summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Bennett <lbennett@gitlab.com>2018-08-06 10:20:05 +0000
committerLuke Bennett <lbennett@gitlab.com>2018-08-06 10:20:05 +0000
commit840d54cfcaa72924c3c4a91fb63a20eece780db2 (patch)
tree892d3e0fac1ffdc574ab0a6dca69bd7f90889ad9
parentb2543977ff479e120746a9d826956b7a2cb6f463 (diff)
parent3bdab23c89cb3985074a7efaa3ac54c154836034 (diff)
downloadgitlab-ce-840d54cfcaa72924c3c4a91fb63a20eece780db2.tar.gz
Merge branch 'master' into 'ce-port-3959-mirroring-interface-improvements'
# Conflicts: # locale/gitlab.pot
-rw-r--r--.gitlab-ci.yml12
-rw-r--r--.rubocop.yml6
-rw-r--r--CHANGELOG.md45
-rw-r--r--Dangerfile1
-rw-r--r--GITALY_SERVER_VERSION2
-rw-r--r--GITLAB_SHELL_VERSION2
-rw-r--r--GITLAB_WORKHORSE_VERSION2
-rw-r--r--Gemfile5
-rw-r--r--Gemfile.lock21
-rw-r--r--Gemfile.rails5.lock29
-rw-r--r--app/assets/javascripts/autosave.js4
-rw-r--r--app/assets/javascripts/badges/components/badge.vue2
-rw-r--r--app/assets/javascripts/boards/components/board.js13
-rw-r--r--app/assets/javascripts/boards/components/board_new_issue.vue1
-rw-r--r--app/assets/javascripts/boards/components/project_select.vue2
-rw-r--r--app/assets/javascripts/boards/index.js149
-rw-r--r--app/assets/javascripts/boards/models/list.js2
-rw-r--r--app/assets/javascripts/boards/stores/boards_store.js10
-rw-r--r--app/assets/javascripts/commons/gitlab_ui.js4
-rw-r--r--app/assets/javascripts/commons/index.js1
-rw-r--r--app/assets/javascripts/diffs/components/diff_discussions.vue1
-rw-r--r--app/assets/javascripts/diffs/components/diff_file_header.vue7
-rw-r--r--app/assets/javascripts/diffs/components/diff_line_gutter_content.vue21
-rw-r--r--app/assets/javascripts/diffs/components/diff_line_note_form.vue31
-rw-r--r--app/assets/javascripts/diffs/components/diff_table_cell.vue6
-rw-r--r--app/assets/javascripts/diffs/components/inline_diff_comment_row.vue16
-rw-r--r--app/assets/javascripts/diffs/components/inline_diff_table_row.vue8
-rw-r--r--app/assets/javascripts/diffs/components/inline_diff_view.vue24
-rw-r--r--app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue53
-rw-r--r--app/assets/javascripts/diffs/components/parallel_diff_table_row.vue14
-rw-r--r--app/assets/javascripts/diffs/components/parallel_diff_view.vue39
-rw-r--r--app/assets/javascripts/diffs/store/getters.js91
-rw-r--r--app/assets/javascripts/diffs/store/utils.js21
-rw-r--r--app/assets/javascripts/environments/components/environment_item.vue29
-rw-r--r--app/assets/javascripts/environments/components/environments_table.vue13
-rw-r--r--app/assets/javascripts/groups_select.js1
-rw-r--r--app/assets/javascripts/helpers/avatar_helper.js33
-rw-r--r--app/assets/javascripts/ide/components/changed_file_icon.vue20
-rw-r--r--app/assets/javascripts/ide/components/commit_sidebar/actions.vue3
-rw-r--r--app/assets/javascripts/ide/components/commit_sidebar/list_item.vue10
-rw-r--r--app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue2
-rw-r--r--app/assets/javascripts/ide/components/ide.vue24
-rw-r--r--app/assets/javascripts/ide/components/ide_review.vue13
-rw-r--r--app/assets/javascripts/ide/components/ide_tree.vue8
-rw-r--r--app/assets/javascripts/ide/components/ide_tree_list.vue6
-rw-r--r--app/assets/javascripts/ide/components/jobs/detail.vue3
-rw-r--r--app/assets/javascripts/ide/components/new_dropdown/index.vue57
-rw-r--r--app/assets/javascripts/ide/components/new_dropdown/modal.vue46
-rw-r--r--app/assets/javascripts/ide/components/repo_commit_section.vue2
-rw-r--r--app/assets/javascripts/ide/components/repo_editor.vue17
-rw-r--r--app/assets/javascripts/ide/components/repo_file.vue14
-rw-r--r--app/assets/javascripts/ide/components/repo_tab.vue6
-rw-r--r--app/assets/javascripts/ide/constants.js20
-rw-r--r--app/assets/javascripts/ide/lib/common/model.js2
-rw-r--r--app/assets/javascripts/ide/services/index.js6
-rw-r--r--app/assets/javascripts/ide/stores/actions.js34
-rw-r--r--app/assets/javascripts/ide/stores/actions/file.js27
-rw-r--r--app/assets/javascripts/ide/stores/actions/tree.js16
-rw-r--r--app/assets/javascripts/ide/stores/getters.js4
-rw-r--r--app/assets/javascripts/ide/stores/modules/commit/actions.js12
-rw-r--r--app/assets/javascripts/ide/stores/modules/commit/getters.js26
-rw-r--r--app/assets/javascripts/ide/stores/mutation_types.js4
-rw-r--r--app/assets/javascripts/ide/stores/mutations.js74
-rw-r--r--app/assets/javascripts/ide/stores/mutations/file.js44
-rw-r--r--app/assets/javascripts/ide/stores/mutations/tree.js11
-rw-r--r--app/assets/javascripts/ide/stores/state.js3
-rw-r--r--app/assets/javascripts/ide/stores/utils.js39
-rw-r--r--app/assets/javascripts/ide/utils.js12
-rw-r--r--app/assets/javascripts/issue_show/components/edited.vue2
-rw-r--r--app/assets/javascripts/lib/utils/http_status.js27
-rw-r--r--app/assets/javascripts/lib/utils/poll.js5
-rw-r--r--app/assets/javascripts/lib/utils/text_utility.js14
-rw-r--r--app/assets/javascripts/notes/components/discussion_counter.vue28
-rw-r--r--app/assets/javascripts/notes/components/note_edited_text.vue2
-rw-r--r--app/assets/javascripts/notes/components/note_form.vue2
-rw-r--r--app/assets/javascripts/notes/components/note_header.vue3
-rw-r--r--app/assets/javascripts/notes/components/noteable_discussion.vue73
-rw-r--r--app/assets/javascripts/notes/mixins/autosave.js17
-rw-r--r--app/assets/javascripts/notes/mixins/discussion_navigation.js29
-rw-r--r--app/assets/javascripts/notes/stores/getters.js97
-rw-r--r--app/assets/javascripts/notes/stores/mutations.js19
-rw-r--r--app/assets/javascripts/notes/stores/utils.js9
-rw-r--r--app/assets/javascripts/pages/projects/new/index.js2
-rw-r--r--app/assets/javascripts/pipelines/components/graph/dropdown_job_component.vue5
-rw-r--r--app/assets/javascripts/pipelines/components/graph/graph_component.vue4
-rw-r--r--app/assets/javascripts/pipelines/components/graph/job_component.vue7
-rw-r--r--app/assets/javascripts/pipelines/components/graph/stage_column_component.vue3
-rw-r--r--app/assets/javascripts/projects/project_new.js17
-rw-r--r--app/assets/javascripts/reports/components/grouped_test_reports_app.vue116
-rw-r--r--app/assets/javascripts/reports/components/modal.vue73
-rw-r--r--app/assets/javascripts/reports/components/test_issue_body.vue44
-rw-r--r--app/assets/javascripts/reports/constants.js16
-rw-r--r--app/assets/javascripts/reports/store/actions.js27
-rw-r--r--app/assets/javascripts/reports/store/getters.js16
-rw-r--r--app/assets/javascripts/reports/store/index.js2
-rw-r--r--app/assets/javascripts/reports/store/mutation_types.js2
-rw-r--r--app/assets/javascripts/reports/store/mutations.js21
-rw-r--r--app/assets/javascripts/reports/store/state.js33
-rw-r--r--app/assets/javascripts/reports/store/utils.js59
-rw-r--r--app/assets/javascripts/search_autocomplete.js6
-rw-r--r--app/assets/javascripts/sidebar/components/assignees/assignees.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/participants/participants.vue2
-rw-r--r--app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue19
-rw-r--r--app/assets/javascripts/terminal/index.js10
-rw-r--r--app/assets/javascripts/terminal/terminal.js103
-rw-r--r--app/assets/javascripts/users_select.js4
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue6
-rw-r--r--app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js2
-rw-r--r--app/assets/javascripts/vue_shared/components/bar_chart.vue391
-rw-r--r--app/assets/javascripts/vue_shared/components/bar_chart_constants.js4
-rw-r--r--app/assets/javascripts/vue_shared/components/clipboard_button.vue15
-rw-r--r--app/assets/javascripts/vue_shared/components/code_block.vue16
-rw-r--r--app/assets/javascripts/vue_shared/components/gl_modal.vue18
-rw-r--r--app/assets/javascripts/vue_shared/components/header_ci_component.vue3
-rw-r--r--app/assets/javascripts/vue_shared/components/identicon.vue26
-rw-r--r--app/assets/javascripts/vue_shared/components/panel_resizer.vue11
-rw-r--r--app/assets/javascripts/vue_shared/components/reports/constants.js3
-rw-r--r--app/assets/javascripts/vue_shared/components/reports/issue_body.js9
-rw-r--r--app/assets/javascripts/vue_shared/components/reports/issue_status_icon.vue58
-rw-r--r--app/assets/javascripts/vue_shared/components/reports/issues_list.vue74
-rw-r--r--app/assets/javascripts/vue_shared/components/reports/report_issues.vue59
-rw-r--r--app/assets/javascripts/vue_shared/components/reports/report_section.vue31
-rw-r--r--app/assets/javascripts/vue_shared/components/reports/summary_row.vue9
-rw-r--r--app/assets/javascripts/vue_shared/components/svg_gradient.vue37
-rw-r--r--app/assets/stylesheets/framework/avatar.scss16
-rw-r--r--app/assets/stylesheets/framework/blocks.scss15
-rw-r--r--app/assets/stylesheets/framework/common.scss10
-rw-r--r--app/assets/stylesheets/framework/forms.scss2
-rw-r--r--app/assets/stylesheets/framework/header.scss3
-rw-r--r--app/assets/stylesheets/framework/highlight.scss8
-rw-r--r--app/assets/stylesheets/framework/jquery.scss2
-rw-r--r--app/assets/stylesheets/framework/lists.scss4
-rw-r--r--app/assets/stylesheets/framework/mixins.scss41
-rw-r--r--app/assets/stylesheets/framework/sidebar.scss12
-rw-r--r--app/assets/stylesheets/framework/typography.scss14
-rw-r--r--app/assets/stylesheets/framework/variables.scss34
-rw-r--r--app/assets/stylesheets/mailers/highlighted_diff_email.scss4
-rw-r--r--app/assets/stylesheets/page_bundles/ide.scss (renamed from app/assets/stylesheets/pages/repo.scss)86
-rw-r--r--app/assets/stylesheets/pages/boards.scss4
-rw-r--r--app/assets/stylesheets/pages/builds.scss22
-rw-r--r--app/assets/stylesheets/pages/commits.scss36
-rw-r--r--app/assets/stylesheets/pages/cycle_analytics.scss2
-rw-r--r--app/assets/stylesheets/pages/detail_page.scss2
-rw-r--r--app/assets/stylesheets/pages/diff.scss7
-rw-r--r--app/assets/stylesheets/pages/editor.scss2
-rw-r--r--app/assets/stylesheets/pages/environments.scss2
-rw-r--r--app/assets/stylesheets/pages/graph.scss58
-rw-r--r--app/assets/stylesheets/pages/issuable.scss38
-rw-r--r--app/assets/stylesheets/pages/issues.scss2
-rw-r--r--app/assets/stylesheets/pages/issues/issue_count_badge.scss26
-rw-r--r--app/assets/stylesheets/pages/login.scss2
-rw-r--r--app/assets/stylesheets/pages/merge_conflicts.scss210
-rw-r--r--app/assets/stylesheets/pages/merge_requests.scss43
-rw-r--r--app/assets/stylesheets/pages/note_form.scss2
-rw-r--r--app/assets/stylesheets/pages/notes.scss4
-rw-r--r--app/assets/stylesheets/pages/projects.scss36
-rw-r--r--app/assets/stylesheets/pages/reports.scss16
-rw-r--r--app/assets/stylesheets/pages/tree.scss18
-rw-r--r--app/assets/stylesheets/snippets.scss20
-rw-r--r--app/controllers/admin/conversational_development_index_controller.rb5
-rw-r--r--app/controllers/admin/jobs_controller.rb2
-rw-r--r--app/controllers/admin/services_controller.rb4
-rw-r--r--app/controllers/application_controller.rb15
-rw-r--r--app/controllers/boards/issues_controller.rb17
-rw-r--r--app/controllers/concerns/authenticates_with_two_factor.rb4
-rw-r--r--app/controllers/concerns/members_presentation.rb8
-rw-r--r--app/controllers/concerns/membership_actions.rb2
-rw-r--r--app/controllers/concerns/notes_actions.rb4
-rw-r--r--app/controllers/concerns/renders_notes.rb5
-rw-r--r--app/controllers/dashboard/milestones_controller.rb13
-rw-r--r--app/controllers/groups/group_members_controller.rb2
-rw-r--r--app/controllers/instance_statistics/application_controller.rb10
-rw-r--r--app/controllers/instance_statistics/cohorts_controller.rb (renamed from app/controllers/admin/cohorts_controller.rb)4
-rw-r--r--app/controllers/instance_statistics/conversational_development_index_controller.rb7
-rw-r--r--app/controllers/jwt_controller.rb18
-rw-r--r--app/controllers/profiles_controller.rb4
-rw-r--r--app/controllers/projects/commit_controller.rb9
-rw-r--r--app/controllers/projects/commits_controller.rb10
-rw-r--r--app/controllers/projects/issues_controller.rb2
-rw-r--r--app/controllers/projects/labels_controller.rb16
-rw-r--r--app/controllers/projects/lfs_api_controller.rb7
-rw-r--r--app/controllers/projects/merge_requests/application_controller.rb2
-rw-r--r--app/controllers/projects/merge_requests_controller.rb17
-rw-r--r--app/controllers/projects/milestones_controller.rb11
-rw-r--r--app/controllers/projects/mirrors_controller.rb4
-rw-r--r--app/controllers/projects/notes_controller.rb3
-rw-r--r--app/controllers/projects/pipelines_controller.rb11
-rw-r--r--app/controllers/projects/snippets_controller.rb2
-rw-r--r--app/controllers/projects/wikis_controller.rb43
-rw-r--r--app/controllers/sessions_controller.rb12
-rw-r--r--app/controllers/snippets/notes_controller.rb2
-rw-r--r--app/controllers/snippets_controller.rb2
-rw-r--r--app/controllers/users_controller.rb6
-rw-r--r--app/finders/admin/projects_finder.rb4
-rw-r--r--app/finders/issuable_finder.rb2
-rw-r--r--app/finders/labels_finder.rb11
-rw-r--r--app/finders/personal_projects_finder.rb4
-rw-r--r--app/finders/user_recent_events_finder.rb3
-rw-r--r--app/graphql/gitlab_schema.rb2
-rw-r--r--app/graphql/mutations/base_mutation.rb13
-rw-r--r--app/graphql/mutations/concerns/mutations/resolves_project.rb13
-rw-r--r--app/graphql/mutations/merge_requests/base.rb32
-rw-r--r--app/graphql/mutations/merge_requests/set_wip.rb35
-rw-r--r--app/graphql/types/mutation_type.rb6
-rw-r--r--app/helpers/application_settings_helper.rb27
-rw-r--r--app/helpers/avatars_helper.rb16
-rw-r--r--app/helpers/environments_helper.rb19
-rw-r--r--app/helpers/hooks_helper.rb2
-rw-r--r--app/helpers/issuables_helper.rb6
-rw-r--r--app/helpers/milestones_helper.rb8
-rw-r--r--app/helpers/profiles_helper.rb4
-rw-r--r--app/helpers/projects_helper.rb4
-rw-r--r--app/helpers/repository_languages_helper.rb16
-rw-r--r--app/helpers/snippets_helper.rb2
-rw-r--r--app/helpers/users_helper.rb26
-rw-r--r--app/mailers/notify.rb4
-rw-r--r--app/models/ability.rb2
-rw-r--r--app/models/abuse_report.rb2
-rw-r--r--app/models/active_session.rb2
-rw-r--r--app/models/appearance.rb2
-rw-r--r--app/models/application_setting.rb45
-rw-r--r--app/models/application_setting/term.rb2
-rw-r--r--app/models/audit_event.rb2
-rw-r--r--app/models/award_emoji.rb2
-rw-r--r--app/models/badge.rb2
-rw-r--r--app/models/badges/group_badge.rb2
-rw-r--r--app/models/badges/project_badge.rb2
-rw-r--r--app/models/blob.rb2
-rw-r--r--app/models/blob_viewer/auxiliary.rb2
-rw-r--r--app/models/blob_viewer/balsamiq.rb2
-rw-r--r--app/models/blob_viewer/base.rb2
-rw-r--r--app/models/blob_viewer/binary_stl.rb2
-rw-r--r--app/models/blob_viewer/cartfile.rb2
-rw-r--r--app/models/blob_viewer/changelog.rb2
-rw-r--r--app/models/blob_viewer/client_side.rb2
-rw-r--r--app/models/blob_viewer/composer_json.rb2
-rw-r--r--app/models/blob_viewer/contributing.rb2
-rw-r--r--app/models/blob_viewer/dependency_manager.rb2
-rw-r--r--app/models/blob_viewer/download.rb2
-rw-r--r--app/models/blob_viewer/empty.rb2
-rw-r--r--app/models/blob_viewer/gemfile.rb2
-rw-r--r--app/models/blob_viewer/gemspec.rb2
-rw-r--r--app/models/blob_viewer/gitlab_ci_yml.rb2
-rw-r--r--app/models/blob_viewer/godeps_json.rb2
-rw-r--r--app/models/blob_viewer/image.rb2
-rw-r--r--app/models/blob_viewer/license.rb2
-rw-r--r--app/models/blob_viewer/markup.rb2
-rw-r--r--app/models/blob_viewer/notebook.rb2
-rw-r--r--app/models/blob_viewer/package_json.rb2
-rw-r--r--app/models/blob_viewer/pdf.rb2
-rw-r--r--app/models/blob_viewer/podfile.rb2
-rw-r--r--app/models/blob_viewer/podspec.rb2
-rw-r--r--app/models/blob_viewer/podspec_json.rb2
-rw-r--r--app/models/blob_viewer/readme.rb2
-rw-r--r--app/models/blob_viewer/requirements_txt.rb2
-rw-r--r--app/models/blob_viewer/rich.rb2
-rw-r--r--app/models/blob_viewer/route_map.rb2
-rw-r--r--app/models/blob_viewer/server_side.rb2
-rw-r--r--app/models/blob_viewer/simple.rb2
-rw-r--r--app/models/blob_viewer/sketch.rb2
-rw-r--r--app/models/blob_viewer/static.rb2
-rw-r--r--app/models/blob_viewer/svg.rb2
-rw-r--r--app/models/blob_viewer/text.rb2
-rw-r--r--app/models/blob_viewer/text_stl.rb2
-rw-r--r--app/models/blob_viewer/video.rb2
-rw-r--r--app/models/blob_viewer/yarn_lock.rb2
-rw-r--r--app/models/board.rb2
-rw-r--r--app/models/broadcast_message.rb2
-rw-r--r--app/models/chat_name.rb2
-rw-r--r--app/models/chat_team.rb2
-rw-r--r--app/models/ci/artifact_blob.rb2
-rw-r--r--app/models/ci/build.rb82
-rw-r--r--app/models/ci/build_metadata.rb2
-rw-r--r--app/models/ci/build_runner_session.rb4
-rw-r--r--app/models/ci/build_trace_chunk.rb2
-rw-r--r--app/models/ci/build_trace_chunks/database.rb2
-rw-r--r--app/models/ci/build_trace_chunks/fog.rb2
-rw-r--r--app/models/ci/build_trace_chunks/redis.rb2
-rw-r--r--app/models/ci/build_trace_section.rb2
-rw-r--r--app/models/ci/build_trace_section_name.rb2
-rw-r--r--app/models/ci/group.rb2
-rw-r--r--app/models/ci/group_variable.rb2
-rw-r--r--app/models/ci/job_artifact.rb49
-rw-r--r--app/models/ci/legacy_stage.rb2
-rw-r--r--app/models/ci/pipeline.rb14
-rw-r--r--app/models/ci/pipeline_schedule.rb2
-rw-r--r--app/models/ci/pipeline_schedule_variable.rb2
-rw-r--r--app/models/ci/pipeline_variable.rb2
-rw-r--r--app/models/ci/runner.rb2
-rw-r--r--app/models/ci/runner_namespace.rb2
-rw-r--r--app/models/ci/runner_project.rb2
-rw-r--r--app/models/ci/stage.rb2
-rw-r--r--app/models/ci/trigger.rb2
-rw-r--r--app/models/ci/trigger_request.rb2
-rw-r--r--app/models/ci/variable.rb2
-rw-r--r--app/models/clusters/applications/helm.rb2
-rw-r--r--app/models/clusters/applications/ingress.rb8
-rw-r--r--app/models/clusters/applications/jupyter.rb6
-rw-r--r--app/models/clusters/applications/prometheus.rb13
-rw-r--r--app/models/clusters/applications/runner.rb6
-rw-r--r--app/models/clusters/cluster.rb2
-rw-r--r--app/models/clusters/concerns/application_core.rb2
-rw-r--r--app/models/clusters/concerns/application_data.rb2
-rw-r--r--app/models/clusters/concerns/application_status.rb2
-rw-r--r--app/models/clusters/concerns/application_version.rb17
-rw-r--r--app/models/clusters/platforms/kubernetes.rb2
-rw-r--r--app/models/clusters/project.rb2
-rw-r--r--app/models/clusters/providers/gcp.rb2
-rw-r--r--app/models/commit.rb10
-rw-r--r--app/models/commit_range.rb2
-rw-r--r--app/models/commit_status.rb5
-rw-r--r--app/models/compare.rb2
-rw-r--r--app/models/concerns/atomic_internal_id.rb21
-rw-r--r--app/models/concerns/label_eventable.rb16
-rw-r--r--app/models/concerns/prometheus_adapter.rb15
-rw-r--r--app/models/concerns/reactive_caching.rb10
-rw-r--r--app/models/concerns/routable.rb44
-rw-r--r--app/models/concerns/storage/legacy_namespace.rb13
-rw-r--r--app/models/container_repository.rb2
-rw-r--r--app/models/cycle_analytics.rb2
-rw-r--r--app/models/dashboard_group_milestone.rb36
-rw-r--r--app/models/dashboard_milestone.rb2
-rw-r--r--app/models/deploy_key.rb2
-rw-r--r--app/models/deploy_keys_project.rb2
-rw-r--r--app/models/deploy_token.rb15
-rw-r--r--app/models/deployment.rb2
-rw-r--r--app/models/diff_discussion.rb2
-rw-r--r--app/models/diff_note.rb2
-rw-r--r--app/models/directly_addressed_user.rb2
-rw-r--r--app/models/discussion.rb2
-rw-r--r--app/models/discussion_note.rb2
-rw-r--r--app/models/email.rb6
-rw-r--r--app/models/environment.rb4
-rw-r--r--app/models/epic.rb2
-rw-r--r--app/models/event.rb2
-rw-r--r--app/models/event_collection.rb2
-rw-r--r--app/models/external_issue.rb2
-rw-r--r--app/models/fork_network.rb2
-rw-r--r--app/models/fork_network_member.rb2
-rw-r--r--app/models/forked_project_link.rb2
-rw-r--r--app/models/generic_commit_status.rb2
-rw-r--r--app/models/global_label.rb2
-rw-r--r--app/models/global_milestone.rb2
-rw-r--r--app/models/gpg_key.rb2
-rw-r--r--app/models/gpg_key_subkey.rb2
-rw-r--r--app/models/gpg_signature.rb2
-rw-r--r--app/models/group.rb2
-rw-r--r--app/models/group_custom_attribute.rb2
-rw-r--r--app/models/group_label.rb2
-rw-r--r--app/models/group_milestone.rb2
-rw-r--r--app/models/guest.rb2
-rw-r--r--app/models/identity.rb2
-rw-r--r--app/models/import_export_upload.rb3
-rw-r--r--app/models/individual_note_discussion.rb2
-rw-r--r--app/models/instance_configuration.rb2
-rw-r--r--app/models/internal_id.rb38
-rw-r--r--app/models/issue.rb3
-rw-r--r--app/models/issue_assignee.rb2
-rw-r--r--app/models/issue_collection.rb2
-rw-r--r--app/models/key.rb2
-rw-r--r--app/models/label.rb14
-rw-r--r--app/models/label_link.rb2
-rw-r--r--app/models/label_priority.rb2
-rw-r--r--app/models/legacy_diff_discussion.rb2
-rw-r--r--app/models/legacy_diff_note.rb2
-rw-r--r--app/models/lfs_file_lock.rb2
-rw-r--r--app/models/lfs_object.rb2
-rw-r--r--app/models/lfs_objects_project.rb2
-rw-r--r--app/models/list.rb2
-rw-r--r--app/models/member.rb2
-rw-r--r--app/models/merge_request.rb38
-rw-r--r--app/models/merge_request_diff.rb10
-rw-r--r--app/models/merge_request_diff_commit.rb2
-rw-r--r--app/models/merge_request_diff_file.rb2
-rw-r--r--app/models/merge_requests_closing_issues.rb2
-rw-r--r--app/models/milestone.rb6
-rw-r--r--app/models/namespace.rb4
-rw-r--r--app/models/note.rb4
-rw-r--r--app/models/note_diff_file.rb2
-rw-r--r--app/models/notification_reason.rb2
-rw-r--r--app/models/notification_recipient.rb2
-rw-r--r--app/models/notification_setting.rb2
-rw-r--r--app/models/oauth_access_grant.rb2
-rw-r--r--app/models/oauth_access_token.rb2
-rw-r--r--app/models/out_of_context_discussion.rb2
-rw-r--r--app/models/pages_domain.rb2
-rw-r--r--app/models/personal_access_token.rb2
-rw-r--r--app/models/personal_snippet.rb2
-rw-r--r--app/models/programming_language.rb4
-rw-r--r--app/models/project.rb97
-rw-r--r--app/models/project_authorization.rb2
-rw-r--r--app/models/project_auto_devops.rb2
-rw-r--r--app/models/project_ci_cd_setting.rb2
-rw-r--r--app/models/project_custom_attribute.rb2
-rw-r--r--app/models/project_deploy_token.rb2
-rw-r--r--app/models/project_feature.rb28
-rw-r--r--app/models/project_group_link.rb2
-rw-r--r--app/models/project_import_data.rb2
-rw-r--r--app/models/project_import_state.rb2
-rw-r--r--app/models/project_label.rb2
-rw-r--r--app/models/project_snippet.rb2
-rw-r--r--app/models/project_statistics.rb25
-rw-r--r--app/models/project_team.rb2
-rw-r--r--app/models/project_wiki.rb2
-rw-r--r--app/models/protectable_dropdown.rb2
-rw-r--r--app/models/protected_branch.rb2
-rw-r--r--app/models/protected_ref_matcher.rb2
-rw-r--r--app/models/protected_tag.rb2
-rw-r--r--app/models/push_event.rb2
-rw-r--r--app/models/push_event_payload.rb2
-rw-r--r--app/models/readme_blob.rb2
-rw-r--r--app/models/redirect_route.rb2
-rw-r--r--app/models/release.rb2
-rw-r--r--app/models/remote_mirror.rb8
-rw-r--r--app/models/repository.rb14
-rw-r--r--app/models/repository_language.rb12
-rw-r--r--app/models/resource_label_event.rb35
-rw-r--r--app/models/route.rb2
-rw-r--r--app/models/security_event.rb2
-rw-r--r--app/models/sent_notification.rb2
-rw-r--r--app/models/service.rb2
-rw-r--r--app/models/site_statistic.rb74
-rw-r--r--app/models/snippet.rb3
-rw-r--r--app/models/snippet_blob.rb2
-rw-r--r--app/models/spam_log.rb2
-rw-r--r--app/models/subscription.rb2
-rw-r--r--app/models/system_note_metadata.rb2
-rw-r--r--app/models/term_agreement.rb2
-rw-r--r--app/models/timelog.rb2
-rw-r--r--app/models/todo.rb2
-rw-r--r--app/models/tree.rb2
-rw-r--r--app/models/trending_project.rb2
-rw-r--r--app/models/u2f_registration.rb2
-rw-r--r--app/models/upload.rb2
-rw-r--r--app/models/user.rb16
-rw-r--r--app/models/user_agent_detail.rb2
-rw-r--r--app/models/user_callout.rb2
-rw-r--r--app/models/user_custom_attribute.rb2
-rw-r--r--app/models/user_interacted_project.rb2
-rw-r--r--app/models/user_status.rb17
-rw-r--r--app/models/user_synced_attributes_metadata.rb2
-rw-r--r--app/models/users_star_project.rb2
-rw-r--r--app/models/wiki_directory.rb2
-rw-r--r--app/models/wiki_page.rb2
-rw-r--r--app/policies/application_setting/term_policy.rb2
-rw-r--r--app/policies/base_policy.rb2
-rw-r--r--app/policies/ci/build_policy.rb2
-rw-r--r--app/policies/ci/pipeline_policy.rb2
-rw-r--r--app/policies/ci/pipeline_schedule_policy.rb2
-rw-r--r--app/policies/ci/runner_policy.rb2
-rw-r--r--app/policies/ci/trigger_policy.rb2
-rw-r--r--app/policies/clusters/cluster_policy.rb2
-rw-r--r--app/policies/commit_status_policy.rb2
-rw-r--r--app/policies/concerns/policy_actor.rb36
-rw-r--r--app/policies/deploy_key_policy.rb2
-rw-r--r--app/policies/deploy_token_policy.rb2
-rw-r--r--app/policies/deployment_policy.rb2
-rw-r--r--app/policies/environment_policy.rb2
-rw-r--r--app/policies/external_issue_policy.rb2
-rw-r--r--app/policies/global_policy.rb7
-rw-r--r--app/policies/group_label_policy.rb2
-rw-r--r--app/policies/group_member_policy.rb2
-rw-r--r--app/policies/group_policy.rb2
-rw-r--r--app/policies/issuable_policy.rb2
-rw-r--r--app/policies/issue_policy.rb2
-rw-r--r--app/policies/merge_request_policy.rb2
-rw-r--r--app/policies/namespace_policy.rb2
-rw-r--r--app/policies/nil_policy.rb2
-rw-r--r--app/policies/note_policy.rb2
-rw-r--r--app/policies/personal_snippet_policy.rb2
-rw-r--r--app/policies/project_label_policy.rb2
-rw-r--r--app/policies/project_member_policy.rb2
-rw-r--r--app/policies/project_policy.rb2
-rw-r--r--app/policies/project_policy/class_methods.rb2
-rw-r--r--app/policies/project_snippet_policy.rb2
-rw-r--r--app/policies/protected_branch_policy.rb2
-rw-r--r--app/policies/user_policy.rb9
-rw-r--r--app/presenters/ci/build_metadata_presenter.rb2
-rw-r--r--app/presenters/ci/build_presenter.rb2
-rw-r--r--app/presenters/ci/build_runner_presenter.rb43
-rw-r--r--app/presenters/ci/group_variable_presenter.rb2
-rw-r--r--app/presenters/ci/pipeline_presenter.rb2
-rw-r--r--app/presenters/ci/variable_presenter.rb2
-rw-r--r--app/presenters/clusters/cluster_presenter.rb2
-rw-r--r--app/presenters/commit_status_presenter.rb16
-rw-r--r--app/presenters/conversational_development_index/metric_presenter.rb2
-rw-r--r--app/presenters/generic_commit_status_presenter.rb2
-rw-r--r--app/presenters/group_member_presenter.rb2
-rw-r--r--app/presenters/member_presenter.rb2
-rw-r--r--app/presenters/members_presenter.rb2
-rw-r--r--app/presenters/merge_request_presenter.rb2
-rw-r--r--app/presenters/project_member_presenter.rb2
-rw-r--r--app/presenters/project_presenter.rb2
-rw-r--r--app/presenters/projects/settings/deploy_keys_presenter.rb2
-rw-r--r--app/serializers/concerns/user_status_tooltip.rb19
-rw-r--r--app/serializers/discussion_entity.rb1
-rw-r--r--app/serializers/merge_request_widget_entity.rb10
-rw-r--r--app/serializers/pipeline_serializer.rb9
-rw-r--r--app/serializers/test_case_entity.rb7
-rw-r--r--app/serializers/test_reports_comparer_entity.rb11
-rw-r--r--app/serializers/test_reports_comparer_serializer.rb3
-rw-r--r--app/serializers/test_suite_comparer_entity.rb14
-rw-r--r--app/serializers/user_entity.rb1
-rw-r--r--app/services/auth/container_registry_authentication_service.rb12
-rw-r--r--app/services/boards/issues/list_service.rb27
-rw-r--r--app/services/ci/compare_test_reports_service.rb24
-rw-r--r--app/services/ci/register_job_service.rb26
-rw-r--r--app/services/clusters/applications/check_installation_progress_service.rb8
-rw-r--r--app/services/git_push_service.rb95
-rw-r--r--app/services/git_tag_push_service.rb10
-rw-r--r--app/services/issues/update_service.rb2
-rw-r--r--app/services/members/destroy_service.rb8
-rw-r--r--app/services/projects/create_from_template_service.rb12
-rw-r--r--app/services/projects/detect_repository_languages_service.rb52
-rw-r--r--app/services/projects/gitlab_projects_import_service.rb63
-rw-r--r--app/services/projects/hashed_storage/migrate_attachments_service.rb30
-rw-r--r--app/services/projects/hashed_storage/migrate_repository_service.rb25
-rw-r--r--app/services/projects/hashed_storage_migration_service.rb11
-rw-r--r--app/services/projects/transfer_service.rb1
-rw-r--r--app/services/projects/update_service.rb70
-rw-r--r--app/services/prometheus/adapter_service.rb2
-rw-r--r--app/services/resource_events/change_labels_service.rb43
-rw-r--r--app/services/todos/destroy/base_service.rb33
-rw-r--r--app/services/todos/destroy/confidential_issue_service.rb39
-rw-r--r--app/services/todos/destroy/entity_leave_service.rb59
-rw-r--r--app/services/todos/destroy/private_features_service.rb40
-rw-r--r--app/services/todos/destroy/project_private_service.rb30
-rw-r--r--app/services/users/activity_service.rb1
-rw-r--r--app/services/users/build_service.rb3
-rw-r--r--app/services/users/set_status_service.rb39
-rw-r--r--app/services/users/update_service.rb12
-rw-r--r--app/uploaders/import_export_uploader.rb2
-rw-r--r--app/views/admin/application_settings/_repository_storage.html.haml2
-rw-r--r--app/views/admin/application_settings/_usage.html.haml5
-rw-r--r--app/views/admin/application_settings/show.html.haml3
-rw-r--r--app/views/admin/projects/_projects.html.haml2
-rw-r--r--app/views/dashboard/milestones/_milestone.html.haml2
-rw-r--r--app/views/ide/index.html.haml3
-rw-r--r--app/views/instance_statistics/cohorts/_cohorts_table.html.haml (renamed from app/views/admin/cohorts/_cohorts_table.html.haml)0
-rw-r--r--app/views/instance_statistics/cohorts/_usage_ping.html.haml (renamed from app/views/admin/cohorts/_usage_ping.html.haml)0
-rw-r--r--app/views/instance_statistics/cohorts/index.html.haml (renamed from app/views/admin/cohorts/index.html.haml)0
-rw-r--r--app/views/instance_statistics/conversational_development_index/_callout.html.haml (renamed from app/views/admin/conversational_development_index/_callout.html.haml)0
-rw-r--r--app/views/instance_statistics/conversational_development_index/_card.html.haml (renamed from app/views/admin/conversational_development_index/_card.html.haml)0
-rw-r--r--app/views/instance_statistics/conversational_development_index/_disabled.html.haml (renamed from app/views/admin/conversational_development_index/_disabled.html.haml)0
-rw-r--r--app/views/instance_statistics/conversational_development_index/_no_data.html.haml (renamed from app/views/admin/conversational_development_index/_no_data.html.haml)0
-rw-r--r--app/views/instance_statistics/conversational_development_index/index.html.haml (renamed from app/views/admin/conversational_development_index/show.html.haml)0
-rw-r--r--app/views/layouts/_head.html.haml5
-rw-r--r--app/views/layouts/_recaptcha_verification.html.haml4
-rw-r--r--app/views/layouts/_search.html.haml10
-rw-r--r--app/views/layouts/admin.html.haml4
-rw-r--r--app/views/layouts/dashboard.html.haml4
-rw-r--r--app/views/layouts/devise.html.haml13
-rw-r--r--app/views/layouts/devise_empty.html.haml6
-rw-r--r--app/views/layouts/explore.html.haml4
-rw-r--r--app/views/layouts/group_settings.html.haml2
-rw-r--r--app/views/layouts/header/_default.html.haml18
-rw-r--r--app/views/layouts/header/_new_dropdown.haml24
-rw-r--r--app/views/layouts/help.html.haml6
-rw-r--r--app/views/layouts/instance_statistics.html.haml6
-rw-r--r--app/views/layouts/koding.html.haml6
-rw-r--r--app/views/layouts/mailer.text.erb2
-rw-r--r--app/views/layouts/mailer/devise.html.haml12
-rw-r--r--app/views/layouts/nav/_breadcrumbs.html.haml2
-rw-r--r--app/views/layouts/nav/_dashboard.html.haml48
-rw-r--r--app/views/layouts/nav/_explore.html.haml14
-rw-r--r--app/views/layouts/nav/sidebar/_admin.html.haml111
-rw-r--r--app/views/layouts/nav/sidebar/_group.html.haml54
-rw-r--r--app/views/layouts/nav/sidebar/_instance_statistics.html.haml33
-rw-r--r--app/views/layouts/nav/sidebar/_profile.html.haml56
-rw-r--r--app/views/layouts/nav/sidebar/_project.html.haml58
-rw-r--r--app/views/layouts/notify.html.haml7
-rw-r--r--app/views/layouts/profile.html.haml4
-rw-r--r--app/views/layouts/project_settings.html.haml2
-rw-r--r--app/views/layouts/search.html.haml4
-rw-r--r--app/views/layouts/snippets.html.haml2
-rw-r--r--app/views/profiles/show.html.haml18
-rw-r--r--app/views/projects/_project_templates.html.haml31
-rw-r--r--app/views/projects/commit/_commit_box.html.haml3
-rw-r--r--app/views/projects/commits/_commit.html.haml2
-rw-r--r--app/views/projects/environments/metrics.html.haml22
-rw-r--r--app/views/projects/jobs/_sidebar.html.haml2
-rw-r--r--app/views/projects/jobs/show.html.haml2
-rw-r--r--app/views/projects/jobs/terminal.html.haml2
-rw-r--r--app/views/projects/labels/index.html.haml35
-rw-r--r--app/views/projects/merge_requests/creations/_new_compare.html.haml2
-rw-r--r--app/views/projects/pipelines/_info.html.haml65
-rw-r--r--app/views/projects/pipelines/show.html.haml6
-rw-r--r--app/views/projects/project_templates/_built_in_templates.html.haml17
-rw-r--r--app/views/projects/project_templates/_project_fields_form.html.haml12
-rw-r--r--app/views/projects/settings/ci_cd/show.html.haml4
-rw-r--r--app/views/projects/show.html.haml5
-rw-r--r--app/views/projects/wikis/_main_links.html.haml2
-rw-r--r--app/views/shared/boards/components/_board.html.haml24
-rw-r--r--app/views/shared/builds/_build_output.html.haml3
-rw-r--r--app/views/shared/members/_member.html.haml1
-rw-r--r--app/views/shared/notes/_note.html.haml4
-rw-r--r--app/views/shared/notes/_notes_with_form.html.haml2
-rw-r--r--app/views/shared/snippets/_embed.html.haml2
-rw-r--r--app/views/shared/snippets/_header.html.haml1
-rw-r--r--app/views/users/show.html.haml79
-rw-r--r--app/workers/all_queues.yml6
-rw-r--r--app/workers/concerns/gitlab/github_import/object_importer.rb2
-rw-r--r--app/workers/concerns/todos_destroyer_queue.rb12
-rw-r--r--app/workers/create_gpg_signature_worker.rb20
-rw-r--r--app/workers/detect_repository_languages_worker.rb33
-rw-r--r--app/workers/project_migrate_hashed_storage_worker.rb4
-rw-r--r--app/workers/repository_fork_worker.rb4
-rw-r--r--app/workers/repository_import_worker.rb20
-rw-r--r--app/workers/todos_destroyer/confidential_issue_worker.rb10
-rw-r--r--app/workers/todos_destroyer/entity_leave_worker.rb10
-rw-r--r--app/workers/todos_destroyer/private_features_worker.rb10
-rw-r--r--app/workers/todos_destroyer/project_private_worker.rb10
-rw-r--r--changelogs/unreleased/1756-set-iid-via-api.yml5
-rw-r--r--changelogs/unreleased/25990-improve-web-terminal.yml5
-rw-r--r--changelogs/unreleased/25990-interactive-web-terminals-authorization.yml5
-rw-r--r--changelogs/unreleased/31576-redirect-commits-to-root-if-no-ref.yml5
-rw-r--r--changelogs/unreleased/32783-api-all-members-with-ancestors.yml6
-rw-r--r--changelogs/unreleased/32821-better-error-message-add-invalid-user-to-project.yml5
-rw-r--r--changelogs/unreleased/34572-ssh-certificates.yml5
-rw-r--r--changelogs/unreleased/38604-add-private-profile.yml5
-rw-r--r--changelogs/unreleased/40973-disable-rack-attack-by-default.yml5
-rw-r--r--changelogs/unreleased/41416-making-instance-wide-data-tools-more-accessible.yml5
-rw-r--r--changelogs/unreleased/44824-remove-ghost-notification-settings-for-group-and-project.yml5
-rw-r--r--changelogs/unreleased/4525-fix-project-indexes.yml5
-rw-r--r--changelogs/unreleased/45318-junit-FE.yml5
-rw-r--r--changelogs/unreleased/46940-hashed-storage-extend-enable-hashed-storage-for-all-new-projects-to-for-all-new-and-renamed-projects.yml5
-rw-r--r--changelogs/unreleased/47548-monospace-commit-messages.yml5
-rw-r--r--changelogs/unreleased/47728-mr-api-documentation-changes.yml5
-rw-r--r--changelogs/unreleased/48055-web-ide-resize-handles.yml5
-rw-r--r--changelogs/unreleased/48246-osw-load-diffs-improvement.yml5
-rw-r--r--changelogs/unreleased/48542-code-link.yml5
-rw-r--r--changelogs/unreleased/48617-promoting-milestone.yml5
-rw-r--r--changelogs/unreleased/48636-new-mr-card-styles.yml5
-rw-r--r--changelogs/unreleased/48773-gitlab-project-import-should-use-object-storage.yml5
-rw-r--r--changelogs/unreleased/48817-fix-mr-changes-discussion-navigation.yml5
-rw-r--r--changelogs/unreleased/48823-copy-gfm.yml5
-rw-r--r--changelogs/unreleased/48834-chart-versions-for-applications-installed-by-one-click-install-buttons-should-be-version-locked.yml6
-rw-r--r--changelogs/unreleased/49025-docs-kubernetes-tiller.yml5
-rw-r--r--changelogs/unreleased/49107-prefetching-of-assets-and-cdn-domain.yml5
-rw-r--r--changelogs/unreleased/49161-disable-toggle-comments.yml5
-rw-r--r--changelogs/unreleased/49364-fix-broadcast-margin.yml5
-rw-r--r--changelogs/unreleased/49499-list-of-projects-not-loading-when-trying-to-create-an-issue-from-a-board-typeerror.yml5
-rw-r--r--changelogs/unreleased/49701-sorting-by-name-on-milestones-page-error.yml5
-rw-r--r--changelogs/unreleased/49747-update-poll-2xx.yml5
-rw-r--r--changelogs/unreleased/49776-pipeline-job-log-page-uses-too-much-cpu-for-loading-animation.yml5
-rw-r--r--changelogs/unreleased/49830-use-helm-272.yml5
-rw-r--r--changelogs/unreleased/49851-link-to-runners.yml6
-rw-r--r--changelogs/unreleased/49861-top-nav-search-bar-produces-console-error-when-unauthenticated.yml5
-rw-r--r--changelogs/unreleased/49899-merge-request-e-mail-link-has-full-url.yml5
-rw-r--r--changelogs/unreleased/6860-FE-instance-level-project-templates.yml5
-rw-r--r--changelogs/unreleased/_acet-fix-expanding-context-lines.yml5
-rw-r--r--changelogs/unreleased/_acet-fix-mr-autosave.yml5
-rw-r--r--changelogs/unreleased/_acet-fix-outdated-discussions.yml5
-rw-r--r--changelogs/unreleased/artifact-format-v2-with-parser.yml5
-rw-r--r--changelogs/unreleased/artifact-format-v2.yml5
-rw-r--r--changelogs/unreleased/bvl-graphql-wip-mutation.yml5
-rw-r--r--changelogs/unreleased/bvl-user-status-message-35463.yml5
-rw-r--r--changelogs/unreleased/ce-6064-geo-sql-query-for-counting-projects-with-wikis-is-very-slow.yml5
-rw-r--r--changelogs/unreleased/cr-add-group-milestone-to-dashboard.yml5
-rw-r--r--changelogs/unreleased/cr-add-path-of-group-milestone.yml5
-rw-r--r--changelogs/unreleased/custom_wiki_sidebar.yml (renamed from changelogs/custom_wiki_sidebar.yml)0
-rw-r--r--changelogs/unreleased/dz-labels-search.yml5
-rw-r--r--changelogs/unreleased/feature-gb-login-activity-metrics.yml5
-rw-r--r--changelogs/unreleased/fix-email-confirmation-addtional-email.yml5
-rw-r--r--changelogs/unreleased/fix-multiple-scopes.yml5
-rw-r--r--changelogs/unreleased/fix-storage-size-for-artifacts-change.yml5
-rw-r--r--changelogs/unreleased/fj-37736-improve-performance-post-receive-create-gpg-siganture-worker.yml5
-rw-r--r--changelogs/unreleased/fj-49512-fix-gitlab-git-pages-encoding.yml5
-rw-r--r--changelogs/unreleased/fj-49802-bug-api-set-http-headers.yml5
-rw-r--r--changelogs/unreleased/floating-avarage-commit-numbers.yml5
-rw-r--r--changelogs/unreleased/frozen-string-danger.yml5
-rw-r--r--changelogs/unreleased/frozen-string-enable-app-models-more.yml5
-rw-r--r--changelogs/unreleased/frozen-string-enable-app-models.yml5
-rw-r--r--changelogs/unreleased/frozen-string-enable-app-presenters-policies.yml5
-rw-r--r--changelogs/unreleased/full-list-of-vulnerabilities-5239.yml5
-rw-r--r--changelogs/unreleased/ide-delete-entries.yml5
-rw-r--r--changelogs/unreleased/ide-rename-files.yml5
-rw-r--r--changelogs/unreleased/ide-warn-staged-files.yml5
-rw-r--r--changelogs/unreleased/jprovazn-resource-events.yml5
-rw-r--r--changelogs/unreleased/mk-add-local-project-uploads-cleanup-task.yml5
-rw-r--r--changelogs/unreleased/mk-fix-callback-canceling-in-namespace-move-dir.yml5
-rw-r--r--changelogs/unreleased/project-dropdown-list-overflow.yml5
-rw-r--r--changelogs/unreleased/rails5-fix-flaky-spec-user-uses-shortcuts.yml5
-rw-r--r--changelogs/unreleased/rails5-gpg-permit-concurrent.yml5
-rw-r--r--changelogs/unreleased/rails5-update-gemfile-lock-2.yml5
-rw-r--r--changelogs/unreleased/rails5-update-rouge.yml5
-rw-r--r--changelogs/unreleased/replace-all-snake-case-in-scss-variables.yml5
-rw-r--r--changelogs/unreleased/replace-snake-case-css-classes.yml5
-rw-r--r--changelogs/unreleased/rouge-3-2-0.yml5
-rw-r--r--changelogs/unreleased/runner-features.yml5
-rw-r--r--changelogs/unreleased/security-fj-missing-csrf-system-hooks.yml5
-rw-r--r--changelogs/unreleased/security-ide-branch-name-xss.yml5
-rw-r--r--changelogs/unreleased/sh-bump-haml-5-0-4.yml5
-rw-r--r--changelogs/unreleased/sh-fix-admin-jobs-controller-timing-out.yml5
-rw-r--r--changelogs/unreleased/sh-include-rbtrace.yml5
-rw-r--r--changelogs/unreleased/sh-lfs-fix-content-type.yml5
-rw-r--r--changelogs/unreleased/sh-simplify-liveness-check.yml5
-rw-r--r--changelogs/unreleased/sh-support-users-find-by-confirmed-emails.yml5
-rw-r--r--changelogs/unreleased/sh-use-wiki-limit-parameter-gitaly.yml5
-rw-r--r--changelogs/unreleased/stop-dynamic-routable-creation.yml5
-rw-r--r--changelogs/unreleased/tc-reorder-mail-notify-references.yml5
-rw-r--r--changelogs/unreleased/todos-visibility-change.yml5
-rw-r--r--changelogs/unreleased/tz-mr-refactor-memory-reduction.yml5
-rw-r--r--changelogs/unreleased/wrap-job-name-on-jobs-sidebar.yml5
-rw-r--r--changelogs/unreleased/zj-remove-git-rake-tasks.yml5
-rw-r--r--changelogs/unreleased/zj-repository-languages.yml5
-rw-r--r--config/application.rb14
-rw-r--r--config/dependency_decisions.yml6
-rw-r--r--config/initializers/1_settings.rb29
-rw-r--r--config/initializers/sidekiq.rb2
-rw-r--r--config/initializers/warden.rb44
-rw-r--r--config/object_store_settings.rb15
-rw-r--r--config/routes.rb3
-rw-r--r--config/routes/admin.rb6
-rw-r--r--config/routes/instance_statistics.rb8
-rw-r--r--config/routes/project.rb3
-rw-r--r--config/routes/repository.rb1
-rw-r--r--config/sidekiq_queues.yml2
-rw-r--r--config/unicorn.rb.example12
-rw-r--r--config/unicorn.rb.example.development17
-rw-r--r--danger/database/Dangerfile4
-rw-r--r--danger/frozen_string/Dangerfile26
-rw-r--r--db/migrate/20140313092127_init_schema.rb9
-rw-r--r--db/migrate/20140407135544_fix_namespaces.rb1
-rw-r--r--db/migrate/20140415124820_limits_to_mysql.rb1
-rw-r--r--db/migrate/20140729145339_migrate_project_tags.rb1
-rw-r--r--db/migrate/20141121133009_add_timestamps_to_members.rb1
-rw-r--r--db/migrate/20141223135007_add_import_data_to_project_table.rb1
-rw-r--r--db/migrate/20150116234544_add_home_page_url_for_application_settings.rb1
-rw-r--r--db/migrate/20150116234545_add_gitlab_access_token_to_user.rb1
-rw-r--r--db/migrate/20150206222854_add_notification_email_to_user.rb1
-rw-r--r--db/migrate/20150211174341_allow_null_in_services_project_id.rb1
-rw-r--r--db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb1
-rw-r--r--db/migrate/20150223022001_set_missing_last_activity_at.rb1
-rw-r--r--db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb1
-rw-r--r--db/migrate/20150320234437_add_location_to_user.rb1
-rw-r--r--db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb1
-rw-r--r--db/migrate/20150327150017_add_import_data_to_project.rb1
-rw-r--r--db/migrate/20150327223628_add_devise_two_factor_to_users.rb1
-rw-r--r--db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb1
-rw-r--r--db/migrate/20150331183602_add_devise_two_factor_backupable_to_users.rb1
-rw-r--r--db/migrate/20150411000035_fix_identities.rb1
-rw-r--r--db/migrate/20150411180045_rename_buildbox_service.rb1
-rw-r--r--db/migrate/20150417121913_create_project_import_data.rb1
-rw-r--r--db/migrate/20150423033240_add_default_project_visibililty_to_application_settings.rb1
-rw-r--r--db/migrate/20150425164646_gitlab_change_collation_for_tag_names.acts_as_taggable_on_engine.rb1
-rw-r--r--db/migrate/20150425164650_add_missing_taggable_index.acts_as_taggable_on_engine.rb1
-rw-r--r--db/migrate/20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb1
-rw-r--r--db/migrate/20150425173433_add_default_snippet_visibility_to_app_settings.rb1
-rw-r--r--db/migrate/20150429002313_remove_abandoned_group_members_records.rb1
-rw-r--r--db/migrate/20150502064022_add_restricted_signup_domains_to_application_settings.rb1
-rw-r--r--db/migrate/20150509180749_convert_legacy_reference_notes.rb1
-rw-r--r--db/migrate/20150529111607_add_user_oauth_applications_to_application_settings.rb1
-rw-r--r--db/migrate/20150609141121_add_session_expire_delay_for_application_settings.rb1
-rw-r--r--db/migrate/20150620233230_add_default_otp_required_for_login_value.rb1
-rw-r--r--db/migrate/20150730122406_add_updated_by_to_issuables_and_notes.rb1
-rw-r--r--db/migrate/20150818213832_add_sent_notifications.rb1
-rw-r--r--db/migrate/20150915001905_enable_ssl_verification_by_default.rb1
-rw-r--r--db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb1
-rw-r--r--db/migrate/20150916114643_add_help_page_text_to_application_settings.rb1
-rw-r--r--db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb1
-rw-r--r--db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb1
-rw-r--r--db/migrate/20150920010715_add_consumed_timestep_to_users.rb1
-rw-r--r--db/migrate/20150920161119_add_line_code_to_sent_notification.rb1
-rw-r--r--db/migrate/20150924125150_add_project_id_to_ci_commit.rb1
-rw-r--r--db/migrate/20150924125436_migrate_project_id_for_ci_commits.rb1
-rw-r--r--db/migrate/20150930001110_merge_request_error_field.rb1
-rw-r--r--db/migrate/20150930095736_add_null_to_name_for_ci_projects.rb1
-rw-r--r--db/migrate/20151002112914_add_stage_idx_to_builds.rb1
-rw-r--r--db/migrate/20151002122929_add_ref_and_tag_to_builds.rb1
-rw-r--r--db/migrate/20151005075649_add_user_id_to_build.rb1
-rw-r--r--db/migrate/20151008143519_add_admin_notification_email_setting.rb1
-rw-r--r--db/migrate/20151013092124_add_artifacts_file_to_builds.rb1
-rw-r--r--db/migrate/20151019111551_fix_build_tags.rb1
-rw-r--r--db/migrate/20151019111703_fail_build_without_names.rb1
-rw-r--r--db/migrate/20151020173516_ci_limits_to_mysql.rb1
-rw-r--r--db/migrate/20151023112551_fail_build_with_empty_name.rb1
-rw-r--r--db/migrate/20151023144219_remove_satellites.rb1
-rw-r--r--db/migrate/20151103133339_add_shared_runners_setting.rb1
-rw-r--r--db/migrate/20151104105513_add_file_to_lfs_objects.rb1
-rw-r--r--db/migrate/20151109100728_add_max_artifacts_size_to_application_settings.rb1
-rw-r--r--db/migrate/20151110125604_add_import_error_to_project.rb1
-rw-r--r--db/migrate/20151201203948_raise_hook_url_limit.rb1
-rw-r--r--db/migrate/20151209144329_migrate_ci_web_hooks.rb1
-rw-r--r--db/migrate/20151209145909_migrate_ci_emails.rb1
-rw-r--r--db/migrate/20151210030143_add_unlock_token_to_user.rb1
-rw-r--r--db/migrate/20151210072243_add_runners_registration_token_to_application_settings.rb1
-rw-r--r--db/migrate/20151210125232_migrate_ci_slack_service.rb1
-rw-r--r--db/migrate/20151210125927_migrate_ci_hip_chat_service.rb1
-rw-r--r--db/migrate/20151210125929_add_project_id_to_ci.rb1
-rw-r--r--db/migrate/20151210125930_migrate_ci_to_project.rb1
-rw-r--r--db/migrate/20151218154042_add_tfa_to_application_settings.rb1
-rw-r--r--db/migrate/20151221234414_add_tfa_additional_fields.rb1
-rw-r--r--db/migrate/20151224123230_rename_emojis.rb1
-rw-r--r--db/migrate/20151228175719_add_recaptcha_to_application_settings.rb1
-rw-r--r--db/migrate/20151229102248_influxdb_udp_port_setting.rb1
-rw-r--r--db/migrate/20151230132518_add_artifacts_metadata_to_ci_build.rb1
-rw-r--r--db/migrate/20151231152326_add_akismet_to_application_settings.rb1
-rw-r--r--db/migrate/20160113111034_add_metrics_sample_interval.rb1
-rw-r--r--db/migrate/20160118155830_add_sentry_to_application_settings.rb1
-rw-r--r--db/migrate/20160120172143_add_base_commit_sha_to_merge_request_diffs.rb1
-rw-r--r--db/migrate/20160128233227_change_lfs_objects_size_column.rb1
-rw-r--r--db/migrate/20160129135155_remove_dot_atom_path_ending_of_projects.rb1
-rw-r--r--db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb1
-rw-r--r--db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb1
-rw-r--r--db/migrate/20160217100506_add_description_to_label.rb1
-rw-r--r--db/migrate/20160217174422_add_note_to_tasks.rb1
-rw-r--r--db/migrate/20160220123949_rename_tasks_to_todos.rb1
-rw-r--r--db/migrate/20160229193553_add_main_language_to_repository.rb1
-rw-r--r--db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb1
-rw-r--r--db/migrate/20160307221555_disallow_blank_line_code_on_note.rb1
-rw-r--r--db/migrate/20160316192622_change_target_id_to_null_on_todos.rb1
-rw-r--r--db/migrate/20160317092222_add_moved_to_to_issue.rb1
-rw-r--r--db/migrate/20160324020319_remove_todos_for_deleted_issues.rb1
-rw-r--r--db/migrate/20160328115649_migrate_new_notification_setting.rb1
-rw-r--r--db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb1
-rw-r--r--db/migrate/20160407120251_add_images_enabled_for_project.rb1
-rw-r--r--db/migrate/20160413115152_add_token_to_web_hooks.rb1
-rw-r--r--db/migrate/20160415062917_create_personal_access_tokens.rb1
-rw-r--r--db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb1
-rw-r--r--db/migrate/20160416182152_convert_award_note_to_emoji_award.rb1
-rw-r--r--db/migrate/20160419120017_add_metrics_packet_size.rb1
-rw-r--r--db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb1
-rw-r--r--db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb1
-rw-r--r--db/migrate/20160508215820_add_type_to_notes.rb1
-rw-r--r--db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb1
-rw-r--r--db/migrate/20160527020117_remove_notification_settings_for_deleted_projects.rb1
-rw-r--r--db/migrate/20160530150109_add_container_registry_token_expire_delay_to_application_settings.rb1
-rw-r--r--db/migrate/20160603180330_remove_duplicated_notification_settings.rb1
-rw-r--r--db/migrate/20160608155312_add_after_sign_up_text_to_application_settings.rb1
-rw-r--r--db/migrate/20160610204157_add_deployments.rb2
-rw-r--r--db/migrate/20160610204158_add_environments.rb2
-rw-r--r--db/migrate/20160615173316_add_enabled_git_access_protocols_to_application_settings.rb1
-rw-r--r--db/migrate/20160616102642_remove_duplicated_keys.rb1
-rw-r--r--db/migrate/20160824124900_add_table_issue_metrics.rb2
-rw-r--r--db/migrate/20160825052008_add_table_merge_request_metrics.rb2
-rw-r--r--db/migrate/20161113184239_create_user_chat_names_table.rb1
-rw-r--r--db/migrate/20170130221926_create_uploads.rb1
-rw-r--r--db/migrate/20170222143317_drop_ci_projects.rb1
-rw-r--r--db/migrate/20170301205639_remove_unused_ci_tables_and_columns.rb1
-rw-r--r--db/migrate/20170329095907_create_ci_trigger_schedules.rb1
-rw-r--r--db/migrate/20170402231018_remove_index_for_users_current_sign_in_at.rb2
-rw-r--r--db/migrate/20170425112128_create_pipeline_schedules_table.rb1
-rw-r--r--db/migrate/20170502091007_markdown_cache_limits_to_mysql.rb1
-rw-r--r--db/migrate/20170531202042_rename_users_ldap_email_to_external_email.rb1
-rw-r--r--db/migrate/20171106171453_add_timezone_to_issues_closed_at.rb1
-rw-r--r--db/migrate/20180201145907_migrate_remaining_issues_closed_at.rb1
-rw-r--r--db/migrate/20180214093516_create_badges.rb1
-rw-r--r--db/migrate/20180227182112_add_group_id_to_boards_ce.rb2
-rw-r--r--db/migrate/20180302152117_ensure_foreign_keys_on_clusters_applications.rb1
-rw-r--r--db/migrate/20180309160427_add_partial_indexes_on_todos.rb11
-rw-r--r--db/migrate/20180408143354_rename_users_rss_token_to_feed_token.rb1
-rw-r--r--db/migrate/20180417090132_add_index_constraints_to_internal_id_table.rb1
-rw-r--r--db/migrate/20180418053107_add_index_to_ci_job_artifacts_file_store.rb1
-rw-r--r--db/migrate/20180424090541_add_enforce_terms_to_application_settings.rb1
-rw-r--r--db/migrate/20180425075446_create_term_agreements.rb1
-rw-r--r--db/migrate/20180503131624_create_remote_mirrors.rb1
-rw-r--r--db/migrate/20180503150427_add_index_to_namespaces_runners_token.rb1
-rw-r--r--db/migrate/20180503175054_add_indexes_to_project_mirror_data.rb1
-rw-r--r--db/migrate/20180503193542_add_indexes_to_remote_mirror.rb1
-rw-r--r--db/migrate/20180511090724_add_index_on_ci_runners_runner_type.rb1
-rw-r--r--db/migrate/20180515005612_add_squash_to_merge_requests.rb1
-rw-r--r--db/migrate/20180515121227_create_notes_diff_files.rb1
-rw-r--r--db/migrate/20180521171529_increase_mysql_text_limit_for_gpg_keys.rb1
-rw-r--r--db/migrate/20180529093006_ensure_remote_mirror_columns.rb1
-rw-r--r--db/migrate/20180531185349_add_repository_languages.rb28
-rw-r--r--db/migrate/20180531220618_change_default_value_for_dsa_key_restriction.rb4
-rw-r--r--db/migrate/20180608110058_rename_merge_requests_allow_collaboration.rb1
-rw-r--r--db/migrate/20180629153018_create_site_statistics.rb18
-rw-r--r--db/migrate/20180702124358_remove_orphaned_routes.rb49
-rw-r--r--db/migrate/20180702134423_generate_missing_routes.rb143
-rw-r--r--db/migrate/20180705160945_add_file_format_to_ci_job_artifacts.rb7
-rw-r--r--db/migrate/20180710162338_add_foreign_key_from_notification_settings_to_users.rb30
-rw-r--r--db/migrate/20180713092803_create_user_statuses.rb20
-rw-r--r--db/migrate/20180718005113_add_instance_statistics_visibility_to_application_setting.rb20
-rw-r--r--db/migrate/20180722103201_add_private_profile_to_users.rb10
-rw-r--r--db/migrate/20180726172057_create_resource_label_events.rb18
-rw-r--r--db/migrate/gpg_keys_limits_to_mysql.rb1
-rw-r--r--db/migrate/limits_ci_build_trace_chunks_raw_data_for_mysql.rb2
-rw-r--r--db/migrate/limits_to_mysql.rb1
-rw-r--r--db/optional_migrations/composite_primary_keys.rb6
-rw-r--r--db/post_migrate/20161221153951_rename_reserved_project_names.rb2
-rw-r--r--db/post_migrate/20170313133418_rename_more_reserved_project_names.rb2
-rw-r--r--db/post_migrate/20170425130047_drop_ci_trigger_schedules_table.rb1
-rw-r--r--db/post_migrate/20170531203055_cleanup_users_ldap_email_rename.rb1
-rw-r--r--db/post_migrate/20170711145558_migrate_stages_statuses.rb1
-rw-r--r--db/post_migrate/20170830150306_drop_events_for_migration_table.rb1
-rw-r--r--db/post_migrate/20171106154015_remove_issues_branch_name.rb1
-rw-r--r--db/post_migrate/20171106180641_cleanup_add_timezone_to_issues_closed_at.rb1
-rw-r--r--db/post_migrate/20171128214150_schedule_populate_merge_request_metrics_with_events_data.rb1
-rw-r--r--db/post_migrate/20180223124427_build_user_interacted_projects_table.rb3
-rw-r--r--db/post_migrate/20180408143355_cleanup_users_rss_token_rename.rb1
-rw-r--r--db/post_migrate/20180424151928_fill_file_store.rb2
-rw-r--r--db/post_migrate/20180430143705_backfill_runner_type_for_ci_runners_post_migrate.rb1
-rw-r--r--db/post_migrate/20180502134117_migrate_import_attributes_data_from_projects_to_project_mirror_data.rb1
-rw-r--r--db/post_migrate/20180507083701_set_minimal_project_build_timeout.rb2
-rw-r--r--db/post_migrate/20180523125103_cleanup_merge_requests_allow_maintainer_to_push_rename.rb1
-rw-r--r--db/post_migrate/20180704145007_update_project_indexes.rb2
-rw-r--r--db/post_migrate/20180706223200_populate_site_statistics.rb25
-rw-r--r--db/schema.rb54
-rw-r--r--doc/README.md3
-rw-r--r--doc/administration/high_availability/gitlab.md5
-rw-r--r--doc/administration/high_availability/nfs.md22
-rw-r--r--doc/administration/img/raketasks/check_repos_output.pngbin19153 -> 0 bytes
-rw-r--r--doc/administration/index.md1
-rw-r--r--doc/administration/operations/fast_ssh_key_lookup.md7
-rw-r--r--doc/administration/operations/index.md5
-rw-r--r--doc/administration/operations/ssh_certificates.md165
-rw-r--r--doc/administration/raketasks/check.md79
-rw-r--r--doc/administration/repository_storage_types.md2
-rw-r--r--doc/administration/troubleshooting/debug.md18
-rw-r--r--doc/administration/uploads.md12
-rw-r--r--doc/api/issues.md1
-rw-r--r--doc/api/members.md75
-rw-r--r--doc/api/merge_requests.md17
-rw-r--r--doc/api/settings.md7
-rw-r--r--doc/api/users.md96
-rw-r--r--doc/ci/docker/using_docker_build.md10
-rw-r--r--doc/ci/examples/test-and-deploy-python-application-to-heroku.md2
-rw-r--r--doc/ci/yaml/README.md4
-rw-r--r--doc/development/api_graphql_styleguide.md174
-rw-r--r--doc/development/background_migrations.md8
-rw-r--r--doc/development/documentation/styleguide.md14
-rw-r--r--doc/development/fe_guide/performance.md14
-rw-r--r--doc/development/i18n/proofreader.md1
-rw-r--r--doc/development/performance.md54
-rw-r--r--doc/gitlab-basics/create-project.md2
-rw-r--r--doc/install/installation.md6
-rw-r--r--doc/install/kubernetes/preparation/tiller.md18
-rw-r--r--doc/raketasks/cleanup.md31
-rw-r--r--doc/security/rack_attack.md10
-rw-r--r--doc/university/high-availability/aws/README.md6
-rw-r--r--doc/update/11.1-to-11.2.md378
-rw-r--r--doc/update/patch_versions.md16
-rw-r--r--doc/user/admin_area/monitoring/health_check.md23
-rw-r--r--doc/user/profile/account/two_factor_authentication.md2
-rw-r--r--doc/user/profile/index.md22
-rw-r--r--doc/user/profile/personal_access_tokens.md2
-rw-r--r--doc/user/project/issue_board.md4
-rw-r--r--generator_templates/active_record/migration/create_table_migration.rb2
-rw-r--r--generator_templates/active_record/migration/migration.rb2
-rw-r--r--generator_templates/rails/post_deployment_migration/migration.rb2
-rw-r--r--lib/api/entities.rb19
-rw-r--r--lib/api/helpers/headers_helpers.rb6
-rw-r--r--lib/api/helpers/members_helpers.rb25
-rw-r--r--lib/api/internal.rb55
-rw-r--r--lib/api/issues.rb6
-rw-r--r--lib/api/keys.rb2
-rw-r--r--lib/api/members.rb22
-rw-r--r--lib/api/projects.rb67
-rw-r--r--lib/api/runner.rb34
-rw-r--r--lib/api/settings.rb150
-rw-r--r--lib/api/users.rb46
-rw-r--r--lib/backup/repository.rb171
-rw-r--r--lib/banzai/filter/sanitization_filter.rb2
-rw-r--r--lib/banzai/pipeline/emoji_pipeline.rb17
-rw-r--r--lib/feature.rb4
-rw-r--r--lib/gitlab/auth/activity.rb78
-rw-r--r--lib/gitlab/auth/blocked_user_tracker.rb36
-rw-r--r--lib/gitlab/bare_repository_import/importer.rb36
-rw-r--r--lib/gitlab/bare_repository_import/repository.rb2
-rw-r--r--lib/gitlab/ci/build/artifacts/gzip_file_adapter.rb46
-rw-r--r--lib/gitlab/ci/config/entry/artifacts.rb13
-rw-r--r--lib/gitlab/ci/config/entry/commands.rb13
-rw-r--r--lib/gitlab/ci/config/entry/reports.rb32
-rw-r--r--lib/gitlab/ci/config/entry/validators.rb14
-rw-r--r--lib/gitlab/ci/parsers.rb9
-rw-r--r--lib/gitlab/ci/parsers/junit.rb69
-rw-r--r--lib/gitlab/ci/reports/test_case.rb32
-rw-r--r--lib/gitlab/ci/reports/test_reports.rb39
-rw-r--r--lib/gitlab/ci/reports/test_reports_comparer.rb38
-rw-r--r--lib/gitlab/ci/reports/test_suite.rb54
-rw-r--r--lib/gitlab/ci/reports/test_suite_comparer.rb57
-rw-r--r--lib/gitlab/ci/status/build/failed.rb19
-rw-r--r--lib/gitlab/ci/trace.rb2
-rw-r--r--lib/gitlab/cleanup/project_upload_file_finder.rb66
-rw-r--r--lib/gitlab/cleanup/project_uploads.rb125
-rw-r--r--lib/gitlab/database.rb26
-rw-r--r--lib/gitlab/email/handler/create_issue_handler.rb4
-rw-r--r--lib/gitlab/email/handler/create_merge_request_handler.rb4
-rw-r--r--lib/gitlab/email/handler/create_note_handler.rb4
-rw-r--r--lib/gitlab/email/handler/unsubscribe_handler.rb4
-rw-r--r--lib/gitlab/git/conflict/resolver.rb2
-rw-r--r--lib/gitlab/git/repository.rb49
-rw-r--r--lib/gitlab/git/repository_mirroring.rb4
-rw-r--r--lib/gitlab/git/wiki.rb8
-rw-r--r--lib/gitlab/git_post_receive.rb12
-rw-r--r--lib/gitlab/gitaly_client.rb6
-rw-r--r--lib/gitlab/gitaly_client/ref_service.rb2
-rw-r--r--lib/gitlab/gitaly_client/repository_service.rb6
-rw-r--r--lib/gitlab/gitaly_client/wiki_service.rb4
-rw-r--r--lib/gitlab/github_import/importer/pull_requests_importer.rb2
-rw-r--r--lib/gitlab/gpg.rb12
-rw-r--r--lib/gitlab/graphql/authorize.rb9
-rw-r--r--lib/gitlab/graphql/authorize/authorize_resource.rb46
-rw-r--r--lib/gitlab/graphql/errors.rb1
-rw-r--r--lib/gitlab/graphql/mount_mutation.rb18
-rw-r--r--lib/gitlab/graphs/commits.rb2
-rw-r--r--lib/gitlab/hashed_storage/migrator.rb2
-rw-r--r--lib/gitlab/import_export/command_line_util.rb15
-rw-r--r--lib/gitlab/import_export/file_importer.rb24
-rw-r--r--lib/gitlab/import_export/import_export.yml1
-rw-r--r--lib/gitlab/import_export/importer.rb12
-rw-r--r--lib/gitlab/import_export/merge_request_parser.rb6
-rw-r--r--lib/gitlab/import_export/uploads_manager.rb5
-rw-r--r--lib/gitlab/import_sources.rb12
-rw-r--r--lib/gitlab/kubernetes/config_map.rb10
-rw-r--r--lib/gitlab/kubernetes/helm.rb2
-rw-r--r--lib/gitlab/kubernetes/helm/api.rb20
-rw-r--r--lib/gitlab/language_detection.rb68
-rw-r--r--lib/gitlab/middleware/basic_health_check.rb43
-rw-r--r--lib/gitlab/prometheus/metric.rb2
-rw-r--r--lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb1
-rw-r--r--lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb1
-rw-r--r--lib/gitlab/prometheus/queries/query_additional_metrics.rb8
-rw-r--r--lib/gitlab/template_helper.rb28
-rw-r--r--lib/support/nginx/registry-ssl2
-rw-r--r--lib/tasks/gitlab/check.rake25
-rw-r--r--lib/tasks/gitlab/cleanup.rake39
-rw-r--r--lib/tasks/gitlab/git.rake85
-rw-r--r--locale/bg/gitlab.po2388
-rw-r--r--locale/cs_CZ/gitlab.po2406
-rw-r--r--locale/de/gitlab.po2390
-rw-r--r--locale/eo/gitlab.po2388
-rw-r--r--locale/es/gitlab.po2394
-rw-r--r--locale/fil_PH/gitlab.po2384
-rw-r--r--locale/fr/gitlab.po2508
-rw-r--r--locale/gitlab.pot251
-rw-r--r--locale/gl_ES/gitlab.po2384
-rw-r--r--locale/id_ID/gitlab.po2373
-rw-r--r--locale/it/gitlab.po2400
-rw-r--r--locale/ja/gitlab.po3271
-rw-r--r--locale/ko/gitlab.po3125
-rw-r--r--locale/nl_NL/gitlab.po2396
-rw-r--r--locale/pl_PL/gitlab.po2406
-rw-r--r--locale/pt_BR/gitlab.po2608
-rw-r--r--locale/ru/gitlab.po2474
-rw-r--r--locale/tr_TR/gitlab.po2384
-rw-r--r--locale/uk/gitlab.po2508
-rw-r--r--locale/zh_CN/gitlab.po2629
-rw-r--r--locale/zh_HK/gitlab.po2379
-rw-r--r--locale/zh_TW/gitlab.po2409
-rw-r--r--package.json7
-rw-r--r--qa/qa/page/admin/settings/repository_storage.rb4
-rw-r--r--qa/qa/page/menu/side.rb6
-rw-r--r--qa/qa/page/project/show.rb2
-rw-r--r--qa/qa/runtime/browser.rb1
-rw-r--r--spec/config/object_store_settings_spec.rb29
-rw-r--r--spec/controllers/admin/services_controller_spec.rb2
-rw-r--r--spec/controllers/application_controller_spec.rb44
-rw-r--r--spec/controllers/boards/issues_controller_spec.rb4
-rw-r--r--spec/controllers/dashboard/milestones_controller_spec.rb19
-rw-r--r--spec/controllers/instance_statistics/cohorts_controller_spec.rb7
-rw-r--r--spec/controllers/instance_statistics/conversational_development_index_controller_spec.rb7
-rw-r--r--spec/controllers/profiles_controller_spec.rb9
-rw-r--r--spec/controllers/projects/commits_controller_spec.rb12
-rw-r--r--spec/controllers/projects/issues_controller_spec.rb23
-rw-r--r--spec/controllers/projects/labels_controller_spec.rb8
-rw-r--r--spec/controllers/projects/merge_requests_controller_spec.rb58
-rw-r--r--spec/controllers/projects/milestones_controller_spec.rb8
-rw-r--r--spec/controllers/projects/pipelines_controller_spec.rb14
-rw-r--r--spec/controllers/projects/wikis_controller_spec.rb124
-rw-r--r--spec/controllers/users_controller_spec.rb64
-rw-r--r--spec/factories/ci/builds.rb6
-rw-r--r--spec/factories/ci/job_artifacts.rb44
-rw-r--r--spec/factories/ci/pipelines.rb12
-rw-r--r--spec/factories/merge_requests.rb12
-rw-r--r--spec/factories/programming_languages.rb6
-rw-r--r--spec/factories/projects.rb2
-rw-r--r--spec/factories/repository_languages.rb7
-rw-r--r--spec/factories/resource_label_events.rb10
-rw-r--r--spec/factories/site_statistics.rb7
-rw-r--r--spec/factories/user_statuses.rb9
-rw-r--r--spec/features/dashboard/active_tab_spec.rb28
-rw-r--r--spec/features/dashboard/instance_statistics_spec.rb60
-rw-r--r--spec/features/groups/board_spec.rb35
-rw-r--r--spec/features/groups/members/list_members_spec.rb14
-rw-r--r--spec/features/instance_statistics/cohorts_spec.rb (renamed from spec/features/admin/admin_cohorts_spec.rb)4
-rw-r--r--spec/features/instance_statistics/conversational_development_index_spec.rb (renamed from spec/features/admin/admin_conversational_development_index_spec.rb)8
-rw-r--r--spec/features/issues/update_issues_spec.rb4
-rw-r--r--spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb5
-rw-r--r--spec/features/merge_requests/user_mass_updates_spec.rb4
-rw-r--r--spec/features/profiles/user_edit_profile_spec.rb27
-rw-r--r--spec/features/projects/commit/user_views_user_status_on_commit_spec.rb40
-rw-r--r--spec/features/projects/import_export/import_file_object_storage_spec.rb103
-rw-r--r--spec/features/projects/import_export/import_file_spec.rb1
-rw-r--r--spec/features/projects/issues/user_views_issue_spec.rb18
-rw-r--r--spec/features/projects/jobs_spec.rb14
-rw-r--r--spec/features/projects/labels/search_labels_spec.rb80
-rw-r--r--spec/features/projects/members/group_members_spec.rb8
-rw-r--r--spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb36
-rw-r--r--spec/features/projects/pipelines/pipeline_spec.rb6
-rw-r--r--spec/features/projects/snippets/show_spec.rb12
-rw-r--r--spec/features/projects/user_uses_shortcuts_spec.rb2
-rw-r--r--spec/features/projects/wiki/user_views_wiki_page_spec.rb20
-rw-r--r--spec/features/snippets/notes_on_personal_snippets_spec.rb11
-rw-r--r--spec/features/snippets/show_spec.rb8
-rw-r--r--spec/features/users/add_email_to_existing_account.rb15
-rw-r--r--spec/features/users/login_spec.rb241
-rw-r--r--spec/features/users/show_spec.rb62
-rw-r--r--spec/finders/labels_finder_spec.rb16
-rw-r--r--spec/finders/user_recent_events_finder_spec.rb15
-rw-r--r--spec/fixtures/api/schemas/entities/merge_request_widget.json4
-rw-r--r--spec/fixtures/api/schemas/entities/test_case.json15
-rw-r--r--spec/fixtures/api/schemas/entities/test_reports_comparer.json26
-rw-r--r--spec/fixtures/api/schemas/entities/test_suite_comparer.json32
-rw-r--r--spec/fixtures/emails/commands_in_reply.eml2
-rw-r--r--spec/fixtures/emails/commands_only_reply.eml2
-rw-r--r--spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references.eml2
-rw-r--r--spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references_with_a_comma.eml2
-rw-r--r--spec/fixtures/emails/update_commands_only_reply.eml2
-rw-r--r--spec/fixtures/emails/valid_reply.eml2
-rw-r--r--spec/fixtures/junit/junit.xml32
-rw-r--r--spec/fixtures/junit/junit.xml.gzbin0 -> 568 bytes
-rw-r--r--spec/fixtures/junit/junit_ant.xml.gzbin0 -> 1659 bytes
-rw-r--r--spec/fixtures/junit/junit_with_corrupted_data.xml.gzbin0 -> 461 bytes
-rw-r--r--spec/fixtures/junit/junit_with_three_testsuites.xml.gzbin0 -> 10106 bytes
-rw-r--r--spec/fixtures/junit/junit_with_three_testsuites_1.xml8
-rw-r--r--spec/fixtures/junit/junit_with_three_testsuites_2.xml6010
-rw-r--r--spec/fixtures/junit/junit_with_three_testsuites_3.xml8
-rw-r--r--spec/graphql/gitlab_schema_spec.rb2
-rw-r--r--spec/graphql/mutations/concerns/mutations/resolves_project_spec.rb19
-rw-r--r--spec/graphql/mutations/merge_requests/set_wip_spec.rb51
-rw-r--r--spec/graphql/types/mutation_type_spec.rb9
-rw-r--r--spec/helpers/snippets_helper_spec.rb4
-rw-r--r--spec/helpers/users_helper_spec.rb16
-rw-r--r--spec/javascripts/.eslintrc.yml1
-rw-r--r--spec/javascripts/autosave_spec.js10
-rw-r--r--spec/javascripts/avatar_helper_spec.js98
-rw-r--r--spec/javascripts/boards/boards_store_spec.js22
-rw-r--r--spec/javascripts/datetime_utility_spec.js1
-rw-r--r--spec/javascripts/diffs/components/diff_file_header_spec.js50
-rw-r--r--spec/javascripts/diffs/components/diff_line_gutter_content_spec.js8
-rw-r--r--spec/javascripts/diffs/components/diff_line_note_form_spec.js41
-rw-r--r--spec/javascripts/diffs/components/inline_diff_view_spec.js1
-rw-r--r--spec/javascripts/diffs/mock_data/diff_discussions.js11
-rw-r--r--spec/javascripts/diffs/store/getters_spec.js53
-rw-r--r--spec/javascripts/diffs/store/utils_spec.js20
-rw-r--r--spec/javascripts/fixtures/graph.html.haml1
-rw-r--r--spec/javascripts/helpers/vue_mount_component_helper.js10
-rw-r--r--spec/javascripts/ide/components/changed_file_icon_spec.js8
-rw-r--r--spec/javascripts/ide/components/commit_sidebar/actions_spec.js8
-rw-r--r--spec/javascripts/ide/components/commit_sidebar/list_item_spec.js16
-rw-r--r--spec/javascripts/ide/components/ide_spec.js27
-rw-r--r--spec/javascripts/ide/components/new_dropdown/index_spec.js15
-rw-r--r--spec/javascripts/ide/components/new_dropdown/modal_spec.js47
-rw-r--r--spec/javascripts/ide/components/repo_editor_spec.js3
-rw-r--r--spec/javascripts/ide/components/repo_file_spec.js19
-rw-r--r--spec/javascripts/ide/components/repo_tab_spec.js4
-rw-r--r--spec/javascripts/ide/stores/actions/file_spec.js17
-rw-r--r--spec/javascripts/ide/stores/actions_spec.js71
-rw-r--r--spec/javascripts/ide/stores/modules/commit/actions_spec.js6
-rw-r--r--spec/javascripts/ide/stores/modules/commit/getters_spec.js16
-rw-r--r--spec/javascripts/ide/stores/mutations/file_spec.js64
-rw-r--r--spec/javascripts/ide/stores/mutations_spec.js157
-rw-r--r--spec/javascripts/ide/stores/utils_spec.js62
-rw-r--r--spec/javascripts/issue_show/components/app_spec.js4
-rw-r--r--spec/javascripts/issue_show/components/edited_spec.js6
-rw-r--r--spec/javascripts/lib/utils/poll_spec.js39
-rw-r--r--spec/javascripts/lib/utils/text_utility_spec.js17
-rw-r--r--spec/javascripts/notes/components/discussion_counter_spec.js2
-rw-r--r--spec/javascripts/notes/components/noteable_discussion_spec.js56
-rw-r--r--spec/javascripts/notes/mock_data.js84
-rw-r--r--spec/javascripts/notes/stores/getters_spec.js155
-rw-r--r--spec/javascripts/pdf/page_spec.js2
-rw-r--r--spec/javascripts/pipelines/graph/dropdown_job_component_spec.js93
-rw-r--r--spec/javascripts/pipelines/graph/graph_component_spec.js43
-rw-r--r--spec/javascripts/pipelines/graph/job_component_spec.js26
-rw-r--r--spec/javascripts/pipelines/graph/mock_data.js2
-rw-r--r--spec/javascripts/pipelines/graph/stage_column_component_spec.js37
-rw-r--r--spec/javascripts/reports/components/grouped_test_reports_app_spec.js163
-rw-r--r--spec/javascripts/reports/components/modal_spec.js45
-rw-r--r--spec/javascripts/reports/components/test_issue_body_spec.js71
-rw-r--r--spec/javascripts/reports/mock_data/mock_data.js8
-rw-r--r--spec/javascripts/reports/mock_data/new_and_fixed_failures_report.json1
-rw-r--r--spec/javascripts/reports/mock_data/new_failures_report.json1
-rw-r--r--spec/javascripts/reports/mock_data/no_failures_report.json1
-rw-r--r--spec/javascripts/reports/store/actions_spec.js49
-rw-r--r--spec/javascripts/reports/store/mutations_spec.js31
-rw-r--r--spec/javascripts/reports/store/utils_spec.js138
-rw-r--r--spec/javascripts/sidebar/assignees_spec.js8
-rw-r--r--spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js17
-rw-r--r--spec/javascripts/test_bundle.js17
-rw-r--r--spec/javascripts/vue_shared/components/bar_chart_spec.js85
-rw-r--r--spec/javascripts/vue_shared/components/clipboard_button_spec.js54
-rw-r--r--spec/javascripts/vue_shared/components/code_block_spec.js33
-rw-r--r--spec/javascripts/vue_shared/components/gl_modal_spec.js34
-rw-r--r--spec/javascripts/vue_shared/components/identicon_spec.js17
-rw-r--r--spec/javascripts/vue_shared/components/panel_resizer_spec.js4
-rw-r--r--spec/javascripts/vue_shared/components/reports/report_issues_spec.js0
-rw-r--r--spec/javascripts/vue_shared/components/reports/report_section_spec.js33
-rw-r--r--spec/lib/backup/repository_spec.rb40
-rw-r--r--spec/lib/banzai/filter/sanitization_filter_spec.rb12
-rw-r--r--spec/lib/banzai/pipeline/emoji_pipeline_spec.rb21
-rw-r--r--spec/lib/gitlab/auth/activity_spec.rb30
-rw-r--r--spec/lib/gitlab/auth/blocked_user_tracker_spec.rb68
-rw-r--r--spec/lib/gitlab/background_migration/delete_diff_files_spec.rb2
-rw-r--r--spec/lib/gitlab/background_migration/schedule_diff_files_deletion_spec.rb2
-rw-r--r--spec/lib/gitlab/bare_repository_import/importer_spec.rb54
-rw-r--r--spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb56
-rw-r--r--spec/lib/gitlab/ci/config/entry/artifacts_spec.rb17
-rw-r--r--spec/lib/gitlab/ci/config/entry/commands_spec.rb3
-rw-r--r--spec/lib/gitlab/ci/config/entry/reports_spec.rb53
-rw-r--r--spec/lib/gitlab/ci/parsers/junit_spec.rb118
-rw-r--r--spec/lib/gitlab/ci/parsers_spec.rb23
-rw-r--r--spec/lib/gitlab/ci/reports/test_case_spec.rb90
-rw-r--r--spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb134
-rw-r--r--spec/lib/gitlab/ci/reports/test_reports_spec.rb132
-rw-r--r--spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb225
-rw-r--r--spec/lib/gitlab/ci/reports/test_suite_spec.rb120
-rw-r--r--spec/lib/gitlab/ci/status/build/failed_spec.rb27
-rw-r--r--spec/lib/gitlab/cleanup/project_uploads_spec.rb278
-rw-r--r--spec/lib/gitlab/database_spec.rb86
-rw-r--r--spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb2
-rw-r--r--spec/lib/gitlab/git/attributes_parser_spec.rb2
-rw-r--r--spec/lib/gitlab/git/blame_spec.rb2
-rw-r--r--spec/lib/gitlab/git/blob_snippet_spec.rb2
-rw-r--r--spec/lib/gitlab/git/blob_spec.rb2
-rw-r--r--spec/lib/gitlab/git/branch_spec.rb2
-rw-r--r--spec/lib/gitlab/git/commit_spec.rb2
-rw-r--r--spec/lib/gitlab/git/committer_with_hooks_spec.rb2
-rw-r--r--spec/lib/gitlab/git/compare_spec.rb2
-rw-r--r--spec/lib/gitlab/git/diff_collection_spec.rb2
-rw-r--r--spec/lib/gitlab/git/diff_spec.rb2
-rw-r--r--spec/lib/gitlab/git/hooks_service_spec.rb2
-rw-r--r--spec/lib/gitlab/git/index_spec.rb2
-rw-r--r--spec/lib/gitlab/git/remote_repository_spec.rb2
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb2
-rw-r--r--spec/lib/gitlab/git/tag_spec.rb2
-rw-r--r--spec/lib/gitlab/git/tree_spec.rb2
-rw-r--r--spec/lib/gitlab/git/wiki_spec.rb25
-rw-r--r--spec/lib/gitlab/gitaly_client/storage_service_spec.rb13
-rw-r--r--spec/lib/gitlab/gitaly_client/wiki_service_spec.rb22
-rw-r--r--spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb1
-rw-r--r--spec/lib/gitlab/graphql/authorize/authorize_resource_spec.rb103
-rw-r--r--spec/lib/gitlab/graphql/authorize_spec.rb20
-rw-r--r--spec/lib/gitlab/graphs/commits_spec.rb2
-rw-r--r--spec/lib/gitlab/import_export/all_models.yml3
-rw-r--r--spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb89
-rw-r--r--spec/lib/gitlab/import_export/file_importer_spec.rb4
-rw-r--r--spec/lib/gitlab/import_export/importer_object_storage_spec.rb115
-rw-r--r--spec/lib/gitlab/import_export/importer_spec.rb5
-rw-r--r--spec/lib/gitlab/import_export/project_tree_restorer_spec.rb2
-rw-r--r--spec/lib/gitlab/kubernetes/config_map_spec.rb6
-rw-r--r--spec/lib/gitlab/kubernetes/helm/api_spec.rb12
-rw-r--r--spec/lib/gitlab/kubernetes/helm/install_command_spec.rb6
-rw-r--r--spec/lib/gitlab/language_detection_spec.rb85
-rw-r--r--spec/lib/gitlab/middleware/basic_health_check_spec.rb57
-rw-r--r--spec/migrations/add_foreign_key_from_notification_settings_to_users_spec.rb36
-rw-r--r--spec/migrations/generate_missing_routes_spec.rb84
-rw-r--r--spec/models/ci/build_runner_session_spec.rb2
-rw-r--r--spec/models/ci/build_spec.rb225
-rw-r--r--spec/models/ci/job_artifact_spec.rb78
-rw-r--r--spec/models/ci/pipeline_spec.rb56
-rw-r--r--spec/models/clusters/applications/ingress_spec.rb24
-rw-r--r--spec/models/clusters/applications/jupyter_spec.rb24
-rw-r--r--spec/models/clusters/applications/prometheus_spec.rb79
-rw-r--r--spec/models/clusters/applications/runner_spec.rb24
-rw-r--r--spec/models/concerns/reactive_caching_spec.rb7
-rw-r--r--spec/models/concerns/routable_spec.rb33
-rw-r--r--spec/models/deploy_token_spec.rb8
-rw-r--r--spec/models/internal_id_spec.rb66
-rw-r--r--spec/models/label_spec.rb16
-rw-r--r--spec/models/merge_request_diff_spec.rb7
-rw-r--r--spec/models/merge_request_spec.rb101
-rw-r--r--spec/models/milestone_spec.rb20
-rw-r--r--spec/models/namespace_spec.rb38
-rw-r--r--spec/models/programming_language_spec.rb11
-rw-r--r--spec/models/project_feature_spec.rb42
-rw-r--r--spec/models/project_spec.rb50
-rw-r--r--spec/models/project_statistics_spec.rb6
-rw-r--r--spec/models/repository_language_spec.rb16
-rw-r--r--spec/models/repository_spec.rb6
-rw-r--r--spec/models/resource_label_event_spec.rb48
-rw-r--r--spec/models/site_statistic_spec.rb83
-rw-r--r--spec/models/user_spec.rb16
-rw-r--r--spec/models/user_status_spec.rb20
-rw-r--r--spec/policies/concerns/policy_actor_spec.rb13
-rw-r--r--spec/policies/global_policy_spec.rb34
-rw-r--r--spec/policies/user_policy_spec.rb4
-rw-r--r--spec/presenters/ci/build_runner_presenter_spec.rb86
-rw-r--r--spec/presenters/commit_status_presenter_spec.rb26
-rw-r--r--spec/requests/api/files_spec.rb30
-rw-r--r--spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb68
-rw-r--r--spec/requests/api/internal_spec.rb65
-rw-r--r--spec/requests/api/issues_spec.rb32
-rw-r--r--spec/requests/api/jobs_spec.rb4
-rw-r--r--spec/requests/api/members_spec.rb121
-rw-r--r--spec/requests/api/project_import_spec.rb2
-rw-r--r--spec/requests/api/runner_spec.rb54
-rw-r--r--spec/requests/api/settings_spec.rb5
-rw-r--r--spec/requests/api/users_spec.rb104
-rw-r--r--spec/requests/git_http_spec.rb8
-rw-r--r--spec/requests/jwt_controller_spec.rb19
-rw-r--r--spec/requests/lfs_http_spec.rb6
-rw-r--r--spec/routing/admin_routing_spec.rb2
-rw-r--r--spec/routing/instance_statistics_routing_spec.rb11
-rw-r--r--spec/routing/project_routing_spec.rb2
-rw-r--r--spec/serializers/pipeline_serializer_spec.rb4
-rw-r--r--spec/serializers/test_case_entity_spec.rb31
-rw-r--r--spec/serializers/test_reports_comparer_entity_spec.rb76
-rw-r--r--spec/serializers/test_reports_comparer_serializer_spec.rb62
-rw-r--r--spec/serializers/test_suite_comparer_entity_spec.rb86
-rw-r--r--spec/services/auth/container_registry_authentication_service_spec.rb140
-rw-r--r--spec/services/ci/compare_test_reports_service_spec.rb45
-rw-r--r--spec/services/ci/register_job_service_spec.rb33
-rw-r--r--spec/services/ci/retry_build_service_spec.rb4
-rw-r--r--spec/services/clusters/applications/check_installation_progress_service_spec.rb2
-rw-r--r--spec/services/git_push_service_spec.rb16
-rw-r--r--spec/services/issues/update_service_spec.rb17
-rw-r--r--spec/services/members/destroy_service_spec.rb5
-rw-r--r--spec/services/projects/create_from_template_service_spec.rb33
-rw-r--r--spec/services/projects/detect_repository_languages_service_spec.rb54
-rw-r--r--spec/services/projects/gitlab_projects_import_service_spec.rb56
-rw-r--r--spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb17
-rw-r--r--spec/services/projects/hashed_storage/migrate_repository_service_spec.rb3
-rw-r--r--spec/services/projects/hashed_storage_migration_service_spec.rb18
-rw-r--r--spec/services/projects/transfer_service_spec.rb6
-rw-r--r--spec/services/projects/update_pages_service_spec.rb2
-rw-r--r--spec/services/projects/update_service_spec.rb51
-rw-r--r--spec/services/resource_events/change_labels_service_spec.rb53
-rw-r--r--spec/services/todos/destroy/confidential_issue_service_spec.rb47
-rw-r--r--spec/services/todos/destroy/entity_leave_service_spec.rb135
-rw-r--r--spec/services/todos/destroy/private_features_service_spec.rb143
-rw-r--r--spec/services/todos/destroy/project_private_service_spec.rb38
-rw-r--r--spec/services/users/activity_service_spec.rb12
-rw-r--r--spec/services/users/set_status_service_spec.rb58
-rw-r--r--spec/services/users/update_service_spec.rb21
-rw-r--r--spec/support/helpers/graphql_helpers.rb61
-rw-r--r--spec/support/helpers/reactive_caching_helpers.rb4
-rw-r--r--spec/support/helpers/seed_helper.rb6
-rw-r--r--spec/support/helpers/stub_metrics.rb27
-rw-r--r--spec/support/helpers/test_env.rb8
-rw-r--r--spec/support/matchers/graphql_matchers.rb9
-rw-r--r--spec/support/matchers/metric_counter_matcher.rb11
-rw-r--r--spec/support/matchers/user_status_matcher.rb13
-rw-r--r--spec/support/prometheus/additional_metrics_shared_examples.rb7
-rw-r--r--spec/support/rspec.rb2
-rw-r--r--spec/support/shared_examples/helm_generated_script.rb2
-rw-r--r--spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb37
-rw-r--r--spec/support/shared_examples/models/atomic_internal_id_spec.rb14
-rw-r--r--spec/support/shared_examples/notify_shared_examples.rb6
-rw-r--r--spec/support/shared_examples/requests/graphql_shared_examples.rb2
-rw-r--r--spec/support/shared_examples/services/boards/issues_list_service.rb10
-rw-r--r--spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb54
-rw-r--r--spec/support/shared_examples/showing_user_status_shared_examples.rb11
-rw-r--r--spec/support/stored_repositories.rb4
-rw-r--r--spec/support/test_reports/test_reports_helper.rb93
-rw-r--r--spec/tasks/gitlab/backup_rake_spec.rb21
-rw-r--r--spec/tasks/gitlab/cleanup_rake_spec.rb86
-rw-r--r--spec/tasks/gitlab/git_rake_spec.rb30
-rw-r--r--spec/views/layouts/_head.html.haml_spec.rb33
-rw-r--r--spec/views/projects/merge_requests/show.html.haml_spec.rb11
-rw-r--r--spec/workers/concerns/gitlab/github_import/object_importer_spec.rb1
-rw-r--r--spec/workers/create_gpg_signature_worker_spec.rb47
-rw-r--r--spec/workers/detect_repository_languages_worker_spec.rb32
-rw-r--r--spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb1
-rw-r--r--spec/workers/gitlab/github_import/import_issue_worker_spec.rb1
-rw-r--r--spec/workers/gitlab/github_import/import_note_worker_spec.rb1
-rw-r--r--spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb1
-rw-r--r--spec/workers/project_migrate_hashed_storage_worker_spec.rb2
-rw-r--r--spec/workers/todos_destroyer/confidential_issue_worker_spec.rb12
-rw-r--r--spec/workers/todos_destroyer/entity_leave_worker_spec.rb12
-rw-r--r--spec/workers/todos_destroyer/private_features_worker_spec.rb12
-rw-r--r--spec/workers/todos_destroyer/project_private_worker_spec.rb12
-rw-r--r--vendor/assets/javascripts/xterm/encoding-indexes.js39
-rw-r--r--vendor/assets/javascripts/xterm/encoding.js3309
-rw-r--r--vendor/assets/javascripts/xterm/fit.js86
-rw-r--r--vendor/assets/javascripts/xterm/xterm.js2235
-rw-r--r--vendor/assets/stylesheets/xterm/xterm.css2206
-rw-r--r--yarn.lock286
1371 files changed, 74695 insertions, 14674 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index afe9da08495..fcf47421b01 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -439,17 +439,15 @@ setup-test-env:
- vendor/gitaly-ruby
danger-review:
- image: registry.gitlab.com/gitlab-org/gitaly/dangercontainer:latest
+ image: registry.gitlab.com/gitlab-org/gitlab-build-images:danger
stage: test
allow_failure: true
- before_script:
- - source scripts/utils.sh
- - retry gem install danger --no-ri --no-rdoc
cache: {}
+ dependencies: []
+ before_script: []
only:
- refs:
- - branches@gitlab-org/gitlab-ce
- - branches@gitlab-org/gitlab-ee
+ variables:
+ - $DANGER_GITLAB_API_TOKEN
except:
refs:
- master
diff --git a/.rubocop.yml b/.rubocop.yml
index 0582bfe8d70..c8b1ce327e2 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -10,9 +10,9 @@ AllCops:
Exclude:
- 'vendor/**/*'
- 'node_modules/**/*'
- - 'db/**/*'
- 'db/fixtures/**/*'
- - 'ee/db/**/*'
+ - 'db/schema.rb'
+ - 'ee/db/geo/schema.rb'
- 'tmp/**/*'
- 'bin/**/*'
- 'generator_templates/**/*'
@@ -34,6 +34,8 @@ Style/MutableConstant:
Naming/FileName:
ExpectMatchingDefinition: true
Exclude:
+ - 'db/**/*'
+ - 'ee/db/**/*'
- 'spec/**/*'
- 'features/**/*'
- 'ee/spec/**/*'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7cc047c40ed..7be28a9ac0e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,37 @@
documentation](doc/development/changelog.md) for instructions on adding your own
entry.
+## 11.1.4 (2018-07-30)
+
+### Fixed (4 changes, 1 of them is from the community)
+
+- Rework some projects table indexes around repository_storage field. !20377
+- Don't overflow project/group dropdown results. !20704 (gfyoung)
+- Fixed IDE not opening JSON files. !20798
+- Disable Gitaly timeouts when creating or restoring backups. !20810
+
+## 11.1.3 (2018-07-27)
+
+- Not released.
+
+## 11.1.2 (2018-07-26)
+
+### Security (4 changes)
+
+- Adding CSRF protection to Hooks test action.
+- Don't expose project names in GitHub counters.
+- Don't expose project names in various counters.
+- Fixed XSS in branch name in Web IDE.
+
+### Fixed (1 change)
+
+- Escapes milestone and label's names on flash notice when promoting them.
+
+### Performance (1 change)
+
+- Fix slow Markdown rendering. !20820
+
+
## 11.1.1 (2018-07-23)
### Fixed (2 changes)
@@ -253,6 +284,20 @@ entry.
- Use monospaced font for MR diff commit link ref on GFM.
+## 11.0.5 (2018-07-26)
+
+### Security (4 changes)
+
+- Don't expose project names in various counters.
+- Don't expose project names in GitHub counters.
+- Adding CSRF protection to Hooks test action.
+- Fixed XSS in branch name in Web IDE.
+
+### Fixed (1 change)
+
+- Escapes milestone and label's names on flash notice when promoting them.
+
+
## 11.0.4 (2018-07-17)
### Security (1 change)
diff --git a/Dangerfile b/Dangerfile
index 84b72673c50..9217610da8b 100644
--- a/Dangerfile
+++ b/Dangerfile
@@ -4,3 +4,4 @@ danger.import_dangerfile(path: 'danger/changelog')
danger.import_dangerfile(path: 'danger/specs')
danger.import_dangerfile(path: 'danger/gemfile')
danger.import_dangerfile(path: 'danger/database')
+danger.import_dangerfile(path: 'danger/frozen_string')
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 5fea1768541..bdc80994dd9 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-0.113.0
+0.115.0
diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION
index 69adf3456f8..8104cabd36f 100644
--- a/GITLAB_SHELL_VERSION
+++ b/GITLAB_SHELL_VERSION
@@ -1 +1 @@
-7.1.5
+8.1.0
diff --git a/GITLAB_WORKHORSE_VERSION b/GITLAB_WORKHORSE_VERSION
index 0062ac97180..831446cbd27 100644
--- a/GITLAB_WORKHORSE_VERSION
+++ b/GITLAB_WORKHORSE_VERSION
@@ -1 +1 @@
-5.0.0
+5.1.0
diff --git a/Gemfile b/Gemfile
index 47815f230d3..687039b9afb 100644
--- a/Gemfile
+++ b/Gemfile
@@ -306,7 +306,7 @@ group :metrics do
gem 'influxdb', '~> 0.2', require: false
# Prometheus
- gem 'prometheus-client-mmap', '~> 0.9.3'
+ gem 'prometheus-client-mmap', '~> 0.9.4'
gem 'raindrops', '~> 0.18'
end
@@ -400,6 +400,7 @@ gem 'email_reply_trimmer', '~> 0.1'
gem 'html2text'
gem 'ruby-prof', '~> 0.17.0'
+gem 'rbtrace', '~> 0.4', require: false
# OAuth
gem 'oauth2', '~> 1.4'
@@ -422,7 +423,7 @@ group :ed25519 do
end
# Gitaly GRPC client
-gem 'gitaly-proto', '~> 0.106.0', require: 'gitaly'
+gem 'gitaly-proto', '~> 0.109.0', require: 'gitaly'
gem 'grpc', '~> 1.11.0'
# Locked until https://github.com/google/protobuf/issues/4210 is closed
diff --git a/Gemfile.lock b/Gemfile.lock
index 22626c0071b..d8f878875f3 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -284,7 +284,7 @@ GEM
gettext_i18n_rails (>= 0.7.1)
po_to_json (>= 1.0.0)
rails (>= 3.2.0)
- gitaly-proto (0.106.0)
+ gitaly-proto (0.109.0)
google-protobuf (~> 3.1)
grpc (~> 1.10)
github-linguist (5.3.3)
@@ -375,7 +375,8 @@ GEM
google-protobuf (~> 3.1)
googleapis-common-protos-types (~> 1.0.0)
googleauth (>= 0.5.1, < 0.7)
- haml (4.0.7)
+ haml (5.0.4)
+ temple (>= 0.8.0)
tilt
haml_lint (0.26.0)
haml (>= 4.0, < 5.1)
@@ -397,7 +398,7 @@ GEM
hipchat (1.5.2)
httparty
mimemagic
- html-pipeline (2.8.3)
+ html-pipeline (2.8.4)
activesupport (>= 2)
nokogiri (>= 1.4)
html2text (0.2.0)
@@ -634,7 +635,7 @@ GEM
parser
unparser
procto (0.0.3)
- prometheus-client-mmap (0.9.3)
+ prometheus-client-mmap (0.9.4)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
@@ -700,6 +701,10 @@ GEM
ffi (>= 0.5.0, < 2)
rblineprof (0.3.6)
debugger-ruby_core_source (~> 1.3)
+ rbtrace (0.4.10)
+ ffi (>= 1.0.6)
+ msgpack (>= 0.4.3)
+ trollop (>= 1.16.2)
rdoc (6.0.4)
re2 (1.1.1)
recaptcha (3.0.0)
@@ -740,7 +745,7 @@ GEM
retriable (3.1.1)
rinku (2.0.0)
rotp (2.1.2)
- rouge (3.1.1)
+ rouge (3.2.0)
rqrcode (0.7.0)
chunky_png
rqrcode-rails3 (0.1.7)
@@ -911,6 +916,7 @@ GEM
parslet (~> 1.5.0)
toml-rb (1.0.0)
citrus (~> 3.0, > 3.0)
+ trollop (2.1.3)
truncato (0.7.10)
htmlentities (~> 4.3.1)
nokogiri (~> 1.8.0, >= 1.7.0)
@@ -1042,7 +1048,7 @@ DEPENDENCIES
gettext (~> 3.2.2)
gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3)
- gitaly-proto (~> 0.106.0)
+ gitaly-proto (~> 0.109.0)
github-linguist (~> 5.3.3)
gitlab-flowdock-git-hook (~> 1.0.1)
gitlab-gollum-lib (~> 4.2)
@@ -1120,7 +1126,7 @@ DEPENDENCIES
peek-sidekiq (~> 1.0.3)
pg (~> 0.18.2)
premailer-rails (~> 1.9.7)
- prometheus-client-mmap (~> 0.9.3)
+ prometheus-client-mmap (~> 0.9.4)
pry-byebug (~> 3.4.1)
pry-rails (~> 0.3.4)
rack-attack (~> 4.4.1)
@@ -1133,6 +1139,7 @@ DEPENDENCIES
rainbow (~> 2.2)
raindrops (~> 0.18)
rblineprof (~> 0.3.6)
+ rbtrace (~> 0.4)
rdoc (~> 6.0)
re2 (~> 1.1.1)
recaptcha (~> 3.0)
diff --git a/Gemfile.rails5.lock b/Gemfile.rails5.lock
index 5a0aaf05608..a763dcebe2d 100644
--- a/Gemfile.rails5.lock
+++ b/Gemfile.rails5.lock
@@ -287,7 +287,7 @@ GEM
gettext_i18n_rails (>= 0.7.1)
po_to_json (>= 1.0.0)
rails (>= 3.2.0)
- gitaly-proto (0.106.0)
+ gitaly-proto (0.109.0)
google-protobuf (~> 3.1)
grpc (~> 1.10)
github-linguist (5.3.3)
@@ -364,7 +364,7 @@ GEM
grape-entity (0.7.1)
activesupport (>= 4.0)
multi_json (>= 1.3.2)
- grape-path-helpers (1.0.5)
+ grape-path-helpers (1.0.6)
activesupport (>= 4, < 5.1)
grape (~> 1.0)
rake (~> 12)
@@ -378,7 +378,8 @@ GEM
google-protobuf (~> 3.1)
googleapis-common-protos-types (~> 1.0.0)
googleauth (>= 0.5.1, < 0.7)
- haml (4.0.7)
+ haml (5.0.4)
+ temple (>= 0.8.0)
tilt
haml_lint (0.26.0)
haml (>= 4.0, < 5.1)
@@ -400,7 +401,7 @@ GEM
hipchat (1.5.2)
httparty
mimemagic
- html-pipeline (2.8.3)
+ html-pipeline (2.8.4)
activesupport (>= 2)
nokogiri (>= 1.4)
html2text (0.2.0)
@@ -518,7 +519,7 @@ GEM
net-ssh (5.0.1)
netrc (0.11.0)
nio4r (2.3.1)
- nokogiri (1.8.3)
+ nokogiri (1.8.4)
mini_portile2 (~> 2.3.0)
nokogumbo (1.5.0)
nokogiri
@@ -638,7 +639,7 @@ GEM
parser
unparser
procto (0.0.3)
- prometheus-client-mmap (0.9.3)
+ prometheus-client-mmap (0.9.4)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
@@ -709,6 +710,10 @@ GEM
ffi (>= 0.5.0, < 2)
rblineprof (0.3.6)
debugger-ruby_core_source (~> 1.3)
+ rbtrace (0.4.10)
+ ffi (>= 1.0.6)
+ msgpack (>= 0.4.3)
+ trollop (>= 1.16.2)
rdoc (6.0.4)
re2 (1.1.1)
recaptcha (3.0.0)
@@ -749,7 +754,7 @@ GEM
retriable (3.1.1)
rinku (2.0.0)
rotp (2.1.2)
- rouge (3.1.1)
+ rouge (3.2.0)
rqrcode (0.7.0)
chunky_png
rqrcode-rails3 (0.1.7)
@@ -817,7 +822,7 @@ GEM
et-orbi (~> 1.0)
rugged (0.27.2)
safe_yaml (1.0.4)
- sanitize (4.6.5)
+ sanitize (4.6.6)
crass (~> 1.0.2)
nokogiri (>= 1.4.4)
nokogumbo (~> 1.4)
@@ -911,13 +916,14 @@ GEM
rack (>= 1, < 3)
thor (0.19.4)
thread_safe (0.3.6)
- tilt (2.0.6)
+ tilt (2.0.8)
timecop (0.8.1)
timfel-krb5-auth (0.8.3)
toml (0.1.2)
parslet (~> 1.5.0)
toml-rb (1.0.0)
citrus (~> 3.0, > 3.0)
+ trollop (2.1.3)
truncato (0.7.10)
htmlentities (~> 4.3.1)
nokogiri (~> 1.8.0, >= 1.7.0)
@@ -1052,7 +1058,7 @@ DEPENDENCIES
gettext (~> 3.2.2)
gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3)
- gitaly-proto (~> 0.106.0)
+ gitaly-proto (~> 0.109.0)
github-linguist (~> 5.3.3)
gitlab-flowdock-git-hook (~> 1.0.1)
gitlab-gollum-lib (~> 4.2)
@@ -1130,7 +1136,7 @@ DEPENDENCIES
peek-sidekiq (~> 1.0.3)
pg (~> 0.18.2)
premailer-rails (~> 1.9.7)
- prometheus-client-mmap (~> 0.9.3)
+ prometheus-client-mmap (~> 0.9.4)
pry-byebug (~> 3.4.1)
pry-rails (~> 0.3.4)
rack-attack (~> 4.4.1)
@@ -1144,6 +1150,7 @@ DEPENDENCIES
rainbow (~> 2.2)
raindrops (~> 0.18)
rblineprof (~> 0.3.6)
+ rbtrace (~> 0.4)
rdoc (~> 6.0)
re2 (~> 1.1.1)
recaptcha (~> 3.0)
diff --git a/app/assets/javascripts/autosave.js b/app/assets/javascripts/autosave.js
index e8c59fab609..fa00a3cf386 100644
--- a/app/assets/javascripts/autosave.js
+++ b/app/assets/javascripts/autosave.js
@@ -53,8 +53,4 @@ export default class Autosave {
return window.localStorage.removeItem(this.key);
}
-
- dispose() {
- this.field.off('input');
- }
}
diff --git a/app/assets/javascripts/badges/components/badge.vue b/app/assets/javascripts/badges/components/badge.vue
index b4bfaee1d85..155c348286c 100644
--- a/app/assets/javascripts/badges/components/badge.vue
+++ b/app/assets/javascripts/badges/components/badge.vue
@@ -93,7 +93,7 @@ export default {
<icon
:size="16"
class="prepend-left-8 append-right-8"
- name="doc_image"
+ name="doc-image"
aria-hidden="true"
/>
</div>
diff --git a/app/assets/javascripts/boards/components/board.js b/app/assets/javascripts/boards/components/board.js
index a2355d7fd5c..9ad451fa375 100644
--- a/app/assets/javascripts/boards/components/board.js
+++ b/app/assets/javascripts/boards/components/board.js
@@ -2,6 +2,9 @@
import Sortable from 'sortablejs';
import Vue from 'vue';
+import { n__ } from '~/locale';
+import Icon from '~/vue_shared/components/icon.vue';
+import Tooltip from '~/vue_shared/directives/tooltip';
import AccessorUtilities from '../../lib/utils/accessor';
import boardList from './board_list.vue';
import BoardBlankState from './board_blank_state.vue';
@@ -17,6 +20,10 @@ gl.issueBoards.Board = Vue.extend({
boardList,
'board-delete': gl.issueBoards.BoardDelete,
BoardBlankState,
+ Icon,
+ },
+ directives: {
+ Tooltip,
},
props: {
list: {
@@ -46,6 +53,12 @@ gl.issueBoards.Board = Vue.extend({
filter: Store.filter,
};
},
+ computed: {
+ counterTooltip() {
+ const { issuesSize } = this.list;
+ return `${n__('%d issue', '%d issues', issuesSize)}`;
+ },
+ },
watch: {
filter: {
handler() {
diff --git a/app/assets/javascripts/boards/components/board_new_issue.vue b/app/assets/javascripts/boards/components/board_new_issue.vue
index 271c6eac81a..1e3cd43d1f0 100644
--- a/app/assets/javascripts/boards/components/board_new_issue.vue
+++ b/app/assets/javascripts/boards/components/board_new_issue.vue
@@ -115,6 +115,7 @@ export default {
:id="list.id + '-title'"
class="form-control"
type="text"
+ name="issue_title"
autocomplete="off"
/>
<project-select
diff --git a/app/assets/javascripts/boards/components/project_select.vue b/app/assets/javascripts/boards/components/project_select.vue
index dc887db1e73..ef9844d5562 100644
--- a/app/assets/javascripts/boards/components/project_select.vue
+++ b/app/assets/javascripts/boards/components/project_select.vue
@@ -46,7 +46,7 @@ export default {
selectable: true,
data: (term, callback) => {
this.loading = true;
- return Api.groupProjects(this.groupId, term, projects => {
+ return Api.groupProjects(this.groupId, term, {}, projects => {
this.loading = false;
callback(projects);
});
diff --git a/app/assets/javascripts/boards/index.js b/app/assets/javascripts/boards/index.js
index 200d1923635..bc263cbbfea 100644
--- a/app/assets/javascripts/boards/index.js
+++ b/app/assets/javascripts/boards/index.js
@@ -1,5 +1,3 @@
-/* eslint-disable quote-props, comma-dangle */
-
import $ from 'jquery';
import _ from 'underscore';
import Vue from 'vue';
@@ -47,7 +45,7 @@ export default () => {
gl.IssueBoardsApp = new Vue({
el: $boardApp,
components: {
- 'board': gl.issueBoards.Board,
+ board: gl.issueBoards.Board,
'board-sidebar': gl.issueBoards.BoardSidebar,
BoardAddIssuesModal,
},
@@ -65,11 +63,11 @@ export default () => {
defaultAvatar: $boardApp.dataset.defaultAvatar,
},
computed: {
- detailIssueVisible () {
+ detailIssueVisible() {
return Object.keys(this.detailIssue.issue).length;
},
},
- created () {
+ created() {
gl.boardService = new BoardService({
boardsEndpoint: this.boardsEndpoint,
listsEndpoint: this.listsEndpoint,
@@ -89,15 +87,16 @@ export default () => {
eventHub.$off('clearDetailIssue', this.clearDetailIssue);
sidebarEventHub.$off('toggleSubscription', this.toggleSubscription);
},
- mounted () {
+ mounted() {
this.filterManager = new FilteredSearchBoards(Store.filter, true, Store.cantEdit);
this.filterManager.setup();
Store.disabled = this.disabled;
- gl.boardService.all()
+ gl.boardService
+ .all()
.then(res => res.data)
- .then((data) => {
- data.forEach((board) => {
+ .then(data => {
+ data.forEach(board => {
const list = Store.addList(board, this.defaultAvatar);
if (list.type === 'closed') {
@@ -126,7 +125,7 @@ export default () => {
newIssue.setFetchingState('subscriptions', true);
BoardService.getIssueInfo(sidebarInfoEndpoint)
.then(res => res.data)
- .then((data) => {
+ .then(data => {
newIssue.setFetchingState('subscriptions', false);
newIssue.updateData({
subscribed: data.subscribed,
@@ -159,7 +158,7 @@ export default () => {
Flash(__('An error occurred when toggling the notification subscription'));
});
}
- }
+ },
},
});
@@ -168,77 +167,81 @@ export default () => {
data: {
filters: Store.state.filters,
},
- mounted () {
+ mounted() {
gl.issueBoards.newListDropdownInit();
},
});
- gl.IssueBoardsModalAddBtn = new Vue({
- el: document.getElementById('js-add-issues-btn'),
- mixins: [modalMixin],
- data() {
- return {
- modal: ModalStore.store,
- store: Store.state,
- canAdminList: this.$options.el.hasAttribute('data-can-admin-list'),
- };
- },
- computed: {
- disabled() {
- if (!this.store) {
- return true;
- }
- return !this.store.lists.filter(list => !list.preset).length;
+ const issueBoardsModal = document.getElementById('js-add-issues-btn');
+
+ if (issueBoardsModal) {
+ gl.IssueBoardsModalAddBtn = new Vue({
+ el: issueBoardsModal,
+ mixins: [modalMixin],
+ data() {
+ return {
+ modal: ModalStore.store,
+ store: Store.state,
+ canAdminList: this.$options.el.hasAttribute('data-can-admin-list'),
+ };
},
- tooltipTitle() {
- if (this.disabled) {
- return 'Please add a list to your board first';
- }
+ computed: {
+ disabled() {
+ if (!this.store) {
+ return true;
+ }
+ return !this.store.lists.filter(list => !list.preset).length;
+ },
+ tooltipTitle() {
+ if (this.disabled) {
+ return 'Please add a list to your board first';
+ }
- return '';
+ return '';
+ },
},
- },
- watch: {
- disabled() {
+ watch: {
+ disabled() {
+ this.updateTooltip();
+ },
+ },
+ mounted() {
this.updateTooltip();
},
- },
- mounted() {
- this.updateTooltip();
- },
- methods: {
- updateTooltip() {
- const $tooltip = $(this.$refs.addIssuesButton);
-
- this.$nextTick(() => {
- if (this.disabled) {
- $tooltip.tooltip();
- } else {
- $tooltip.tooltip('dispose');
+ methods: {
+ updateTooltip() {
+ const $tooltip = $(this.$refs.addIssuesButton);
+
+ this.$nextTick(() => {
+ if (this.disabled) {
+ $tooltip.tooltip();
+ } else {
+ $tooltip.tooltip('dispose');
+ }
+ });
+ },
+ openModal() {
+ if (!this.disabled) {
+ this.toggleModal(true);
}
- });
- },
- openModal() {
- if (!this.disabled) {
- this.toggleModal(true);
- }
+ },
},
- },
- template: `
- <div class="board-extra-actions">
- <button
- class="btn btn-create prepend-left-10"
- type="button"
- data-placement="bottom"
- ref="addIssuesButton"
- :class="{ 'disabled': disabled }"
- :title="tooltipTitle"
- :aria-disabled="disabled"
- v-if="canAdminList"
- @click="openModal">
- Add issues
- </button>
- </div>
- `,
- });
+ template: `
+ <div class="board-extra-actions">
+ <button
+ class="btn btn-create prepend-left-10"
+ type="button"
+ data-placement="bottom"
+ ref="addIssuesButton"
+ :class="{ 'disabled': disabled }"
+ :title="tooltipTitle"
+ :aria-disabled="disabled"
+ v-if="canAdminList"
+ @click="openModal">
+ Add issues
+ </button>
+ </div>
+ `,
+ });
+ }
};
diff --git a/app/assets/javascripts/boards/models/list.js b/app/assets/javascripts/boards/models/list.js
index 4f05a0e4282..050cbd8db48 100644
--- a/app/assets/javascripts/boards/models/list.js
+++ b/app/assets/javascripts/boards/models/list.js
@@ -136,6 +136,8 @@ class List {
}
this.createIssues(data.issues);
+
+ return data;
});
}
diff --git a/app/assets/javascripts/boards/stores/boards_store.js b/app/assets/javascripts/boards/stores/boards_store.js
index 333338489bc..76467564608 100644
--- a/app/assets/javascripts/boards/stores/boards_store.js
+++ b/app/assets/javascripts/boards/stores/boards_store.js
@@ -125,11 +125,17 @@ gl.issueBoards.BoardsStore = {
} else if (listTo.type === 'backlog' && listFrom.type === 'assignee') {
issue.removeAssignee(listFrom.assignee);
listFrom.removeIssue(issue);
- } else if ((listTo.type !== 'label' && listFrom.type === 'assignee') ||
- (listTo.type !== 'assignee' && listFrom.type === 'label')) {
+ } else if (this.shouldRemoveIssue(listFrom, listTo)) {
listFrom.removeIssue(issue);
}
},
+ shouldRemoveIssue(listFrom, listTo) {
+ return (
+ (listTo.type !== 'label' && listFrom.type === 'assignee') ||
+ (listTo.type !== 'assignee' && listFrom.type === 'label') ||
+ (listFrom.type === 'backlog')
+ );
+ },
moveIssueInList (list, issue, oldIndex, newIndex, idArray) {
const beforeId = parseInt(idArray[newIndex - 1], 10) || null;
const afterId = parseInt(idArray[newIndex + 1], 10) || null;
diff --git a/app/assets/javascripts/commons/gitlab_ui.js b/app/assets/javascripts/commons/gitlab_ui.js
new file mode 100644
index 00000000000..923c036f5a4
--- /dev/null
+++ b/app/assets/javascripts/commons/gitlab_ui.js
@@ -0,0 +1,4 @@
+import Vue from 'vue';
+import progressBar from '@gitlab-org/gitlab-ui/dist/base/progress_bar';
+
+Vue.component('gl-progress-bar', progressBar);
diff --git a/app/assets/javascripts/commons/index.js b/app/assets/javascripts/commons/index.js
index 0d2fe2925d8..ea945cd3fa5 100644
--- a/app/assets/javascripts/commons/index.js
+++ b/app/assets/javascripts/commons/index.js
@@ -3,4 +3,5 @@ import './polyfills';
import './jquery';
import './bootstrap';
import './vue';
+import './gitlab_ui';
import '../lib/utils/axios_utils';
diff --git a/app/assets/javascripts/diffs/components/diff_discussions.vue b/app/assets/javascripts/diffs/components/diff_discussions.vue
index e64d5511d78..20483161033 100644
--- a/app/assets/javascripts/diffs/components/diff_discussions.vue
+++ b/app/assets/javascripts/diffs/components/diff_discussions.vue
@@ -30,7 +30,6 @@ export default {
:render-header="false"
:render-diff-file="false"
:always-expanded="true"
- :discussions-by-diff-order="true"
/>
</ul>
</div>
diff --git a/app/assets/javascripts/diffs/components/diff_file_header.vue b/app/assets/javascripts/diffs/components/diff_file_header.vue
index c494d3bcd3e..d3ffbe0415a 100644
--- a/app/assets/javascripts/diffs/components/diff_file_header.vue
+++ b/app/assets/javascripts/diffs/components/diff_file_header.vue
@@ -50,7 +50,7 @@ export default {
};
},
computed: {
- ...mapGetters('diffs', ['diffHasExpandedDiscussions']),
+ ...mapGetters('diffs', ['diffHasExpandedDiscussions', 'diffHasDiscussions']),
hasExpandedDiscussions() {
return this.diffHasExpandedDiscussions(this.diffFile);
},
@@ -108,6 +108,9 @@ export default {
false,
);
},
+ gfmCopyText() {
+ return `\`${this.diffFile.filePath}\``;
+ },
},
methods: {
...mapActions('diffs', ['toggleFileDiscussions']),
@@ -191,6 +194,7 @@ export default {
<clipboard-button
:title="__('Copy file path to clipboard')"
:text="diffFile.filePath"
+ :gfm="gfmCopyText"
css-class="btn-default btn-transparent btn-clipboard"
/>
@@ -217,6 +221,7 @@ export default {
v-if="diffFile.blob && diffFile.blob.readableText"
>
<button
+ :disabled="!diffHasDiscussions(diffFile)"
:class="{ active: hasExpandedDiscussions }"
:title="s__('MergeRequests|Toggle comments for this file')"
class="js-btn-vue-toggle-comments btn"
diff --git a/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue b/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue
index d184a76f038..ad838a32518 100644
--- a/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue
+++ b/app/assets/javascripts/diffs/components/diff_line_gutter_content.vue
@@ -71,18 +71,13 @@ export default {
required: false,
default: false,
},
- discussions: {
- type: Array,
- required: false,
- default: () => [],
- },
},
computed: {
...mapState({
diffViewType: state => state.diffs.diffViewType,
diffFiles: state => state.diffs.diffFiles,
}),
- ...mapGetters(['isLoggedIn']),
+ ...mapGetters(['isLoggedIn', 'discussionsByLineCode']),
lineHref() {
return this.lineCode ? `#${this.lineCode}` : '#';
},
@@ -92,19 +87,24 @@ export default {
this.showCommentButton &&
!this.isMatchLine &&
!this.isContextLine &&
- !this.isMetaLine &&
- !this.hasDiscussions
+ !this.hasDiscussions &&
+ !this.isMetaLine
);
},
+ discussions() {
+ return this.discussionsByLineCode[this.lineCode] || [];
+ },
hasDiscussions() {
return this.discussions.length > 0;
},
shouldShowAvatarsOnGutter() {
+ let render = this.hasDiscussions && this.showCommentButton;
+
if (!this.lineType && this.linePosition === LINE_POSITION_RIGHT) {
- return false;
+ render = false;
}
- return this.hasDiscussions && this.showCommentButton;
+ return render;
},
},
methods: {
@@ -189,6 +189,7 @@ export default {
</button>
<a
v-if="lineNumber"
+ v-once
:data-linenumber="lineNumber"
:href="lineHref"
>
diff --git a/app/assets/javascripts/diffs/components/diff_line_note_form.vue b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
index cbe4551d06b..32f9516d332 100644
--- a/app/assets/javascripts/diffs/components/diff_line_note_form.vue
+++ b/app/assets/javascripts/diffs/components/diff_line_note_form.vue
@@ -1,17 +1,17 @@
<script>
+import $ from 'jquery';
import { mapState, mapGetters, mapActions } from 'vuex';
import createFlash from '~/flash';
import { s__ } from '~/locale';
import noteForm from '../../notes/components/note_form.vue';
import { getNoteFormData } from '../store/utils';
-import autosave from '../../notes/mixins/autosave';
-import { DIFF_NOTE_TYPE } from '../constants';
+import Autosave from '../../autosave';
+import { DIFF_NOTE_TYPE, NOTE_TYPE } from '../constants';
export default {
components: {
noteForm,
},
- mixins: [autosave],
props: {
diffFileHash: {
type: String,
@@ -41,35 +41,28 @@ export default {
},
mounted() {
if (this.isLoggedIn) {
+ const noteableData = this.getNoteableData;
const keys = [
- this.noteableData.diff_head_sha,
+ NOTE_TYPE,
+ this.noteableType,
+ noteableData.id,
+ noteableData.diff_head_sha,
DIFF_NOTE_TYPE,
- this.noteableData.source_project_id,
+ noteableData.source_project_id,
this.line.lineCode,
];
- this.initAutoSave(this.noteableData, keys);
+ this.autosave = new Autosave($(this.$refs.noteForm.$refs.textarea), keys);
}
},
methods: {
...mapActions('diffs', ['cancelCommentForm']),
...mapActions(['saveNote', 'refetchDiscussionById']),
- handleCancelCommentForm(shouldConfirm, isDirty) {
- if (shouldConfirm && isDirty) {
- const msg = s__('Notes|Are you sure you want to cancel creating this comment?');
-
- // eslint-disable-next-line no-alert
- if (!window.confirm(msg)) {
- return;
- }
- }
-
+ handleCancelCommentForm() {
+ this.autosave.reset();
this.cancelCommentForm({
lineCode: this.line.lineCode,
});
- this.$nextTick(() => {
- this.resetAutoSave();
- });
},
handleSaveNote(note) {
const selectedDiffFile = this.getDiffFileByHash(this.diffFileHash);
diff --git a/app/assets/javascripts/diffs/components/diff_table_cell.vue b/app/assets/javascripts/diffs/components/diff_table_cell.vue
index e8e8ddc6c5e..5962f30d9bb 100644
--- a/app/assets/javascripts/diffs/components/diff_table_cell.vue
+++ b/app/assets/javascripts/diffs/components/diff_table_cell.vue
@@ -67,11 +67,6 @@ export default {
required: false,
default: false,
},
- discussions: {
- type: Array,
- required: false,
- default: () => [],
- },
},
computed: {
...mapGetters(['isLoggedIn']),
@@ -141,7 +136,6 @@ export default {
:is-match-line="isMatchLine"
:is-context-line="isContentLine"
:is-meta-line="isMetaLine"
- :discussions="discussions"
/>
</td>
</template>
diff --git a/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue b/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue
index 1b5ae5e9f75..ca265dd892c 100644
--- a/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue
+++ b/app/assets/javascripts/diffs/components/inline_diff_comment_row.vue
@@ -1,5 +1,5 @@
<script>
-import { mapState } from 'vuex';
+import { mapState, mapGetters } from 'vuex';
import diffDiscussions from './diff_discussions.vue';
import diffLineNoteForm from './diff_line_note_form.vue';
@@ -21,22 +21,18 @@ export default {
type: Number,
required: true,
},
- discussions: {
- type: Array,
- required: false,
- default: () => [],
- },
},
computed: {
...mapState({
diffLineCommentForms: state => state.diffs.diffLineCommentForms,
}),
+ ...mapGetters(['discussionsByLineCode']),
+ discussions() {
+ return this.discussionsByLineCode[this.line.lineCode] || [];
+ },
className() {
return this.discussions.length ? '' : 'js-temp-notes-holder';
},
- hasCommentForm() {
- return this.diffLineCommentForms[this.line.lineCode];
- },
},
};
</script>
@@ -57,7 +53,7 @@ export default {
:discussions="discussions"
/>
<diff-line-note-form
- v-if="hasCommentForm"
+ v-if="diffLineCommentForms[line.lineCode]"
:diff-file-hash="diffFileHash"
:line="line"
:note-target-line="line"
diff --git a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue
index 32d65ff994f..0197a510ef1 100644
--- a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue
+++ b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue
@@ -33,11 +33,6 @@ export default {
required: false,
default: false,
},
- discussions: {
- type: Array,
- required: false,
- default: () => [],
- },
},
data() {
return {
@@ -94,7 +89,6 @@ export default {
:is-bottom="isBottom"
:is-hover="isHover"
:show-comment-button="true"
- :discussions="discussions"
class="diff-line-num old_line"
/>
<diff-table-cell
@@ -104,10 +98,10 @@ export default {
:line-type="newLineType"
:is-bottom="isBottom"
:is-hover="isHover"
- :discussions="discussions"
class="diff-line-num new_line"
/>
<td
+ v-once
:class="line.type"
class="line_content"
v-html="line.richText"
diff --git a/app/assets/javascripts/diffs/components/inline_diff_view.vue b/app/assets/javascripts/diffs/components/inline_diff_view.vue
index 5f30cc57a59..9fd19b74cd7 100644
--- a/app/assets/javascripts/diffs/components/inline_diff_view.vue
+++ b/app/assets/javascripts/diffs/components/inline_diff_view.vue
@@ -20,11 +20,8 @@ export default {
},
},
computed: {
- ...mapGetters('diffs', [
- 'commitId',
- 'shouldRenderInlineCommentRow',
- 'singleDiscussionByLineCode',
- ]),
+ ...mapGetters('diffs', ['commitId']),
+ ...mapGetters(['discussionsByLineCode']),
...mapState({
diffLineCommentForms: state => state.diffs.diffLineCommentForms,
}),
@@ -38,7 +35,18 @@ export default {
return window.gon.user_color_scheme;
},
},
- methods: {},
+ methods: {
+ shouldRenderCommentRow(line) {
+ if (this.diffLineCommentForms[line.lineCode]) return true;
+
+ const lineDiscussions = this.discussionsByLineCode[line.lineCode];
+ if (lineDiscussions === undefined) {
+ return false;
+ }
+
+ return lineDiscussions.every(discussion => discussion.expanded);
+ },
+ },
};
</script>
@@ -57,15 +65,13 @@ export default {
:line="line"
:is-bottom="index + 1 === diffLinesLength"
:key="line.lineCode"
- :discussions="singleDiscussionByLineCode(line.lineCode)"
/>
<inline-diff-comment-row
- v-if="shouldRenderInlineCommentRow(line)"
+ v-if="shouldRenderCommentRow(line)"
:diff-file-hash="diffFile.fileHash"
:line="line"
:line-index="index"
:key="index"
- :discussions="singleDiscussionByLineCode(line.lineCode)"
/>
</template>
</tbody>
diff --git a/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue
index bb9a65c83fa..cc5248c25d9 100644
--- a/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue
+++ b/app/assets/javascripts/diffs/components/parallel_diff_comment_row.vue
@@ -1,5 +1,5 @@
<script>
-import { mapState } from 'vuex';
+import { mapState, mapGetters } from 'vuex';
import diffDiscussions from './diff_discussions.vue';
import diffLineNoteForm from './diff_line_note_form.vue';
@@ -21,51 +21,48 @@ export default {
type: Number,
required: true,
},
- leftDiscussions: {
- type: Array,
- required: false,
- default: () => [],
- },
- rightDiscussions: {
- type: Array,
- required: false,
- default: () => [],
- },
},
computed: {
...mapState({
diffLineCommentForms: state => state.diffs.diffLineCommentForms,
}),
+ ...mapGetters(['discussionsByLineCode']),
leftLineCode() {
return this.line.left.lineCode;
},
rightLineCode() {
return this.line.right.lineCode;
},
+ hasDiscussion() {
+ const discussions = this.discussionsByLineCode;
+
+ return discussions[this.leftLineCode] || discussions[this.rightLineCode];
+ },
hasExpandedDiscussionOnLeft() {
- const discussions = this.leftDiscussions;
+ const discussions = this.discussionsByLineCode[this.leftLineCode];
+
return discussions ? discussions.every(discussion => discussion.expanded) : false;
},
hasExpandedDiscussionOnRight() {
- const discussions = this.rightDiscussions;
+ const discussions = this.discussionsByLineCode[this.rightLineCode];
+
return discussions ? discussions.every(discussion => discussion.expanded) : false;
},
hasAnyExpandedDiscussion() {
return this.hasExpandedDiscussionOnLeft || this.hasExpandedDiscussionOnRight;
},
shouldRenderDiscussionsOnLeft() {
- return this.leftDiscussions && this.hasExpandedDiscussionOnLeft;
+ return this.discussionsByLineCode[this.leftLineCode] && this.hasExpandedDiscussionOnLeft;
},
shouldRenderDiscussionsOnRight() {
- return this.rightDiscussions && this.hasExpandedDiscussionOnRight && this.line.right.type;
- },
- showRightSideCommentForm() {
- return this.line.right.type && this.diffLineCommentForms[this.rightLineCode];
+ return (
+ this.discussionsByLineCode[this.rightLineCode] &&
+ this.hasExpandedDiscussionOnRight &&
+ this.line.right.type
+ );
},
className() {
- return this.leftDiscussions.length > 0 || this.rightDiscussions.length > 0
- ? ''
- : 'js-temp-notes-holder';
+ return this.hasDiscussion ? '' : 'js-temp-notes-holder';
},
},
};
@@ -83,12 +80,13 @@ export default {
class="content"
>
<diff-discussions
- v-if="leftDiscussions.length"
- :discussions="leftDiscussions"
+ v-if="discussionsByLineCode[leftLineCode].length"
+ :discussions="discussionsByLineCode[leftLineCode]"
/>
</div>
<diff-line-note-form
- v-if="diffLineCommentForms[leftLineCode]"
+ v-if="diffLineCommentForms[leftLineCode] &&
+ diffLineCommentForms[leftLineCode]"
:diff-file-hash="diffFileHash"
:line="line.left"
:note-target-line="line.left"
@@ -102,12 +100,13 @@ export default {
class="content"
>
<diff-discussions
- v-if="rightDiscussions.length"
- :discussions="rightDiscussions"
+ v-if="discussionsByLineCode[rightLineCode].length"
+ :discussions="discussionsByLineCode[rightLineCode]"
/>
</div>
<diff-line-note-form
- v-if="showRightSideCommentForm"
+ v-if="diffLineCommentForms[rightLineCode] &&
+ diffLineCommentForms[rightLineCode] && line.right.type"
:diff-file-hash="diffFileHash"
:line="line.right"
:note-target-line="line.right"
diff --git a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
index d4e54c2bd00..ee5bb4d8d05 100644
--- a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
+++ b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue
@@ -36,16 +36,6 @@ export default {
required: false,
default: false,
},
- leftDiscussions: {
- type: Array,
- required: false,
- default: () => [],
- },
- rightDiscussions: {
- type: Array,
- required: false,
- default: () => [],
- },
},
data() {
return {
@@ -126,10 +116,10 @@ export default {
:is-hover="isLeftHover"
:show-comment-button="true"
:diff-view-type="parallelDiffViewType"
- :discussions="leftDiscussions"
class="diff-line-num old_line"
/>
<td
+ v-once
:id="line.left.lineCode"
:class="parallelViewLeftLineType"
class="line_content parallel left-side"
@@ -147,10 +137,10 @@ export default {
:is-hover="isRightHover"
:show-comment-button="true"
:diff-view-type="parallelDiffViewType"
- :discussions="rightDiscussions"
class="diff-line-num new_line"
/>
<td
+ v-once
:id="line.right.lineCode"
:class="line.right.type"
class="line_content parallel right-side"
diff --git a/app/assets/javascripts/diffs/components/parallel_diff_view.vue b/app/assets/javascripts/diffs/components/parallel_diff_view.vue
index 4d97cb6d15d..32528c9e7ab 100644
--- a/app/assets/javascripts/diffs/components/parallel_diff_view.vue
+++ b/app/assets/javascripts/diffs/components/parallel_diff_view.vue
@@ -21,11 +21,8 @@ export default {
},
},
computed: {
- ...mapGetters('diffs', [
- 'commitId',
- 'singleDiscussionByLineCode',
- 'shouldRenderParallelCommentRow',
- ]),
+ ...mapGetters('diffs', ['commitId']),
+ ...mapGetters(['discussionsByLineCode']),
...mapState({
diffLineCommentForms: state => state.diffs.diffLineCommentForms,
}),
@@ -55,6 +52,32 @@ export default {
return window.gon.user_color_scheme;
},
},
+ methods: {
+ shouldRenderCommentRow(line) {
+ const leftLineCode = line.left.lineCode;
+ const rightLineCode = line.right.lineCode;
+ const discussions = this.discussionsByLineCode;
+ const leftDiscussions = discussions[leftLineCode];
+ const rightDiscussions = discussions[rightLineCode];
+ const hasDiscussion = leftDiscussions || rightDiscussions;
+
+ const hasExpandedDiscussionOnLeft = leftDiscussions
+ ? leftDiscussions.every(discussion => discussion.expanded)
+ : false;
+ const hasExpandedDiscussionOnRight = rightDiscussions
+ ? rightDiscussions.every(discussion => discussion.expanded)
+ : false;
+
+ if (hasDiscussion && (hasExpandedDiscussionOnLeft || hasExpandedDiscussionOnRight)) {
+ return true;
+ }
+
+ const hasCommentFormOnLeft = this.diffLineCommentForms[leftLineCode];
+ const hasCommentFormOnRight = this.diffLineCommentForms[rightLineCode];
+
+ return hasCommentFormOnLeft || hasCommentFormOnRight;
+ },
+ },
};
</script>
@@ -75,17 +98,13 @@ export default {
:line="line"
:is-bottom="index + 1 === diffLinesLength"
:key="index"
- :left-discussions="singleDiscussionByLineCode(line.left.lineCode)"
- :right-discussions="singleDiscussionByLineCode(line.right.lineCode)"
/>
<parallel-diff-comment-row
- v-if="shouldRenderParallelCommentRow(line)"
+ v-if="shouldRenderCommentRow(line)"
:key="`dcr-${index}`"
:line="line"
:diff-file-hash="diffFile.fileHash"
:line-index="index"
- :left-discussions="singleDiscussionByLineCode(line.left.lineCode)"
- :right-discussions="singleDiscussionByLineCode(line.right.lineCode)"
/>
</template>
</tbody>
diff --git a/app/assets/javascripts/diffs/store/getters.js b/app/assets/javascripts/diffs/store/getters.js
index c7b9b1a16e6..9aec117c236 100644
--- a/app/assets/javascripts/diffs/store/getters.js
+++ b/app/assets/javascripts/diffs/store/getters.js
@@ -1,7 +1,5 @@
import _ from 'underscore';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
import { PARALLEL_DIFF_VIEW_TYPE, INLINE_DIFF_VIEW_TYPE } from '../constants';
-import { getDiffRefsByLineCode } from './utils';
export const isParallelView = state => state.diffViewType === PARALLEL_DIFF_VIEW_TYPE;
@@ -48,6 +46,14 @@ export const diffHasExpandedDiscussions = (state, getters) => diff => {
};
/**
+ * Checks if the diff has any discussion
+ * @param {Boolean} diff
+ * @returns {Boolean}
+ */
+export const diffHasDiscussions = (state, getters) => diff =>
+ getters.getDiffFileDiscussions(diff).length > 0;
+
+/**
* Returns an array with the discussions of the given diff
* @param {Object} diff
* @returns {Array}
@@ -58,87 +64,6 @@ export const getDiffFileDiscussions = (state, getters, rootState, rootGetters) =
discussion.diff_discussion && _.isEqual(discussion.diff_file.file_hash, diff.fileHash),
) || [];
-/**
- * Returns an Object with discussions by their diff line code
- * To avoid rendering outdated discussions on the Changes tab we should do a bunch of SHA
- * comparisions. `note.position.formatter` have the current version diff refs but
- * `note.original_position.formatter` will have the first version's diff refs.
- * If line diff refs matches with one of them, we should render it as a discussion on Changes tab.
- *
- * @param {Object} diff
- * @returns {Array}
- */
-export const discussionsByLineCode = (state, getters, rootState, rootGetters) => {
- const diffRefsByLineCode = getDiffRefsByLineCode(state.diffFiles);
-
- return rootGetters.discussions.reduce((acc, note) => {
- const isDiffDiscussion = note.diff_discussion;
- const hasLineCode = note.line_code;
- const isResolvable = note.resolvable;
-
- if (isDiffDiscussion && hasLineCode && isResolvable) {
- const diffRefs = diffRefsByLineCode[note.line_code];
- if (diffRefs) {
- const refs = convertObjectPropsToCamelCase(note.position.formatter);
- const originalRefs = convertObjectPropsToCamelCase(note.original_position.formatter);
-
- if (_.isEqual(refs, diffRefs) || _.isEqual(originalRefs, diffRefs)) {
- const lineCode = note.line_code;
-
- if (acc[lineCode]) {
- acc[lineCode].push(note);
- } else {
- acc[lineCode] = [note];
- }
- }
- }
- }
-
- return acc;
- }, {});
-};
-
-export const singleDiscussionByLineCode = (state, getters) => lineCode => {
- if (!lineCode) return [];
- const discussions = getters.discussionsByLineCode;
- return discussions[lineCode] || [];
-};
-
-export const shouldRenderParallelCommentRow = (state, getters) => line => {
- const leftLineCode = line.left.lineCode;
- const rightLineCode = line.right.lineCode;
- const leftDiscussions = getters.singleDiscussionByLineCode(leftLineCode);
- const rightDiscussions = getters.singleDiscussionByLineCode(rightLineCode);
- const hasDiscussion = leftDiscussions.length || rightDiscussions.length;
-
- const hasExpandedDiscussionOnLeft = leftDiscussions.length
- ? leftDiscussions.every(discussion => discussion.expanded)
- : false;
- const hasExpandedDiscussionOnRight = rightDiscussions.length
- ? rightDiscussions.every(discussion => discussion.expanded)
- : false;
-
- if (hasDiscussion && (hasExpandedDiscussionOnLeft || hasExpandedDiscussionOnRight)) {
- return true;
- }
-
- const hasCommentFormOnLeft = state.diffLineCommentForms[leftLineCode];
- const hasCommentFormOnRight = state.diffLineCommentForms[rightLineCode];
-
- return hasCommentFormOnLeft || hasCommentFormOnRight;
-};
-
-export const shouldRenderInlineCommentRow = (state, getters) => line => {
- if (state.diffLineCommentForms[line.lineCode]) return true;
-
- const lineDiscussions = getters.singleDiscussionByLineCode(line.lineCode);
- if (lineDiscussions.length === 0) {
- return false;
- }
-
- return lineDiscussions.every(discussion => discussion.expanded);
-};
-
// prevent babel-plugin-rewire from generating an invalid default during karma∂ tests
export const getDiffFileByHash = state => fileHash =>
state.diffFiles.find(file => file.fileHash === fileHash);
diff --git a/app/assets/javascripts/diffs/store/utils.js b/app/assets/javascripts/diffs/store/utils.js
index 82082ac508a..d9589baa76e 100644
--- a/app/assets/javascripts/diffs/store/utils.js
+++ b/app/assets/javascripts/diffs/store/utils.js
@@ -173,24 +173,3 @@ export function trimFirstCharOfLineContent(line = {}) {
return parsedLine;
}
-
-export function getDiffRefsByLineCode(diffFiles) {
- return diffFiles.reduce((acc, diffFile) => {
- const { baseSha, headSha, startSha } = diffFile.diffRefs;
- const { newPath, oldPath } = diffFile;
-
- // We can only use highlightedDiffLines to create the map of diff lines because
- // highlightedDiffLines will also include every parallel diff line in it.
- if (diffFile.highlightedDiffLines) {
- diffFile.highlightedDiffLines.forEach(line => {
- const { lineCode, oldLine, newLine } = line;
-
- if (lineCode) {
- acc[lineCode] = { baseSha, headSha, startSha, newPath, oldPath, oldLine, newLine };
- }
- });
- }
-
- return acc;
- }, {});
-}
diff --git a/app/assets/javascripts/environments/components/environment_item.vue b/app/assets/javascripts/environments/components/environment_item.vue
index 39f3790a286..21cf92d1bc5 100644
--- a/app/assets/javascripts/environments/components/environment_item.vue
+++ b/app/assets/javascripts/environments/components/environment_item.vue
@@ -87,6 +87,16 @@ export default {
},
/**
+ * Checkes whether the environment is protected.
+ * (`is_protected` currently only set in EE)
+ *
+ * @returns {Boolean}
+ */
+ isProtected() {
+ return this.model && this.model.is_protected;
+ },
+
+ /**
* Returns whether the environment can be stopped.
*
* @returns {Boolean}
@@ -455,7 +465,7 @@ export default {
class="gl-responsive-table-row"
role="row">
<div
- class="table-section section-10"
+ class="table-section section-wrap section-15"
role="gridcell"
>
<div
@@ -465,16 +475,17 @@ export default {
>
{{ s__("Environments|Environment") }}
</div>
- <a
+ <span
v-if="!model.isFolder"
- :href="environmentPath"
- class="environment-name flex-truncate-parent table-mobile-content">
- <span
+ class="environment-name table-mobile-content">
+ <a
v-tooltip
+ :href="environmentPath"
:title="model.name"
- class="flex-truncate-child"
- >{{ model.name }}</span>
- </a>
+ >
+ {{ model.name }}
+ </a>
+ </span>
<span
v-else
class="folder-name"
@@ -548,7 +559,7 @@ export default {
<div
v-if="!model.isFolder"
- class="table-section section-25"
+ class="table-section section-20"
role="gridcell"
>
<div
diff --git a/app/assets/javascripts/environments/components/environments_table.vue b/app/assets/javascripts/environments/components/environments_table.vue
index 22863e926d4..016e9f7c7b3 100644
--- a/app/assets/javascripts/environments/components/environments_table.vue
+++ b/app/assets/javascripts/environments/components/environments_table.vue
@@ -15,7 +15,7 @@ export default {
environments: {
type: Array,
required: true,
- default: () => ([]),
+ default: () => [],
},
canReadEnvironment: {
@@ -35,10 +35,7 @@ export default {
return `${window.location.pathname}/folders/${model.folderName}`;
},
shouldRenderFolderContent(env) {
- return env.isFolder &&
- env.isOpen &&
- env.children &&
- env.children.length > 0;
+ return env.isFolder && env.isOpen && env.children && env.children.length > 0;
},
},
};
@@ -53,7 +50,7 @@ export default {
role="row"
>
<div
- class="table-section section-10 environments-name"
+ class="table-section section-15 environments-name"
role="columnheader"
>
{{ s__("Environments|Environment") }}
@@ -71,7 +68,7 @@ export default {
{{ s__("Environments|Job") }}
</div>
<div
- class="table-section section-25 environments-commit"
+ class="table-section section-20 environments-commit"
role="columnheader"
>
{{ s__("Environments|Commit") }}
@@ -91,7 +88,7 @@ export default {
:model="model"
:can-create-deployment="canCreateDeployment"
:can-read-environment="canReadEnvironment"
- :key="i"
+ :key="`environment-item-${i}`"
/>
<template
diff --git a/app/assets/javascripts/groups_select.js b/app/assets/javascripts/groups_select.js
index 310f6fe06cf..e37fc5c4be6 100644
--- a/app/assets/javascripts/groups_select.js
+++ b/app/assets/javascripts/groups_select.js
@@ -12,6 +12,7 @@ export default function groupsSelect() {
const skipGroups = $select.data('skipGroups') || [];
$select.select2({
placeholder: 'Search for a group',
+ allowClear: $select.hasClass('allowClear'),
multiple: $select.hasClass('multiselect'),
minimumInputLength: 0,
ajax: {
diff --git a/app/assets/javascripts/helpers/avatar_helper.js b/app/assets/javascripts/helpers/avatar_helper.js
new file mode 100644
index 00000000000..d3b1d0f11fd
--- /dev/null
+++ b/app/assets/javascripts/helpers/avatar_helper.js
@@ -0,0 +1,33 @@
+import _ from 'underscore';
+import { getFirstCharacterCapitalized } from '~/lib/utils/text_utility';
+
+export const DEFAULT_SIZE_CLASS = 's40';
+export const IDENTICON_BG_COUNT = 7;
+
+export function getIdenticonBackgroundClass(entityId) {
+ const type = (entityId % IDENTICON_BG_COUNT) + 1;
+ return `bg${type}`;
+}
+
+export function getIdenticonTitle(entityName) {
+ return getFirstCharacterCapitalized(entityName) || ' ';
+}
+
+export function renderIdenticon(entity, options = {}) {
+ const { sizeClass = DEFAULT_SIZE_CLASS } = options;
+
+ const bgClass = getIdenticonBackgroundClass(entity.id);
+ const title = getIdenticonTitle(entity.name);
+
+ return `<div class="avatar identicon ${_.escape(sizeClass)} ${_.escape(bgClass)}">${_.escape(title)}</div>`;
+}
+
+export function renderAvatar(entity, options = {}) {
+ if (!entity.avatar_url) {
+ return renderIdenticon(entity, options);
+ }
+
+ const { sizeClass = DEFAULT_SIZE_CLASS } = options;
+
+ return `<img src="${_.escape(entity.avatar_url)}" class="avatar ${_.escape(sizeClass)}" />`;
+}
diff --git a/app/assets/javascripts/ide/components/changed_file_icon.vue b/app/assets/javascripts/ide/components/changed_file_icon.vue
index a4e06bbbe3c..720ae11aaa6 100644
--- a/app/assets/javascripts/ide/components/changed_file_icon.vue
+++ b/app/assets/javascripts/ide/components/changed_file_icon.vue
@@ -3,6 +3,7 @@ import tooltip from '~/vue_shared/directives/tooltip';
import Icon from '~/vue_shared/components/icon.vue';
import { pluralize } from '~/lib/utils/text_utility';
import { __, sprintf } from '~/locale';
+import { getCommitIconMap } from '../utils';
export default {
components: {
@@ -34,16 +35,14 @@ export default {
},
computed: {
changedIcon() {
- const suffix = this.file.staged && !this.showStagedIcon ? '-solid' : '';
- return this.file.tempFile && !this.forceModifiedIcon
- ? `file-addition${suffix}`
- : `file-modified${suffix}`;
- },
- stagedIcon() {
- return `${this.changedIcon}-solid`;
+ const suffix = !this.file.changed && this.file.staged && !this.showStagedIcon ? '-solid' : '';
+
+ if (this.forceModifiedIcon) return `file-modified${suffix}`;
+
+ return `${getCommitIconMap(this.file).icon}${suffix}`;
},
changedIconClass() {
- return `multi-${this.changedIcon} float-left`;
+ return `ide-${this.changedIcon} float-left`;
},
tooltipTitle() {
if (!this.showTooltip) return undefined;
@@ -66,6 +65,9 @@ export default {
return undefined;
},
+ showIcon() {
+ return this.file.changed || this.file.tempFile || this.file.staged || this.file.deleted;
+ },
},
};
</script>
@@ -79,7 +81,7 @@ export default {
class="ide-file-changed-icon"
>
<icon
- v-if="file.changed || file.tempFile || file.staged"
+ v-if="showIcon"
:name="changedIcon"
:size="12"
:css-classes="changedIconClass"
diff --git a/app/assets/javascripts/ide/components/commit_sidebar/actions.vue b/app/assets/javascripts/ide/components/commit_sidebar/actions.vue
index eb7cb9745ec..a8b5c7a16d0 100644
--- a/app/assets/javascripts/ide/components/commit_sidebar/actions.vue
+++ b/app/assets/javascripts/ide/components/commit_sidebar/actions.vue
@@ -1,4 +1,5 @@
<script>
+import _ from 'underscore';
import { mapActions, mapState, mapGetters } from 'vuex';
import { sprintf, __ } from '~/locale';
import * as consts from '../../stores/modules/commit/constants';
@@ -14,7 +15,7 @@ export default {
commitToCurrentBranchText() {
return sprintf(
__('Commit to %{branchName} branch'),
- { branchName: `<strong class="monospace">${this.currentBranchId}</strong>` },
+ { branchName: `<strong class="monospace">${_.escape(this.currentBranchId)}</strong>` },
false,
);
},
diff --git a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue
index ee21eeda3cd..391004dcd3c 100644
--- a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue
+++ b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue
@@ -5,6 +5,7 @@ import Icon from '~/vue_shared/components/icon.vue';
import StageButton from './stage_button.vue';
import UnstageButton from './unstage_button.vue';
import { viewerTypes } from '../../constants';
+import { getCommitIconMap } from '../../utils';
export default {
components: {
@@ -42,11 +43,12 @@ export default {
},
computed: {
iconName() {
- const prefix = this.stagedList ? '-solid' : '';
- return this.file.tempFile ? `file-addition${prefix}` : `file-modified${prefix}`;
+ const suffix = this.stagedList ? '-solid' : '';
+
+ return `${getCommitIconMap(this.file).icon}${suffix}`;
},
iconClass() {
- return `multi-file-${this.file.tempFile ? 'addition' : 'modified'} append-right-8`;
+ return `${getCommitIconMap(this.file).class} append-right-8`;
},
fullKey() {
return `${this.keyPrefix}-${this.file.key}`;
@@ -67,6 +69,8 @@ export default {
'stageChange',
]),
openFileInEditor() {
+ if (this.file.type === 'tree') return null;
+
return this.openPendingTab({
file: this.file,
keyPrefix: this.keyPrefix,
diff --git a/app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue b/app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue
index 7014b9f605e..e6044401c9f 100644
--- a/app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue
+++ b/app/assets/javascripts/ide/components/commit_sidebar/stage_button.vue
@@ -56,7 +56,7 @@ export default {
>
<icon
:size="12"
- name="more"
+ name="ellipsis_h"
/>
</button>
<div class="dropdown-menu dropdown-menu-right">
diff --git a/app/assets/javascripts/ide/components/ide.vue b/app/assets/javascripts/ide/components/ide.vue
index 257a7432c20..2c8305aa0cc 100644
--- a/app/assets/javascripts/ide/components/ide.vue
+++ b/app/assets/javascripts/ide/components/ide.vue
@@ -1,6 +1,7 @@
<script>
import Mousetrap from 'mousetrap';
import { mapActions, mapState, mapGetters } from 'vuex';
+import { __ } from '~/locale';
import NewModal from './new_dropdown/modal.vue';
import IdeSidebar from './ide_side_bar.vue';
import RepoTabs from './repo_tabs.vue';
@@ -25,7 +26,6 @@ export default {
},
computed: {
...mapState([
- 'changedFiles',
'openFiles',
'viewer',
'currentMergeRequestId',
@@ -34,18 +34,10 @@ export default {
'currentProjectId',
'errorMessage',
]),
- ...mapGetters(['activeFile', 'hasChanges']),
+ ...mapGetters(['activeFile', 'hasChanges', 'someUncommitedChanges']),
},
mounted() {
- const returnValue = 'Are you sure you want to lose unsaved changes?';
- window.onbeforeunload = e => {
- if (!this.changedFiles.length) return undefined;
-
- Object.assign(e, {
- returnValue,
- });
- return returnValue;
- };
+ window.onbeforeunload = e => this.onBeforeUnload(e);
Mousetrap.bind(['t', 'command+p', 'ctrl+p'], e => {
if (e.preventDefault) {
@@ -59,6 +51,16 @@ export default {
},
methods: {
...mapActions(['toggleFileFinder']),
+ onBeforeUnload(e = {}) {
+ const returnValue = __('Are you sure you want to lose unsaved changes?');
+
+ if (!this.someUncommitedChanges) return undefined;
+
+ Object.assign(e, {
+ returnValue,
+ });
+ return returnValue;
+ },
mousetrapStopCallback(e, el, combo) {
if (
(combo === 't' && el.classList.contains('dropdown-input-field')) ||
diff --git a/app/assets/javascripts/ide/components/ide_review.vue b/app/assets/javascripts/ide/components/ide_review.vue
index f9978762c45..d09c99050fe 100644
--- a/app/assets/javascripts/ide/components/ide_review.vue
+++ b/app/assets/javascripts/ide/components/ide_review.vue
@@ -10,7 +10,7 @@ export default {
EditorModeDropdown,
},
computed: {
- ...mapGetters(['currentMergeRequest']),
+ ...mapGetters(['currentMergeRequest', 'activeFile']),
...mapState(['viewer', 'currentMergeRequestId']),
showLatestChangesText() {
return !this.currentMergeRequestId || this.viewer === viewerTypes.diff;
@@ -23,12 +23,20 @@ export default {
},
},
mounted() {
+ if (this.activeFile && this.activeFile.pending && !this.activeFile.deleted) {
+ this.$router.push(`/project${this.activeFile.url}`, () => {
+ this.updateViewer('editor');
+ });
+ } else if (this.activeFile && this.activeFile.deleted) {
+ this.resetOpenFiles();
+ }
+
this.$nextTick(() => {
this.updateViewer(this.currentMergeRequestId ? viewerTypes.mr : viewerTypes.diff);
});
},
methods: {
- ...mapActions(['updateViewer']),
+ ...mapActions(['updateViewer', 'resetOpenFiles']),
},
};
</script>
@@ -36,7 +44,6 @@ export default {
<template>
<ide-tree-list
:viewer-type="viewer"
- :disable-action-dropdown="true"
header-class="ide-review-header"
>
<template
diff --git a/app/assets/javascripts/ide/components/ide_tree.vue b/app/assets/javascripts/ide/components/ide_tree.vue
index 0a95c0bb30d..e996dd9059e 100644
--- a/app/assets/javascripts/ide/components/ide_tree.vue
+++ b/app/assets/javascripts/ide/components/ide_tree.vue
@@ -17,14 +17,18 @@ export default {
...mapGetters(['currentProject', 'currentTree', 'activeFile']),
},
mounted() {
- if (this.activeFile && this.activeFile.pending) {
+ if (!this.activeFile) return;
+
+ if (this.activeFile.pending && !this.activeFile.deleted) {
this.$router.push(`/project${this.activeFile.url}`, () => {
this.updateViewer('editor');
});
+ } else if (this.activeFile.deleted) {
+ this.resetOpenFiles();
}
},
methods: {
- ...mapActions(['updateViewer', 'openNewEntryModal', 'createTempEntry']),
+ ...mapActions(['updateViewer', 'openNewEntryModal', 'createTempEntry', 'resetOpenFiles']),
},
};
</script>
diff --git a/app/assets/javascripts/ide/components/ide_tree_list.vue b/app/assets/javascripts/ide/components/ide_tree_list.vue
index 0df99798d21..2e7226b727c 100644
--- a/app/assets/javascripts/ide/components/ide_tree_list.vue
+++ b/app/assets/javascripts/ide/components/ide_tree_list.vue
@@ -22,11 +22,6 @@ export default {
required: false,
default: null,
},
- disableActionDropdown: {
- type: Boolean,
- required: false,
- default: false,
- },
},
computed: {
...mapState(['currentBranchId']),
@@ -69,7 +64,6 @@ export default {
:key="file.key"
:file="file"
:level="0"
- :disable-action-dropdown="disableActionDropdown"
/>
</template>
</div>
diff --git a/app/assets/javascripts/ide/components/jobs/detail.vue b/app/assets/javascripts/ide/components/jobs/detail.vue
index f39ce545656..f884c26ed6a 100644
--- a/app/assets/javascripts/ide/components/jobs/detail.vue
+++ b/app/assets/javascripts/ide/components/jobs/detail.vue
@@ -131,6 +131,9 @@ export default {
v-show="detailJob.isLoading"
class="build-loader-animation"
>
+ <div class="dot"></div>
+ <div class="dot"></div>
+ <div class="dot"></div>
</div>
</pre>
</div>
diff --git a/app/assets/javascripts/ide/components/new_dropdown/index.vue b/app/assets/javascripts/ide/components/new_dropdown/index.vue
index c29e49ba766..f02fd6cf7ea 100644
--- a/app/assets/javascripts/ide/components/new_dropdown/index.vue
+++ b/app/assets/javascripts/ide/components/new_dropdown/index.vue
@@ -4,6 +4,7 @@ import icon from '~/vue_shared/components/icon.vue';
import newModal from './modal.vue';
import upload from './upload.vue';
import ItemButton from './button.vue';
+import { modalTypes } from '../../constants';
export default {
components: {
@@ -13,7 +14,7 @@ export default {
ItemButton,
},
props: {
- branch: {
+ type: {
type: String,
required: true,
},
@@ -35,7 +36,9 @@ export default {
watch: {
dropdownOpen() {
this.$nextTick(() => {
- this.$refs.dropdownMenu.scrollIntoView();
+ this.$refs.dropdownMenu.scrollIntoView({
+ block: 'nearest',
+ });
});
},
mouseOver() {
@@ -45,7 +48,7 @@ export default {
},
},
methods: {
- ...mapActions(['createTempEntry', 'openNewEntryModal']),
+ ...mapActions(['createTempEntry', 'openNewEntryModal', 'deleteEntry']),
createNewItem(type) {
this.openNewEntryModal({ type, path: this.path });
this.dropdownOpen = false;
@@ -54,6 +57,7 @@ export default {
this.dropdownOpen = !this.dropdownOpen;
},
},
+ modalTypes,
};
</script>
@@ -72,7 +76,7 @@ export default {
@click.stop="openDropdown()"
>
<icon
- name="hamburger"
+ name="ellipsis_v"
/>
<icon
name="arrow-down"
@@ -82,28 +86,49 @@ export default {
ref="dropdownMenu"
class="dropdown-menu dropdown-menu-right"
>
+ <template v-if="type === 'tree'">
+ <li>
+ <item-button
+ :label="__('New file')"
+ class="d-flex"
+ icon="doc-new"
+ icon-classes="mr-2"
+ @click="createNewItem('blob')"
+ />
+ </li>
+ <li>
+ <upload
+ :path="path"
+ @create="createTempEntry"
+ />
+ </li>
+ <li>
+ <item-button
+ :label="__('New directory')"
+ class="d-flex"
+ icon="folder-new"
+ icon-classes="mr-2"
+ @click="createNewItem($options.modalTypes.tree)"
+ />
+ </li>
+ <li class="divider"></li>
+ </template>
<li>
<item-button
- :label="__('New file')"
+ :label="__('Rename')"
class="d-flex"
- icon="doc-new"
+ icon="pencil"
icon-classes="mr-2"
- @click="createNewItem('blob')"
- />
- </li>
- <li>
- <upload
- :path="path"
- @create="createTempEntry"
+ @click="createNewItem($options.modalTypes.rename)"
/>
</li>
<li>
<item-button
- :label="__('New directory')"
+ :label="__('Delete')"
class="d-flex"
- icon="folder-new"
+ icon="remove"
icon-classes="mr-2"
- @click="createNewItem('tree')"
+ @click="deleteEntry(path)"
/>
</li>
</ul>
diff --git a/app/assets/javascripts/ide/components/new_dropdown/modal.vue b/app/assets/javascripts/ide/components/new_dropdown/modal.vue
index 833c4b027df..e500ef0e1b5 100644
--- a/app/assets/javascripts/ide/components/new_dropdown/modal.vue
+++ b/app/assets/javascripts/ide/components/new_dropdown/modal.vue
@@ -2,6 +2,7 @@
import { __ } from '~/locale';
import { mapActions, mapState } from 'vuex';
import GlModal from '~/vue_shared/components/gl_modal.vue';
+import { modalTypes } from '../../constants';
export default {
components: {
@@ -13,42 +14,58 @@ export default {
};
},
computed: {
- ...mapState(['newEntryModal']),
+ ...mapState(['entryModal']),
entryName: {
get() {
- return this.name || (this.newEntryModal.path !== '' ? `${this.newEntryModal.path}/` : '');
+ if (this.entryModal.type === modalTypes.rename) {
+ return this.name || this.entryModal.entry.name;
+ }
+
+ return this.name || (this.entryModal.path !== '' ? `${this.entryModal.path}/` : '');
},
set(val) {
this.name = val;
},
},
modalTitle() {
- if (this.newEntryModal.type === 'tree') {
+ if (this.entryModal.type === modalTypes.tree) {
return __('Create new directory');
+ } else if (this.entryModal.type === modalTypes.rename) {
+ return this.entryModal.entry.type === modalTypes.tree ? __('Rename folder') : __('Rename file');
}
return __('Create new file');
},
buttonLabel() {
- if (this.newEntryModal.type === 'tree') {
+ if (this.entryModal.type === modalTypes.tree) {
return __('Create directory');
+ } else if (this.entryModal.type === modalTypes.rename) {
+ return this.entryModal.entry.type === modalTypes.tree ? __('Rename folder') : __('Rename file');
}
return __('Create file');
},
},
methods: {
- ...mapActions(['createTempEntry']),
- createEntryInStore() {
- this.createTempEntry({
- name: this.name,
- type: this.newEntryModal.type,
- });
+ ...mapActions(['createTempEntry', 'renameEntry']),
+ submitForm() {
+ if (this.entryModal.type === modalTypes.rename) {
+ this.renameEntry({
+ path: this.entryModal.entry.path,
+ name: this.entryName,
+ });
+ } else {
+ this.createTempEntry({
+ name: this.name,
+ type: this.entryModal.type,
+ });
+ }
},
focusInput() {
- setTimeout(() => {
- this.$refs.fieldName.focus();
- });
+ this.$refs.fieldName.focus();
+ },
+ closedModal() {
+ this.name = '';
},
},
};
@@ -60,8 +77,9 @@ export default {
:header-title-text="modalTitle"
:footer-primary-button-text="buttonLabel"
footer-primary-button-variant="success"
- @submit="createEntryInStore"
+ @submit="submitForm"
@open="focusInput"
+ @closed="closedModal"
>
<div
class="form-group row"
diff --git a/app/assets/javascripts/ide/components/repo_commit_section.vue b/app/assets/javascripts/ide/components/repo_commit_section.vue
index 50ab242ba2a..6f1a941fbc4 100644
--- a/app/assets/javascripts/ide/components/repo_commit_section.vue
+++ b/app/assets/javascripts/ide/components/repo_commit_section.vue
@@ -44,7 +44,7 @@ export default {
},
},
mounted() {
- if (this.lastOpenedFile) {
+ if (this.lastOpenedFile && this.lastOpenedFile.type !== 'tree') {
this.openPendingTab({
file: this.lastOpenedFile,
keyPrefix: this.lastOpenedFile.changed ? stageKeys.unstaged : stageKeys.staged,
diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue
index 08ee12fd98f..f9badb01535 100644
--- a/app/assets/javascripts/ide/components/repo_editor.vue
+++ b/app/assets/javascripts/ide/components/repo_editor.vue
@@ -87,7 +87,9 @@ export default {
this.editor.updateDimensions();
},
viewer() {
- this.createEditorInstance();
+ if (!this.file.pending) {
+ this.createEditorInstance();
+ }
},
panelResizing() {
if (!this.panelResizing) {
@@ -109,6 +111,7 @@ export default {
},
methods: {
...mapActions([
+ 'getFileData',
'getRawFileData',
'changeFileContent',
'setFileLanguage',
@@ -123,10 +126,16 @@ export default {
this.editor.clearEditor();
- this.getRawFileData({
+ this.getFileData({
path: this.file.path,
- baseSha: this.currentMergeRequest ? this.currentMergeRequest.baseCommitSha : '',
+ makeFileActive: false,
})
+ .then(() =>
+ this.getRawFileData({
+ path: this.file.path,
+ baseSha: this.currentMergeRequest ? this.currentMergeRequest.baseCommitSha : '',
+ }),
+ )
.then(() => {
this.createEditorInstance();
})
@@ -246,6 +255,8 @@ export default {
ref="editor"
:class="{
'is-readonly': isCommitModeActive,
+ 'is-deleted': file.deleted,
+ 'is-added': file.tempFile
}"
class="multi-file-editor-holder"
>
diff --git a/app/assets/javascripts/ide/components/repo_file.vue b/app/assets/javascripts/ide/components/repo_file.vue
index 3b4dd5ae9aa..dbdf0be2809 100644
--- a/app/assets/javascripts/ide/components/repo_file.vue
+++ b/app/assets/javascripts/ide/components/repo_file.vue
@@ -34,11 +34,6 @@ export default {
type: Number,
required: true,
},
- disableActionDropdown: {
- type: Boolean,
- required: false,
- default: false,
- },
},
data() {
return {
@@ -139,8 +134,7 @@ export default {
.replace(/[/]$/g, '');
// - strip ending "/"
- const filePath = this.file.path
- .replace(/[/]$/g, '');
+ const filePath = this.file.path.replace(/[/]$/g, '');
return filePath === routePath;
},
@@ -199,7 +193,7 @@ export default {
data-container="body"
data-placement="right"
name="file-modified"
- css-classes="prepend-left-5 multi-file-modified"
+ css-classes="prepend-left-5 ide-file-modified"
/>
</span>
<changed-file-icon
@@ -212,9 +206,7 @@ export default {
/>
</span>
<new-dropdown
- v-if="isTree && !disableActionDropdown"
- :project-id="file.projectId"
- :branch="file.branchId"
+ :type="file.type"
:path="file.path"
:mouse-over="mouseOver"
class="float-right prepend-left-8"
diff --git a/app/assets/javascripts/ide/components/repo_tab.vue b/app/assets/javascripts/ide/components/repo_tab.vue
index 03772ae4a4c..db47b75ec5c 100644
--- a/app/assets/javascripts/ide/components/repo_tab.vue
+++ b/app/assets/javascripts/ide/components/repo_tab.vue
@@ -37,7 +37,7 @@ export default {
return this.fileHasChanged ? !this.tabMouseOver : false;
},
fileHasChanged() {
- return this.tab.changed || this.tab.tempFile || this.tab.staged;
+ return this.tab.changed || this.tab.tempFile || this.tab.staged || this.tab.deleted;
},
},
@@ -71,7 +71,8 @@ export default {
<template>
<li
:class="{
- active: tab.active
+ active: tab.active,
+ disabled: tab.pending
}"
@click="clickFile(tab)"
@mouseover="mouseOverTab"
@@ -105,7 +106,6 @@ export default {
<changed-file-icon
v-else
:file="tab"
- :force-modified-icon="true"
/>
</button>
</li>
diff --git a/app/assets/javascripts/ide/constants.js b/app/assets/javascripts/ide/constants.js
index 45d36f6f42c..d3ac57471c9 100644
--- a/app/assets/javascripts/ide/constants.js
+++ b/app/assets/javascripts/ide/constants.js
@@ -38,3 +38,23 @@ export const stageKeys = {
unstaged: 'unstaged',
staged: 'staged',
};
+
+export const commitItemIconMap = {
+ addition: {
+ icon: 'file-addition',
+ class: 'ide-file-addition',
+ },
+ modified: {
+ icon: 'file-modified',
+ class: 'ide-file-modified',
+ },
+ deleted: {
+ icon: 'file-deletion',
+ class: 'ide-file-deletion',
+ },
+};
+
+export const modalTypes = {
+ rename: 'rename',
+ tree: 'tree',
+};
diff --git a/app/assets/javascripts/ide/lib/common/model.js b/app/assets/javascripts/ide/lib/common/model.js
index 78e6f632728..60bddb34977 100644
--- a/app/assets/javascripts/ide/lib/common/model.js
+++ b/app/assets/javascripts/ide/lib/common/model.js
@@ -7,7 +7,7 @@ export default class Model {
this.disposable = new Disposable();
this.file = file;
this.head = head;
- this.content = file.content !== '' ? file.content : file.raw;
+ this.content = file.content !== '' || file.deleted ? file.content : file.raw;
this.disposable.add(
(this.originalModel = monacoEditor.createModel(
diff --git a/app/assets/javascripts/ide/services/index.js b/app/assets/javascripts/ide/services/index.js
index 49a481f25d5..f0193d8e8ea 100644
--- a/app/assets/javascripts/ide/services/index.js
+++ b/app/assets/javascripts/ide/services/index.js
@@ -8,7 +8,7 @@ export default {
});
},
getRawFileData(file) {
- if (file.tempFile) {
+ if (file.tempFile && !file.prevPath) {
return Promise.resolve(file.content);
}
@@ -18,7 +18,7 @@ export default {
return axios
.get(file.rawPath, {
- params: { format: 'json' },
+ transformResponse: [f => f],
})
.then(({ data }) => data);
},
@@ -33,7 +33,7 @@ export default {
return axios
.get(file.rawPath.replace(`/raw/${file.branchId}/${file.path}`, `/raw/${sha}/${file.path}`), {
- params: { format: 'json' },
+ transformResponse: [f => f],
})
.then(({ data }) => data);
},
diff --git a/app/assets/javascripts/ide/stores/actions.js b/app/assets/javascripts/ide/stores/actions.js
index b5bd6f5a6bb..aa02dfbddc4 100644
--- a/app/assets/javascripts/ide/stores/actions.js
+++ b/app/assets/javascripts/ide/stores/actions.js
@@ -185,6 +185,40 @@ export const openNewEntryModal = ({ commit }, { type, path = '' }) => {
$('#ide-new-entry').modal('show');
};
+export const deleteEntry = ({ commit, dispatch, state }, path) => {
+ const entry = state.entries[path];
+
+ if (state.unusedSeal) dispatch('burstUnusedSeal');
+ if (entry.opened) dispatch('closeFile', entry);
+
+ if (entry.type === 'tree') {
+ entry.tree.forEach(f => dispatch('deleteEntry', f.path));
+ }
+
+ commit(types.DELETE_ENTRY, path);
+
+ if (entry.parentPath && state.entries[entry.parentPath].tree.length === 0) {
+ dispatch('deleteEntry', entry.parentPath);
+ }
+};
+
+export const resetOpenFiles = ({ commit }) => commit(types.RESET_OPEN_FILES);
+
+export const renameEntry = ({ dispatch, commit, state }, { path, name, entryPath = null }) => {
+ const entry = state.entries[entryPath || path];
+ commit(types.RENAME_ENTRY, { path, name, entryPath });
+
+ if (entry.type === 'tree') {
+ state.entries[entryPath || path].tree.forEach(f =>
+ dispatch('renameEntry', { path, name, entryPath: f.path }),
+ );
+ }
+
+ if (!entryPath) {
+ dispatch('deleteEntry', path);
+ }
+};
+
export * from './actions/tree';
export * from './actions/file';
export * from './actions/project';
diff --git a/app/assets/javascripts/ide/stores/actions/file.js b/app/assets/javascripts/ide/stores/actions/file.js
index 6c0887e11ee..9e3f5da4676 100644
--- a/app/assets/javascripts/ide/stores/actions/file.js
+++ b/app/assets/javascripts/ide/stores/actions/file.js
@@ -61,17 +61,21 @@ export const setFileActive = ({ commit, state, getters, dispatch }, path) => {
export const getFileData = ({ state, commit, dispatch }, { path, makeFileActive = true }) => {
const file = state.entries[path];
+
+ if (file.raw || (file.tempFile && !file.prevPath)) return Promise.resolve();
+
commit(types.TOGGLE_LOADING, { entry: file });
+
+ const url = file.prevPath ? file.url.replace(file.path, file.prevPath) : file.url;
+
return service
- .getFileData(
- `${gon.relative_url_root ? gon.relative_url_root : ''}${file.url.replace('/-/', '/')}`,
- )
+ .getFileData(`${gon.relative_url_root ? gon.relative_url_root : ''}${url.replace('/-/', '/')}`)
.then(({ data, headers }) => {
const normalizedHeaders = normalizeHeaders(headers);
setPageTitle(decodeURI(normalizedHeaders['PAGE-TITLE']));
commit(types.SET_FILE_DATA, { data, file });
- commit(types.TOGGLE_FILE_OPEN, path);
+ if (makeFileActive) commit(types.TOGGLE_FILE_OPEN, path);
if (makeFileActive) dispatch('setFileActive', path);
commit(types.TOGGLE_LOADING, { entry: file });
})
@@ -97,7 +101,7 @@ export const getRawFileData = ({ state, commit, dispatch }, { path, baseSha }) =
service
.getRawFileData(file)
.then(raw => {
- commit(types.SET_FILE_RAW_DATA, { file, raw });
+ if (!(file.tempFile && !file.prevPath)) commit(types.SET_FILE_RAW_DATA, { file, raw });
if (file.mrChange && file.mrChange.new_file === false) {
service
.getBaseRawFileData(file, baseSha)
@@ -172,9 +176,22 @@ export const setFileViewMode = ({ commit }, { file, viewMode }) => {
export const discardFileChanges = ({ dispatch, state, commit, getters }, path) => {
const file = state.entries[path];
+ if (file.deleted && file.parentPath) {
+ dispatch('restoreTree', file.parentPath);
+ }
+
+ if (file.movedPath) {
+ commit(types.DISCARD_FILE_CHANGES, file.movedPath);
+ commit(types.REMOVE_FILE_FROM_CHANGED, file.movedPath);
+ }
+
commit(types.DISCARD_FILE_CHANGES, path);
commit(types.REMOVE_FILE_FROM_CHANGED, path);
+ if (file.prevPath) {
+ dispatch('discardFileChanges', file.prevPath);
+ }
+
if (file.tempFile && file.opened) {
commit(types.TOGGLE_FILE_OPEN, path);
} else if (getters.activeFile && file.path === getters.activeFile.path) {
diff --git a/app/assets/javascripts/ide/stores/actions/tree.js b/app/assets/javascripts/ide/stores/actions/tree.js
index ffaaaabff17..9288bbe32f5 100644
--- a/app/assets/javascripts/ide/stores/actions/tree.js
+++ b/app/assets/javascripts/ide/stores/actions/tree.js
@@ -21,14 +21,12 @@ export const showTreeEntry = ({ commit, dispatch, state }, path) => {
export const handleTreeEntryAction = ({ commit, dispatch }, row) => {
if (row.type === 'tree') {
dispatch('toggleTreeOpen', row.path);
- } else if (row.type === 'blob' && (row.opened || row.changed)) {
- if (row.changed && !row.opened) {
+ } else if (row.type === 'blob') {
+ if (!row.opened) {
commit(types.TOGGLE_FILE_OPEN, row.path);
}
dispatch('setFileActive', row.path);
- } else {
- dispatch('getFileData', { path: row.path });
}
dispatch('showTreeEntry', row.path);
@@ -91,3 +89,13 @@ export const getFiles = ({ state, commit, dispatch }, { projectId, branchId } =
resolve();
}
});
+
+export const restoreTree = ({ dispatch, commit, state }, path) => {
+ const entry = state.entries[path];
+
+ commit(types.RESTORE_TREE, path);
+
+ if (entry.parentPath) {
+ dispatch('restoreTree', entry.parentPath);
+ }
+};
diff --git a/app/assets/javascripts/ide/stores/getters.js b/app/assets/javascripts/ide/stores/getters.js
index 5ce268b0d05..79cdb494e5a 100644
--- a/app/assets/javascripts/ide/stores/getters.js
+++ b/app/assets/javascripts/ide/stores/getters.js
@@ -67,9 +67,9 @@ export const someUncommitedChanges = state =>
!!(state.changedFiles.length || state.stagedFiles.length);
export const getChangesInFolder = state => path => {
- const changedFilesCount = state.changedFiles.filter(f => filePathMatches(f, path)).length;
+ const changedFilesCount = state.changedFiles.filter(f => filePathMatches(f.path, path)).length;
const stagedFilesCount = state.stagedFiles.filter(
- f => filePathMatches(f, path) && !getChangedFile(state)(f.path),
+ f => filePathMatches(f.path, path) && !getChangedFile(state)(f.path),
).length;
return changedFilesCount + stagedFilesCount;
diff --git a/app/assets/javascripts/ide/stores/modules/commit/actions.js b/app/assets/javascripts/ide/stores/modules/commit/actions.js
index 7828c31f20e..462ca45db9b 100644
--- a/app/assets/javascripts/ide/stores/modules/commit/actions.js
+++ b/app/assets/javascripts/ide/stores/modules/commit/actions.js
@@ -174,11 +174,13 @@ export const commitChanges = ({ commit, state, getters, dispatch, rootState, roo
dispatch('updateActivityBarView', activityBarViews.edit, { root: true });
dispatch('updateViewer', 'editor', { root: true });
- router.push(
- `/project/${rootState.currentProjectId}/blob/${getters.branchName}/-/${
- rootGetters.activeFile.path
- }`,
- );
+ if (rootGetters.activeFile) {
+ router.push(
+ `/project/${rootState.currentProjectId}/blob/${getters.branchName}/-/${
+ rootGetters.activeFile.path
+ }`,
+ );
+ }
}
})
.then(() => dispatch('updateCommitAction', consts.COMMIT_TO_CURRENT_BRANCH))
diff --git a/app/assets/javascripts/ide/stores/modules/commit/getters.js b/app/assets/javascripts/ide/stores/modules/commit/getters.js
index 3db4b2f903e..03777e6c10b 100644
--- a/app/assets/javascripts/ide/stores/modules/commit/getters.js
+++ b/app/assets/javascripts/ide/stores/modules/commit/getters.js
@@ -1,7 +1,15 @@
-import { sprintf, n__ } from '../../../../locale';
+import { sprintf, n__, __ } from '../../../../locale';
import * as consts from './constants';
const BRANCH_SUFFIX_COUNT = 5;
+const createTranslatedTextForFiles = (files, text) => {
+ if (!files.length) return null;
+
+ return sprintf(n__('%{text} %{files}', '%{text} %{files} files', files.length), {
+ files: files.reduce((acc, val) => acc.concat(val.path), []).join(', '),
+ text,
+ });
+};
export const discardDraftButtonDisabled = state =>
state.commitMessage === '' || state.submitCommitLoading;
@@ -29,14 +37,16 @@ export const branchName = (state, getters, rootState) => {
export const preBuiltCommitMessage = (state, _, rootState) => {
if (state.commitMessage) return state.commitMessage;
- const files = (rootState.stagedFiles.length
- ? rootState.stagedFiles
- : rootState.changedFiles
- ).reduce((acc, val) => acc.concat(val.path), []);
+ const files = rootState.stagedFiles.length ? rootState.stagedFiles : rootState.changedFiles;
+ const modifiedFiles = files.filter(f => !f.deleted);
+ const deletedFiles = files.filter(f => f.deleted);
- return sprintf(n__('Update %{files}', 'Update %{files} files', files.length), {
- files: files.join(', '),
- });
+ return [
+ createTranslatedTextForFiles(modifiedFiles, __('Update')),
+ createTranslatedTextForFiles(deletedFiles, __('Deleted')),
+ ]
+ .filter(t => t)
+ .join('\n');
};
// prevent babel-plugin-rewire from generating an invalid default during karma tests
diff --git a/app/assets/javascripts/ide/stores/mutation_types.js b/app/assets/javascripts/ide/stores/mutation_types.js
index 8d6f9ccaf34..5a7991d2fa7 100644
--- a/app/assets/javascripts/ide/stores/mutation_types.js
+++ b/app/assets/javascripts/ide/stores/mutation_types.js
@@ -76,3 +76,7 @@ export const RESET_OPEN_FILES = 'RESET_OPEN_FILES';
export const SET_ERROR_MESSAGE = 'SET_ERROR_MESSAGE';
export const OPEN_NEW_ENTRY_MODAL = 'OPEN_NEW_ENTRY_MODAL';
+export const DELETE_ENTRY = 'DELETE_ENTRY';
+export const RENAME_ENTRY = 'RENAME_ENTRY';
+
+export const RESTORE_TREE = 'RESTORE_TREE';
diff --git a/app/assets/javascripts/ide/stores/mutations.js b/app/assets/javascripts/ide/stores/mutations.js
index f8091f5b5e0..d0bf847dbde 100644
--- a/app/assets/javascripts/ide/stores/mutations.js
+++ b/app/assets/javascripts/ide/stores/mutations.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-param-reassign */
import * as types from './mutation_types';
import projectMutations from './mutations/project';
import mergeRequestMutation from './mutations/merge_request';
@@ -130,11 +131,14 @@ export default {
},
[types.UPDATE_FILE_AFTER_COMMIT](state, { file, lastCommit }) {
const changedFile = state.changedFiles.find(f => f.path === file.path);
+ const { prevPath } = file;
Object.assign(state.entries[file.path], {
raw: file.content,
changed: !!changedFile,
staged: false,
+ prevPath: '',
+ moved: false,
lastCommit: Object.assign(state.entries[file.path].lastCommit, {
id: lastCommit.commit.id,
url: lastCommit.commit_path,
@@ -143,6 +147,18 @@ export default {
updatedAt: lastCommit.commit.authored_date,
}),
});
+
+ if (prevPath) {
+ // Update URLs after file has moved
+ const regex = new RegExp(`${prevPath}$`);
+
+ Object.assign(state.entries[file.path], {
+ rawPath: file.rawPath.replace(regex, file.path),
+ permalink: file.permalink.replace(regex, file.path),
+ commitsPath: file.commitsPath.replace(regex, file.path),
+ blamePath: file.blamePath.replace(regex, file.path),
+ });
+ }
},
[types.BURST_UNUSED_SEAL](state) {
Object.assign(state, {
@@ -168,8 +184,62 @@ export default {
},
[types.OPEN_NEW_ENTRY_MODAL](state, { type, path }) {
Object.assign(state, {
- newEntryModal: { type, path },
- });
+ entryModal: {
+ type,
+ path,
+ entry: { ...state.entries[path] },
+ },
+ });
+ },
+ [types.DELETE_ENTRY](state, path) {
+ const entry = state.entries[path];
+ const parent = entry.parentPath
+ ? state.entries[entry.parentPath]
+ : state.trees[`${state.currentProjectId}/${state.currentBranchId}`];
+
+ entry.deleted = true;
+
+ parent.tree = parent.tree.filter(f => f.path !== entry.path);
+
+ if (entry.type === 'blob') {
+ state.changedFiles = state.changedFiles.concat(entry);
+ }
+ },
+ [types.RENAME_ENTRY](state, { path, name, entryPath = null }) {
+ const oldEntry = state.entries[entryPath || path];
+ const nameRegex =
+ !entryPath && oldEntry.type === 'blob'
+ ? new RegExp(`${oldEntry.name}$`)
+ : new RegExp(`^${path}`);
+ const newPath = oldEntry.path.replace(nameRegex, name);
+ const parentPath = oldEntry.parentPath ? oldEntry.parentPath.replace(nameRegex, name) : '';
+
+ state.entries[newPath] = {
+ ...oldEntry,
+ id: newPath,
+ key: `${name}-${oldEntry.type}-${oldEntry.id}`,
+ path: newPath,
+ name: entryPath ? oldEntry.name : name,
+ tempFile: true,
+ prevPath: oldEntry.path,
+ url: oldEntry.url.replace(new RegExp(`${oldEntry.path}/?$`), newPath),
+ tree: [],
+ parentPath,
+ raw: '',
+ };
+ oldEntry.moved = true;
+ oldEntry.movedPath = newPath;
+
+ const parent = parentPath
+ ? state.entries[parentPath]
+ : state.trees[`${state.currentProjectId}/${state.currentBranchId}`];
+ const newEntry = state.entries[newPath];
+
+ parent.tree = sortTree(parent.tree.concat(newEntry));
+
+ if (newEntry.type === 'blob') {
+ state.changedFiles = state.changedFiles.concat(newEntry);
+ }
},
...projectMutations,
...mergeRequestMutation,
diff --git a/app/assets/javascripts/ide/stores/mutations/file.js b/app/assets/javascripts/ide/stores/mutations/file.js
index 46547820425..c75add39bcd 100644
--- a/app/assets/javascripts/ide/stores/mutations/file.js
+++ b/app/assets/javascripts/ide/stores/mutations/file.js
@@ -1,5 +1,6 @@
/* eslint-disable no-param-reassign */
import * as types from '../mutation_types';
+import { sortTree } from '../utils';
import { diffModes } from '../../constants';
export default {
@@ -51,9 +52,27 @@ export default {
});
},
[types.SET_FILE_RAW_DATA](state, { file, raw }) {
- Object.assign(state.entries[file.path], {
- raw,
- });
+ const openPendingFile = state.openFiles.find(
+ f => f.path === file.path && f.pending && !(f.tempFile && !f.prevPath),
+ );
+
+ if (file.tempFile) {
+ Object.assign(state.entries[file.path], {
+ content: raw,
+ });
+ } else {
+ Object.assign(state.entries[file.path], {
+ raw,
+ });
+ }
+
+ if (!openPendingFile) return;
+
+ if (!openPendingFile.tempFile) {
+ openPendingFile.raw = raw;
+ } else if (openPendingFile.tempFile) {
+ openPendingFile.content = raw;
+ }
},
[types.SET_FILE_BASE_RAW_DATA](state, { file, baseRaw }) {
Object.assign(state.entries[file.path], {
@@ -109,11 +128,30 @@ export default {
},
[types.DISCARD_FILE_CHANGES](state, path) {
const stagedFile = state.stagedFiles.find(f => f.path === path);
+ const entry = state.entries[path];
+ const { deleted, prevPath } = entry;
Object.assign(state.entries[path], {
content: stagedFile ? stagedFile.content : state.entries[path].raw,
changed: false,
+ deleted: false,
+ moved: false,
+ movedPath: '',
});
+
+ if (deleted) {
+ const parent = entry.parentPath
+ ? state.entries[entry.parentPath]
+ : state.trees[`${state.currentProjectId}/${state.currentBranchId}`];
+
+ parent.tree = sortTree(parent.tree.concat(entry));
+ } else if (prevPath) {
+ const parent = entry.parentPath
+ ? state.entries[entry.parentPath]
+ : state.trees[`${state.currentProjectId}/${state.currentBranchId}`];
+
+ parent.tree = parent.tree.filter(f => f.path !== path);
+ }
},
[types.ADD_FILE_TO_CHANGED](state, path) {
Object.assign(state, {
diff --git a/app/assets/javascripts/ide/stores/mutations/tree.js b/app/assets/javascripts/ide/stores/mutations/tree.js
index 2cf34af9274..eac7441ee54 100644
--- a/app/assets/javascripts/ide/stores/mutations/tree.js
+++ b/app/assets/javascripts/ide/stores/mutations/tree.js
@@ -1,4 +1,5 @@
import * as types from '../mutation_types';
+import { sortTree } from '../utils';
export default {
[types.TOGGLE_TREE_OPEN](state, path) {
@@ -36,4 +37,14 @@ export default {
changedFiles: [],
});
},
+ [types.RESTORE_TREE](state, path) {
+ const entry = state.entries[path];
+ const parent = entry.parentPath
+ ? state.entries[entry.parentPath]
+ : state.trees[`${state.currentProjectId}/${state.currentBranchId}`];
+
+ if (!parent.tree.find(f => f.path === path)) {
+ parent.tree = sortTree(parent.tree.concat(entry));
+ }
+ },
};
diff --git a/app/assets/javascripts/ide/stores/state.js b/app/assets/javascripts/ide/stores/state.js
index 0f32a267469..2371b201f8c 100644
--- a/app/assets/javascripts/ide/stores/state.js
+++ b/app/assets/javascripts/ide/stores/state.js
@@ -26,8 +26,9 @@ export default () => ({
rightPane: null,
links: {},
errorMessage: null,
- newEntryModal: {
+ entryModal: {
type: '',
path: '',
+ entry: {},
},
});
diff --git a/app/assets/javascripts/ide/stores/utils.js b/app/assets/javascripts/ide/stores/utils.js
index 9e6b86dd844..0ede76fd1e0 100644
--- a/app/assets/javascripts/ide/stores/utils.js
+++ b/app/assets/javascripts/ide/stores/utils.js
@@ -46,6 +46,10 @@ export const dataStructure = () => ({
parentPath: null,
lastOpenedAt: 0,
mrChange: null,
+ deleted: false,
+ prevPath: '',
+ movedPath: '',
+ moved: false,
});
export const decorateData = entity => {
@@ -105,15 +109,37 @@ export const setPageTitle = title => {
document.title = title;
};
+export const commitActionForFile = file => {
+ if (file.prevPath) {
+ return 'move';
+ } else if (file.deleted) {
+ return 'delete';
+ } else if (file.tempFile) {
+ return 'create';
+ }
+
+ return 'update';
+};
+
+export const getCommitFiles = stagedFiles =>
+ stagedFiles.reduce((acc, file) => {
+ if (file.moved) return acc;
+
+ return acc.concat({
+ ...file,
+ });
+ }, []);
+
export const createCommitPayload = ({ branch, getters, newBranch, state, rootState }) => ({
branch,
commit_message: state.commitMessage || getters.preBuiltCommitMessage,
- actions: rootState.stagedFiles.map(f => ({
- action: f.tempFile ? 'create' : 'update',
+ actions: getCommitFiles(rootState.stagedFiles).map(f => ({
+ action: commitActionForFile(f),
file_path: f.path,
- content: f.content,
+ previous_path: f.prevPath === '' ? undefined : f.prevPath,
+ content: f.content || undefined,
encoding: f.base64 ? 'base64' : 'text',
- last_commit_id: newBranch ? undefined : f.lastCommitSha,
+ last_commit_id: newBranch || f.deleted || f.prevPath ? undefined : f.lastCommitSha,
})),
start_branch: newBranch ? rootState.currentBranchId : undefined,
});
@@ -141,8 +167,7 @@ export const sortTree = sortedTree =>
)
.sort(sortTreesByTypeAndName);
-export const filePathMatches = (f, path) =>
- f.path.replace(new RegExp(`${f.name}$`), '').indexOf(`${path}/`) === 0;
+export const filePathMatches = (filePath, path) => filePath.indexOf(`${path}/`) === 0;
export const getChangesCountForFiles = (files, path) =>
- files.filter(f => filePathMatches(f, path)).length;
+ files.filter(f => filePathMatches(f.path, path)).length;
diff --git a/app/assets/javascripts/ide/utils.js b/app/assets/javascripts/ide/utils.js
new file mode 100644
index 00000000000..92b15cf232d
--- /dev/null
+++ b/app/assets/javascripts/ide/utils.js
@@ -0,0 +1,12 @@
+import { commitItemIconMap } from './constants';
+
+// eslint-disable-next-line import/prefer-default-export
+export const getCommitIconMap = file => {
+ if (file.deleted) {
+ return commitItemIconMap.deleted;
+ } else if (file.tempFile) {
+ return commitItemIconMap.addition;
+ }
+
+ return commitItemIconMap.modified;
+};
diff --git a/app/assets/javascripts/issue_show/components/edited.vue b/app/assets/javascripts/issue_show/components/edited.vue
index 5ff5b1630b1..05cd976f196 100644
--- a/app/assets/javascripts/issue_show/components/edited.vue
+++ b/app/assets/javascripts/issue_show/components/edited.vue
@@ -46,7 +46,7 @@
by
<a
:href="updatedByPath"
- class="author_link"
+ class="author-link"
>
<span>{{ updatedByName }}</span>
</a>
diff --git a/app/assets/javascripts/lib/utils/http_status.js b/app/assets/javascripts/lib/utils/http_status.js
index 229d53b18b0..e4852c85378 100644
--- a/app/assets/javascripts/lib/utils/http_status.js
+++ b/app/assets/javascripts/lib/utils/http_status.js
@@ -2,11 +2,34 @@
* exports HTTP status codes
*/
-export default {
+const httpStatusCodes = {
ABORTED: 0,
- NO_CONTENT: 204,
OK: 200,
+ CREATED: 201,
+ ACCEPTED: 202,
+ NON_AUTHORITATIVE_INFORMATION: 203,
+ NO_CONTENT: 204,
+ RESET_CONTENT: 205,
+ PARTIAL_CONTENT: 206,
+ MULTI_STATUS: 207,
+ ALREADY_REPORTED: 208,
+ IM_USED: 226,
MULTIPLE_CHOICES: 300,
BAD_REQUEST: 400,
NOT_FOUND: 404,
};
+
+export const successCodes = [
+ httpStatusCodes.OK,
+ httpStatusCodes.CREATED,
+ httpStatusCodes.ACCEPTED,
+ httpStatusCodes.NON_AUTHORITATIVE_INFORMATION,
+ httpStatusCodes.NO_CONTENT,
+ httpStatusCodes.RESET_CONTENT,
+ httpStatusCodes.PARTIAL_CONTENT,
+ httpStatusCodes.MULTI_STATUS,
+ httpStatusCodes.ALREADY_REPORTED,
+ httpStatusCodes.IM_USED,
+];
+
+export default httpStatusCodes;
diff --git a/app/assets/javascripts/lib/utils/poll.js b/app/assets/javascripts/lib/utils/poll.js
index 91d8c30744f..198711cf427 100644
--- a/app/assets/javascripts/lib/utils/poll.js
+++ b/app/assets/javascripts/lib/utils/poll.js
@@ -1,4 +1,4 @@
-import httpStatusCodes from './http_status';
+import httpStatusCodes, { successCodes } from './http_status';
import { normalizeHeaders } from './common_utils';
/**
@@ -62,8 +62,7 @@ export default class Poll {
checkConditions(response) {
const headers = normalizeHeaders(response.headers);
const pollInterval = parseInt(headers[this.intervalHeader], 10);
- if (pollInterval > 0 && response.status === httpStatusCodes.OK && this.canPoll) {
- clearTimeout(this.timeoutID);
+ if (pollInterval > 0 && successCodes.indexOf(response.status) !== -1 && this.canPoll) {
this.timeoutID = setTimeout(() => {
this.makeRequest();
}, pollInterval);
diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js
index 5f25c6ce1ae..2be3c97bd95 100644
--- a/app/assets/javascripts/lib/utils/text_utility.js
+++ b/app/assets/javascripts/lib/utils/text_utility.js
@@ -76,6 +76,20 @@ export function capitalizeFirstCharacter(text) {
}
/**
+ * Returns the first character capitalized
+ *
+ * If falsey, returns empty string.
+ *
+ * @param {String} text
+ * @return {String}
+ */
+export function getFirstCharacterCapitalized(text) {
+ return text
+ ? text.charAt(0).toUpperCase()
+ : '';
+}
+
+/**
* Replaces all html tags from a string with the given replacement.
*
* @param {String} string
diff --git a/app/assets/javascripts/notes/components/discussion_counter.vue b/app/assets/javascripts/notes/components/discussion_counter.vue
index ad6e7cf501d..6385b75e557 100644
--- a/app/assets/javascripts/notes/components/discussion_counter.vue
+++ b/app/assets/javascripts/notes/components/discussion_counter.vue
@@ -5,20 +5,19 @@ import resolvedSvg from 'icons/_icon_status_success_solid.svg';
import mrIssueSvg from 'icons/_icon_mr_issue.svg';
import nextDiscussionSvg from 'icons/_next_discussion.svg';
import { pluralize } from '../../lib/utils/text_utility';
-import discussionNavigation from '../mixins/discussion_navigation';
+import { scrollToElement } from '../../lib/utils/common_utils';
import tooltip from '../../vue_shared/directives/tooltip';
export default {
directives: {
tooltip,
},
- mixins: [discussionNavigation],
computed: {
...mapGetters([
'getUserData',
'getNoteableData',
'discussionCount',
- 'firstUnresolvedDiscussionId',
+ 'unresolvedDiscussions',
'resolvedDiscussionCount',
]),
isLoggedIn() {
@@ -36,6 +35,11 @@ export default {
resolveAllDiscussionsIssuePath() {
return this.getNoteableData.create_issue_to_resolve_discussions_path;
},
+ firstUnresolvedDiscussionId() {
+ const item = this.unresolvedDiscussions[0] || {};
+
+ return item.id;
+ },
},
created() {
this.resolveSvg = resolveSvg;
@@ -46,10 +50,22 @@ export default {
methods: {
...mapActions(['expandDiscussion']),
jumpToFirstUnresolvedDiscussion() {
- const diffTab = window.mrTabs.currentAction === 'diffs';
- const discussionId = this.firstUnresolvedDiscussionId(diffTab);
+ const discussionId = this.firstUnresolvedDiscussionId;
+ if (!discussionId) {
+ return;
+ }
+
+ const el = document.querySelector(`[data-discussion-id="${discussionId}"]`);
+ const activeTab = window.mrTabs.currentAction;
+
+ if (activeTab === 'commits' || activeTab === 'pipelines') {
+ window.mrTabs.activateTab('show');
+ }
- this.jumpToDiscussion(discussionId);
+ if (el) {
+ this.expandDiscussion({ discussionId });
+ scrollToElement(el);
+ }
},
},
};
diff --git a/app/assets/javascripts/notes/components/note_edited_text.vue b/app/assets/javascripts/notes/components/note_edited_text.vue
index 391bb2ae179..d848335022f 100644
--- a/app/assets/javascripts/notes/components/note_edited_text.vue
+++ b/app/assets/javascripts/notes/components/note_edited_text.vue
@@ -42,7 +42,7 @@ export default {
by
<a
:href="editedBy.path"
- class="js-vue-author author_link">
+ class="js-vue-author author-link">
{{ editedBy.name }}
</a>
</template>
diff --git a/app/assets/javascripts/notes/components/note_form.vue b/app/assets/javascripts/notes/components/note_form.vue
index abcd4422d7c..26482a02e00 100644
--- a/app/assets/javascripts/notes/components/note_form.vue
+++ b/app/assets/javascripts/notes/components/note_form.vue
@@ -7,7 +7,7 @@ import issuableStateMixin from '../mixins/issuable_state';
import resolvable from '../mixins/resolvable';
export default {
- name: 'NoteForm',
+ name: 'IssueNoteForm',
components: {
issueWarning,
markdownField,
diff --git a/app/assets/javascripts/notes/components/note_header.vue b/app/assets/javascripts/notes/components/note_header.vue
index ee3580895df..a621418cf72 100644
--- a/app/assets/javascripts/notes/components/note_header.vue
+++ b/app/assets/javascripts/notes/components/note_header.vue
@@ -74,6 +74,9 @@ export default {
</div>
<a :href="author.path">
<span class="note-header-author-name">{{ author.name }}</span>
+ <span
+ v-if="author.status_tooltip_html"
+ v-html="author.status_tooltip_html"></span>
<span class="note-headline-light">
@{{ author.username }}
</span>
diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue
index 0fe1c16854a..bee635398b3 100644
--- a/app/assets/javascripts/notes/components/noteable_discussion.vue
+++ b/app/assets/javascripts/notes/components/noteable_discussion.vue
@@ -1,11 +1,11 @@
<script>
+import _ from 'underscore';
import { mapActions, mapGetters } from 'vuex';
import resolveDiscussionsSvg from 'icons/_icon_mr_issue.svg';
import nextDiscussionsSvg from 'icons/_next_discussion.svg';
-import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils';
+import { convertObjectPropsToCamelCase, scrollToElement } from '~/lib/utils/common_utils';
import { truncateSha } from '~/lib/utils/text_utility';
import systemNote from '~/vue_shared/components/notes/system_note.vue';
-import { s__ } from '~/locale';
import Flash from '../../flash';
import { SYSTEM_NOTE } from '../constants';
import userAvatarLink from '../../vue_shared/components/user_avatar/user_avatar_link.vue';
@@ -20,7 +20,6 @@ import placeholderSystemNote from '../../vue_shared/components/notes/placeholder
import autosave from '../mixins/autosave';
import noteable from '../mixins/noteable';
import resolvable from '../mixins/resolvable';
-import discussionNavigation from '../mixins/discussion_navigation';
import tooltip from '../../vue_shared/directives/tooltip';
export default {
@@ -40,7 +39,7 @@ export default {
directives: {
tooltip,
},
- mixins: [autosave, noteable, resolvable, discussionNavigation],
+ mixins: [autosave, noteable, resolvable],
props: {
discussion: {
type: Object,
@@ -61,11 +60,6 @@ export default {
required: false,
default: false,
},
- discussionsByDiffOrder: {
- type: Boolean,
- required: false,
- default: false,
- },
},
data() {
return {
@@ -80,12 +74,7 @@ export default {
'discussionCount',
'resolvedDiscussionCount',
'allDiscussions',
- 'unresolvedDiscussionsIdsByDiff',
- 'unresolvedDiscussionsIdsByDate',
'unresolvedDiscussions',
- 'unresolvedDiscussionsIdsOrdered',
- 'nextUnresolvedDiscussionId',
- 'isLastUnresolvedDiscussion',
]),
transformedDiscussion() {
return {
@@ -136,10 +125,6 @@ export default {
hasMultipleUnresolvedDiscussions() {
return this.unresolvedDiscussions.length > 1;
},
- showJumpToNextDiscussion() {
- return this.hasMultipleUnresolvedDiscussions &&
- !this.isLastUnresolvedDiscussion(this.discussion.id, this.discussionsByDiffOrder);
- },
shouldRenderDiffs() {
const { diffDiscussion, diffFile } = this.transformedDiscussion;
@@ -159,17 +144,19 @@ export default {
return this.isDiffDiscussion ? '' : 'card discussion-wrapper';
},
},
- watch: {
- isReplying() {
- if (this.isReplying) {
- this.$nextTick(() => {
- // Pass an extra key to separate reply and note edit forms
- this.initAutoSave(this.transformedDiscussion, ['Reply']);
- });
+ mounted() {
+ if (this.isReplying) {
+ this.initAutoSave(this.transformedDiscussion);
+ }
+ },
+ updated() {
+ if (this.isReplying) {
+ if (!this.autosave) {
+ this.initAutoSave(this.transformedDiscussion);
} else {
- this.disposeAutoSave();
+ this.setAutoSave();
}
- },
+ }
},
created() {
this.resolveDiscussionsSvg = resolveDiscussionsSvg;
@@ -207,18 +194,16 @@ export default {
showReplyForm() {
this.isReplying = true;
},
- cancelReplyForm(shouldConfirm, isDirty) {
- if (shouldConfirm && isDirty) {
- const msg = s__('Notes|Are you sure you want to cancel creating this comment?');
-
+ cancelReplyForm(shouldConfirm) {
+ if (shouldConfirm && this.$refs.noteForm.isDirty) {
// eslint-disable-next-line no-alert
- if (!window.confirm(msg)) {
+ if (!window.confirm('Are you sure you want to cancel creating this comment?')) {
return;
}
}
- this.isReplying = false;
this.resetAutoSave();
+ this.isReplying = false;
},
saveReply(noteText, form, callback) {
const postData = {
@@ -256,10 +241,21 @@ Please check your network connection and try again.`;
});
},
jumpToNextDiscussion() {
- const nextId =
- this.nextUnresolvedDiscussionId(this.discussion.id, this.discussionsByDiffOrder);
+ const discussionIds = this.allDiscussions.map(d => d.id);
+ const unresolvedIds = this.unresolvedDiscussions.map(d => d.id);
+ const currentIndex = discussionIds.indexOf(this.discussion.id);
+ const remainingAfterCurrent = discussionIds.slice(currentIndex + 1);
+ const nextIndex = _.findIndex(remainingAfterCurrent, id => unresolvedIds.indexOf(id) > -1);
+
+ if (nextIndex > -1) {
+ const nextId = remainingAfterCurrent[nextIndex];
+ const el = document.querySelector(`[data-discussion-id="${nextId}"]`);
- this.jumpToDiscussion(nextId);
+ if (el) {
+ this.expandDiscussion({ discussionId: nextId });
+ scrollToElement(el);
+ }
+ }
},
},
};
@@ -401,7 +397,7 @@ Please check your network connection and try again.`;
</a>
</div>
<div
- v-if="showJumpToNextDiscussion"
+ v-if="hasMultipleUnresolvedDiscussions"
class="btn-group"
role="group">
<button
@@ -424,8 +420,7 @@ Please check your network connection and try again.`;
:is-editing="false"
save-button-title="Comment"
@handleFormUpdate="saveReply"
- @cancelForm="cancelReplyForm"
- />
+ @cancelForm="cancelReplyForm" />
<note-signed-out-widget v-if="!canReply" />
</div>
</div>
diff --git a/app/assets/javascripts/notes/mixins/autosave.js b/app/assets/javascripts/notes/mixins/autosave.js
index 4f45f912479..36cc8d5d056 100644
--- a/app/assets/javascripts/notes/mixins/autosave.js
+++ b/app/assets/javascripts/notes/mixins/autosave.js
@@ -4,18 +4,12 @@ import { capitalizeFirstCharacter } from '../../lib/utils/text_utility';
export default {
methods: {
- initAutoSave(noteable, extraKeys = []) {
- let keys = [
+ initAutoSave(noteable) {
+ this.autosave = new Autosave($(this.$refs.noteForm.$refs.textarea), [
'Note',
- capitalizeFirstCharacter(noteable.noteable_type || noteable.noteableType),
+ capitalizeFirstCharacter(noteable.noteable_type),
noteable.id,
- ];
-
- if (extraKeys) {
- keys = keys.concat(extraKeys);
- }
-
- this.autosave = new Autosave($(this.$refs.noteForm.$refs.textarea), keys);
+ ]);
},
resetAutoSave() {
this.autosave.reset();
@@ -23,8 +17,5 @@ export default {
setAutoSave() {
this.autosave.save();
},
- disposeAutoSave() {
- this.autosave.dispose();
- },
},
};
diff --git a/app/assets/javascripts/notes/mixins/discussion_navigation.js b/app/assets/javascripts/notes/mixins/discussion_navigation.js
deleted file mode 100644
index f7c4deee1f8..00000000000
--- a/app/assets/javascripts/notes/mixins/discussion_navigation.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import { scrollToElement } from '~/lib/utils/common_utils';
-
-export default {
- methods: {
- jumpToDiscussion(id) {
- if (id) {
- const activeTab = window.mrTabs.currentAction;
- const selector =
- activeTab === 'diffs'
- ? `ul.notes[data-discussion-id="${id}"]`
- : `div.discussion[data-discussion-id="${id}"]`;
- const el = document.querySelector(selector);
-
- if (activeTab === 'commits' || activeTab === 'pipelines') {
- window.mrTabs.activateTab('show');
- }
-
- if (el) {
- this.expandDiscussion({ discussionId: id });
-
- scrollToElement(el);
- return true;
- }
- }
-
- return false;
- },
- },
-};
diff --git a/app/assets/javascripts/notes/stores/getters.js b/app/assets/javascripts/notes/stores/getters.js
index 0d8d197bf71..5c65e1c3bb5 100644
--- a/app/assets/javascripts/notes/stores/getters.js
+++ b/app/assets/javascripts/notes/stores/getters.js
@@ -28,6 +28,18 @@ export const notesById = state =>
return acc;
}, {});
+export const discussionsByLineCode = state =>
+ state.discussions.reduce((acc, note) => {
+ if (note.diff_discussion && note.line_code && note.resolvable) {
+ // For context about line notes: there might be multiple notes with the same line code
+ const items = acc[note.line_code] || [];
+ items.push(note);
+
+ Object.assign(acc, { [note.line_code]: items });
+ }
+ return acc;
+ }, {});
+
export const noteableType = state => {
const { ISSUE_NOTEABLE_TYPE, MERGE_REQUEST_NOTEABLE_TYPE, EPIC_NOTEABLE_TYPE } = constants;
@@ -70,9 +82,6 @@ export const allDiscussions = (state, getters) => {
return Object.values(resolved).concat(unresolved);
};
-export const allResolvableDiscussions = (state, getters) =>
- getters.allDiscussions.filter(d => !d.individual_note && d.resolvable);
-
export const resolvedDiscussionsById = state => {
const map = {};
@@ -89,51 +98,6 @@ export const resolvedDiscussionsById = state => {
return map;
};
-// Gets Discussions IDs ordered by the date of their initial note
-export const unresolvedDiscussionsIdsByDate = (state, getters) =>
- getters.allResolvableDiscussions
- .filter(d => !d.resolved)
- .sort((a, b) => {
- const aDate = new Date(a.notes[0].created_at);
- const bDate = new Date(b.notes[0].created_at);
-
- if (aDate < bDate) {
- return -1;
- }
-
- return aDate === bDate ? 0 : 1;
- })
- .map(d => d.id);
-
-// Gets Discussions IDs ordered by their position in the diff
-//
-// Sorts the array of resolvable yet unresolved discussions by
-// comparing file names first. If file names are the same, compares
-// line numbers.
-export const unresolvedDiscussionsIdsByDiff = (state, getters) =>
- getters.allResolvableDiscussions
- .filter(d => !d.resolved)
- .sort((a, b) => {
- if (!a.diff_file || !b.diff_file) {
- return 0;
- }
-
- // Get file names comparison result
- const filenameComparison = a.diff_file.file_path.localeCompare(b.diff_file.file_path);
-
- // Get the line numbers, to compare within the same file
- const aLines = [a.position.formatter.new_line, a.position.formatter.old_line];
- const bLines = [b.position.formatter.new_line, b.position.formatter.old_line];
-
- return filenameComparison < 0 ||
- (filenameComparison === 0 &&
- // .max() because one of them might be zero (if removed/added)
- Math.max(aLines[0], aLines[1]) < Math.max(bLines[0], bLines[1]))
- ? -1
- : 1;
- })
- .map(d => d.id);
-
export const resolvedDiscussionCount = (state, getters) => {
const resolvedMap = getters.resolvedDiscussionsById;
@@ -150,42 +114,5 @@ export const discussionTabCounter = state => {
return all.length;
};
-// Returns the list of discussion IDs ordered according to given parameter
-// @param {Boolean} diffOrder - is ordered by diff?
-export const unresolvedDiscussionsIdsOrdered = (state, getters) => diffOrder => {
- if (diffOrder) {
- return getters.unresolvedDiscussionsIdsByDiff;
- }
- return getters.unresolvedDiscussionsIdsByDate;
-};
-
-// Checks if a given discussion is the last in the current order (diff or date)
-// @param {Boolean} discussionId - id of the discussion
-// @param {Boolean} diffOrder - is ordered by diff?
-export const isLastUnresolvedDiscussion = (state, getters) => (discussionId, diffOrder) => {
- const idsOrdered = getters.unresolvedDiscussionsIdsOrdered(diffOrder);
- const lastDiscussionId = idsOrdered[idsOrdered.length - 1];
-
- return lastDiscussionId === discussionId;
-};
-
-// Gets the ID of the discussion following the one provided, respecting order (diff or date)
-// @param {Boolean} discussionId - id of the current discussion
-// @param {Boolean} diffOrder - is ordered by diff?
-export const nextUnresolvedDiscussionId = (state, getters) => (discussionId, diffOrder) => {
- const idsOrdered = getters.unresolvedDiscussionsIdsOrdered(diffOrder);
- const currentIndex = idsOrdered.indexOf(discussionId);
-
- return idsOrdered.slice(currentIndex + 1, currentIndex + 2)[0];
-};
-
-// @param {Boolean} diffOrder - is ordered by diff?
-export const firstUnresolvedDiscussionId = (state, getters) => diffOrder => {
- if (diffOrder) {
- return getters.unresolvedDiscussionsIdsByDiff[0];
- }
- return getters.unresolvedDiscussionsIdsByDate[0];
-};
-
// prevent babel-plugin-rewire from generating an invalid default during karma tests
export default () => {};
diff --git a/app/assets/javascripts/notes/stores/mutations.js b/app/assets/javascripts/notes/stores/mutations.js
index e1b159142c9..ab6a95e2601 100644
--- a/app/assets/javascripts/notes/stores/mutations.js
+++ b/app/assets/javascripts/notes/stores/mutations.js
@@ -174,19 +174,27 @@ export default {
[types.UPDATE_NOTE](state, note) {
const noteObj = utils.findNoteObjectById(state.discussions, note.discussion_id);
+
if (noteObj.individual_note) {
noteObj.notes.splice(0, 1, note);
} else {
const comment = utils.findNoteObjectById(noteObj.notes, note.id);
- Object.assign(comment, note);
+ noteObj.notes.splice(noteObj.notes.indexOf(comment), 1, note);
}
},
[types.UPDATE_DISCUSSION](state, noteData) {
const note = noteData;
- const selectedDiscussion = state.discussions.find(n => n.id === note.id);
+ let index = 0;
+
+ state.discussions.forEach((n, i) => {
+ if (n.id === note.id) {
+ index = i;
+ }
+ });
+
note.expanded = true; // override expand flag to prevent collapse
- Object.assign(selectedDiscussion, note);
+ state.discussions.splice(index, 1, note);
},
[types.CLOSE_ISSUE](state) {
@@ -207,9 +215,12 @@ export default {
[types.SET_DISCUSSION_DIFF_LINES](state, { discussionId, diffLines }) {
const discussion = utils.findNoteObjectById(state.discussions, discussionId);
+ const index = state.discussions.indexOf(discussion);
- Object.assign(discussion, {
+ const discussionWithDiffLines = Object.assign({}, discussion, {
truncated_diff_lines: diffLines,
});
+
+ state.discussions.splice(index, 1, discussionWithDiffLines);
},
};
diff --git a/app/assets/javascripts/notes/stores/utils.js b/app/assets/javascripts/notes/stores/utils.js
index c4a812c5af4..a0e096ebfaf 100644
--- a/app/assets/javascripts/notes/stores/utils.js
+++ b/app/assets/javascripts/notes/stores/utils.js
@@ -2,11 +2,13 @@ import AjaxCache from '~/lib/utils/ajax_cache';
const REGEX_QUICK_ACTIONS = /^\/\w+.*$/gm;
-export const findNoteObjectById = (notes, id) => notes.find(n => n.id === id);
+export const findNoteObjectById = (notes, id) =>
+ notes.filter(n => n.id === id)[0];
export const getQuickActionText = note => {
let text = 'Applying command';
- const quickActions = AjaxCache.get(gl.GfmAutoComplete.dataSources.commands) || [];
+ const quickActions =
+ AjaxCache.get(gl.GfmAutoComplete.dataSources.commands) || [];
const executedCommands = quickActions.filter(command => {
const commandRegex = new RegExp(`/${command.name}`);
@@ -27,4 +29,5 @@ export const getQuickActionText = note => {
export const hasQuickActions = note => REGEX_QUICK_ACTIONS.test(note);
-export const stripQuickActions = note => note.replace(REGEX_QUICK_ACTIONS, '').trim();
+export const stripQuickActions = note =>
+ note.replace(REGEX_QUICK_ACTIONS, '').trim();
diff --git a/app/assets/javascripts/pages/projects/new/index.js b/app/assets/javascripts/pages/projects/new/index.js
index 7db644e2477..097403ba9e2 100644
--- a/app/assets/javascripts/pages/projects/new/index.js
+++ b/app/assets/javascripts/pages/projects/new/index.js
@@ -1,9 +1,7 @@
-import initProjectLoadingSpinner from '../shared/save_project_loader';
import initProjectVisibilitySelector from '../../../project_visibility';
import initProjectNew from '../../../projects/project_new';
document.addEventListener('DOMContentLoaded', () => {
- initProjectLoadingSpinner();
initProjectVisibilitySelector();
initProjectNew.bindEvents();
});
diff --git a/app/assets/javascripts/pipelines/components/graph/dropdown_job_component.vue b/app/assets/javascripts/pipelines/components/graph/dropdown_job_component.vue
index c32dc83da8e..8487c8036ee 100644
--- a/app/assets/javascripts/pipelines/components/graph/dropdown_job_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/dropdown_job_component.vue
@@ -1,5 +1,6 @@
<script>
import $ from 'jquery';
+import _ from 'underscore';
import JobNameComponent from './job_name_component.vue';
import JobComponent from './job_component.vue';
import tooltip from '../../../vue_shared/directives/tooltip';
@@ -13,7 +14,7 @@ import tooltip from '../../../vue_shared/directives/tooltip';
* "id": 4256,
* "name": "test",
* "status": {
- * "icon": "icon_status_success",
+ * "icon": "status_success",
* "text": "passed",
* "label": "passed",
* "group": "success",
@@ -46,7 +47,7 @@ export default {
computed: {
tooltipText() {
- return `${this.job.name} - ${this.job.status.label}`;
+ return _.escape(`${this.job.name} - ${this.job.status.label}`);
},
},
diff --git a/app/assets/javascripts/pipelines/components/graph/graph_component.vue b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
index 4ec67f6c01b..1952dd453f4 100644
--- a/app/assets/javascripts/pipelines/components/graph/graph_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/graph_component.vue
@@ -1,4 +1,5 @@
<script>
+import _ from 'underscore';
import LoadingIcon from '~/vue_shared/components/loading_icon.vue';
import StageColumnComponent from './stage_column_component.vue';
@@ -26,7 +27,8 @@ export default {
methods: {
capitalizeStageName(name) {
- return name.charAt(0).toUpperCase() + name.slice(1);
+ const escapedName = _.escape(name);
+ return escapedName.charAt(0).toUpperCase() + escapedName.slice(1);
},
isFirstColumn(index) {
diff --git a/app/assets/javascripts/pipelines/components/graph/job_component.vue b/app/assets/javascripts/pipelines/components/graph/job_component.vue
index 8af984ef91a..66f95147193 100644
--- a/app/assets/javascripts/pipelines/components/graph/job_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/job_component.vue
@@ -1,4 +1,5 @@
<script>
+import _ from 'underscore';
import ActionComponent from './action_component.vue';
import JobNameComponent from './job_name_component.vue';
import tooltip from '../../../vue_shared/directives/tooltip';
@@ -12,7 +13,7 @@ import tooltip from '../../../vue_shared/directives/tooltip';
* "id": 4256,
* "name": "test",
* "status": {
- * "icon": "icon_status_success",
+ * "icon": "status_success",
* "text": "passed",
* "label": "passed",
* "group": "success",
@@ -61,7 +62,7 @@ export default {
const textBuilder = [];
if (this.job.name) {
- textBuilder.push(this.job.name);
+ textBuilder.push(_.escape(this.job.name));
}
if (this.job.name && this.status.tooltip) {
@@ -69,7 +70,7 @@ export default {
}
if (this.status.tooltip) {
- textBuilder.push(`${this.job.status.tooltip}`);
+ textBuilder.push(this.job.status.tooltip);
}
return textBuilder.join(' ');
diff --git a/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue b/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
index 2c728582b7c..e7b2de52f76 100644
--- a/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
+++ b/app/assets/javascripts/pipelines/components/graph/stage_column_component.vue
@@ -1,4 +1,5 @@
<script>
+import _ from 'underscore';
import JobComponent from './job_component.vue';
import DropdownJobComponent from './dropdown_job_component.vue';
@@ -37,7 +38,7 @@ export default {
},
jobId(job) {
- return `ci-badge-${job.name}`;
+ return `ci-badge-${_.escape(job.name)}`;
},
buildConnnectorClass(index) {
diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js
index 002edb4663c..04badad0f34 100644
--- a/app/assets/javascripts/projects/project_new.js
+++ b/app/assets/javascripts/projects/project_new.js
@@ -37,9 +37,10 @@ const bindEvents = () => {
const $projectFieldsForm = $('.project-fields-form');
const $selectedTemplateText = $('.selected-template');
const $changeTemplateBtn = $('.change-template');
- const $selectedIcon = $('.selected-icon svg');
+ const $selectedIcon = $('.selected-icon');
const $templateProjectNameInput = $('#template-project-name #project_path');
const $pushNewProjectTipTrigger = $('.push-new-project-tip');
+ const $projectTemplateButtons = $('.project-templates-buttons');
if ($newProjectForm.length !== 1) {
return;
@@ -88,35 +89,35 @@ const bindEvents = () => {
}
function chooseTemplate() {
- $('.template-option').hide();
+ $projectTemplateButtons.addClass('hidden');
$projectFieldsForm.addClass('selected');
- $selectedIcon.removeClass('d-block');
+ $selectedIcon.empty();
const value = $(this).val();
const templates = {
rails: {
text: 'Ruby on Rails',
- icon: '.selected-icon .icon-rails',
+ icon: '.template-option svg.icon-rails',
},
express: {
text: 'NodeJS Express',
- icon: '.selected-icon .icon-node-express',
+ icon: '.template-option svg.icon-node-express',
},
spring: {
text: 'Spring',
- icon: '.selected-icon .icon-java-spring',
+ icon: '.template-option svg.icon-java-spring',
},
};
const selectedTemplate = templates[value];
$selectedTemplateText.text(selectedTemplate.text);
- $(selectedTemplate.icon).addClass('d-block');
+ $(selectedTemplate.icon).clone().addClass('d-block').appendTo($selectedIcon);
$templateProjectNameInput.focus();
}
$useTemplateBtn.on('change', chooseTemplate);
$changeTemplateBtn.on('click', () => {
- $('.template-option').show();
+ $projectTemplateButtons.removeClass('hidden');
$projectFieldsForm.removeClass('selected');
$useTemplateBtn.prop('checked', false);
});
diff --git a/app/assets/javascripts/reports/components/grouped_test_reports_app.vue b/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
new file mode 100644
index 00000000000..0fc84b4552a
--- /dev/null
+++ b/app/assets/javascripts/reports/components/grouped_test_reports_app.vue
@@ -0,0 +1,116 @@
+<script>
+ import { mapActions, mapGetters, mapState } from 'vuex';
+ import { s__ } from '~/locale';
+ import { componentNames } from '~/vue_shared/components/reports/issue_body';
+ import ReportSection from '~/vue_shared/components/reports/report_section.vue';
+ import SummaryRow from '~/vue_shared/components/reports/summary_row.vue';
+ import IssuesList from '~/vue_shared/components/reports/issues_list.vue';
+ import Modal from './modal.vue';
+ import createStore from '../store';
+ import { summaryTextBuilder, reportTextBuilder, statusIcon } from '../store/utils';
+
+ export default {
+ name: 'GroupedTestReportsApp',
+ store: createStore(),
+ components: {
+ ReportSection,
+ SummaryRow,
+ IssuesList,
+ Modal,
+ },
+ props: {
+ endpoint: {
+ type: String,
+ required: true,
+ },
+ },
+ componentNames,
+ computed: {
+ ...mapState([
+ 'reports',
+ 'isLoading',
+ 'hasError',
+ 'summary',
+ ]),
+ ...mapState({
+ modalTitle: state => state.modal.title || '',
+ modalData: state => state.modal.data || {},
+ }),
+ ...mapGetters([
+ 'summaryStatus',
+ ]),
+ groupedSummaryText() {
+ if (this.isLoading) {
+ return s__('Reports|Test summary results are being parsed');
+ }
+
+ if (this.hasError) {
+ return s__('Reports|Test summary failed loading results');
+ }
+
+ return summaryTextBuilder(s__('Reports|Test summary'), this.summary);
+ },
+ },
+ created() {
+ this.setEndpoint(this.endpoint);
+
+ this.fetchReports();
+ },
+ methods: {
+ ...mapActions(['setEndpoint', 'fetchReports']),
+ reportText(report) {
+ const summary = report.summary || {};
+ return reportTextBuilder(report.name, summary);
+ },
+ getReportIcon(report) {
+ return statusIcon(report.status);
+ },
+ shouldRenderIssuesList(report) {
+ return (
+ report.existing_failures.length > 0 ||
+ report.new_failures.length > 0 ||
+ report.resolved_failures > 0
+ );
+ },
+ },
+ };
+</script>
+<template>
+ <report-section
+ :status="summaryStatus"
+ :success-text="groupedSummaryText"
+ :loading-text="groupedSummaryText"
+ :error-text="groupedSummaryText"
+ :has-issues="reports.length > 0"
+ class="mr-widget-border-top grouped-security-reports"
+ >
+ <div
+ slot="body"
+ class="mr-widget-grouped-section report-block"
+ >
+ <template
+ v-for="(report, i) in reports"
+ >
+ <summary-row
+ :summary="reportText(report)"
+ :status-icon="getReportIcon(report)"
+ :key="`summary-row-${i}`"
+ />
+ <issues-list
+ v-if="shouldRenderIssuesList(report)"
+ :unresolved-issues="report.existing_failures"
+ :new-issues="report.new_failures"
+ :resolved-issues="report.resolved_failures"
+ :key="`issues-list-${i}`"
+ :component="$options.componentNames.TestIssueBody"
+ class="report-block-group-list"
+ />
+ </template>
+
+ <modal
+ :title="modalTitle"
+ :modal-data="modalData"
+ />
+ </div>
+ </report-section>
+</template>
diff --git a/app/assets/javascripts/reports/components/modal.vue b/app/assets/javascripts/reports/components/modal.vue
new file mode 100644
index 00000000000..b2133714858
--- /dev/null
+++ b/app/assets/javascripts/reports/components/modal.vue
@@ -0,0 +1,73 @@
+<script>
+ import Modal from '~/vue_shared/components/gl_modal.vue';
+ import LoadingButton from '~/vue_shared/components/loading_button.vue';
+ import CodeBlock from '~/vue_shared/components/code_block.vue';
+ import { fieldTypes } from '../constants';
+
+ export default {
+ components: {
+ Modal,
+ LoadingButton,
+ CodeBlock,
+ },
+ props: {
+ title: {
+ type: String,
+ required: true,
+ },
+ modalData: {
+ type: Object,
+ required: true,
+ },
+ },
+ fieldTypes,
+ };
+</script>
+<template>
+ <modal
+ id="modal-mrwidget-reports"
+ :header-title-text="title"
+ class="modal-security-report-dast modal-hide-footer"
+ >
+ <slot>
+ <div
+ v-for="(field, key, index) in modalData"
+ v-if="field.value"
+ :key="index"
+ class="row prepend-top-10 append-bottom-10"
+ >
+ <strong class="col-sm-2 text-right">
+ {{ field.text }}:
+ </strong>
+
+ <div class="col-sm-10 text-secondary">
+ <code-block
+ v-if="field.type === $options.fieldTypes.codeBock"
+ :code="field.value"
+ />
+
+ <template v-else-if="field.type === $options.fieldTypes.link">
+ <a
+ :href="field.value"
+ target="_blank"
+ rel="noopener noreferrer"
+ class="js-modal-link"
+ >
+ {{ field.value }}
+ </a>
+ </template>
+
+ <template v-else-if="field.type === $options.fieldTypes.miliseconds">
+ {{ field.value }} ms
+ </template>
+
+ <template v-else-if="field.type === $options.fieldTypes.text">
+ {{ field.value }}
+ </template>
+ </div>
+ </div>
+ </slot>
+ <div slot="footer">
+ </div>
+ </modal>
+</template>
diff --git a/app/assets/javascripts/reports/components/test_issue_body.vue b/app/assets/javascripts/reports/components/test_issue_body.vue
new file mode 100644
index 00000000000..cd443a49b52
--- /dev/null
+++ b/app/assets/javascripts/reports/components/test_issue_body.vue
@@ -0,0 +1,44 @@
+<script>
+ import { mapActions } from 'vuex';
+
+ export default {
+ name: 'TestIssueBody',
+ props: {
+ issue: {
+ type: Object,
+ required: true,
+ },
+ // failed || success
+ status: {
+ type: String,
+ required: true,
+ },
+ isNew: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
+ },
+ methods: {
+ ...mapActions(['openModal']),
+ },
+ };
+</script>
+<template>
+ <div class="report-block-list-issue-description prepend-top-5 append-bottom-5">
+ <div class="report-block-list-issue-description-text">
+ <button
+ type="button"
+ class="btn-link btn-blank text-left break-link vulnerability-name-button"
+ @click="openModal({ issue })"
+ >
+ <div
+ v-if="isNew"
+ class="badge badge-danger append-right-5"
+ >
+ {{ s__('New') }}
+ </div>{{ issue.name }}
+ </button>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/reports/constants.js b/app/assets/javascripts/reports/constants.js
new file mode 100644
index 00000000000..807ecb1039e
--- /dev/null
+++ b/app/assets/javascripts/reports/constants.js
@@ -0,0 +1,16 @@
+export const fieldTypes = {
+ codeBock: 'codeBlock',
+ link: 'link',
+ miliseconds: 'miliseconds',
+ text: 'text',
+};
+
+export const LOADING = 'LOADING';
+export const ERROR = 'ERROR';
+export const SUCCESS = 'SUCCESS';
+
+export const STATUS_FAILED = 'failed';
+export const STATUS_SUCCESS = 'success';
+export const ICON_WARNING = 'warning';
+export const ICON_SUCCESS = 'success';
+export const ICON_NOTFOUND = 'notfound';
diff --git a/app/assets/javascripts/reports/store/actions.js b/app/assets/javascripts/reports/store/actions.js
index 15c077b0fd8..acabcc1d193 100644
--- a/app/assets/javascripts/reports/store/actions.js
+++ b/app/assets/javascripts/reports/store/actions.js
@@ -1,7 +1,9 @@
import Visibility from 'visibilityjs';
+import $ from 'jquery';
import axios from '../../lib/utils/axios_utils';
import Poll from '../../lib/utils/poll';
import * as types from './mutation_types';
+import httpStatusCodes from '../../lib/utils/http_status';
export const setEndpoint = ({ commit }, endpoint) => commit(types.SET_ENDPOINT, endpoint);
@@ -41,12 +43,19 @@ export const fetchReports = ({ state, dispatch }) => {
},
data: state.endpoint,
method: 'getReports',
- successCallback: ({ data }) => dispatch('receiveReportsSuccess', data),
+ successCallback: ({ data, status }) => dispatch('receiveReportsSuccess', {
+ data, status,
+ }),
errorCallback: () => dispatch('receiveReportsError'),
});
if (!Visibility.hidden()) {
eTagPoll.makeRequest();
+ } else {
+ axios
+ .get(state.endpoint)
+ .then(({ data, status }) => dispatch('receiveReportsSuccess', { data, status }))
+ .catch(() => dispatch('receiveReportsError'));
}
Visibility.change(() => {
@@ -58,10 +67,22 @@ export const fetchReports = ({ state, dispatch }) => {
});
};
-export const receiveReportsSuccess = ({ commit }, response) =>
- commit(types.RECEIVE_REPORTS_SUCCESS, response);
+export const receiveReportsSuccess = ({ commit }, response) => {
+ // With 204 we keep polling and don't update the state
+ if (response.status === httpStatusCodes.OK) {
+ commit(types.RECEIVE_REPORTS_SUCCESS, response.data);
+ }
+};
export const receiveReportsError = ({ commit }) => commit(types.RECEIVE_REPORTS_ERROR);
+export const openModal = ({ dispatch }, payload) => {
+ dispatch('setModalData', payload);
+
+ $('#modal-mrwidget-reports').modal('show');
+};
+
+export const setModalData = ({ commit }, payload) => commit(types.SET_ISSUE_MODAL_DATA, payload);
+
// prevent babel-plugin-rewire from generating an invalid default during karma tests
export default () => {};
diff --git a/app/assets/javascripts/reports/store/getters.js b/app/assets/javascripts/reports/store/getters.js
new file mode 100644
index 00000000000..95266194acb
--- /dev/null
+++ b/app/assets/javascripts/reports/store/getters.js
@@ -0,0 +1,16 @@
+import { LOADING, ERROR, SUCCESS, STATUS_FAILED } from '../constants';
+
+export const summaryStatus = state => {
+ if (state.isLoading) {
+ return LOADING;
+ }
+
+ if (state.hasError || state.status === STATUS_FAILED) {
+ return ERROR;
+ }
+
+ return SUCCESS;
+};
+
+// prevent babel-plugin-rewire from generating an invalid default during karma tests
+export default () => {};
diff --git a/app/assets/javascripts/reports/store/index.js b/app/assets/javascripts/reports/store/index.js
index af4f9688fb4..9d8f7dc3b74 100644
--- a/app/assets/javascripts/reports/store/index.js
+++ b/app/assets/javascripts/reports/store/index.js
@@ -1,6 +1,7 @@
import Vue from 'vue';
import Vuex from 'vuex';
import * as actions from './actions';
+import * as getters from './getters';
import mutations from './mutations';
import state from './state';
@@ -9,5 +10,6 @@ Vue.use(Vuex);
export default () => new Vuex.Store({
actions,
mutations,
+ getters,
state: state(),
});
diff --git a/app/assets/javascripts/reports/store/mutation_types.js b/app/assets/javascripts/reports/store/mutation_types.js
index 77722974c45..82bda31df5d 100644
--- a/app/assets/javascripts/reports/store/mutation_types.js
+++ b/app/assets/javascripts/reports/store/mutation_types.js
@@ -3,3 +3,5 @@ export const SET_ENDPOINT = 'SET_ENDPOINT';
export const REQUEST_REPORTS = 'REQUEST_REPORTS';
export const RECEIVE_REPORTS_SUCCESS = 'RECEIVE_REPORTS_SUCCESS';
export const RECEIVE_REPORTS_ERROR = 'RECEIVE_REPORTS_ERROR';
+export const SET_ISSUE_MODAL_DATA = 'SET_ISSUE_MODAL_DATA';
+
diff --git a/app/assets/javascripts/reports/store/mutations.js b/app/assets/javascripts/reports/store/mutations.js
index d9d301826cf..e806d120b51 100644
--- a/app/assets/javascripts/reports/store/mutations.js
+++ b/app/assets/javascripts/reports/store/mutations.js
@@ -16,11 +16,32 @@ export default {
state.summary.resolved = response.summary.resolved;
state.summary.failed = response.summary.failed;
+ state.status = response.status;
state.reports = response.suites;
},
[types.RECEIVE_REPORTS_ERROR](state) {
state.isLoading = false;
state.hasError = true;
+
+ state.reports = [];
+ state.summary = {
+ total: 0,
+ resolved: 0,
+ failed: 0,
+ };
+ state.status = null;
+ },
+ [types.SET_ISSUE_MODAL_DATA](state, payload) {
+ state.modal.title = payload.issue.name;
+
+ Object.keys(payload.issue).forEach((key) => {
+ if (Object.prototype.hasOwnProperty.call(state.modal.data, key)) {
+ state.modal.data[key] = {
+ ...state.modal.data[key],
+ value: payload.issue[key],
+ };
+ }
+ });
},
};
diff --git a/app/assets/javascripts/reports/store/state.js b/app/assets/javascripts/reports/store/state.js
index 97f9d0a6859..4cab2e27a16 100644
--- a/app/assets/javascripts/reports/store/state.js
+++ b/app/assets/javascripts/reports/store/state.js
@@ -1,9 +1,14 @@
+import { s__ } from '~/locale';
+import { fieldTypes } from '../constants';
+
export default () => ({
endpoint: null,
isLoading: false,
hasError: false,
+ status: null,
+
summary: {
total: 0,
resolved: 0,
@@ -25,4 +30,32 @@ export default () => ({
* }
*/
reports: [],
+
+ modal: {
+ title: null,
+
+ data: {
+ class: {
+ value: null,
+ text: s__('Reports|Class'),
+ type: fieldTypes.link,
+ },
+ execution_time: {
+ value: null,
+ text: s__('Reports|Execution time'),
+ type: fieldTypes.miliseconds,
+ },
+ failure: {
+ value: null,
+ text: s__('Reports|Failure'),
+ type: fieldTypes.codeBock,
+ },
+ system_output: {
+ value: null,
+ text: s__('Reports|System output'),
+ type: fieldTypes.codeBock,
+ },
+ },
+ },
+
});
diff --git a/app/assets/javascripts/reports/store/utils.js b/app/assets/javascripts/reports/store/utils.js
new file mode 100644
index 00000000000..35632218269
--- /dev/null
+++ b/app/assets/javascripts/reports/store/utils.js
@@ -0,0 +1,59 @@
+import { sprintf, n__, s__ } from '~/locale';
+import {
+ STATUS_FAILED,
+ STATUS_SUCCESS,
+ ICON_WARNING,
+ ICON_SUCCESS,
+ ICON_NOTFOUND,
+} from '../constants';
+
+const textBuilder = results => {
+ const { failed, resolved, total } = results;
+
+ const failedString = failed
+ ? n__('%d failed test result', '%d failed test results', failed)
+ : null;
+ const resolvedString = resolved
+ ? n__('%d fixed test result', '%d fixed test results', resolved)
+ : null;
+ const totalString = total ? n__('out of %d total test', 'out of %d total tests', total) : null;
+
+ let resultsString = s__('Reports|no changed test results');
+
+ if (failed) {
+ if (resolved) {
+ resultsString = sprintf(s__('Reports|%{failedString} and %{resolvedString}'), {
+ failedString,
+ resolvedString,
+ });
+ } else {
+ resultsString = failedString;
+ }
+ } else if (resolved) {
+ resultsString = resolvedString;
+ }
+
+ return `${resultsString} ${totalString}`;
+};
+
+export const summaryTextBuilder = (name = '', results = {}) => {
+ const resultsString = textBuilder(results);
+ return `${name} contained ${resultsString}`;
+};
+
+export const reportTextBuilder = (name = '', results = {}) => {
+ const resultsString = textBuilder(results);
+ return `${name} found ${resultsString}`;
+};
+
+export const statusIcon = status => {
+ if (status === STATUS_FAILED) {
+ return ICON_WARNING;
+ }
+
+ if (status === STATUS_SUCCESS) {
+ return ICON_SUCCESS;
+ }
+
+ return ICON_NOTFOUND;
+};
diff --git a/app/assets/javascripts/search_autocomplete.js b/app/assets/javascripts/search_autocomplete.js
index 5b2e0468784..72a2c7ca101 100644
--- a/app/assets/javascripts/search_autocomplete.js
+++ b/app/assets/javascripts/search_autocomplete.js
@@ -137,7 +137,11 @@ export default class SearchAutocomplete {
if (!term) {
const contents = this.getCategoryContents();
if (contents) {
- this.searchInput.data('glDropdown').filter.options.callback(contents);
+ const glDropdownInstance = this.searchInput.data('glDropdown');
+
+ if (glDropdownInstance) {
+ glDropdownInstance.filter.options.callback(contents);
+ }
this.enableAutocomplete();
}
return;
diff --git a/app/assets/javascripts/sidebar/components/assignees/assignees.vue b/app/assets/javascripts/sidebar/components/assignees/assignees.vue
index d22a1e1ac66..dd155c133ce 100644
--- a/app/assets/javascripts/sidebar/components/assignees/assignees.vue
+++ b/app/assets/javascripts/sidebar/components/assignees/assignees.vue
@@ -187,7 +187,7 @@ export default {
<template v-else-if="hasOneUser">
<a
:href="assigneeUrl(firstUser)"
- class="author_link bold"
+ class="author-link bold"
>
<img
:alt="assigneeAlt(firstUser)"
diff --git a/app/assets/javascripts/sidebar/components/participants/participants.vue b/app/assets/javascripts/sidebar/components/participants/participants.vue
index 33dd6c981b6..56d57f6aac8 100644
--- a/app/assets/javascripts/sidebar/components/participants/participants.vue
+++ b/app/assets/javascripts/sidebar/components/participants/participants.vue
@@ -120,7 +120,7 @@
>
<a
:href="participant.web_url"
- class="author_link"
+ class="author-link"
>
<user-avatar-image
:lazy="true"
diff --git a/app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue b/app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue
index d335c3f55af..dc599e1b9fc 100644
--- a/app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue
+++ b/app/assets/javascripts/sidebar/components/time_tracking/comparison_pane.vue
@@ -42,11 +42,14 @@ export default {
return this.timeEstimate - this.timeSpent;
},
timeRemainingPercent() {
- return `${Math.floor((this.timeSpent / this.timeEstimate) * 100)}%`;
+ return Math.floor((this.timeSpent / this.timeEstimate) * 100);
},
timeRemainingStatusClass() {
return this.timeEstimate >= this.timeSpent ? 'within_estimate' : 'over_estimate';
},
+ progressBarVariant() {
+ return this.timeRemainingPercent > 100 ? 'danger' : 'primary';
+ },
},
};
</script>
@@ -62,16 +65,10 @@ export default {
data-placement="top"
role="timeRemainingDisplay"
>
- <div
- :aria-valuenow="timeRemainingPercent"
- class="meter-container"
- >
- <div
- :style="{ width: timeRemainingPercent }"
- class="meter-fill"
- >
- </div>
- </div>
+ <gl-progress-bar
+ :value="timeRemainingPercent"
+ :variant="progressBarVariant"
+ />
<div class="compare-display-container">
<div class="compare-display float-left">
<span class="compare-label">
diff --git a/app/assets/javascripts/terminal/index.js b/app/assets/javascripts/terminal/index.js
index 1a75e072c4e..49aeb377c74 100644
--- a/app/assets/javascripts/terminal/index.js
+++ b/app/assets/javascripts/terminal/index.js
@@ -1,9 +1,3 @@
-import 'vendor/xterm/encoding-indexes';
-import 'vendor/xterm/encoding';
-import Terminal from 'vendor/xterm/xterm';
-import 'vendor/xterm/fit';
-import './terminal';
+import Terminal from './terminal';
-window.Terminal = Terminal;
-
-export default () => new gl.Terminal({ selector: '#terminal' });
+export default () => new Terminal({ selector: '#terminal' });
diff --git a/app/assets/javascripts/terminal/terminal.js b/app/assets/javascripts/terminal/terminal.js
index caffcddf3b0..74c5bbe45a4 100644
--- a/app/assets/javascripts/terminal/terminal.js
+++ b/app/assets/javascripts/terminal/terminal.js
@@ -1,70 +1,71 @@
-/* global Terminal */
-
import $ from 'jquery';
+import { Terminal } from 'xterm';
+import * as fit from 'xterm/lib/addons/fit/fit';
-(() => {
- class GLTerminal {
-
- constructor(options) {
- this.options = options || {};
-
- if (!Object.prototype.hasOwnProperty.call(this.options, 'cursorBlink')) {
- this.options.cursorBlink = true;
- }
+export default class GLTerminal {
+ constructor(options = {}) {
+ this.options = Object.assign({}, {
+ cursorBlink: true,
+ screenKeys: true,
+ }, options);
- if (!Object.prototype.hasOwnProperty.call(this.options, 'screenKeys')) {
- this.options.screenKeys = true;
- }
+ this.container = document.querySelector(options.selector);
- this.container = document.querySelector(options.selector);
+ this.setSocketUrl();
+ this.createTerminal();
- this.setSocketUrl();
- this.createTerminal();
- $(window).off('resize.terminal').on('resize.terminal', () => {
+ $(window)
+ .off('resize.terminal')
+ .on('resize.terminal', () => {
this.terminal.fit();
});
- }
+ }
+
+ setSocketUrl() {
+ const { protocol, hostname, port } = window.location;
+ const wsProtocol = protocol === 'https:' ? 'wss://' : 'ws://';
+ const path = this.container.dataset.projectPath;
- setSocketUrl() {
- const { protocol, hostname, port } = window.location;
- const wsProtocol = protocol === 'https:' ? 'wss://' : 'ws://';
- const path = this.container.dataset.projectPath;
+ this.socketUrl = `${wsProtocol}${hostname}:${port}${path}`;
+ }
- this.socketUrl = `${wsProtocol}${hostname}:${port}${path}`;
- }
+ createTerminal() {
+ Terminal.applyAddon(fit);
- createTerminal() {
- this.terminal = new Terminal(this.options);
- this.socket = new WebSocket(this.socketUrl, ['terminal.gitlab.com']);
- this.socket.binaryType = 'arraybuffer';
+ this.terminal = new Terminal(this.options);
- this.terminal.open(this.container);
- this.socket.onopen = () => { this.runTerminal(); };
- this.socket.onerror = () => { this.handleSocketFailure(); };
- }
+ this.socket = new WebSocket(this.socketUrl, ['terminal.gitlab.com']);
+ this.socket.binaryType = 'arraybuffer';
- runTerminal() {
- const decoder = new TextDecoder('utf-8');
- const encoder = new TextEncoder('utf-8');
+ this.terminal.open(this.container);
+ this.terminal.fit();
+ this.terminal.focus();
- this.terminal.on('data', (data) => {
- this.socket.send(encoder.encode(data));
- });
+ this.socket.onopen = () => {
+ this.runTerminal();
+ };
+ this.socket.onerror = () => {
+ this.handleSocketFailure();
+ };
+ }
- this.socket.addEventListener('message', (ev) => {
- this.terminal.write(decoder.decode(ev.data));
- });
+ runTerminal() {
+ const decoder = new TextDecoder('utf-8');
+ const encoder = new TextEncoder('utf-8');
- this.isTerminalInitialized = true;
- this.terminal.fit();
- }
+ this.terminal.on('data', data => {
+ this.socket.send(encoder.encode(data));
+ });
- handleSocketFailure() {
- this.terminal.write('\r\nConnection failure');
- }
+ this.socket.addEventListener('message', ev => {
+ this.terminal.write(decoder.decode(ev.data));
+ });
+ this.isTerminalInitialized = true;
+ this.terminal.fit();
}
- window.gl = window.gl || {};
- gl.Terminal = GLTerminal;
-})();
+ handleSocketFailure() {
+ this.terminal.write('\r\nConnection failure');
+ }
+}
diff --git a/app/assets/javascripts/users_select.js b/app/assets/javascripts/users_select.js
index e3d7645040d..e19bbbacf4d 100644
--- a/app/assets/javascripts/users_select.js
+++ b/app/assets/javascripts/users_select.js
@@ -206,8 +206,8 @@ function UsersSelect(currentUser, els, options = {}) {
return $collapsedSidebar.html(collapsedAssigneeTemplate(user));
});
};
- collapsedAssigneeTemplate = _.template('<% if( avatar ) { %> <a class="author_link" href="/<%- username %>"> <img width="24" class="avatar avatar-inline s24" alt="" src="<%- avatar %>"> </a> <% } else { %> <i class="fa fa-user"></i> <% } %>');
- assigneeTemplate = _.template('<% if (username) { %> <a class="author_link bold" href="/<%- username %>"> <% if( avatar ) { %> <img width="32" class="avatar avatar-inline s32" alt="" src="<%- avatar %>"> <% } %> <span class="author"><%- name %></span> <span class="username"> @<%- username %> </span> </a> <% } else { %> <span class="no-value assign-yourself"> No assignee - <a href="#" class="js-assign-yourself"> assign yourself </a> </span> <% } %>');
+ collapsedAssigneeTemplate = _.template('<% if( avatar ) { %> <a class="author-link" href="/<%- username %>"> <img width="24" class="avatar avatar-inline s24" alt="" src="<%- avatar %>"> </a> <% } else { %> <i class="fa fa-user"></i> <% } %>');
+ assigneeTemplate = _.template('<% if (username) { %> <a class="author-link bold" href="/<%- username %>"> <% if( avatar ) { %> <img width="32" class="avatar avatar-inline s32" alt="" src="<%- avatar %>"> <% } %> <span class="author"><%- name %></span> <span class="username"> @<%- username %> </span> </a> <% } else { %> <span class="no-value assign-yourself"> No assignee - <a href="#" class="js-assign-yourself"> assign yourself </a> </span> <% } %>');
return $dropdown.glDropdown({
showMenuAbove: showMenuAbove,
data: function(term, callback) {
diff --git a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
index b5de3dd6d73..80593d1f34a 100644
--- a/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
+++ b/app/assets/javascripts/vue_merge_request_widget/mr_widget_options.vue
@@ -36,6 +36,7 @@ import {
notify,
SourceBranchRemovalStatus,
} from './dependencies';
+import GroupedTestReportsApp from '../reports/components/grouped_test_reports_app.vue';
import { setFaviconOverlay } from '../lib/utils/common_utils';
export default {
@@ -68,6 +69,7 @@ export default {
'mr-widget-auto-merge-failed': AutoMergeFailed,
'mr-widget-rebase': RebaseState,
SourceBranchRemovalStatus,
+ GroupedTestReportsApp,
},
props: {
mrData: {
@@ -260,6 +262,10 @@ export default {
:deployment="deployment"
/>
<div class="mr-section-container">
+ <grouped-test-reports-app
+ v-if="mr.testResultsPath"
+ :endpoint="mr.testResultsPath"
+ />
<div class="mr-widget-section">
<component
:is="componentName"
diff --git a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
index e84c436905d..672e5280b5e 100644
--- a/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
+++ b/app/assets/javascripts/vue_merge_request_widget/stores/mr_widget_store.js
@@ -108,6 +108,8 @@ export default class MergeRequestStore {
this.isPipelineBlocked = pipelineStatus ? pipelineStatus.group === 'manual' : false;
this.ciStatusFaviconPath = pipelineStatus ? pipelineStatus.favicon : null;
+ this.testResultsPath = data.test_reports_path;
+
this.setState(data);
}
diff --git a/app/assets/javascripts/vue_shared/components/bar_chart.vue b/app/assets/javascripts/vue_shared/components/bar_chart.vue
new file mode 100644
index 00000000000..3ced4eb691a
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/bar_chart.vue
@@ -0,0 +1,391 @@
+<script>
+import * as d3 from 'd3';
+import tooltip from '../directives/tooltip';
+import Icon from './icon.vue';
+import SvgGradient from './svg_gradient.vue';
+import {
+ GRADIENT_COLORS,
+ GRADIENT_OPACITY,
+ INVERSE_GRADIENT_COLORS,
+ INVERSE_GRADIENT_OPACITY,
+} from './bar_chart_constants';
+
+/**
+ * Renders a bar chart that can be dragged(scrolled) when the number
+ * of elements to renders surpasses that of the available viewport space
+ * while keeping even padding and a width of 24px (customizable)
+ *
+ * It can render data with the following format:
+ * graphData: [{
+ * name: 'element' // x domain data
+ * value: 1 // y domain data
+ * }]
+ *
+ * Used in:
+ * - Contribution analytics - all of the rows describing pushes, merge requests and issues
+ */
+
+export default {
+ directives: {
+ tooltip,
+ },
+ components: {
+ Icon,
+ SvgGradient,
+ },
+ props: {
+ graphData: {
+ type: Array,
+ required: true,
+ },
+ barWidth: {
+ type: Number,
+ required: false,
+ default: 24,
+ },
+ yAxisLabel: {
+ type: String,
+ required: true,
+ },
+ },
+ data() {
+ return {
+ minX: -40,
+ minY: 0,
+ vbWidth: 0,
+ vbHeight: 0,
+ vpWidth: 0,
+ vpHeight: 350,
+ preserveAspectRatioType: 'xMidYMid meet',
+ containerMargin: {
+ leftRight: 30,
+ },
+ viewBoxMargin: {
+ topBottom: 150,
+ },
+ panX: 0,
+ xScale: {},
+ yScale: {},
+ zoom: {},
+ bars: {},
+ xGraphRange: 0,
+ isLoading: true,
+ paddingThreshold: 50,
+ showScrollIndicator: false,
+ showLeftScrollIndicator: false,
+ isGrabbed: false,
+ isPanAvailable: false,
+ gradientColors: GRADIENT_COLORS,
+ gradientOpacity: GRADIENT_OPACITY,
+ inverseGradientColors: INVERSE_GRADIENT_COLORS,
+ inverseGradientOpacity: INVERSE_GRADIENT_OPACITY,
+ maxTextWidth: 72,
+ rectYAxisLabelDims: {},
+ xAxisTextElements: {},
+ yAxisRectTransformPadding: 20,
+ yAxisTextTransformPadding: 10,
+ yAxisTextRotation: 90,
+ };
+ },
+ computed: {
+ svgViewBox() {
+ return `${this.minX} ${this.minY} ${this.vbWidth} ${this.vbHeight}`;
+ },
+ xAxisLocation() {
+ return `translate(${this.panX}, ${this.vbHeight})`;
+ },
+ barTranslationTransform() {
+ return `translate(${this.panX}, 0)`;
+ },
+ scrollIndicatorTransform() {
+ return `translate(${this.vbWidth - 80}, 0)`;
+ },
+ activateGrabCursor() {
+ return {
+ 'svg-graph-container-with-grab': this.isPanAvailable,
+ 'svg-graph-container-grabbed': this.isPanAvailable && this.isGrabbed,
+ };
+ },
+ yAxisLabelRectTransform() {
+ const rectWidth =
+ this.rectYAxisLabelDims.height != null ? this.rectYAxisLabelDims.height / 2 : 0;
+ const yCoord = this.vbHeight / 2 - rectWidth;
+
+ return `translate(${this.minX - this.yAxisRectTransformPadding}, ${yCoord})`;
+ },
+ yAxisLabelTextTransform() {
+ const rectWidth =
+ this.rectYAxisLabelDims.height != null ? this.rectYAxisLabelDims.height / 2 : 0;
+ const yCoord = this.vbHeight / 2 + rectWidth - 5;
+
+ return `translate(${this.minX + this.yAxisTextTransformPadding}, ${yCoord}) rotate(-${this.yAxisTextRotation})`;
+ },
+ },
+ mounted() {
+ if (!this.allValuesEmpty) {
+ this.draw();
+ }
+ },
+ methods: {
+ draw() {
+ // update viewport
+ this.vpWidth = this.$refs.svgContainer.clientWidth - this.containerMargin.leftRight;
+ // update viewbox
+ this.vbWidth = this.vpWidth;
+ this.vbHeight = this.vpHeight - this.viewBoxMargin.topBottom;
+ let padding = 0;
+ if (this.graphData.length * this.barWidth > this.vbWidth) {
+ this.xGraphRange = this.graphData.length * this.barWidth;
+ padding = this.calculatePadding(this.barWidth);
+ this.showScrollIndicator = true;
+ this.isPanAvailable = true;
+ } else {
+ this.xGraphRange = this.vbWidth - Math.abs(this.minX);
+ }
+
+ this.xScale = d3
+ .scaleBand()
+ .range([0, this.xGraphRange])
+ .round(true)
+ .paddingInner(padding);
+ this.yScale = d3.scaleLinear().rangeRound([this.vbHeight, 0]);
+
+ this.xScale.domain(this.graphData.map(d => d.name));
+ this.yScale.domain([0, d3.max(this.graphData.map(d => d.value))]);
+
+ // Zoom/Panning Function
+ this.zoom = d3
+ .zoom()
+ .translateExtent([[0, 0], [this.xGraphRange, this.vbHeight]])
+ .on('zoom', this.panGraph)
+ .on('end', this.removeGrabStyling);
+
+ const xAxis = d3.axisBottom().scale(this.xScale);
+
+ const yAxis = d3
+ .axisLeft()
+ .scale(this.yScale)
+ .ticks(4);
+
+ const renderedXAxis = d3
+ .select(this.$refs.baseSvg)
+ .select('.x-axis')
+ .call(xAxis);
+
+ this.xAxisTextElements = this.$refs.xAxis.querySelectorAll('text');
+
+ renderedXAxis.select('.domain').remove();
+
+ renderedXAxis
+ .selectAll('text')
+ .style('text-anchor', 'end')
+ .attr('dx', '-.3em')
+ .attr('dy', '-.95em')
+ .attr('class', 'tick-text')
+ .attr('transform', 'rotate(-90)');
+
+ renderedXAxis.selectAll('line').remove();
+
+ const { maxTextWidth } = this;
+ renderedXAxis.selectAll('text').each(function formatText() {
+ const axisText = d3.select(this);
+ let textLength = axisText.node().getComputedTextLength();
+ let textContent = axisText.text();
+ while (textLength > maxTextWidth && textContent.length > 0) {
+ textContent = textContent.slice(0, -1);
+ axisText.text(`${textContent}...`);
+ textLength = axisText.node().getComputedTextLength();
+ }
+ });
+
+ const width = this.vbWidth;
+
+ const renderedYAxis = d3
+ .select(this.$refs.baseSvg)
+ .select('.y-axis')
+ .call(yAxis);
+
+ renderedYAxis.selectAll('.tick').each(function createTickLines(d, i) {
+ if (i > 0) {
+ d3
+ .select(this)
+ .select('line')
+ .attr('x2', width)
+ .attr('class', 'axis-tick');
+ }
+ });
+
+ // Add the panning capabilities
+ if (this.isPanAvailable) {
+ d3
+ .select(this.$refs.baseSvg)
+ .call(this.zoom)
+ .on('wheel.zoom', null); // This disables the pan of the graph with the scroll of the mouse wheel
+ }
+
+ this.isLoading = false;
+ // Update the yAxisLabel coordinates
+ const labelDims = this.$refs.yAxisLabel.getBBox();
+ this.rectYAxisLabelDims = {
+ height: labelDims.width + 10,
+ };
+ },
+ panGraph() {
+ const allowedRightScroll = this.xGraphRange - this.vbWidth - this.paddingThreshold;
+ const graphMaxPan = Math.abs(d3.event.transform.x) < allowedRightScroll;
+ this.isGrabbed = true;
+ this.panX = d3.event.transform.x;
+
+ if (d3.event.transform.x === 0) {
+ this.showLeftScrollIndicator = false;
+ } else {
+ this.showLeftScrollIndicator = true;
+ this.showScrollIndicator = true;
+ }
+
+ if (!graphMaxPan) {
+ this.panX = -1 * (this.xGraphRange - this.vbWidth + this.paddingThreshold);
+ this.showScrollIndicator = false;
+ }
+ },
+ setTooltipTitle(data) {
+ return data !== null ? `${data.name}: ${data.value}` : '';
+ },
+ calculatePadding(desiredBarWidth) {
+ const widthWithMargin = this.vbWidth - Math.abs(this.minX);
+ const dividend = widthWithMargin - this.graphData.length * desiredBarWidth;
+ const divisor = widthWithMargin - desiredBarWidth;
+
+ return dividend / divisor;
+ },
+ removeGrabStyling() {
+ this.isGrabbed = false;
+ },
+ barHoveredIn(index) {
+ this.xAxisTextElements[index].classList.add('x-axis-text');
+ },
+ barHoveredOut(index) {
+ this.xAxisTextElements[index].classList.remove('x-axis-text');
+ },
+ },
+};
+</script>
+<template>
+ <div
+ ref="svgContainer"
+ :class="activateGrabCursor"
+ class="svg-graph-container"
+ >
+ <svg
+ ref="baseSvg"
+ :width="vpWidth"
+ :height="vpHeight"
+ :viewBox="svgViewBox"
+ :preserveAspectRatio="preserveAspectRatioType">
+ <g
+ ref="xAxis"
+ :transform="xAxisLocation"
+ class="x-axis"
+ />
+ <g v-if="!isLoading">
+ <template
+ v-for="(data, index) in graphData">
+ <rect
+ v-tooltip
+ :key="index"
+ :width="xScale.bandwidth()"
+ :x="xScale(data.name)"
+ :y="yScale(data.value)"
+ :height="vbHeight - yScale(data.value)"
+ :transform="barTranslationTransform"
+ :title="setTooltipTitle(data)"
+ class="bar-rect"
+ data-placement="top"
+ @mouseover="barHoveredIn(index)"
+ @mouseout="barHoveredOut(index)"
+ />
+ </template>
+ </g>
+ <rect
+ :height="vbHeight + 100"
+ transform="translate(-100, -5)"
+ width="100"
+ fill="#fff"
+ />
+ <g class="y-axis-label">
+ <line
+ :x1="0"
+ :x2="0"
+ :y1="0"
+ :y2="vbHeight"
+ transform="translate(-35, 0)"
+ stroke="black"
+ />
+ <!--Get text length and change the height of this rect accordingly-->
+ <rect
+ :height="rectYAxisLabelDims.height"
+ :transform="yAxisLabelRectTransform"
+ :width="30"
+ fill="#fff"
+ />
+ <text
+ ref="yAxisLabel"
+ :transform="yAxisLabelTextTransform"
+ >
+ {{ yAxisLabel }}
+ </text>
+ </g>
+ <g
+ class="y-axis"
+ />
+ <g v-if="showScrollIndicator">
+ <rect
+ :height="vbHeight + 100"
+ :transform="`translate(${vpWidth - 60}, -5)`"
+ width="40"
+ fill="#fff"
+ />
+ <icon
+ :x="vpWidth - 50"
+ :y="vbHeight / 2"
+ :width="14"
+ :height="14"
+ name="chevron-right"
+ class="animate-flicker"
+ />
+ </g>
+ <!--The line that shows up when the data elements surpass the available width -->
+ <g
+ v-if="showScrollIndicator"
+ :transform="scrollIndicatorTransform">
+ <rect
+ :height="vbHeight"
+ x="0"
+ y="0"
+ width="20"
+ fill="url(#shadow-gradient)"
+ />
+ </g>
+ <!--Left scroll indicator-->
+ <g
+ v-if="showLeftScrollIndicator"
+ transform="translate(0, 0)">
+ <rect
+ :height="vbHeight"
+ x="0"
+ y="0"
+ width="20"
+ fill="url(#left-shadow-gradient)"
+ />
+ </g>
+ <svg-gradient
+ :colors="gradientColors"
+ :opacity="gradientOpacity"
+ identifier-name="shadow-gradient"/>
+ <svg-gradient
+ :colors="inverseGradientColors"
+ :opacity="inverseGradientOpacity"
+ identifier-name="left-shadow-gradient"/>
+ </svg>
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/bar_chart_constants.js b/app/assets/javascripts/vue_shared/components/bar_chart_constants.js
new file mode 100644
index 00000000000..6957b112da6
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/bar_chart_constants.js
@@ -0,0 +1,4 @@
+export const GRADIENT_COLORS = ['#000', '#a7a7a7'];
+export const GRADIENT_OPACITY = ['0', '0.4'];
+export const INVERSE_GRADIENT_COLORS = ['#a7a7a7', '#000'];
+export const INVERSE_GRADIENT_OPACITY = ['0.4', '0'];
diff --git a/app/assets/javascripts/vue_shared/components/clipboard_button.vue b/app/assets/javascripts/vue_shared/components/clipboard_button.vue
index d272bf3f55f..945a33d9622 100644
--- a/app/assets/javascripts/vue_shared/components/clipboard_button.vue
+++ b/app/assets/javascripts/vue_shared/components/clipboard_button.vue
@@ -31,6 +31,11 @@ export default {
type: String,
required: true,
},
+ gfm: {
+ type: String,
+ required: false,
+ default: null,
+ },
title: {
type: String,
required: true,
@@ -51,6 +56,14 @@ export default {
default: 'btn-default',
},
},
+ computed: {
+ clipboardText() {
+ if (this.gfm !== null) {
+ return JSON.stringify({ text: this.text, gfm: this.gfm });
+ }
+ return this.text;
+ },
+ },
};
</script>
@@ -59,7 +72,7 @@ export default {
v-tooltip
:class="cssClass"
:title="title"
- :data-clipboard-text="text"
+ :data-clipboard-text="clipboardText"
:data-container="tooltipContainer"
:data-placement="tooltipPlacement"
type="button"
diff --git a/app/assets/javascripts/vue_shared/components/code_block.vue b/app/assets/javascripts/vue_shared/components/code_block.vue
new file mode 100644
index 00000000000..3cca7a86bef
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/code_block.vue
@@ -0,0 +1,16 @@
+<script>
+export default {
+ name: 'CodeBlock',
+ props: {
+ code: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+<template>
+ <pre class="code-block rounded">
+ <code class="d-block">{{ code }}</code>
+ </pre>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/gl_modal.vue b/app/assets/javascripts/vue_shared/components/gl_modal.vue
index 416eda796a7..b023c5cfeb1 100644
--- a/app/assets/javascripts/vue_shared/components/gl_modal.vue
+++ b/app/assets/javascripts/vue_shared/components/gl_modal.vue
@@ -1,4 +1,6 @@
<script>
+import $ from 'jquery';
+
const buttonVariants = ['danger', 'primary', 'success', 'warning'];
const sizeVariants = ['sm', 'md', 'lg', 'xl'];
@@ -38,6 +40,12 @@ export default {
return this.modalSize === 'md' ? '' : `modal-${this.modalSize}`;
},
},
+ mounted() {
+ $(this.$el).on('shown.bs.modal', this.opened).on('hidden.bs.modal', this.closed);
+ },
+ beforeDestroy() {
+ $(this.$el).off('shown.bs.modal', this.opened).off('hidden.bs.modal', this.closed);
+ },
methods: {
emitCancel(event) {
this.$emit('cancel', event);
@@ -45,10 +53,11 @@ export default {
emitSubmit(event) {
this.$emit('submit', event);
},
- opened({ propertyName }) {
- if (propertyName === 'opacity') {
- this.$emit('open');
- }
+ opened() {
+ this.$emit('open');
+ },
+ closed() {
+ this.$emit('closed');
},
},
};
@@ -60,7 +69,6 @@ export default {
class="modal fade"
tabindex="-1"
role="dialog"
- @transitionend="opened"
>
<div
:class="modalSizeClass"
diff --git a/app/assets/javascripts/vue_shared/components/header_ci_component.vue b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
index 62d35f6547d..49fbce75110 100644
--- a/app/assets/javascripts/vue_shared/components/header_ci_component.vue
+++ b/app/assets/javascripts/vue_shared/components/header_ci_component.vue
@@ -113,6 +113,9 @@ export default {
{{ user.name }}
</a>
+ <span
+ v-if="user.status_tooltip_html"
+ v-html="user.status_tooltip_html"></span>
</template>
</section>
diff --git a/app/assets/javascripts/vue_shared/components/identicon.vue b/app/assets/javascripts/vue_shared/components/identicon.vue
index 4ffc811e714..0862f2c0cff 100644
--- a/app/assets/javascripts/vue_shared/components/identicon.vue
+++ b/app/assets/javascripts/vue_shared/components/identicon.vue
@@ -1,4 +1,6 @@
<script>
+import { getIdenticonBackgroundClass, getIdenticonTitle } from '~/helpers/avatar_helper';
+
export default {
props: {
entityId: {
@@ -16,26 +18,11 @@ export default {
},
},
computed: {
- /**
- * This method is based on app/helpers/avatars_helper.rb#project_identicon
- */
- identiconStyles() {
- const allowedColors = [
- '#FFEBEE',
- '#F3E5F5',
- '#E8EAF6',
- '#E3F2FD',
- '#E0F2F1',
- '#FBE9E7',
- '#EEEEEE',
- ];
-
- const backgroundColor = allowedColors[this.entityId % 7];
-
- return `background-color: ${backgroundColor}; color: #555;`;
+ identiconBackgroundClass() {
+ return getIdenticonBackgroundClass(this.entityId);
},
identiconTitle() {
- return this.entityName.charAt(0).toUpperCase();
+ return getIdenticonTitle(this.entityName);
},
},
};
@@ -43,8 +30,7 @@ export default {
<template>
<div
- :class="sizeClass"
- :style="identiconStyles"
+ :class="[sizeClass, identiconBackgroundClass]"
class="avatar identicon">
{{ identiconTitle }}
</div>
diff --git a/app/assets/javascripts/vue_shared/components/panel_resizer.vue b/app/assets/javascripts/vue_shared/components/panel_resizer.vue
index 8c2dcc2d902..7947ae1e4da 100644
--- a/app/assets/javascripts/vue_shared/components/panel_resizer.vue
+++ b/app/assets/javascripts/vue_shared/components/panel_resizer.vue
@@ -32,7 +32,7 @@
},
computed: {
className() {
- return `drag${this.side}`;
+ return `drag-${this.side}`;
},
cursorStyle() {
if (this.enabled) {
@@ -44,8 +44,15 @@
methods: {
resetSize(e) {
e.preventDefault();
+ this.$emit('resize-start', this.size);
+
this.size = this.startSize;
this.$emit('update:size', this.size);
+
+ // End resizing on next tick so that listeners can react to DOM changes
+ this.$nextTick(() => {
+ this.$emit('resize-end', this.size);
+ });
},
startDrag(e) {
if (this.enabled) {
@@ -84,7 +91,7 @@
<div
:class="className"
:style="cursorStyle"
- class="dragHandle"
+ class="drag-handle"
@mousedown="startDrag"
@dblclick="resetSize"
></div>
diff --git a/app/assets/javascripts/vue_shared/components/reports/constants.js b/app/assets/javascripts/vue_shared/components/reports/constants.js
new file mode 100644
index 00000000000..dbde648bfdb
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/reports/constants.js
@@ -0,0 +1,3 @@
+export const STATUS_FAILED = 'failed';
+export const STATUS_SUCCESS = 'success';
+export const STATUS_NEUTRAL = 'neutral';
diff --git a/app/assets/javascripts/vue_shared/components/reports/issue_body.js b/app/assets/javascripts/vue_shared/components/reports/issue_body.js
new file mode 100644
index 00000000000..54dfb7b16bf
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/reports/issue_body.js
@@ -0,0 +1,9 @@
+import TestIssueBody from '~/reports/components/test_issue_body.vue';
+
+export const components = {
+ TestIssueBody,
+};
+
+export const componentNames = {
+ TestIssueBody: TestIssueBody.name,
+};
diff --git a/app/assets/javascripts/vue_shared/components/reports/issue_status_icon.vue b/app/assets/javascripts/vue_shared/components/reports/issue_status_icon.vue
new file mode 100644
index 00000000000..f8189117ac3
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/reports/issue_status_icon.vue
@@ -0,0 +1,58 @@
+<script>
+import Icon from '~/vue_shared/components/icon.vue';
+
+import {
+ STATUS_FAILED,
+ STATUS_NEUTRAL,
+ STATUS_SUCCESS,
+} from '~/vue_shared/components/reports/constants';
+
+export default {
+ name: 'IssueStatusIcon',
+ components: {
+ Icon,
+ },
+ props: {
+ // failed || success
+ status: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ iconName() {
+ if (this.isStatusFailed) {
+ return 'status_failed_borderless';
+ } else if (this.isStatusSuccess) {
+ return 'status_success_borderless';
+ }
+
+ return 'status_created_borderless';
+ },
+ isStatusFailed() {
+ return this.status === STATUS_FAILED;
+ },
+ isStatusSuccess() {
+ return this.status === STATUS_SUCCESS;
+ },
+ isStatusNeutral() {
+ return this.status === STATUS_NEUTRAL;
+ },
+ },
+};
+</script>
+<template>
+ <div
+ :class="{
+ failed: isStatusFailed,
+ success: isStatusSuccess,
+ neutral: isStatusNeutral,
+ }"
+ class="report-block-list-icon"
+ >
+ <icon
+ :name="iconName"
+ :size="32"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/vue_shared/components/reports/issues_list.vue b/app/assets/javascripts/vue_shared/components/reports/issues_list.vue
index e1e03e39ee0..2545e84f932 100644
--- a/app/assets/javascripts/vue_shared/components/reports/issues_list.vue
+++ b/app/assets/javascripts/vue_shared/components/reports/issues_list.vue
@@ -1,5 +1,10 @@
<script>
-import IssuesBlock from './report_issues.vue';
+import IssuesBlock from '~/vue_shared/components/reports/report_issues.vue';
+import {
+ STATUS_SUCCESS,
+ STATUS_FAILED,
+ STATUS_NEUTRAL,
+} from '~/vue_shared/components/reports/constants';
/**
* Renders block of issues
@@ -9,45 +14,34 @@ export default {
components: {
IssuesBlock,
},
+ success: STATUS_SUCCESS,
+ failed: STATUS_FAILED,
+ neutral: STATUS_NEUTRAL,
props: {
- unresolvedIssues: {
+ newIssues: {
type: Array,
required: false,
default: () => [],
},
- resolvedIssues: {
+ unresolvedIssues: {
type: Array,
required: false,
default: () => [],
},
- neutralIssues: {
+ resolvedIssues: {
type: Array,
required: false,
default: () => [],
},
- allIssues: {
+ neutralIssues: {
type: Array,
required: false,
default: () => [],
},
- type: {
+ component: {
type: String,
- required: true,
- },
- },
- data() {
- return {
- isFullReportVisible: false,
- };
- },
- computed: {
- unresolvedIssuesStatus() {
- return this.type === 'license' ? 'neutral' : 'failed';
- },
- },
- methods: {
- openFullReport() {
- this.isFullReportVisible = true;
+ required: false,
+ default: '',
},
},
};
@@ -56,44 +50,36 @@ export default {
<div class="report-block-container">
<issues-block
- v-if="unresolvedIssues.length"
- :type="type"
- :status="unresolvedIssuesStatus"
- :issues="unresolvedIssues"
+ v-if="newIssues.length"
+ :component="component"
+ :issues="newIssues"
class="js-mr-code-new-issues"
+ status="failed"
+ is-new
/>
<issues-block
- v-if="isFullReportVisible"
- :type="type"
- :issues="allIssues"
- class="js-mr-code-all-issues"
- status="failed"
+ v-if="unresolvedIssues.length"
+ :component="component"
+ :issues="unresolvedIssues"
+ :status="$options.failed"
+ class="js-mr-code-new-issues"
/>
<issues-block
v-if="neutralIssues.length"
- :type="type"
+ :component="component"
:issues="neutralIssues"
+ :status="$options.neutral"
class="js-mr-code-non-issues"
- status="neutral"
/>
<issues-block
v-if="resolvedIssues.length"
- :type="type"
+ :component="component"
:issues="resolvedIssues"
+ :status="$options.success"
class="js-mr-code-resolved-issues"
- status="success"
/>
-
- <button
- v-if="allIssues.length && !isFullReportVisible"
- type="button"
- class="btn-link btn-blank prepend-left-10 js-expand-full-list break-link"
- @click="openFullReport"
- >
- {{ s__("ciReport|Show complete code vulnerabilities report") }}
- </button>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/reports/report_issues.vue b/app/assets/javascripts/vue_shared/components/reports/report_issues.vue
index ecffb02a3a0..1f13e555b31 100644
--- a/app/assets/javascripts/vue_shared/components/reports/report_issues.vue
+++ b/app/assets/javascripts/vue_shared/components/reports/report_issues.vue
@@ -1,44 +1,33 @@
<script>
-import Icon from '~/vue_shared/components/icon.vue';
+import IssueStatusIcon from '~/vue_shared/components/reports/issue_status_icon.vue';
+import { components, componentNames } from '~/vue_shared/components/reports/issue_body';
export default {
name: 'ReportIssues',
components: {
- Icon,
+ IssueStatusIcon,
+ ...components,
},
props: {
issues: {
type: Array,
required: true,
},
- type: {
+ component: {
type: String,
- required: true,
+ required: false,
+ default: '',
+ validator: value => value === '' || Object.values(componentNames).includes(value),
},
// failed || success
status: {
type: String,
required: true,
},
- },
- computed: {
- iconName() {
- if (this.isStatusFailed) {
- return 'status_failed_borderless';
- } else if (this.isStatusSuccess) {
- return 'status_success_borderless';
- }
-
- return 'status_created_borderless';
- },
- isStatusFailed() {
- return this.status === 'failed';
- },
- isStatusSuccess() {
- return this.status === 'success';
- },
- isStatusNeutral() {
- return this.status === 'neutral';
+ isNew: {
+ type: Boolean,
+ required: false,
+ default: false,
},
},
};
@@ -52,20 +41,18 @@ export default {
:key="index"
class="report-block-list-issue"
>
- <div
- :class="{
- failed: isStatusFailed,
- success: isStatusSuccess,
- neutral: isStatusNeutral,
- }"
- class="report-block-list-icon append-right-5"
- >
- <icon
- :name="iconName"
- :size="32"
- />
- </div>
+ <issue-status-icon
+ :status="issue.status || status"
+ class="append-right-5"
+ />
+ <component
+ v-if="component"
+ :is="component"
+ :issue="issue"
+ :status="issue.status || status"
+ :is-new="isNew"
+ />
</li>
</ul>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/reports/report_section.vue b/app/assets/javascripts/vue_shared/components/reports/report_section.vue
index d383ed99a0c..0124d8b5bcc 100644
--- a/app/assets/javascripts/vue_shared/components/reports/report_section.vue
+++ b/app/assets/javascripts/vue_shared/components/reports/report_section.vue
@@ -21,7 +21,7 @@ export default {
required: false,
default: false,
},
- type: {
+ component: {
type: String,
required: false,
default: '',
@@ -59,11 +59,6 @@ export default {
required: false,
default: () => [],
},
- allIssues: {
- type: Array,
- required: false,
- default: () => [],
- },
infoText: {
type: [String, Boolean],
required: false,
@@ -142,18 +137,10 @@ export default {
</script>
<template>
<section class="media-section">
- <div
- class="media"
- >
- <status-icon
- :status="statusIconName"
- />
- <div
- class="media-body space-children d-flex"
- >
- <span
- class="js-code-text code-text"
- >
+ <div class="media">
+ <status-icon :status="statusIconName" />
+ <div class="media-body space-children d-flex flex-align-self-center">
+ <span class="js-code-text code-text">
{{ headerText }}
<popover
@@ -163,10 +150,12 @@ export default {
/>
</span>
+ <slot name="actionButtons"></slot>
+
<button
v-if="isCollapsible"
type="button"
- class="js-collapse-btn btn bt-default float-right btn-sm"
+ class="js-collapse-btn btn float-right btn-sm"
@click="toggleCollapsed"
>
{{ collapseText }}
@@ -183,8 +172,8 @@ export default {
<issues-list
:unresolved-issues="unresolvedIssues"
:resolved-issues="resolvedIssues"
- :all-issues="allIssues"
- :type="type"
+ :neutral-issues="neutralIssues"
+ :component="component"
/>
</slot>
</div>
diff --git a/app/assets/javascripts/vue_shared/components/reports/summary_row.vue b/app/assets/javascripts/vue_shared/components/reports/summary_row.vue
index 997bad960e2..28156d7c983 100644
--- a/app/assets/javascripts/vue_shared/components/reports/summary_row.vue
+++ b/app/assets/javascripts/vue_shared/components/reports/summary_row.vue
@@ -29,7 +29,8 @@ export default {
},
popoverOptions: {
type: Object,
- required: true,
+ required: false,
+ default: null,
},
},
computed: {
@@ -60,7 +61,11 @@ export default {
{{ summary }}
</div>
- <popover :options="popoverOptions" />
+ <popover
+ v-if="popoverOptions"
+ :options="popoverOptions"
+ />
+
</div>
</div>
</template>
diff --git a/app/assets/javascripts/vue_shared/components/svg_gradient.vue b/app/assets/javascripts/vue_shared/components/svg_gradient.vue
new file mode 100644
index 00000000000..b61a1befcd6
--- /dev/null
+++ b/app/assets/javascripts/vue_shared/components/svg_gradient.vue
@@ -0,0 +1,37 @@
+<script>
+export default {
+ props: {
+ colors: {
+ type: Array,
+ required: true,
+ },
+ opacity: {
+ type: Array,
+ required: true,
+ },
+ identifierName: {
+ type: String,
+ required: true,
+ },
+ },
+};
+</script>
+<template>
+ <svg
+ height="0"
+ width="0">
+ <defs>
+ <linearGradient
+ :id="identifierName">
+ <stop
+ :stop-color="colors[0]"
+ :stop-opacity="opacity[0]"
+ offset="0%" />
+ <stop
+ :stop-color="colors[1]"
+ :stop-opacity="opacity[1]"
+ offset="100%" />
+ </linearGradient>
+ </defs>
+ </svg>
+</template>
diff --git a/app/assets/stylesheets/framework/avatar.scss b/app/assets/stylesheets/framework/avatar.scss
index c1ec11e434a..dddd07c798c 100644
--- a/app/assets/stylesheets/framework/avatar.scss
+++ b/app/assets/stylesheets/framework/avatar.scss
@@ -7,7 +7,7 @@
.avatar-circle {
float: left;
margin-right: 15px;
- border-radius: $avatar_radius;
+ border-radius: $avatar-radius;
border: 1px solid $avatar-border;
&.s16 { @include avatar-size(16px, 6px); }
&.s18 { @include avatar-size(18px, 6px); }
@@ -69,7 +69,10 @@
.identicon {
text-align: center;
vertical-align: top;
+ color: $identicon-fg-color;
+ background-color: $identicon-gray;
+ // Sizes
&.s16 { font-size: 12px; line-height: 1.33; }
&.s24 { font-size: 13px; line-height: 1.8; }
&.s26 { font-size: 20px; line-height: 1.33; }
@@ -82,6 +85,15 @@
&.s110 { font-size: 40px; line-height: 108px; font-weight: $gl-font-weight-normal; }
&.s140 { font-size: 72px; line-height: 138px; }
&.s160 { font-size: 96px; line-height: 158px; }
+
+ // Background colors
+ &.bg1 { background-color: $identicon-red; }
+ &.bg2 { background-color: $identicon-purple; }
+ &.bg3 { background-color: $identicon-indigo; }
+ &.bg4 { background-color: $identicon-blue; }
+ &.bg5 { background-color: $identicon-teal; }
+ &.bg6 { background-color: $identicon-orange; }
+ &.bg7 { background-color: $identicon-gray; }
}
.avatar-container {
@@ -110,7 +122,7 @@
color: $white-light;
border: 1px solid $avatar-border;
border-radius: 1em;
- font-family: $regular_font;
+ font-family: $regular-font;
font-size: 9px;
line-height: 16px;
text-align: center;
diff --git a/app/assets/stylesheets/framework/blocks.scss b/app/assets/stylesheets/framework/blocks.scss
index 340fddd398b..7145a76db6d 100644
--- a/app/assets/stylesheets/framework/blocks.scss
+++ b/app/assets/stylesheets/framework/blocks.scss
@@ -353,3 +353,18 @@
.flex-right {
margin-left: auto;
}
+
+.code-block {
+ background: $black;
+ color: $gray-darkest;
+ white-space: pre;
+ overflow-x: auto;
+ font-size: 12px;
+ border: 0;
+ padding: $grid-size;
+
+ code {
+ background-color: inherit;
+ padding: inherit;
+ }
+}
diff --git a/app/assets/stylesheets/framework/common.scss b/app/assets/stylesheets/framework/common.scss
index 218e37602dd..c9865610b78 100644
--- a/app/assets/stylesheets/framework/common.scss
+++ b/app/assets/stylesheets/framework/common.scss
@@ -113,8 +113,6 @@ hr {
.item-title { font-weight: $gl-font-weight-bold; }
-/** FLASH message **/
-.author_link,
.author-link {
color: $gl-link-color;
}
@@ -372,11 +370,14 @@ img.emoji {
margin-right: 10px;
}
-.alert,
-.progress {
+.alert {
margin-bottom: $gl-padding;
}
+.progress {
+ height: 4px;
+}
+
.project-item-select-holder {
display: inline-block;
position: relative;
@@ -468,3 +469,4 @@ img.emoji {
.inline { display: inline-block; }
.center { text-align: center; }
.vertical-align-middle { vertical-align: middle; }
+.flex-align-self-center { align-self: center; }
diff --git a/app/assets/stylesheets/framework/forms.scss b/app/assets/stylesheets/framework/forms.scss
index 49a56cac14b..437fcff5c62 100644
--- a/app/assets/stylesheets/framework/forms.scss
+++ b/app/assets/stylesheets/framework/forms.scss
@@ -80,7 +80,7 @@ label {
.form-control {
height: 29px;
background: $white-light;
- font-family: $monospace_font;
+ font-family: $monospace-font;
}
.input-group-prepend .btn,
diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss
index 2097bcebf69..e7e13d35d8e 100644
--- a/app/assets/stylesheets/framework/header.scss
+++ b/app/assets/stylesheets/framework/header.scss
@@ -567,9 +567,6 @@
border-bottom: 1px solid $white-normal;
.mx-auto {
- margin: 8px 0;
- text-align: center;
-
.tanuki-logo,
img {
height: 36px;
diff --git a/app/assets/stylesheets/framework/highlight.scss b/app/assets/stylesheets/framework/highlight.scss
index 813a1711ea2..452e946f95f 100644
--- a/app/assets/stylesheets/framework/highlight.scss
+++ b/app/assets/stylesheets/framework/highlight.scss
@@ -9,8 +9,8 @@
padding: 10px 0;
border: 0;
border-radius: 0;
- font-family: $monospace_font;
- font-size: $code_font_size;
+ font-family: $monospace-font;
+ font-size: $code-font-size;
line-height: 19px;
margin: 0;
overflow: auto;
@@ -22,7 +22,7 @@
code {
display: inline-block;
min-width: 100%;
- font-family: $monospace_font;
+ font-family: $monospace-font;
white-space: normal;
word-wrap: normal;
padding: 0;
@@ -44,7 +44,7 @@
float: left;
a {
- font-family: $monospace_font;
+ font-family: $monospace-font;
display: block;
font-size: $code_font_size !important;
min-height: 19px;
diff --git a/app/assets/stylesheets/framework/jquery.scss b/app/assets/stylesheets/framework/jquery.scss
index 300ba4f2de6..d1360a0c0eb 100644
--- a/app/assets/stylesheets/framework/jquery.scss
+++ b/app/assets/stylesheets/framework/jquery.scss
@@ -1,5 +1,5 @@
.ui-widget {
- font-family: $regular_font;
+ font-family: $regular-font;
font-size: $font-size-base;
.ui-state-default {
diff --git a/app/assets/stylesheets/framework/lists.scss b/app/assets/stylesheets/framework/lists.scss
index d54490c87c6..4b67eab05b3 100644
--- a/app/assets/stylesheets/framework/lists.scss
+++ b/app/assets/stylesheets/framework/lists.scss
@@ -259,7 +259,7 @@ ul.controls {
margin-right: 0;
}
- .author_link {
+ .author-link {
.avatar-inline {
margin-left: 0;
margin-right: 0;
@@ -270,7 +270,7 @@ ul.controls {
.issuable-pipeline-broken a,
.issuable-pipeline-status a,
- .author_link {
+ .author-link {
display: flex;
}
}
diff --git a/app/assets/stylesheets/framework/mixins.scss b/app/assets/stylesheets/framework/mixins.scss
index 76ebfc22ef7..98bf26a5222 100644
--- a/app/assets/stylesheets/framework/mixins.scss
+++ b/app/assets/stylesheets/framework/mixins.scss
@@ -3,13 +3,13 @@
* Mixins with fixed values
*/
-@mixin str-truncated($max_width: 82%) {
+@mixin str-truncated($max-width: 82%) {
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
vertical-align: top;
white-space: nowrap;
- max-width: $max_width;
+ max-width: $max-width;
}
/*
@@ -22,7 +22,7 @@
border: 0;
border-color: $md-area-border;
- @supports(width: fit-content) {
+ @supports (width: fit-content) {
display: block;
width: fit-content;
}
@@ -116,7 +116,7 @@
/* http://phrappe.com/css/conditional-css-for-webkit-based-browsers/ */
@mixin on-webkit-only {
- @media screen and (-webkit-min-device-pixel-ratio:0) {
+ @media screen and (-webkit-min-device-pixel-ratio: 0) {
@content;
}
}
@@ -164,14 +164,18 @@
bottom: 12px;
width: 43px;
height: 30px;
- transition-duration: .3s;
+ transition-duration: 0.3s;
-webkit-transform: translateZ(0);
- background: linear-gradient(to $gradient-direction, $gradient-color 45%, rgba($gradient-color, 0.4));
+ background: linear-gradient(
+ to $gradient-direction,
+ $gradient-color 45%,
+ rgba($gradient-color, 0.4)
+ );
&.scrolling {
visibility: visible;
opacity: 1;
- transition-duration: .3s;
+ transition-duration: 0.3s;
}
.fa {
@@ -233,6 +237,29 @@
max-width: 100%;
}
+@mixin build-loader-animation {
+ position: relative;
+ white-space: initial;
+
+ .dot {
+ display: inline-block;
+ width: 6px;
+ height: 6px;
+ margin: auto auto 12px;
+ border-radius: 50%;
+ animation: blinking-dot 1s linear infinite;
+ background: $white-light;
+
+ &:nth-child(2) {
+ animation-delay: 0.33s;
+ }
+
+ &:nth-child(3) {
+ animation-delay: 0.66s;
+ }
+ }
+}
+
@mixin borderless-status-icon($color) {
svg {
border: 1px solid $color;
diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss
index 8c716400913..c4dbcf2ddc9 100644
--- a/app/assets/stylesheets/framework/sidebar.scss
+++ b/app/assets/stylesheets/framework/sidebar.scss
@@ -33,11 +33,11 @@
@include media-breakpoint-up(sm) {
&:not(.wiki-sidebar):not(.build-sidebar):not(.issuable-bulk-update-sidebar) .content-wrapper {
- padding-right: $gutter_collapsed_width;
+ padding-right: $gutter-collapsed-width;
}
.merge-request-tabs-holder.affix {
- right: $gutter_collapsed_width;
+ right: $gutter-collapsed-width;
}
}
@@ -67,21 +67,21 @@
@include media-breakpoint-only(sm) {
&:not(.wiki-sidebar):not(.build-sidebar):not(.issuable-bulk-update-sidebar) .content-wrapper {
- padding-right: $gutter_collapsed_width;
+ padding-right: $gutter-collapsed-width;
}
}
@include media-breakpoint-up(md) {
.content-wrapper {
- padding-right: $gutter_width;
+ padding-right: $gutter-width;
}
&:not(.with-overlay) .merge-request-tabs-holder.affix {
- right: $gutter_width;
+ right: $gutter-width;
}
&.with-overlay .merge-request-tabs-holder.affix {
- right: $gutter_collapsed_width;
+ right: $gutter-collapsed-width;
}
}
}
diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss
index 9874c928604..473ca408c04 100644
--- a/app/assets/stylesheets/framework/typography.scss
+++ b/app/assets/stylesheets/framework/typography.scss
@@ -44,7 +44,7 @@
// Single code lines should wrap
code {
- font-family: $monospace_font;
+ font-family: $monospace-font;
white-space: pre-wrap;
word-wrap: normal;
}
@@ -179,6 +179,10 @@
font-weight: inherit;
}
+ a > code {
+ color: $gl-link-color;
+ }
+
dd {
margin-left: $gl-padding;
}
@@ -321,7 +325,7 @@ h6 {
/** CODE **/
pre {
- font-family: $monospace_font;
+ font-family: $monospace-font;
display: block;
padding: $gl-padding-8;
margin: 0 0 $gl-padding-8;
@@ -342,7 +346,7 @@ code {
}
.monospace {
- font-family: $monospace_font;
+ font-family: $monospace-font;
}
.weight-normal {
@@ -381,7 +385,7 @@ code {
*
*/
textarea.js-gfm-input {
- font-family: $monospace_font;
+ font-family: $monospace-font;
font-size: 13px;
}
@@ -440,3 +444,5 @@ textarea {
color: $placeholder-text-color;
}
}
+
+.lh-100 { line-height: 1; }
diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss
index 6c2fdbe0608..56940a7564a 100644
--- a/app/assets/stylesheets/framework/variables.scss
+++ b/app/assets/stylesheets/framework/variables.scss
@@ -2,9 +2,9 @@
* Layout
*/
$grid-size: 8px;
-$gutter_collapsed_width: 62px;
-$gutter_width: 290px;
-$gutter_inner_width: 250px;
+$gutter-collapsed-width: 62px;
+$gutter-width: 290px;
+$gutter-inner-width: 250px;
$sidebar-transition-duration: 0.3s;
$sidebar-breakpoint: 1024px;
$default-transition-duration: 0.15s;
@@ -233,8 +233,8 @@ $md-area-border: #ddd;
/*
* Code
*/
-$code_font_size: 90%;
-$code_line_height: 1.6;
+$code-font-size: 90%;
+$code-line-height: 1.6;
/*
* Tooltips
@@ -371,9 +371,9 @@ $diff-jagged-border-gradient-color: darken($white-normal, 8%);
/*
* Fonts
*/
-$monospace_font: 'Menlo', 'DejaVu Sans Mono', 'Liberation Mono', 'Consolas', 'Ubuntu Mono',
+$monospace-font: 'Menlo', 'DejaVu Sans Mono', 'Liberation Mono', 'Consolas', 'Ubuntu Mono',
'Courier New', 'andale mono', 'lucida console', monospace;
-$regular_font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell,
+$regular-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell,
'Helvetica Neue', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
/*
@@ -487,6 +487,18 @@ $note-icon-gutter-width: 55px;
$zen-control-color: #555;
/*
+* Identicon
+*/
+$identicon-red: #ffebee;
+$identicon-purple: #f3e5f5;
+$identicon-indigo: #e8eaf6;
+$identicon-blue: #e3f2fd;
+$identicon-teal: #e0f2f1;
+$identicon-orange: #fbe9e7;
+$identicon-gray: $gray-darker;
+$identicon-fg-color: #555555;
+
+/*
* Calendar
*/
$calendar-hover-bg: #ecf3fe;
@@ -526,7 +538,7 @@ $issue-board-list-difference-md: $issue-board-list-difference-sm + $issue-boards
/*
* Avatar
*/
-$avatar_radius: 50%;
+$avatar-radius: 50%;
$avatar-border: $gray-normal;
$avatar-border-hover: $gray-darker;
$avatar-background: $gray-lightest;
@@ -830,8 +842,10 @@ $secondary: $gray-light;
$input-disabled-bg: $gray-light;
$input-border-color: $theme-gray-200;
$input-color: $gl-text-color;
-$font-family-sans-serif: $regular_font;
-$font-family-monospace: $monospace_font;
+$font-family-sans-serif: $regular-font;
+$font-family-monospace: $monospace-font;
$input-line-height: 20px;
$btn-line-height: 20px;
$table-accent-bg: $gray-light;
+$card-border-color: $border-color;
+$card-cap-bg: $gray-light;
diff --git a/app/assets/stylesheets/mailers/highlighted_diff_email.scss b/app/assets/stylesheets/mailers/highlighted_diff_email.scss
index 1835c4364d3..8b234a5a656 100644
--- a/app/assets/stylesheets/mailers/highlighted_diff_email.scss
+++ b/app/assets/stylesheets/mailers/highlighted_diff_email.scss
@@ -77,13 +77,13 @@ $highlighted-gc-bg: #eaf2f5;
.code {
background-color: $white-light;
font-family: monospace;
- font-size: $code_font_size;
+ font-size: $code-font-size;
-premailer-cellpadding: 0;
-premailer-cellspacing: 0;
-premailer-width: 100%;
> tr {
- line-height: $code_line_height;
+ line-height: $code-line-height;
}
}
diff --git a/app/assets/stylesheets/pages/repo.scss b/app/assets/stylesheets/page_bundles/ide.scss
index 8b1227b9131..58ed5bf6455 100644
--- a/app/assets/stylesheets/pages/repo.scss
+++ b/app/assets/stylesheets/page_bundles/ide.scss
@@ -1,3 +1,6 @@
+@import 'framework/variables';
+@import 'framework/mixins';
+
.project-refs-form,
.project-refs-target-form {
display: inline-block;
@@ -74,6 +77,7 @@
.ide-file-icon-holder {
display: flex;
align-items: center;
+ color: $theme-gray-700;
}
.ide-file-changed-icon {
@@ -161,12 +165,23 @@
background-color: $white-light;
border-bottom-color: $white-light;
}
+
+ &:not(.disabled) {
+ .multi-file-tab {
+ cursor: pointer;
+ }
+ }
+
+ &.disabled {
+ .multi-file-tab-close {
+ cursor: default;
+ }
+ }
}
}
.multi-file-tab {
@include str-truncated(141px);
- cursor: pointer;
svg {
vertical-align: middle;
@@ -241,6 +256,38 @@
}
}
+ .is-deleted {
+ .editor.modified {
+ .margin-view-overlays,
+ .lines-content,
+ .decorationsOverviewRuler {
+ // !important to override monaco inline styles
+ display: none !important;
+ }
+ }
+
+ .diffOverviewRuler.modified {
+ // !important to override monaco inline styles
+ display: none !important;
+ }
+ }
+
+ .is-added {
+ .editor.original {
+ .margin-view-overlays,
+ .lines-content,
+ .decorationsOverviewRuler {
+ // !important to override monaco inline styles
+ display: none !important;
+ }
+ }
+
+ .diffOverviewRuler.original {
+ // !important to override monaco inline styles
+ display: none !important;
+ }
+ }
+
.monaco-diff-editor.vs {
.editor.modified {
box-shadow: none;
@@ -557,16 +604,21 @@
}
}
-.multi-file-addition,
-.multi-file-addition-solid {
+.ide-file-addition,
+.ide-file-addition-solid {
color: $green-500;
}
-.multi-file-modified,
-.multi-file-modified-solid {
+.ide-file-modified,
+.ide-file-modified-solid {
color: $orange-500;
}
+.ide-file-deletion,
+.ide-file-deletion-solid {
+ color: $red-500;
+}
+
.multi-file-commit-list-collapsed {
display: flex;
flex-direction: column;
@@ -781,18 +833,21 @@
}
}
-.dragHandle {
+.drag-handle {
position: absolute;
top: 0;
bottom: 0;
- width: 1px;
- background-color: $white-dark;
+ width: 4px;
+
+ &:hover {
+ background-color: $white-normal;
+ }
- &.dragright {
+ &.drag-right {
right: 0;
}
- &.dragleft {
+ &.drag-left {
left: 0;
}
}
@@ -961,7 +1016,7 @@
overflow: hidden;
.note-textarea {
- font-family: $monospace_font;
+ font-family: $monospace-font;
}
}
@@ -1014,6 +1069,10 @@
.ide-new-btn {
margin-left: auto;
}
+
+ button {
+ color: $gl-text-color;
+ }
}
.ide-sidebar-branch-title {
@@ -1318,6 +1377,7 @@
.ide-entry-dropdown-toggle {
padding: $gl-padding-4;
+ color: $gl-text-color;
background-color: $theme-gray-100;
&:hover {
@@ -1330,6 +1390,10 @@
background-color: $blue-500;
outline: 0;
}
+
+ svg {
+ fill: currentColor;
+ }
}
.ide-new-btn .dropdown.show .ide-entry-dropdown-toggle {
diff --git a/app/assets/stylesheets/pages/boards.scss b/app/assets/stylesheets/pages/boards.scss
index 5de53892fac..a68b47b1d02 100644
--- a/app/assets/stylesheets/pages/boards.scss
+++ b/app/assets/stylesheets/pages/boards.scss
@@ -63,7 +63,7 @@
width: 100%;
&.is-compact {
- width: calc(100% - #{$gutter_width});
+ width: calc(100% - #{$gutter-width});
}
}
}
@@ -205,7 +205,7 @@
.board-title {
margin: 0;
- padding: 12px $gl-padding;
+ padding: $gl-padding-8 $gl-padding;
font-size: 1em;
border-bottom: 1px solid $border-color;
display: flex;
diff --git a/app/assets/stylesheets/pages/builds.scss b/app/assets/stylesheets/pages/builds.scss
index f030189af06..e8158cd7f6b 100644
--- a/app/assets/stylesheets/pages/builds.scss
+++ b/app/assets/stylesheets/pages/builds.scss
@@ -9,25 +9,21 @@
}
}
-@keyframes blinking-dots {
+@keyframes blinking-dot {
0% {
- background-color: rgba($white-light, 1);
- box-shadow: 12px 0 0 0 rgba($white-light, 0.2), 24px 0 0 0 rgba($white-light, 0.2);
+ opacity: 1;
}
25% {
- background-color: rgba($white-light, 0.4);
- box-shadow: 12px 0 0 0 rgba($white-light, 2), 24px 0 0 0 rgba($white-light, 0.2);
+ opacity: 0.4;
}
75% {
- background-color: rgba($white-light, 0.4);
- box-shadow: 12px 0 0 0 rgba($white-light, 0.2), 24px 0 0 0 rgba($white-light, 1);
+ opacity: 0.4;
}
100% {
- background-color: rgba($white-light, 1);
- box-shadow: 12px 0 0 0 rgba($white-light, 0.2), 24px 0 0 0 rgba($white-light, 0.2);
+ opacity: 1;
}
}
@@ -182,12 +178,7 @@
}
.build-loader-animation {
- position: relative;
- width: 6px;
- height: 6px;
- margin: auto auto 12px 2px;
- border-radius: 50%;
- animation: blinking-dots 1s linear infinite;
+ @include build-loader-animation;
}
}
@@ -270,6 +261,7 @@
.block {
width: 100%;
+ word-break: break-word;
&:last-child {
border-bottom: 1px solid $border-gray-normal;
diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index 63585e26022..bce83bf0dd0 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -1,9 +1,17 @@
-.commit-description {
- background: none;
+%commit-description-base {
+ padding: $gl-padding-8 0 $gl-padding-8 $gl-padding-8;
+ margin-top: $gl-padding-8;
border: 0;
- padding: 0;
+ border-radius: unset;
+ background: none;
word-break: normal;
- white-space: pre-wrap;
+ overflow-x: auto;
+ border-left: 3px solid $white-dark;
+ color: $gl-text-color-secondary;
+}
+
+.commit-description {
+ @extend %commit-description-base;
}
.js-details-expand {
@@ -79,7 +87,7 @@
.commit-message-container {
background-color: $body-bg;
position: relative;
- font-family: $monospace_font;
+ font-family: $monospace-font;
$left: 12px;
overflow: hidden; // See https://gitlab.com/gitlab-org/gitlab-ce/issues/13987
.max-width-marker {
@@ -175,11 +183,17 @@
justify-content: space-between;
align-items: start;
flex-grow: 1;
+ min-width: 0;
+
+ .project_namespace {
+ color: $gl-text-color-secondary;
+ }
}
.commit-content {
padding-right: 10px;
white-space: normal;
+ overflow: hidden;
.commit-title {
display: flex;
@@ -270,17 +284,9 @@
}
.commit-row-description {
- font-size: 14px;
- padding: 0 0 0 $gl-padding-8;
- border: 0;
+ @extend %commit-description-base;
display: none;
- white-space: pre-wrap;
- word-break: normal;
- color: $gl-text-color-secondary;
- background: none;
- font-family: inherit;
- border-left: 2px solid $theme-gray-300;
- border-radius: unset;
+ flex: 1;
a {
color: $gl-text-color;
diff --git a/app/assets/stylesheets/pages/cycle_analytics.scss b/app/assets/stylesheets/pages/cycle_analytics.scss
index a22c666a525..e2c0a7a6225 100644
--- a/app/assets/stylesheets/pages/cycle_analytics.scss
+++ b/app/assets/stylesheets/pages/cycle_analytics.scss
@@ -368,7 +368,7 @@
.fa {
color: $gl-text-color-secondary;
- font-size: $code_font_size;
+ font-size: $code-font-size;
}
}
}
diff --git a/app/assets/stylesheets/pages/detail_page.scss b/app/assets/stylesheets/pages/detail_page.scss
index 2e007c52592..37ed5ae674a 100644
--- a/app/assets/stylesheets/pages/detail_page.scss
+++ b/app/assets/stylesheets/pages/detail_page.scss
@@ -10,7 +10,7 @@
}
.issue_created_ago,
- .author_link {
+ .author-link {
white-space: nowrap;
}
diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss
index 5e39bbb9890..591e21243ed 100644
--- a/app/assets/stylesheets/pages/diff.scss
+++ b/app/assets/stylesheets/pages/diff.scss
@@ -16,6 +16,7 @@
svg {
vertical-align: middle;
+ top: -1px;
}
}
@@ -56,7 +57,7 @@
table {
width: 100%;
- font-family: $monospace_font;
+ font-family: $monospace-font;
border: 0;
border-collapse: separate;
margin: 0;
@@ -73,8 +74,8 @@
}
.line_holder td {
- line-height: $code_line_height;
- font-size: $code_font_size;
+ line-height: $code-line-height;
+ font-size: $code-font-size;
&.noteable_line {
position: relative;
diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss
index 437621299e0..ddd1f8cc98a 100644
--- a/app/assets/stylesheets/pages/editor.scss
+++ b/app/assets/stylesheets/pages/editor.scss
@@ -84,7 +84,7 @@
.soft-wrap-toggle {
display: inline-block;
vertical-align: top;
- font-family: $regular_font;
+ font-family: $regular-font;
}
.soft-wrap-toggle {
diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss
index 8915b323b3c..8a074017344 100644
--- a/app/assets/stylesheets/pages/environments.scss
+++ b/app/assets/stylesheets/pages/environments.scss
@@ -478,7 +478,7 @@
}
.deploy-info-text-link {
- font-family: $monospace_font;
+ font-family: $monospace-font;
fill: $gl-link-color;
&:hover {
diff --git a/app/assets/stylesheets/pages/graph.scss b/app/assets/stylesheets/pages/graph.scss
index 84da9180f93..49d8a5d959b 100644
--- a/app/assets/stylesheets/pages/graph.scss
+++ b/app/assets/stylesheets/pages/graph.scss
@@ -31,3 +31,61 @@
color: $gl-text-red;
}
}
+
+.svg-graph-container {
+ width: 100%;
+
+ .axis-tick {
+ opacity: 0.4;
+ }
+
+ .tick-text {
+ fill: $gl-text-color-secondary;
+ }
+
+ .x-axis-text {
+ fill: $theme-gray-900;
+ }
+
+ .bar-rect {
+ fill: rgba($blue-500, 0.1);
+ stroke: $blue-500;
+ }
+
+ .bar-rect:hover {
+ fill: rgba($blue-700, 0.3);
+ }
+
+ .y-axis-label {
+ line {
+ stroke: $stat-graph-axis-fill;
+ }
+
+ text {
+ font-weight: bold;
+ font-size: 12px;
+ fill: $theme-gray-800;
+ }
+ }
+}
+
+.svg-graph-container-with-grab {
+ cursor: grab;
+ cursor: -webkit-grab;
+}
+
+.svg-graph-container-grabbed {
+ cursor: grabbing;
+ cursor: -webkit-grabbing;
+}
+
+@keyframes flickerAnimation {
+ 0% { opacity: 1; }
+ 50% { opacity: 0; }
+ 100% { opacity: 1; }
+}
+
+.animate-flicker {
+ animation: flickerAnimation 1.5s infinite;
+ fill: $theme-gray-500;
+}
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index f9fd9f1ab8b..d5ae2b673d9 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -166,7 +166,7 @@
border-bottom: 1px solid $border-gray-normal;
// This prevents the mess when resizing the sidebar
// of elements repositioning themselves..
- width: $gutter_inner_width;
+ width: $gutter-inner-width;
// --
&.issuable-sidebar-header {
@@ -197,7 +197,7 @@
}
&.assignee {
- .author_link {
+ .author-link {
display: block;
padding-left: 42px;
position: relative;
@@ -290,7 +290,7 @@
}
&.right-sidebar-expanded {
- width: $gutter_width;
+ width: $gutter-width;
.value {
line-height: 1;
@@ -377,11 +377,11 @@
display: block;
}
- width: $gutter_collapsed_width;
+ width: $gutter-collapsed-width;
padding: 0;
.block {
- width: $gutter_collapsed_width - 2px;
+ width: $gutter-collapsed-width - 2px;
padding: 15px 0 0;
border-bottom: 0;
overflow: hidden;
@@ -486,7 +486,7 @@
padding-bottom: 0;
margin-bottom: 10px;
- .author_link {
+ .author-link {
padding-left: 0;
.avatar {
@@ -595,7 +595,7 @@
margin: 16px 0 0;
font-size: 85%;
- .author_link {
+ .author-link {
color: $gray-darkest;
}
}
@@ -620,7 +620,7 @@
padding-right: 0;
}
- .author_link {
+ .author-link {
display: block;
}
@@ -834,17 +834,7 @@
}
.compare-meter {
- &.within_estimate {
- .meter-fill {
- background: $gl-primary;
- }
- }
-
&.over_estimate {
- .meter-fill {
- background: $red-500;
- }
-
.time-remaining,
.compare-value.spent {
color: $red-500;
@@ -852,18 +842,6 @@
}
}
- .meter-container {
- background: $border-gray-light;
- border-radius: 3px;
-
- .meter-fill {
- max-width: 100%;
- height: 5px;
- border-radius: 3px;
- background: $gl-primary;
- }
- }
-
.compare-display-container {
display: flex;
justify-content: space-between;
diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss
index 19fb99bfa93..212e5979273 100644
--- a/app/assets/stylesheets/pages/issues.scss
+++ b/app/assets/stylesheets/pages/issues.scss
@@ -12,7 +12,7 @@
}
.issuable-meta {
- .author_link {
+ .author-link {
display: inline-block;
}
diff --git a/app/assets/stylesheets/pages/issues/issue_count_badge.scss b/app/assets/stylesheets/pages/issues/issue_count_badge.scss
index ccb62bfed18..4fba89e956b 100644
--- a/app/assets/stylesheets/pages/issues/issue_count_badge.scss
+++ b/app/assets/stylesheets/pages/issues/issue_count_badge.scss
@@ -1,29 +1,11 @@
.issue-count-badge {
display: inline-flex;
- align-items: stretch;
- height: 24px;
-}
-
-.issue-count-badge-count {
- display: flex;
- align-items: center;
- padding-right: 10px;
- padding-left: 10px;
- border: 1px solid $border-color;
border-radius: $border-radius-base;
- line-height: 1;
-
- &.has-btn {
- border-right: 0;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- }
+ border: 1px solid $border-color;
+ padding: 5px $gl-padding-8;
}
-.issue-count-badge-add-button {
- display: flex;
+.issue-count-badge-count {
+ display: inline-flex;
align-items: center;
- border: 1px solid $border-color;
- border-radius: 0 $border-radius-base $border-radius-base 0;
- line-height: 1;
}
diff --git a/app/assets/stylesheets/pages/login.scss b/app/assets/stylesheets/pages/login.scss
index c1b1d2e028d..8a4a2caa6c9 100644
--- a/app/assets/stylesheets/pages/login.scss
+++ b/app/assets/stylesheets/pages/login.scss
@@ -237,7 +237,7 @@
}
.login-page-broadcast {
- margin-top: 50px;
+ margin-top: 40px;
}
.navless-container {
diff --git a/app/assets/stylesheets/pages/merge_conflicts.scss b/app/assets/stylesheets/pages/merge_conflicts.scss
index e76525fdbf6..d26659701e1 100644
--- a/app/assets/stylesheets/pages/merge_conflicts.scss
+++ b/app/assets/stylesheets/pages/merge_conflicts.scss
@@ -1,167 +1,162 @@
// Disabled to use the color map for creating color schemes
// scss-lint:disable ColorVariable
$colors: (
- white_header_head_neutral : #e1fad7,
- white_line_head_neutral : #effdec,
- white_button_head_neutral : #9adb84,
+ white-header-head-neutral : #e1fad7,
+ white-line-head-neutral : #effdec,
+ white-button-head-neutral : #9adb84,
- white_header_head_chosen : #baf0a8,
- white_line_head_chosen : #e1fad7,
- white_button_head_chosen : #52c22d,
+ white-header-head-chosen : #baf0a8,
+ white-line-head-chosen : #e1fad7,
+ white-button-head-chosen : #52c22d,
- white_header_origin_neutral : #e0f0ff,
- white_line_origin_neutral : #f2f9ff,
- white_button_origin_neutral : #87c2fa,
+ white-header-origin-neutral : #e0f0ff,
+ white-line-origin-neutral : #f2f9ff,
+ white-button-origin-neutral : #87c2fa,
- white_header_origin_chosen : #add8ff,
- white_line_origin_chosen : #e0f0ff,
- white_button_origin_chosen : #268ced,
+ white-header-origin-chosen : #add8ff,
+ white-line-origin-chosen : #e0f0ff,
+ white-button-origin-chosen : #268ced,
- white_header_not_chosen : #f0f0f0,
- white_line_not_chosen : $gray-light,
+ white-header-not-chosen : #f0f0f0,
+ white-line-not-chosen : $gray-light,
+ dark-header-head-neutral : rgba(#3f3, .2),
+ dark-line-head-neutral : rgba(#3f3, .1),
+ dark-button-head-neutral : #40874f,
- dark_header_head_neutral : rgba(#3f3, .2),
- dark_line_head_neutral : rgba(#3f3, .1),
- dark_button_head_neutral : #40874f,
+ dark-header-head-chosen : rgba(#3f3, .33),
+ dark-line-head-chosen : rgba(#3f3, .2),
+ dark-button-head-chosen : #258537,
- dark_header_head_chosen : rgba(#3f3, .33),
- dark_line_head_chosen : rgba(#3f3, .2),
- dark_button_head_chosen : #258537,
+ dark-header-origin-neutral : rgba(#2878c9, .4),
+ dark-line-origin-neutral : rgba(#2878c9, .3),
+ dark-button-origin-neutral : #2a5c8c,
- dark_header_origin_neutral : rgba(#2878c9, .4),
- dark_line_origin_neutral : rgba(#2878c9, .3),
- dark_button_origin_neutral : #2a5c8c,
+ dark-header-origin-chosen : rgba(#2878c9, .6),
+ dark-line-origin-chosen : rgba(#2878c9, .4),
+ dark-button-origin-chosen : #1d6cbf,
- dark_header_origin_chosen : rgba(#2878c9, .6),
- dark_line_origin_chosen : rgba(#2878c9, .4),
- dark_button_origin_chosen : #1d6cbf,
+ dark-header-not-chosen : rgba(#fff, .25),
+ dark-line-not-chosen : rgba(#fff, .1),
- dark_header_not_chosen : rgba(#fff, .25),
- dark_line_not_chosen : rgba(#fff, .1),
+ monokai-header-head-neutral : rgba(#a6e22e, .25),
+ monokai-line-head-neutral : rgba(#a6e22e, .1),
+ monokai-button-head-neutral : #376b20,
+ monokai-header-head-chosen : rgba(#a6e22e, .4),
+ monokai-line-head-chosen : rgba(#a6e22e, .25),
+ monokai-button-head-chosen : #39800d,
- monokai_header_head_neutral : rgba(#a6e22e, .25),
- monokai_line_head_neutral : rgba(#a6e22e, .1),
- monokai_button_head_neutral : #376b20,
+ monokai-header-origin-neutral : rgba(#60d9f1, .35),
+ monokai-line-origin-neutral : rgba(#60d9f1, .15),
+ monokai-button-origin-neutral : #38848c,
- monokai_header_head_chosen : rgba(#a6e22e, .4),
- monokai_line_head_chosen : rgba(#a6e22e, .25),
- monokai_button_head_chosen : #39800d,
+ monokai-header-origin-chosen : rgba(#60d9f1, .5),
+ monokai-line-origin-chosen : rgba(#60d9f1, .35),
+ monokai-button-origin-chosen : #3ea4b2,
- monokai_header_origin_neutral : rgba(#60d9f1, .35),
- monokai_line_origin_neutral : rgba(#60d9f1, .15),
- monokai_button_origin_neutral : #38848c,
+ monokai-header-not-chosen : rgba(#76715d, .24),
+ monokai-line-not-chosen : rgba(#76715d, .1),
- monokai_header_origin_chosen : rgba(#60d9f1, .5),
- monokai_line_origin_chosen : rgba(#60d9f1, .35),
- monokai_button_origin_chosen : #3ea4b2,
+ solarized-light-header-head-neutral : rgba(#859900, .37),
+ solarized-light-line-head-neutral : rgba(#859900, .2),
+ solarized-light-button-head-neutral : #afb262,
- monokai_header_not_chosen : rgba(#76715d, .24),
- monokai_line_not_chosen : rgba(#76715d, .1),
+ solarized-light-header-head-chosen : rgba(#859900, .5),
+ solarized-light-line-head-chosen : rgba(#859900, .37),
+ solarized-light-button-head-chosen : #94993d,
+ solarized-light-header-origin-neutral : rgba(#2878c9, .37),
+ solarized-light-line-origin-neutral : rgba(#2878c9, .15),
+ solarized-light-button-origin-neutral : #60a1bf,
- solarized_light_header_head_neutral : rgba(#859900, .37),
- solarized_light_line_head_neutral : rgba(#859900, .2),
- solarized_light_button_head_neutral : #afb262,
+ solarized-light-header-origin-chosen : rgba(#2878c9, .6),
+ solarized-light-line-origin-chosen : rgba(#2878c9, .37),
+ solarized-light-button-origin-chosen : #2482b2,
- solarized_light_header_head_chosen : rgba(#859900, .5),
- solarized_light_line_head_chosen : rgba(#859900, .37),
- solarized_light_button_head_chosen : #94993d,
+ solarized-light-header-not-chosen : rgba(#839496, .37),
+ solarized-light-line-not-chosen : rgba(#839496, .2),
- solarized_light_header_origin_neutral : rgba(#2878c9, .37),
- solarized_light_line_origin_neutral : rgba(#2878c9, .15),
- solarized_light_button_origin_neutral : #60a1bf,
+ solarized-dark-header-head-neutral : rgba(#859900, .35),
+ solarized-dark-line-head-neutral : rgba(#859900, .15),
+ solarized-dark-button-head-neutral : #376b20,
- solarized_light_header_origin_chosen : rgba(#2878c9, .6),
- solarized_light_line_origin_chosen : rgba(#2878c9, .37),
- solarized_light_button_origin_chosen : #2482b2,
+ solarized-dark-header-head-chosen : rgba(#859900, .5),
+ solarized-dark-line-head-chosen : rgba(#859900, .35),
+ solarized-dark-button-head-chosen : #39800d,
- solarized_light_header_not_chosen : rgba(#839496, .37),
- solarized_light_line_not_chosen : rgba(#839496, .2),
+ solarized-dark-header-origin-neutral : rgba(#2878c9, .35),
+ solarized-dark-line-origin-neutral : rgba(#2878c9, .15),
+ solarized-dark-button-origin-neutral : #086799,
+ solarized-dark-header-origin-chosen : rgba(#2878c9, .6),
+ solarized-dark-line-origin-chosen : rgba(#2878c9, .35),
+ solarized-dark-button-origin-chosen : #0082cc,
- solarized_dark_header_head_neutral : rgba(#859900, .35),
- solarized_dark_line_head_neutral : rgba(#859900, .15),
- solarized_dark_button_head_neutral : #376b20,
-
- solarized_dark_header_head_chosen : rgba(#859900, .5),
- solarized_dark_line_head_chosen : rgba(#859900, .35),
- solarized_dark_button_head_chosen : #39800d,
-
- solarized_dark_header_origin_neutral : rgba(#2878c9, .35),
- solarized_dark_line_origin_neutral : rgba(#2878c9, .15),
- solarized_dark_button_origin_neutral : #086799,
-
- solarized_dark_header_origin_chosen : rgba(#2878c9, .6),
- solarized_dark_line_origin_chosen : rgba(#2878c9, .35),
- solarized_dark_button_origin_chosen : #0082cc,
-
- solarized_dark_header_not_chosen : rgba(#839496, .25),
- solarized_dark_line_not_chosen : rgba(#839496, .15)
+ solarized-dark-header-not-chosen : rgba(#839496, .25),
+ solarized-dark-line-not-chosen : rgba(#839496, .15)
);
// scss-lint:enable ColorVariable
-
@mixin color-scheme($color) {
.header.line_content,
.diff-line-num {
&.origin {
- background-color: map-get($colors, #{$color}_header_origin_neutral);
- border-color: map-get($colors, #{$color}_header_origin_neutral);
+ background-color: map-get($colors, #{$color}-header-origin-neutral);
+ border-color: map-get($colors, #{$color}-header-origin-neutral);
button {
- background-color: map-get($colors, #{$color}_button_origin_neutral);
- border-color: darken(map-get($colors, #{$color}_button_origin_neutral), 15);
+ background-color: map-get($colors, #{$color}-button-origin-neutral);
+ border-color: darken(map-get($colors, #{$color}-button-origin-neutral), 15);
}
&.selected {
- background-color: map-get($colors, #{$color}_header_origin_chosen);
- border-color: map-get($colors, #{$color}_header_origin_chosen);
+ background-color: map-get($colors, #{$color}-header-origin-chosen);
+ border-color: map-get($colors, #{$color}-header-origin-chosen);
button {
- background-color: map-get($colors, #{$color}_button_origin_chosen);
- border-color: darken(map-get($colors, #{$color}_button_origin_chosen), 15);
+ background-color: map-get($colors, #{$color}-button-origin-chosen);
+ border-color: darken(map-get($colors, #{$color}-button-origin-chosen), 15);
}
}
&.unselected {
- background-color: map-get($colors, #{$color}_header_not_chosen);
- border-color: map-get($colors, #{$color}_header_not_chosen);
+ background-color: map-get($colors, #{$color}-header-not-chosen);
+ border-color: map-get($colors, #{$color}-header-not-chosen);
button {
- background-color: lighten(map-get($colors, #{$color}_button_origin_neutral), 15);
- border-color: map-get($colors, #{$color}_button_origin_neutral);
+ background-color: lighten(map-get($colors, #{$color}-button-origin-neutral), 15);
+ border-color: map-get($colors, #{$color}-button-origin-neutral);
}
}
}
&.head {
- background-color: map-get($colors, #{$color}_header_head_neutral);
- border-color: map-get($colors, #{$color}_header_head_neutral);
+ background-color: map-get($colors, #{$color}-header-head-neutral);
+ border-color: map-get($colors, #{$color}-header-head-neutral);
button {
- background-color: map-get($colors, #{$color}_button_head_neutral);
- border-color: darken(map-get($colors, #{$color}_button_head_neutral), 15);
+ background-color: map-get($colors, #{$color}-button-head-neutral);
+ border-color: darken(map-get($colors, #{$color}-button-head-neutral), 15);
}
&.selected {
- background-color: map-get($colors, #{$color}_header_head_chosen);
- border-color: map-get($colors, #{$color}_header_head_chosen);
+ background-color: map-get($colors, #{$color}-header-head-chosen);
+ border-color: map-get($colors, #{$color}-header-head-chosen);
button {
- background-color: map-get($colors, #{$color}_button_head_chosen);
- border-color: darken(map-get($colors, #{$color}_button_head_chosen), 15);
+ background-color: map-get($colors, #{$color}-button-head-chosen);
+ border-color: darken(map-get($colors, #{$color}-button-head-chosen), 15);
}
}
&.unselected {
- background-color: map-get($colors, #{$color}_header_not_chosen);
- border-color: map-get($colors, #{$color}_header_not_chosen);
+ background-color: map-get($colors, #{$color}-header-not-chosen);
+ border-color: map-get($colors, #{$color}-header-not-chosen);
button {
- background-color: lighten(map-get($colors, #{$color}_button_head_neutral), 15);
- border-color: map-get($colors, #{$color}_button_head_neutral);
+ background-color: lighten(map-get($colors, #{$color}-button-head-neutral), 15);
+ border-color: map-get($colors, #{$color}-button-head-neutral);
}
}
}
@@ -169,32 +164,31 @@ $colors: (
.line_content {
&.origin {
- background-color: map-get($colors, #{$color}_line_origin_neutral);
+ background-color: map-get($colors, #{$color}-line-origin-neutral);
&.selected {
- background-color: map-get($colors, #{$color}_line_origin_chosen);
+ background-color: map-get($colors, #{$color}-line-origin-chosen);
}
&.unselected {
- background-color: map-get($colors, #{$color}_line_not_chosen);
+ background-color: map-get($colors, #{$color}-line-not-chosen);
}
}
&.head {
- background-color: map-get($colors, #{$color}_line_head_neutral);
+ background-color: map-get($colors, #{$color}-line-head-neutral);
&.selected {
- background-color: map-get($colors, #{$color}_line_head_chosen);
+ background-color: map-get($colors, #{$color}-line-head-chosen);
}
&.unselected {
- background-color: map-get($colors, #{$color}_line_not_chosen);
+ background-color: map-get($colors, #{$color}-line-not-chosen);
}
}
}
}
-
#conflicts {
.white {
@@ -210,11 +204,11 @@ $colors: (
}
.solarized-light {
- @include color-scheme('solarized_light')
+ @include color-scheme('solarized-light')
}
.solarized-dark {
- @include color-scheme('solarized_dark')
+ @include color-scheme('solarized-dark')
}
.diff-wrap-lines .line_content {
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index c8349a4ef79..a355ceea7a0 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -15,6 +15,39 @@
}
}
+.mr-widget-border-top {
+ border-top: 1px solid $border-color;
+}
+
+.media-section {
+ @include media-breakpoint-down(md) {
+ align-items: flex-start;
+
+ .media-body {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+ }
+
+ .code-text {
+ @include media-breakpoint-up(lg) {
+ align-self: center;
+ flex: 1;
+ }
+ }
+}
+
+.mr-widget-section {
+ .media {
+ align-items: center;
+ }
+
+ .code-text {
+ flex: 1;
+ }
+}
+
+
.mr-widget-heading {
position: relative;
border: 1px solid $border-color;
@@ -54,6 +87,14 @@
padding: 0;
}
+ .grouped-security-reports {
+ padding: 0;
+
+ > .media {
+ padding: $gl-padding;
+ }
+ }
+
form {
margin-bottom: 0;
@@ -208,7 +249,7 @@
position: absolute;
content: '...';
right: 0;
- font-family: $regular_font;
+ font-family: $regular-font;
background-color: $gray-light;
}
}
diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss
index 5e5696b1602..dcf590e7331 100644
--- a/app/assets/stylesheets/pages/note_form.scss
+++ b/app/assets/stylesheets/pages/note_form.scss
@@ -42,7 +42,7 @@
display: block;
padding: 10px 0;
color: $gl-text-color;
- font-family: $regular_font;
+ font-family: $regular-font;
border: 0;
&:focus {
diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss
index 32d14049067..7fc2936c5e6 100644
--- a/app/assets/stylesheets/pages/notes.scss
+++ b/app/assets/stylesheets/pages/notes.scss
@@ -328,7 +328,7 @@ ul.notes {
}
.notes_holder {
- font-family: $regular_font;
+ font-family: $regular-font;
td {
border: 1px solid $white-normal;
@@ -403,7 +403,7 @@ ul.notes {
}
}
- .author_link {
+ .author-link {
color: $gl-text-color;
}
}
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index aa83e5bdebc..944421604fe 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -490,30 +490,31 @@
margin-bottom: 0;
}
+ .tab-pane {
+ padding-top: 0;
+ padding-bottom: 0;
+ }
+
.template-option {
- padding: $gl-padding $gl-padding $gl-padding ($gl-padding * 4);
- position: relative;
+ .logo {
+ .btn-template-icon {
+ width: 40px !important;
+ }
+ }
+
+ padding: 16px 0;
&:not(:first-child) {
border-top: 1px solid $border-color;
}
- .btn-template-icon {
- position: absolute;
- left: $gl-padding;
- top: $gl-padding;
+ .controls {
+ margin-left: auto;
}
- }
-
- .template-title {
- font-size: 16px;
- }
- .template-description {
- margin: 6px 0 12px;
}
- .template-button {
+ .choose-template {
input {
position: absolute;
clip: rect(0, 0, 0, 0);
@@ -540,8 +541,6 @@
}
.selected-icon {
- padding-right: $gl-padding;
-
svg {
display: none;
top: 7px;
@@ -754,6 +753,11 @@
}
}
+.repository-languages-bar {
+ height: 6px;
+ margin-bottom: 8px;
+}
+
pre.light-well {
border-color: $well-light-border;
}
diff --git a/app/assets/stylesheets/pages/reports.scss b/app/assets/stylesheets/pages/reports.scss
index ce253ebb71f..ecd51aa06a4 100644
--- a/app/assets/stylesheets/pages/reports.scss
+++ b/app/assets/stylesheets/pages/reports.scss
@@ -75,31 +75,27 @@
margin: 0;
.license-item {
- line-height: $gl-padding-24;
+ line-height: $gl-padding-32;
- .license-dependencies {
- color: $gl-text-color-tertiary;
+ .license-packages {
+ font-size: $label-font-size;
}
- .btn-show-all-packages {
- line-height: $gl-btn-line-height;
- margin-bottom: 2px;
- }
}
}
.report-block-list-icon {
display: flex;
- &.failed {
+ &.failed svg {
color: $red-500;
}
- &.success {
+ &.success svg {
color: $green-500;
}
- &.neutral {
+ &.neutral svg {
color: $theme-gray-700;
}
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index efd26cb1f81..1cc26d40ba9 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -109,24 +109,6 @@
line-height: 21px;
}
- .last-commit {
- @include str-truncated(506px);
-
- .fa-angle-right {
- margin-left: 5px;
- }
-
- @include media-breakpoint-only(md) {
- @include str-truncated(450px);
- }
-
- }
-
- .commit-history-link-spacer {
- margin: 0 10px;
- color: $white-normal;
- }
-
&:hover:not(.tree-truncated-warning) {
td {
background-color: $row-hover;
diff --git a/app/assets/stylesheets/snippets.scss b/app/assets/stylesheets/snippets.scss
index 0d6b0735f70..bd777c66b56 100644
--- a/app/assets/stylesheets/snippets.scss
+++ b/app/assets/stylesheets/snippets.scss
@@ -6,9 +6,9 @@
$border-style: 1px solid $border-color;
- font-family: $regular_font;
+ font-family: $regular-font;
font-size: $gl-font-size;
- line-height: $code_line_height;
+ line-height: $code-line-height;
color: $gl-text-color;
margin: 20px;
font-weight: 200;
@@ -22,8 +22,8 @@
height: 16px;
background-size: cover;
- &.gl-snippet-icon-doc_code { background-position: 0 0; }
- &.gl-snippet-icon-doc_text { background-position: 0 -16px; }
+ &.gl-snippet-icon-doc-code { background-position: 0 0; }
+ &.gl-snippet-icon-doc-text { background-position: 0 -16px; }
&.gl-snippet-icon-download { background-position: 0 -32px; }
}
@@ -48,9 +48,9 @@
padding: 10px;
border: 0;
border-radius: 0;
- font-family: $monospace_font;
- font-size: $code_font_size;
- line-height: $code_line_height;
+ font-family: $monospace-font;
+ font-size: $code-font-size;
+ line-height: $code-line-height;
margin: 0;
overflow: auto;
overflow-y: hidden;
@@ -66,10 +66,10 @@
float: left;
.diff-line-num {
- font-family: $monospace_font;
+ font-family: $monospace-font;
display: block;
- font-size: $code_font_size;
- min-height: $code_line_height;
+ font-size: $code-font-size;
+ min-height: $code-line-height;
white-space: nowrap;
color: $black-transparent;
min-width: 30px;
diff --git a/app/controllers/admin/conversational_development_index_controller.rb b/app/controllers/admin/conversational_development_index_controller.rb
deleted file mode 100644
index 921169d3e2b..00000000000
--- a/app/controllers/admin/conversational_development_index_controller.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class Admin::ConversationalDevelopmentIndexController < Admin::ApplicationController
- def show
- @metric = ConversationalDevelopmentIndex::Metric.order(:created_at).last&.present
- end
-end
diff --git a/app/controllers/admin/jobs_controller.rb b/app/controllers/admin/jobs_controller.rb
index ac1ae0f16b3..e355d5fdea7 100644
--- a/app/controllers/admin/jobs_controller.rb
+++ b/app/controllers/admin/jobs_controller.rb
@@ -2,7 +2,7 @@ class Admin::JobsController < Admin::ApplicationController
def index
@scope = params[:scope]
@all_builds = Ci::Build
- @builds = @all_builds.order('created_at DESC')
+ @builds = @all_builds.order('id DESC')
@builds =
case @scope
when 'pending'
diff --git a/app/controllers/admin/services_controller.rb b/app/controllers/admin/services_controller.rb
index e70aa549140..91a36af34f3 100644
--- a/app/controllers/admin/services_controller.rb
+++ b/app/controllers/admin/services_controller.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Admin::ServicesController < Admin::ApplicationController
include ServiceParams
@@ -30,7 +32,7 @@ class Admin::ServicesController < Admin::ApplicationController
def services_templates
Service.available_services_names.map do |service_name|
- service_template = service_name.concat("_service").camelize.constantize
+ service_template = "#{service_name}_service".camelize.constantize
service_template.where(template: true).first_or_create
end
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index eeceb99c8d2..783831748a7 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -108,6 +108,7 @@ class ApplicationController < ActionController::Base
def append_info_to_payload(payload)
super
+
payload[:remote_ip] = request.remote_ip
logged_user = auth_user
@@ -122,12 +123,16 @@ class ApplicationController < ActionController::Base
end
end
+ ##
# Controllers such as GitHttpController may use alternative methods
- # (e.g. tokens) to authenticate the user, whereas Devise sets current_user
+ # (e.g. tokens) to authenticate the user, whereas Devise sets current_user.
+ #
def auth_user
- return current_user if current_user.present?
-
- return try(:authenticated_user)
+ if user_signed_in?
+ current_user
+ else
+ try(:authenticated_user)
+ end
end
# This filter handles personal access tokens, and atom requests with rss tokens
@@ -397,7 +402,7 @@ class ApplicationController < ActionController::Base
# actually stored in the session and a token is needed
# for every request. If you want the token to work as a
# sign in token, you can simply remove store: false.
- sign_in user, store: false
+ sign_in(user, store: false, message: :sessionless_sign_in)
end
end
diff --git a/app/controllers/boards/issues_controller.rb b/app/controllers/boards/issues_controller.rb
index 09e143c23e8..7dd19f87ef5 100644
--- a/app/controllers/boards/issues_controller.rb
+++ b/app/controllers/boards/issues_controller.rb
@@ -12,8 +12,9 @@ module Boards
skip_before_action :authenticate_user!, only: [:index]
def index
- issues = Boards::Issues::ListService.new(board_parent, current_user, filter_params).execute
- issues = issues.page(params[:page]).per(params[:per] || 20)
+ list_service = Boards::Issues::ListService.new(board_parent, current_user, filter_params)
+ issues = list_service.execute
+ issues = issues.page(params[:page]).per(params[:per] || 20).without_count
make_sure_position_is_set(issues) if Gitlab::Database.read_write?
issues = issues.preload(:project,
:milestone,
@@ -22,10 +23,7 @@ module Boards
notes: [:award_emoji, :author]
)
- render json: {
- issues: serialize_as_json(issues),
- size: issues.total_count
- }
+ render_issues(issues, list_service.metadata)
end
def create
@@ -51,6 +49,13 @@ module Boards
private
+ def render_issues(issues, metadata)
+ data = { issues: serialize_as_json(issues) }
+ data.merge!(metadata)
+
+ render json: data
+ end
+
def make_sure_position_is_set(issues)
issues.each do |issue|
issue.move_to_end && issue.save unless issue.relative_position
diff --git a/app/controllers/concerns/authenticates_with_two_factor.rb b/app/controllers/concerns/authenticates_with_two_factor.rb
index 69a053d4246..dfa1da7872c 100644
--- a/app/controllers/concerns/authenticates_with_two_factor.rb
+++ b/app/controllers/concerns/authenticates_with_two_factor.rb
@@ -60,7 +60,7 @@ module AuthenticatesWithTwoFactor
remember_me(user) if user_params[:remember_me] == '1'
user.save!
- sign_in(user)
+ sign_in(user, message: :two_factor_authenticated)
else
user.increment_failed_attempts!
Gitlab::AppLogger.info("Failed Login: user=#{user.username} ip=#{request.remote_ip} method=OTP")
@@ -77,7 +77,7 @@ module AuthenticatesWithTwoFactor
session.delete(:challenge)
remember_me(user) if user_params[:remember_me] == '1'
- sign_in(user)
+ sign_in(user, message: :two_factor_authenticated)
else
user.increment_failed_attempts!
Gitlab::AppLogger.info("Failed Login: user=#{user.username} ip=#{request.remote_ip} method=U2F")
diff --git a/app/controllers/concerns/members_presentation.rb b/app/controllers/concerns/members_presentation.rb
index c0622516fd3..215e0bdf3cb 100644
--- a/app/controllers/concerns/members_presentation.rb
+++ b/app/controllers/concerns/members_presentation.rb
@@ -2,10 +2,18 @@ module MembersPresentation
extend ActiveSupport::Concern
def present_members(members)
+ preload_associations(members)
Gitlab::View::Presenter::Factory.new(
members,
current_user: current_user,
presenter_class: MembersPresenter
).fabricate!
end
+
+ def preload_associations(members)
+ ActiveRecord::Associations::Preloader.new.preload(members, :user)
+ ActiveRecord::Associations::Preloader.new.preload(members, :source)
+ ActiveRecord::Associations::Preloader.new.preload(members.map(&:user), :status)
+ ActiveRecord::Associations::Preloader.new.preload(members.map(&:user), :u2f_registrations)
+ end
end
diff --git a/app/controllers/concerns/membership_actions.rb b/app/controllers/concerns/membership_actions.rb
index 7a6a00b8e13..409e6d4c4d2 100644
--- a/app/controllers/concerns/membership_actions.rb
+++ b/app/controllers/concerns/membership_actions.rb
@@ -1,4 +1,5 @@
module MembershipActions
+ include MembersPresentation
extend ActiveSupport::Concern
def create
@@ -20,6 +21,7 @@ module MembershipActions
.execute(member)
.present(current_user: current_user)
+ present_members([member])
respond_to do |format|
format.js { render 'shared/members/update', locals: { member: member } }
end
diff --git a/app/controllers/concerns/notes_actions.rb b/app/controllers/concerns/notes_actions.rb
index fe9a030cdf2..5127db3f5fb 100644
--- a/app/controllers/concerns/notes_actions.rb
+++ b/app/controllers/concerns/notes_actions.rb
@@ -41,7 +41,7 @@ module NotesActions
@note = Notes::CreateService.new(note_project, current_user, create_params).execute
if @note.is_a?(Note)
- Notes::RenderService.new(current_user).execute([@note])
+ prepare_notes_for_rendering([@note], noteable)
end
respond_to do |format|
@@ -56,7 +56,7 @@ module NotesActions
@note = Notes::UpdateService.new(project, current_user, note_params).execute(note)
if @note.is_a?(Note)
- Notes::RenderService.new(current_user).execute([@note])
+ prepare_notes_for_rendering([@note])
end
respond_to do |format|
diff --git a/app/controllers/concerns/renders_notes.rb b/app/controllers/concerns/renders_notes.rb
index 36e3d76ecfe..cf04023080a 100644
--- a/app/controllers/concerns/renders_notes.rb
+++ b/app/controllers/concerns/renders_notes.rb
@@ -4,6 +4,7 @@ module RendersNotes
preload_noteable_for_regular_notes(notes)
preload_max_access_for_authors(notes, @project)
preload_first_time_contribution_for_authors(noteable, notes)
+ preload_author_status(notes)
Notes::RenderService.new(current_user).execute(notes)
notes
@@ -28,4 +29,8 @@ module RendersNotes
notes.each {|n| n.specialize_for_first_contribution!(noteable)}
end
+
+ def preload_author_status(notes)
+ ActiveRecord::Associations::Preloader.new.preload(notes, { author: :status })
+ end
end
diff --git a/app/controllers/dashboard/milestones_controller.rb b/app/controllers/dashboard/milestones_controller.rb
index 751dbbd8e96..0469e7e1e1f 100644
--- a/app/controllers/dashboard/milestones_controller.rb
+++ b/app/controllers/dashboard/milestones_controller.rb
@@ -21,8 +21,19 @@ class Dashboard::MilestonesController < Dashboard::ApplicationController
private
+ def group_milestones
+ groups = GroupsFinder.new(current_user, all_available: true).execute
+
+ DashboardGroupMilestone.build_collection(groups)
+ end
+
+ # See [#39545](https://gitlab.com/gitlab-org/gitlab-ce/issues/39545) for info about the deprecation of dynamic milestones
+ def dynamic_milestones
+ DashboardMilestone.build_collection(@projects, params)
+ end
+
def milestones
- @milestones = DashboardMilestone.build_collection(@projects, params)
+ @milestones = group_milestones + dynamic_milestones
end
def milestone
diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb
index ef5d5e5c742..7dc51f4c357 100644
--- a/app/controllers/groups/group_members_controller.rb
+++ b/app/controllers/groups/group_members_controller.rb
@@ -30,7 +30,7 @@ class Groups::GroupMembersController < Groups::ApplicationController
end
@members = @members.page(params[:page]).per(50)
- @members = present_members(@members.includes(:user))
+ @members = present_members(@members)
@requesters = present_members(
AccessRequestsFinder.new(@group).execute(current_user))
diff --git a/app/controllers/instance_statistics/application_controller.rb b/app/controllers/instance_statistics/application_controller.rb
new file mode 100644
index 00000000000..a273dde105c
--- /dev/null
+++ b/app/controllers/instance_statistics/application_controller.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class InstanceStatistics::ApplicationController < ApplicationController
+ before_action :authorize_read_instance_statistics!
+ layout 'instance_statistics'
+
+ def authorize_read_instance_statistics!
+ render_404 unless can?(current_user, :read_instance_statistics)
+ end
+end
diff --git a/app/controllers/admin/cohorts_controller.rb b/app/controllers/instance_statistics/cohorts_controller.rb
index 10d9d1b5345..7eba0a5ecdd 100644
--- a/app/controllers/admin/cohorts_controller.rb
+++ b/app/controllers/instance_statistics/cohorts_controller.rb
@@ -1,4 +1,6 @@
-class Admin::CohortsController < Admin::ApplicationController
+# frozen_string_literal: true
+
+class InstanceStatistics::CohortsController < InstanceStatistics::ApplicationController
def index
if Gitlab::CurrentSettings.usage_ping_enabled
cohorts_results = Rails.cache.fetch('cohorts', expires_in: 1.day) do
diff --git a/app/controllers/instance_statistics/conversational_development_index_controller.rb b/app/controllers/instance_statistics/conversational_development_index_controller.rb
new file mode 100644
index 00000000000..d6d2191849f
--- /dev/null
+++ b/app/controllers/instance_statistics/conversational_development_index_controller.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+class InstanceStatistics::ConversationalDevelopmentIndexController < InstanceStatistics::ApplicationController
+ def index
+ @metric = ConversationalDevelopmentIndex::Metric.order(:created_at).last&.present
+ end
+end
diff --git a/app/controllers/jwt_controller.rb b/app/controllers/jwt_controller.rb
index 3cb9e46b548..d172aee5436 100644
--- a/app/controllers/jwt_controller.rb
+++ b/app/controllers/jwt_controller.rb
@@ -54,6 +54,22 @@ class JwtController < ApplicationController
end
def auth_params
- params.permit(:service, :scope, :account, :client_id)
+ params.permit(:service, :account, :client_id)
+ .merge(additional_params)
+ end
+
+ def additional_params
+ { scopes: scopes_param }.compact
+ end
+
+ # We have to parse scope here, because Docker Client does not send an array of scopes,
+ # but rather a flat list and we loose second scope when being processed by Rails:
+ # scope=scopeA&scope=scopeB
+ #
+ # This method makes to always return an array of scopes
+ def scopes_param
+ return unless params[:scope].present?
+
+ Array(Rack::Utils.parse_query(request.query_string)['scope'])
end
end
diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb
index 074db361949..6f50cbb4a36 100644
--- a/app/controllers/profiles_controller.rb
+++ b/app/controllers/profiles_controller.rb
@@ -99,7 +99,9 @@ class ProfilesController < Profiles::ApplicationController
:username,
:website_url,
:organization,
- :preferred_language
+ :preferred_language,
+ :private_profile,
+ status: [:emoji, :message]
)
end
end
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index 1d1184d46d1..44b176d304e 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -22,7 +22,9 @@ class Projects::CommitController < Projects::ApplicationController
apply_diff_view_cookie!
respond_to do |format|
- format.html { render }
+ format.html do
+ render
+ end
format.diff do
send_git_diff(@project.repository, @commit.diff_refs)
end
@@ -124,7 +126,10 @@ class Projects::CommitController < Projects::ApplicationController
end
def commit
- @noteable = @commit ||= @project.commit_by(oid: params[:id])
+ @noteable = @commit ||= @project.commit_by(oid: params[:id]).tap do |commit|
+ # preload author and their status for rendering
+ commit&.author&.status
+ end
end
def define_commit_vars
diff --git a/app/controllers/projects/commits_controller.rb b/app/controllers/projects/commits_controller.rb
index 9e495061f4e..36faea8056e 100644
--- a/app/controllers/projects/commits_controller.rb
+++ b/app/controllers/projects/commits_controller.rb
@@ -4,13 +4,17 @@ class Projects::CommitsController < Projects::ApplicationController
include ExtractsPath
include RendersCommits
- before_action :whitelist_query_limiting
+ before_action :whitelist_query_limiting, except: :commits_root
before_action :require_non_empty_project
- before_action :assign_ref_vars
+ before_action :assign_ref_vars, except: :commits_root
before_action :authorize_download_code!
- before_action :set_commits
+ before_action :set_commits, except: :commits_root
before_action :set_request_format, only: :show
+ def commits_root
+ redirect_to project_commits_path(@project, @project.default_branch)
+ end
+
def show
@merge_request = MergeRequestsFinder.new(current_user, project_id: @project.id).execute.opened
.find_by(source_project: @project, source_branch: @ref, target_branch: @repository.root_ref)
diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb
index 7c897b2d86c..ef8159aa553 100644
--- a/app/controllers/projects/issues_controller.rb
+++ b/app/controllers/projects/issues_controller.rb
@@ -165,7 +165,7 @@ class Projects::IssuesController < Projects::ApplicationController
return @issue if defined?(@issue)
# The Sortable default scope causes performance issues when used with find_by
- @issuable = @noteable = @issue ||= @project.issues.where(iid: params[:id]).reorder(nil).take!
+ @issuable = @noteable = @issue ||= @project.issues.includes(author: :status).where(iid: params[:id]).reorder(nil).take!
@note = @project.notes.new(noteable: @issuable)
return render_404 unless can?(current_user, :read_issue, @issue)
diff --git a/app/controllers/projects/labels_controller.rb b/app/controllers/projects/labels_controller.rb
index 21d3c918581..8a2bce6e7b5 100644
--- a/app/controllers/projects/labels_controller.rb
+++ b/app/controllers/projects/labels_controller.rb
@@ -112,7 +112,7 @@ class Projects::LabelsController < Projects::ApplicationController
begin
return render_404 unless promote_service.execute(@label)
- flash[:notice] = "#{@label.title} promoted to <a href=\"#{group_labels_path(@project.group)}\">group label</a>.".html_safe
+ flash[:notice] = flash_notice_for(@label, @project.group)
respond_to do |format|
format.html do
redirect_to(project_labels_path(@project), status: :see_other)
@@ -135,6 +135,15 @@ class Projects::LabelsController < Projects::ApplicationController
end
end
+ def flash_notice_for(label, group)
+ notice = ''.html_safe
+ notice << label.title
+ notice << ' promoted to '
+ notice << view_context.link_to('<u>group label</u>'.html_safe, group_labels_path(group))
+ notice << '.'
+ notice
+ end
+
protected
def label_params
@@ -151,7 +160,10 @@ class Projects::LabelsController < Projects::ApplicationController
def find_labels
@available_labels ||=
- LabelsFinder.new(current_user, project_id: @project.id, include_ancestor_groups: params[:include_ancestor_groups]).execute
+ LabelsFinder.new(current_user,
+ project_id: @project.id,
+ include_ancestor_groups: params[:include_ancestor_groups],
+ search: params[:search]).execute
end
def authorize_admin_labels!
diff --git a/app/controllers/projects/lfs_api_controller.rb b/app/controllers/projects/lfs_api_controller.rb
index c64ccc3d473..a01351ba292 100644
--- a/app/controllers/projects/lfs_api_controller.rb
+++ b/app/controllers/projects/lfs_api_controller.rb
@@ -1,6 +1,8 @@
class Projects::LfsApiController < Projects::GitHttpClientController
include LfsRequest
+ LFS_TRANSFER_CONTENT_TYPE = 'application/octet-stream'.freeze
+
skip_before_action :lfs_check_access!, only: [:deprecated]
before_action :lfs_check_batch_operation!, only: [:batch]
@@ -86,7 +88,10 @@ class Projects::LfsApiController < Projects::GitHttpClientController
upload: {
href: "#{project.http_url_to_repo}/gitlab-lfs/objects/#{object[:oid]}/#{object[:size]}",
header: {
- Authorization: request.headers['Authorization']
+ Authorization: request.headers['Authorization'],
+ # git-lfs v2.5.0 sets the Content-Type based on the uploaded file. This
+ # ensures that Workhorse can intercept the request.
+ 'Content-Type': LFS_TRANSFER_CONTENT_TYPE
}.compact
}
}
diff --git a/app/controllers/projects/merge_requests/application_controller.rb b/app/controllers/projects/merge_requests/application_controller.rb
index 8e4aeec16dc..fead81dd472 100644
--- a/app/controllers/projects/merge_requests/application_controller.rb
+++ b/app/controllers/projects/merge_requests/application_controller.rb
@@ -6,7 +6,7 @@ class Projects::MergeRequests::ApplicationController < Projects::ApplicationCont
private
def merge_request
- @issuable = @merge_request ||= @project.merge_requests.find_by!(iid: params[:id])
+ @issuable = @merge_request ||= @project.merge_requests.includes(author: :status).find_by!(iid: params[:id])
end
def merge_request_params
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index dc6551fc761..eaf4434f913 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -99,6 +99,23 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
}
end
+ def test_reports
+ result = @merge_request.compare_test_reports
+
+ Gitlab::PollingInterval.set_header(response, interval: 10_000)
+
+ case result[:status]
+ when :parsing
+ render json: '', status: :no_content
+ when :parsed
+ render json: result[:data].to_json, status: :ok
+ when :error
+ render json: { status_reason: result[:status_reason] }, status: :bad_request
+ else
+ render json: { status_reason: 'Unknown error' }, status: :internal_server_error
+ end
+ end
+
def edit
define_edit_vars
end
diff --git a/app/controllers/projects/milestones_controller.rb b/app/controllers/projects/milestones_controller.rb
index 5e86ec93f34..b9b3dcd5a85 100644
--- a/app/controllers/projects/milestones_controller.rb
+++ b/app/controllers/projects/milestones_controller.rb
@@ -76,8 +76,8 @@ class Projects::MilestonesController < Projects::ApplicationController
def promote
promoted_milestone = Milestones::PromoteService.new(project, current_user).execute(milestone)
+ flash[:notice] = flash_notice_for(promoted_milestone, project.group)
- flash[:notice] = "#{milestone.title} promoted to <a href=\"#{group_milestone_path(project.group, promoted_milestone.iid)}\"><u>group milestone</u></a>.".html_safe
respond_to do |format|
format.html do
redirect_to project_milestones_path(project)
@@ -90,6 +90,15 @@ class Projects::MilestonesController < Projects::ApplicationController
redirect_to milestone, alert: error.message
end
+ def flash_notice_for(milestone, group)
+ notice = ''.html_safe
+ notice << milestone.title
+ notice << ' promoted to '
+ notice << view_context.link_to('<u>group milestone</u>'.html_safe, group_milestone_path(group, milestone.iid))
+ notice << '.'
+ notice
+ end
+
def destroy
return access_denied! unless can?(current_user, :admin_milestone, @project)
diff --git a/app/controllers/projects/mirrors_controller.rb b/app/controllers/projects/mirrors_controller.rb
index 3b24d231f3d..da209c3ba61 100644
--- a/app/controllers/projects/mirrors_controller.rb
+++ b/app/controllers/projects/mirrors_controller.rb
@@ -13,7 +13,9 @@ class Projects::MirrorsController < Projects::ApplicationController
end
def update
- if project.update(mirror_params)
+ result = ::Projects::UpdateService.new(project, current_user, mirror_params).execute
+
+ if result[:status] == :success
flash[:notice] = 'Mirroring settings were successfully updated.'
else
flash[:alert] = project.errors.full_messages.join(', ').html_safe
diff --git a/app/controllers/projects/notes_controller.rb b/app/controllers/projects/notes_controller.rb
index 4d4c2af2415..21e2145b73b 100644
--- a/app/controllers/projects/notes_controller.rb
+++ b/app/controllers/projects/notes_controller.rb
@@ -1,4 +1,5 @@
class Projects::NotesController < Projects::ApplicationController
+ include RendersNotes
include NotesActions
include NotesHelper
include ToggleAwardEmoji
@@ -53,7 +54,7 @@ class Projects::NotesController < Projects::ApplicationController
private
def render_json_with_notes_serializer
- Notes::RenderService.new(current_user).execute([note])
+ prepare_notes_for_rendering([note])
render json: note_serializer.represent(note)
end
diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 45cef123c34..b5db646bf57 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -1,7 +1,6 @@
class Projects::PipelinesController < Projects::ApplicationController
before_action :whitelist_query_limiting, only: [:create, :retry]
before_action :pipeline, except: [:index, :new, :create, :charts]
- before_action :commit, only: [:show, :builds, :failures]
before_action :authorize_read_pipeline!
before_action :authorize_create_pipeline!, only: [:new, :create]
before_action :authorize_update_pipeline!, only: [:retry, :cancel]
@@ -161,11 +160,11 @@ class Projects::PipelinesController < Projects::ApplicationController
end
def pipeline
- @pipeline ||= project.pipelines.find_by!(id: params[:id]).present(current_user: current_user)
- end
-
- def commit
- @commit ||= @pipeline.commit
+ @pipeline ||= project
+ .pipelines
+ .includes(user: :status)
+ .find_by!(id: params[:id])
+ .present(current_user: current_user)
end
def whitelist_query_limiting
diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb
index f742d7edf83..7c03d8ce827 100644
--- a/app/controllers/projects/snippets_controller.rb
+++ b/app/controllers/projects/snippets_controller.rb
@@ -88,7 +88,7 @@ class Projects::SnippetsController < Projects::ApplicationController
protected
def snippet
- @snippet ||= @project.snippets.find(params[:id])
+ @snippet ||= @project.snippets.inc_relations_for_view.find(params[:id])
end
alias_method :awardable, :snippet
alias_method :spammable, :snippet
diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb
index 9dc0c31be49..da7aeb26a75 100644
--- a/app/controllers/projects/wikis_controller.rb
+++ b/app/controllers/projects/wikis_controller.rb
@@ -1,10 +1,16 @@
class Projects::WikisController < Projects::ApplicationController
include PreviewMarkdown
+ include Gitlab::Utils::StrongMemoize
before_action :authorize_read_wiki!
before_action :authorize_create_wiki!, only: [:edit, :create, :history]
before_action :authorize_admin_wiki!, only: :destroy
before_action :load_project_wiki
+ before_action :load_page, only: [:show, :edit, :update, :history, :destroy]
+ before_action :valid_encoding?, only: [:show, :edit, :update], if: :load_page
+ before_action only: [:edit, :update], unless: :valid_encoding? do
+ redirect_to(project_wiki_path(@project, @page))
+ end
def pages
@wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page])
@@ -12,11 +18,11 @@ class Projects::WikisController < Projects::ApplicationController
end
def show
- @page = @project_wiki.find_page(params[:id], params[:version_id])
-
view_param = @project_wiki.empty? ? params[:view] : 'create'
if @page
+ set_encoding_error unless valid_encoding?
+
render 'show'
elsif file = @project_wiki.find_file(params[:id], params[:version_id])
response.headers['Content-Security-Policy'] = "default-src 'none'"
@@ -38,13 +44,11 @@ class Projects::WikisController < Projects::ApplicationController
end
def edit
- @page = @project_wiki.find_page(params[:id])
end
def update
return render('empty') unless can?(current_user, :create_wiki, @project)
- @page = @project_wiki.find_page(params[:id])
@page = WikiPages::UpdateService.new(@project, current_user, wiki_params).execute(@page)
if @page.valid?
@@ -79,8 +83,6 @@ class Projects::WikisController < Projects::ApplicationController
end
def history
- @page = @project_wiki.find_page(params[:id])
-
if @page
@page_versions = Kaminari.paginate_array(@page.versions(page: params[:page].to_i),
total_count: @page.count_versions)
@@ -94,8 +96,6 @@ class Projects::WikisController < Projects::ApplicationController
end
def destroy
- @page = @project_wiki.find_page(params[:id])
-
WikiPages::DestroyService.new(@project, current_user).execute(@page)
redirect_to project_wiki_path(@project, :home),
@@ -112,7 +112,7 @@ class Projects::WikisController < Projects::ApplicationController
private
def load_project_wiki
- @project_wiki = ProjectWiki.new(@project, current_user)
+ @project_wiki = load_wiki
# Call #wiki to make sure the Wiki Repo is initialized
@project_wiki.wiki
@@ -128,6 +128,10 @@ class Projects::WikisController < Projects::ApplicationController
false
end
+ def load_wiki
+ ProjectWiki.new(@project, current_user)
+ end
+
def wiki_params
params.require(:wiki).permit(:title, :content, :format, :message, :last_commit_sha)
end
@@ -137,4 +141,25 @@ class Projects::WikisController < Projects::ApplicationController
page.update_attributes(args) # rubocop:disable Rails/ActiveRecordAliases
end
end
+
+ def load_page
+ @page ||= @project_wiki.find_page(*page_params)
+ end
+
+ def page_params
+ keys = [:id]
+ keys << :version_id if params[:action] == 'show'
+
+ params.values_at(*keys)
+ end
+
+ def valid_encoding?
+ strong_memoize(:valid_encoding) do
+ @page.content.encoding == Encoding::UTF_8
+ end
+ end
+
+ def set_encoding_error
+ flash.now[:notice] = "The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository."
+ end
end
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 4ca42e2d4a2..ab8e2e35b98 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -89,6 +89,14 @@ class SessionsController < Devise::SessionsController
).increment
end
+ ##
+ # We do have some duplication between lib/gitlab/auth/activity.rb here, but
+ # leaving this method here because of backwards compatibility.
+ #
+ def login_counter
+ @login_counter ||= Gitlab::Metrics.counter(:user_session_logins_total, 'User sign in count')
+ end
+
def log_failed_login
Gitlab::AppLogger.info("Failed Login: username=#{user_params[:login]} ip=#{request.remote_ip}")
end
@@ -97,10 +105,6 @@ class SessionsController < Devise::SessionsController
(options = env["warden.options"]) && options[:action] == "unauthenticated"
end
- def login_counter
- @login_counter ||= Gitlab::Metrics.counter(:user_session_logins_total, 'User sign in count')
- end
-
# Handle an "initial setup" state, where there's only one user, it's an admin,
# and they require a password change.
def check_initial_setup
diff --git a/app/controllers/snippets/notes_controller.rb b/app/controllers/snippets/notes_controller.rb
index c8b4682e6dc..217da89a1fd 100644
--- a/app/controllers/snippets/notes_controller.rb
+++ b/app/controllers/snippets/notes_controller.rb
@@ -9,7 +9,7 @@ class Snippets::NotesController < ApplicationController
private
def note
- @note ||= snippet.notes.find(params[:id])
+ @note ||= snippet.notes.inc_relations_for_view.find(params[:id])
end
alias_method :awardable, :note
diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb
index 1d6d0943674..dcf18c1f751 100644
--- a/app/controllers/snippets_controller.rb
+++ b/app/controllers/snippets_controller.rb
@@ -95,7 +95,7 @@ class SnippetsController < ApplicationController
protected
def snippet
- @snippet ||= PersonalSnippet.find_by(id: params[:id])
+ @snippet ||= PersonalSnippet.inc_relations_for_view.find_by(id: params[:id])
end
alias_method :awardable, :snippet
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 31f47a7aa7c..2f65f4a7403 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -13,6 +13,8 @@ class UsersController < ApplicationController
skip_before_action :authenticate_user!
before_action :user, except: [:exists]
+ before_action :authorize_read_user_profile!,
+ only: [:calendar, :calendar_activities, :groups, :projects, :contributed_projects, :snippets]
def show
respond_to do |format|
@@ -148,4 +150,8 @@ class UsersController < ApplicationController
def build_canonical_path(user)
url_for(safe_params.merge(username: user.to_param))
end
+
+ def authorize_read_user_profile!
+ access_denied! unless can?(current_user, :read_user_profile, user)
+ end
end
diff --git a/app/finders/admin/projects_finder.rb b/app/finders/admin/projects_finder.rb
index 53b77f5fed9..543bf1a1415 100644
--- a/app/finders/admin/projects_finder.rb
+++ b/app/finders/admin/projects_finder.rb
@@ -7,7 +7,7 @@ class Admin::ProjectsFinder
end
def execute
- items = Project.without_deleted.with_statistics
+ items = Project.without_deleted.with_statistics.with_route
items = by_namespace_id(items)
items = by_visibilty_level(items)
items = by_with_push(items)
@@ -16,7 +16,7 @@ class Admin::ProjectsFinder
items = by_archived(items)
items = by_personal(items)
items = by_name(items)
- items = items.includes(namespace: [:owner])
+ items = items.includes(namespace: [:owner, :route])
sort(items).page(params[:page])
end
diff --git a/app/finders/issuable_finder.rb b/app/finders/issuable_finder.rb
index 6fdfd964fca..372e2a96c2c 100644
--- a/app/finders/issuable_finder.rb
+++ b/app/finders/issuable_finder.rb
@@ -130,7 +130,7 @@ class IssuableFinder
counts[:all] = counts.values.sum
- counts
+ counts.with_indifferent_access
end
def group
diff --git a/app/finders/labels_finder.rb b/app/finders/labels_finder.rb
index afd1f824b32..1d05bf28438 100644
--- a/app/finders/labels_finder.rb
+++ b/app/finders/labels_finder.rb
@@ -14,6 +14,7 @@ class LabelsFinder < UnionFinder
@skip_authorization = skip_authorization
items = find_union(label_ids, Label) || Label.none
items = with_title(items)
+ items = by_search(items)
sort(items)
end
@@ -63,6 +64,12 @@ class LabelsFinder < UnionFinder
items.where(title: title)
end
+ def by_search(labels)
+ return labels unless search?
+
+ labels.search(params[:search])
+ end
+
# Gets redacted array of group ids
# which can include the ancestors and descendants of the requested group.
def group_ids_for(group)
@@ -106,6 +113,10 @@ class LabelsFinder < UnionFinder
params[:only_group_labels]
end
+ def search?
+ params[:search].present?
+ end
+
def title
params[:title] || params[:name]
end
diff --git a/app/finders/personal_projects_finder.rb b/app/finders/personal_projects_finder.rb
index 18adfea747f..a56a3a1e1a9 100644
--- a/app/finders/personal_projects_finder.rb
+++ b/app/finders/personal_projects_finder.rb
@@ -1,4 +1,6 @@
class PersonalProjectsFinder < UnionFinder
+ include Gitlab::Allowable
+
def initialize(user, params = {})
@user = user
@params = params
@@ -14,6 +16,8 @@ class PersonalProjectsFinder < UnionFinder
#
# Returns an ActiveRecord::Relation.
def execute(current_user = nil)
+ return Project.none unless can?(current_user, :read_user_profile, @user)
+
segments = all_projects(current_user)
find_union(segments, Project).includes(:namespace).order_updated_desc
diff --git a/app/finders/user_recent_events_finder.rb b/app/finders/user_recent_events_finder.rb
index 74776b2ed1f..876f086a3ef 100644
--- a/app/finders/user_recent_events_finder.rb
+++ b/app/finders/user_recent_events_finder.rb
@@ -7,6 +7,7 @@
class UserRecentEventsFinder
prepend FinderWithCrossProjectAccess
include FinderMethods
+ include Gitlab::Allowable
requires_cross_project_access
@@ -21,6 +22,8 @@ class UserRecentEventsFinder
end
def execute
+ return Event.none unless can?(current_user, :read_user_profile, target_user)
+
recent_events(params[:offset] || 0)
.joins(:project)
.with_associations
diff --git a/app/graphql/gitlab_schema.rb b/app/graphql/gitlab_schema.rb
index d9f9129d08a..8755a1a62e7 100644
--- a/app/graphql/gitlab_schema.rb
+++ b/app/graphql/gitlab_schema.rb
@@ -7,5 +7,5 @@ class GitlabSchema < GraphQL::Schema
query(Types::QueryType)
default_max_page_size 100
- # mutation(Types::MutationType)
+ mutation(Types::MutationType)
end
diff --git a/app/graphql/mutations/base_mutation.rb b/app/graphql/mutations/base_mutation.rb
new file mode 100644
index 00000000000..eb03dfe1624
--- /dev/null
+++ b/app/graphql/mutations/base_mutation.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+module Mutations
+ class BaseMutation < GraphQL::Schema::RelayClassicMutation
+ field :errors, [GraphQL::STRING_TYPE],
+ null: false,
+ description: "Reasons why the mutation failed."
+
+ def current_user
+ context[:current_user]
+ end
+ end
+end
diff --git a/app/graphql/mutations/concerns/mutations/resolves_project.rb b/app/graphql/mutations/concerns/mutations/resolves_project.rb
new file mode 100644
index 00000000000..0dd1f264a52
--- /dev/null
+++ b/app/graphql/mutations/concerns/mutations/resolves_project.rb
@@ -0,0 +1,13 @@
+module Mutations
+ module ResolvesProject
+ extend ActiveSupport::Concern
+
+ def resolve_project(full_path:)
+ resolver.resolve(full_path: full_path)
+ end
+
+ def resolver
+ Resolvers::ProjectResolver.new(object: nil, context: context)
+ end
+ end
+end
diff --git a/app/graphql/mutations/merge_requests/base.rb b/app/graphql/mutations/merge_requests/base.rb
new file mode 100644
index 00000000000..2149e72e2df
--- /dev/null
+++ b/app/graphql/mutations/merge_requests/base.rb
@@ -0,0 +1,32 @@
+module Mutations
+ module MergeRequests
+ class Base < BaseMutation
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+ include Mutations::ResolvesProject
+
+ argument :project_path, GraphQL::ID_TYPE,
+ required: true,
+ description: "The project the merge request to mutate is in"
+
+ argument :iid, GraphQL::ID_TYPE,
+ required: true,
+ description: "The iid of the merge request to mutate"
+
+ field :merge_request,
+ Types::MergeRequestType,
+ null: true,
+ description: "The merge request after mutation"
+
+ authorize :update_merge_request
+
+ private
+
+ def find_object(project_path:, iid:)
+ project = resolve_project(full_path: project_path)
+ resolver = Resolvers::MergeRequestResolver.new(object: project, context: context)
+
+ resolver.resolve(iid: iid)
+ end
+ end
+ end
+end
diff --git a/app/graphql/mutations/merge_requests/set_wip.rb b/app/graphql/mutations/merge_requests/set_wip.rb
new file mode 100644
index 00000000000..a2aa0c84ee4
--- /dev/null
+++ b/app/graphql/mutations/merge_requests/set_wip.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+module Mutations
+ module MergeRequests
+ class SetWip < Base
+ graphql_name 'MergeRequestSetWip'
+
+ argument :wip,
+ GraphQL::BOOLEAN_TYPE,
+ required: true,
+ description: <<~DESC
+ Whether or not to set the merge request as a WIP.
+ DESC
+
+ def resolve(project_path:, iid:, wip: nil)
+ merge_request = authorized_find!(project_path: project_path, iid: iid)
+ project = merge_request.project
+
+ ::MergeRequests::UpdateService.new(project, current_user, wip_event: wip_event(merge_request, wip))
+ .execute(merge_request)
+
+ {
+ merge_request: merge_request,
+ errors: merge_request.errors.full_messages
+ }
+ end
+
+ private
+
+ def wip_event(merge_request, wip)
+ wip ? 'wip' : 'unwip'
+ end
+ end
+ end
+end
diff --git a/app/graphql/types/mutation_type.rb b/app/graphql/types/mutation_type.rb
index 06ed91c1658..2b4ef299296 100644
--- a/app/graphql/types/mutation_type.rb
+++ b/app/graphql/types/mutation_type.rb
@@ -1,7 +1,11 @@
+# frozen_string_literal: true
+
module Types
class MutationType < BaseObject
+ include Gitlab::Graphql::MountMutation
+
graphql_name "Mutation"
- # TODO: Add Mutations as fields
+ mount_mutation Mutations::MergeRequests::SetWip
end
end
diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb
index 358b896702b..a9499140f8a 100644
--- a/app/helpers/application_settings_helper.rb
+++ b/app/helpers/application_settings_helper.rb
@@ -148,6 +148,7 @@ module ApplicationSettingsHelper
:after_sign_up_text,
:akismet_api_key,
:akismet_enabled,
+ :allow_local_requests_from_hooks_and_services,
:authorized_keys_enabled,
:auto_devops_enabled,
:auto_devops_domain,
@@ -174,6 +175,7 @@ module ApplicationSettingsHelper
:ed25519_key_restriction,
:email_author_in_body,
:enabled_git_access_protocol,
+ :enforce_terms,
:gitaly_timeout_default,
:gitaly_timeout_medium,
:gitaly_timeout_fast,
@@ -182,6 +184,7 @@ module ApplicationSettingsHelper
:help_page_hide_commercial_content,
:help_page_support_url,
:help_page_text,
+ :hide_third_party_offers,
:home_page_url,
:housekeeping_bitmaps_enabled,
:housekeeping_enabled,
@@ -203,6 +206,7 @@ module ApplicationSettingsHelper
:metrics_port,
:metrics_sample_interval,
:metrics_timeout,
+ :mirror_available,
:pages_domain_verification_enabled,
:password_authentication_enabled_for_web,
:password_authentication_enabled_for_git,
@@ -233,28 +237,25 @@ module ApplicationSettingsHelper
:sign_in_text,
:signup_enabled,
:terminal_max_session_time,
- :throttle_unauthenticated_enabled,
- :throttle_unauthenticated_requests_per_period,
- :throttle_unauthenticated_period_in_seconds,
- :throttle_authenticated_web_enabled,
- :throttle_authenticated_web_requests_per_period,
- :throttle_authenticated_web_period_in_seconds,
+ :terms,
:throttle_authenticated_api_enabled,
- :throttle_authenticated_api_requests_per_period,
:throttle_authenticated_api_period_in_seconds,
+ :throttle_authenticated_api_requests_per_period,
+ :throttle_authenticated_web_enabled,
+ :throttle_authenticated_web_period_in_seconds,
+ :throttle_authenticated_web_requests_per_period,
+ :throttle_unauthenticated_enabled,
+ :throttle_unauthenticated_period_in_seconds,
+ :throttle_unauthenticated_requests_per_period,
:two_factor_grace_period,
:unique_ips_limit_enabled,
:unique_ips_limit_per_user,
:unique_ips_limit_time_window,
:usage_ping_enabled,
+ :instance_statistics_visibility_private,
:user_default_external,
:user_oauth_applications,
- :version_check_enabled,
- :allow_local_requests_from_hooks_and_services,
- :hide_third_party_offers,
- :enforce_terms,
- :terms,
- :mirror_available
+ :version_check_enabled
]
end
end
diff --git a/app/helpers/avatars_helper.rb b/app/helpers/avatars_helper.rb
index 43d92bde064..d48dae8f06d 100644
--- a/app/helpers/avatars_helper.rb
+++ b/app/helpers/avatars_helper.rb
@@ -15,22 +15,12 @@ module AvatarsHelper
end
def project_identicon(project, options = {})
- allowed_colors = {
- red: 'FFEBEE',
- purple: 'F3E5F5',
- indigo: 'E8EAF6',
- blue: 'E3F2FD',
- teal: 'E0F2F1',
- orange: 'FBE9E7',
- gray: 'EEEEEE'
- }
-
+ bg_key = (project.id % 7) + 1
options[:class] ||= ''
options[:class] << ' identicon'
- bg_key = project.id % 7
- style = "background-color: ##{allowed_colors.values[bg_key]}; color: #555"
+ options[:class] << " bg#{bg_key}"
- content_tag(:div, class: options[:class], style: style) do
+ content_tag(:div, class: options[:class]) do
project.name[0, 1].upcase
end
end
diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb
index 4ce89f89fa9..c005ecbb56b 100644
--- a/app/helpers/environments_helper.rb
+++ b/app/helpers/environments_helper.rb
@@ -4,4 +4,23 @@ module EnvironmentsHelper
endpoint: project_environments_path(@project, format: :json)
}
end
+
+ def metrics_data(project, environment)
+ {
+ "settings-path" => edit_project_service_path(project, 'prometheus'),
+ "clusters-path" => project_clusters_path(project),
+ "current-environment-name": environment.name,
+ "documentation-path" => help_page_path('administration/monitoring/prometheus/index.md'),
+ "empty-getting-started-svg-path" => image_path('illustrations/monitoring/getting_started.svg'),
+ "empty-loading-svg-path" => image_path('illustrations/monitoring/loading.svg'),
+ "empty-no-data-svg-path" => image_path('illustrations/monitoring/no_data.svg'),
+ "empty-unable-to-connect-svg-path" => image_path('illustrations/monitoring/unable_to_connect.svg'),
+ "metrics-endpoint" => additional_metrics_project_environment_path(project, environment, format: :json),
+ "deployment-endpoint" => project_environment_deployments_path(project, environment, format: :json),
+ "environments-endpoint": project_environments_path(project, format: :json),
+ "project-path" => project_path(project),
+ "tags-path" => project_tags_path(project),
+ "has-metrics" => "#{environment.has_metrics?}"
+ }
+ end
end
diff --git a/app/helpers/hooks_helper.rb b/app/helpers/hooks_helper.rb
index 551b9cca6b1..0a356ba55d2 100644
--- a/app/helpers/hooks_helper.rb
+++ b/app/helpers/hooks_helper.rb
@@ -10,7 +10,7 @@ module HooksHelper
trigger_human_name = trigger.to_s.tr('_', ' ').camelize
- link_to path, rel: 'nofollow' do
+ link_to path, rel: 'nofollow', method: :post do
content_tag(:span, trigger_human_name)
end
end
diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb
index 8766bb43cac..678fed9c414 100644
--- a/app/helpers/issuables_helper.rb
+++ b/app/helpers/issuables_helper.rb
@@ -159,6 +159,12 @@ module IssuablesHelper
output << content_tag(:strong) do
author_output = link_to_member(project, issuable.author, size: 24, mobile_classes: "d-none d-sm-inline", tooltip: true)
author_output << link_to_member(project, issuable.author, size: 24, by_username: true, avatar: false, mobile_classes: "d-block d-sm-none")
+
+ if status = user_status(issuable.author)
+ author_output << "&ensp; #{status}".html_safe
+ end
+
+ author_output
end
output << "&ensp;".html_safe
diff --git a/app/helpers/milestones_helper.rb b/app/helpers/milestones_helper.rb
index 15a15405f1d..95da8f00aff 100644
--- a/app/helpers/milestones_helper.rb
+++ b/app/helpers/milestones_helper.rb
@@ -233,4 +233,12 @@ module MilestonesHelper
group_milestone_path(@group, milestone.iid, milestone: params)
end
end
+
+ def group_or_dashboard_milestone_path(milestone)
+ if milestone.group_milestone?
+ group_milestone_path(milestone.group, milestone.iid, milestone: { title: milestone.title })
+ else
+ dashboard_milestone_path(milestone.safe_title, title: milestone.title)
+ end
+ end
end
diff --git a/app/helpers/profiles_helper.rb b/app/helpers/profiles_helper.rb
index e7aa92e6e5c..a6a57db3002 100644
--- a/app/helpers/profiles_helper.rb
+++ b/app/helpers/profiles_helper.rb
@@ -9,4 +9,8 @@ module ProfilesHelper
end
end
end
+
+ def show_user_status_field?
+ Feature.enabled?(:user_status_form) || cookies[:feature_user_status_form] == 'true'
+ end
end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index 221f1aa9dd8..aaf9dff43ee 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -63,10 +63,10 @@ module ProjectsHelper
author_html = author_html.html_safe
if opts[:name]
- link_to(author_html, user_path(author), class: "author_link #{"#{opts[:extra_class]}" if opts[:extra_class]} #{"#{opts[:mobile_classes]}" if opts[:mobile_classes]}").html_safe
+ link_to(author_html, user_path(author), class: "author-link #{"#{opts[:extra_class]}" if opts[:extra_class]} #{"#{opts[:mobile_classes]}" if opts[:mobile_classes]}").html_safe
else
title = opts[:title].sub(":name", sanitize(author.name))
- link_to(author_html, user_path(author), class: "author_link has-tooltip", title: title, data: { container: 'body' }).html_safe
+ link_to(author_html, user_path(author), class: "author-link has-tooltip", title: title, data: { container: 'body' }).html_safe
end
end
diff --git a/app/helpers/repository_languages_helper.rb b/app/helpers/repository_languages_helper.rb
new file mode 100644
index 00000000000..9a842cf5ce0
--- /dev/null
+++ b/app/helpers/repository_languages_helper.rb
@@ -0,0 +1,16 @@
+module RepositoryLanguagesHelper
+ def repository_languages_bar(languages)
+ return if languages.none?
+
+ content_tag :div, class: 'progress repository-languages-bar' do
+ safe_join(languages.map { |lang| language_progress(lang) })
+ end
+ end
+
+ def language_progress(lang)
+ content_tag :div, nil,
+ class: "progress-bar has-tooltip",
+ style: "width: #{lang.share}%; background-color:#{lang.color}",
+ title: lang.name
+ end
+end
diff --git a/app/helpers/snippets_helper.rb b/app/helpers/snippets_helper.rb
index 733832c1bbb..a05640773ad 100644
--- a/app/helpers/snippets_helper.rb
+++ b/app/helpers/snippets_helper.rb
@@ -116,7 +116,7 @@ module SnippetsHelper
raw_project_snippet_url(@snippet.project, @snippet)
end
- link_to external_snippet_icon('doc_code'), snippet_raw_url, class: 'btn', target: '_blank', rel: 'noopener noreferrer', title: 'Open raw'
+ link_to external_snippet_icon('doc-code'), snippet_raw_url, class: 'btn', target: '_blank', rel: 'noopener noreferrer', title: 'Open raw'
end
def embedded_snippet_download_button
diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb
index 4d17b22a4a1..ceea4384f91 100644
--- a/app/helpers/users_helper.rb
+++ b/app/helpers/users_helper.rb
@@ -39,10 +39,34 @@ module UsersHelper
"access:#{max_project_member_access(project)}"
end
+ def user_status(user)
+ return unless user
+
+ unless user.association(:status).loaded?
+ exception = RuntimeError.new("Status was not preloaded")
+ Gitlab::Sentry.track_exception(exception, extra: { user: user.inspect })
+ end
+
+ return unless user.status
+
+ content_tag :span,
+ class: 'user-status-emoji has-tooltip',
+ title: user.status.message_html,
+ data: { html: true, placement: 'top' } do
+ emoji_icon user.status.emoji
+ end
+ end
+
private
def get_profile_tabs
- [:activity, :groups, :contributed, :projects, :snippets]
+ tabs = []
+
+ if can?(current_user, :read_user_profile, @user)
+ tabs += [:activity, :groups, :contributed, :projects, :snippets]
+ end
+
+ tabs
end
def get_current_user_menu_items
diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index 1db1482d6b7..0e1e39501f5 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -124,7 +124,7 @@ class Notify < BaseMailer
fallback_reply_message_id = "<reply-#{reply_key}@#{Gitlab.config.gitlab.host}>".freeze
headers['References'] ||= []
- headers['References'] << fallback_reply_message_id
+ headers['References'].unshift(fallback_reply_message_id)
@reply_by_email = true
end
@@ -158,7 +158,7 @@ class Notify < BaseMailer
def mail_answer_thread(model, headers = {})
headers['Message-ID'] = "<#{SecureRandom.hex}@#{Gitlab.config.gitlab.host}>"
headers['In-Reply-To'] = message_id(model)
- headers['References'] = message_id(model)
+ headers['References'] = [message_id(model)]
headers[:subject]&.prepend('Re: ')
diff --git a/app/models/ability.rb b/app/models/ability.rb
index bb600eaccba..a853106e5bd 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require_dependency 'declarative_policy'
class Ability
diff --git a/app/models/abuse_report.rb b/app/models/abuse_report.rb
index 4cbd90c5817..1b78fd04ebb 100644
--- a/app/models/abuse_report.rb
+++ b/app/models/abuse_report.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class AbuseReport < ActiveRecord::Base
include CacheMarkdownField
diff --git a/app/models/active_session.rb b/app/models/active_session.rb
index b4a86dbb331..0d9c6a4a1f0 100644
--- a/app/models/active_session.rb
+++ b/app/models/active_session.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ActiveSession
include ActiveModel::Model
diff --git a/app/models/appearance.rb b/app/models/appearance.rb
index b770aadef0e..bffba3e13fa 100644
--- a/app/models/appearance.rb
+++ b/app/models/appearance.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Appearance < ActiveRecord::Base
include CacheableAttributes
include CacheMarkdownField
diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb
index f770b219422..bbe7811841a 100644
--- a/app/models/application_setting.rb
+++ b/app/models/application_setting.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ApplicationSetting < ActiveRecord::Base
include CacheableAttributes
include CacheMarkdownField
@@ -228,25 +230,27 @@ class ApplicationSetting < ActiveRecord::Base
{
after_sign_up_text: nil,
akismet_enabled: false,
+ allow_local_requests_from_hooks_and_services: false,
authorized_keys_enabled: true, # TODO default to false if the instance is configured to use AuthorizedKeysCommand
container_registry_token_expire_delay: 5,
default_artifacts_expire_in: '30 days',
default_branch_protection: Settings.gitlab['default_branch_protection'],
+ default_group_visibility: Settings.gitlab.default_projects_features['visibility_level'],
default_project_visibility: Settings.gitlab.default_projects_features['visibility_level'],
default_projects_limit: Settings.gitlab['default_projects_limit'],
default_snippet_visibility: Settings.gitlab.default_projects_features['visibility_level'],
- default_group_visibility: Settings.gitlab.default_projects_features['visibility_level'],
disabled_oauth_sign_in_sources: [],
domain_whitelist: Settings.gitlab['domain_whitelist'],
dsa_key_restriction: 0,
ecdsa_key_restriction: 0,
ed25519_key_restriction: 0,
+ gitaly_timeout_default: 55,
+ gitaly_timeout_fast: 10,
+ gitaly_timeout_medium: 30,
gravatar_enabled: Settings.gravatar['enabled'],
- help_page_text: nil,
help_page_hide_commercial_content: false,
- unique_ips_limit_per_user: 10,
- unique_ips_limit_time_window: 3600,
- unique_ips_limit_enabled: false,
+ help_page_text: nil,
+ hide_third_party_offers: false,
housekeeping_bitmaps_enabled: true,
housekeeping_enabled: true,
housekeeping_full_repack_period: 50,
@@ -257,12 +261,14 @@ class ApplicationSetting < ActiveRecord::Base
koding_url: nil,
max_artifacts_size: Settings.artifacts['max_size'],
max_attachment_size: Settings.gitlab['max_attachment_size'],
- password_authentication_enabled_for_web: Settings.gitlab['signin_enabled'],
+ mirror_available: true,
password_authentication_enabled_for_git: true,
+ password_authentication_enabled_for_web: Settings.gitlab['signin_enabled'],
performance_bar_allowed_group_id: nil,
rsa_key_restriction: 0,
plantuml_enabled: false,
plantuml_url: nil,
+ polling_interval_multiplier: 1,
project_export_enabled: true,
recaptcha_enabled: false,
repository_checks_enabled: true,
@@ -277,25 +283,22 @@ class ApplicationSetting < ActiveRecord::Base
sign_in_text: nil,
signup_enabled: Settings.gitlab['signup_enabled'],
terminal_max_session_time: 0,
- throttle_unauthenticated_enabled: false,
- throttle_unauthenticated_requests_per_period: 3600,
- throttle_unauthenticated_period_in_seconds: 3600,
- throttle_authenticated_web_enabled: false,
- throttle_authenticated_web_requests_per_period: 7200,
- throttle_authenticated_web_period_in_seconds: 3600,
throttle_authenticated_api_enabled: false,
- throttle_authenticated_api_requests_per_period: 7200,
throttle_authenticated_api_period_in_seconds: 3600,
+ throttle_authenticated_api_requests_per_period: 7200,
+ throttle_authenticated_web_enabled: false,
+ throttle_authenticated_web_period_in_seconds: 3600,
+ throttle_authenticated_web_requests_per_period: 7200,
+ throttle_unauthenticated_enabled: false,
+ throttle_unauthenticated_period_in_seconds: 3600,
+ throttle_unauthenticated_requests_per_period: 3600,
two_factor_grace_period: 48,
- user_default_external: false,
- polling_interval_multiplier: 1,
+ unique_ips_limit_enabled: false,
+ unique_ips_limit_per_user: 10,
+ unique_ips_limit_time_window: 3600,
usage_ping_enabled: Settings.gitlab['usage_ping_enabled'],
- gitaly_timeout_fast: 10,
- gitaly_timeout_medium: 30,
- gitaly_timeout_default: 55,
- allow_local_requests_from_hooks_and_services: false,
- hide_third_party_offers: false,
- mirror_available: true
+ instance_statistics_visibility_private: false,
+ user_default_external: false
}
end
diff --git a/app/models/application_setting/term.rb b/app/models/application_setting/term.rb
index 3b1dfe7e4ef..498701ba22b 100644
--- a/app/models/application_setting/term.rb
+++ b/app/models/application_setting/term.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ApplicationSetting
class Term < ActiveRecord::Base
include CacheMarkdownField
diff --git a/app/models/audit_event.rb b/app/models/audit_event.rb
index 112a8778b4e..8508c88d406 100644
--- a/app/models/audit_event.rb
+++ b/app/models/audit_event.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class AuditEvent < ActiveRecord::Base
serialize :details, Hash # rubocop:disable Cop/ActiveRecordSerialize
diff --git a/app/models/award_emoji.rb b/app/models/award_emoji.rb
index 4d1a15c53aa..99c7866d636 100644
--- a/app/models/award_emoji.rb
+++ b/app/models/award_emoji.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class AwardEmoji < ActiveRecord::Base
DOWNVOTE_NAME = "thumbsdown".freeze
UPVOTE_NAME = "thumbsup".freeze
diff --git a/app/models/badge.rb b/app/models/badge.rb
index 265c5d872d4..7e3b6b659e4 100644
--- a/app/models/badge.rb
+++ b/app/models/badge.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Badge < ActiveRecord::Base
# This structure sets the placeholders that the urls
# can have. This hash also sets which action to ask when
diff --git a/app/models/badges/group_badge.rb b/app/models/badges/group_badge.rb
index f4b2bdecdcc..c0712f452df 100644
--- a/app/models/badges/group_badge.rb
+++ b/app/models/badges/group_badge.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GroupBadge < Badge
belongs_to :group
diff --git a/app/models/badges/project_badge.rb b/app/models/badges/project_badge.rb
index 3945b376052..59638df6fad 100644
--- a/app/models/badges/project_badge.rb
+++ b/app/models/badges/project_badge.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectBadge < Badge
belongs_to :project
diff --git a/app/models/blob.rb b/app/models/blob.rb
index 71c974b4c09..acc64ffca67 100644
--- a/app/models/blob.rb
+++ b/app/models/blob.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# Blob is a Rails-specific wrapper around Gitlab::Git::Blob objects
class Blob < SimpleDelegator
CACHE_TIME = 60 # Cache raw blobs referred to by a (mutable) ref for 1 minute
diff --git a/app/models/blob_viewer/auxiliary.rb b/app/models/blob_viewer/auxiliary.rb
index 1bea225f17c..263d51b4e36 100644
--- a/app/models/blob_viewer/auxiliary.rb
+++ b/app/models/blob_viewer/auxiliary.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
module Auxiliary
extend ActiveSupport::Concern
diff --git a/app/models/blob_viewer/balsamiq.rb b/app/models/blob_viewer/balsamiq.rb
index f982521db99..1af6c5474d7 100644
--- a/app/models/blob_viewer/balsamiq.rb
+++ b/app/models/blob_viewer/balsamiq.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Balsamiq < Base
include Rich
diff --git a/app/models/blob_viewer/base.rb b/app/models/blob_viewer/base.rb
index bf3453b3063..eaaf9af1330 100644
--- a/app/models/blob_viewer/base.rb
+++ b/app/models/blob_viewer/base.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Base
PARTIAL_PATH_PREFIX = 'projects/blob/viewers'.freeze
diff --git a/app/models/blob_viewer/binary_stl.rb b/app/models/blob_viewer/binary_stl.rb
index 80393471ef2..425f72decae 100644
--- a/app/models/blob_viewer/binary_stl.rb
+++ b/app/models/blob_viewer/binary_stl.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class BinarySTL < Base
include Rich
diff --git a/app/models/blob_viewer/cartfile.rb b/app/models/blob_viewer/cartfile.rb
index d8471bc33c0..ea0494033bf 100644
--- a/app/models/blob_viewer/cartfile.rb
+++ b/app/models/blob_viewer/cartfile.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Cartfile < DependencyManager
include Static
diff --git a/app/models/blob_viewer/changelog.rb b/app/models/blob_viewer/changelog.rb
index 0464ae27f71..8810bd25809 100644
--- a/app/models/blob_viewer/changelog.rb
+++ b/app/models/blob_viewer/changelog.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Changelog < Base
include Auxiliary
diff --git a/app/models/blob_viewer/client_side.rb b/app/models/blob_viewer/client_side.rb
index 079cfbe3616..f7efd4b8e50 100644
--- a/app/models/blob_viewer/client_side.rb
+++ b/app/models/blob_viewer/client_side.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
module ClientSide
extend ActiveSupport::Concern
diff --git a/app/models/blob_viewer/composer_json.rb b/app/models/blob_viewer/composer_json.rb
index def4879fbb5..9d1376de0cb 100644
--- a/app/models/blob_viewer/composer_json.rb
+++ b/app/models/blob_viewer/composer_json.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class ComposerJson < DependencyManager
include ServerSide
diff --git a/app/models/blob_viewer/contributing.rb b/app/models/blob_viewer/contributing.rb
index fbd1dd48697..fa224309e31 100644
--- a/app/models/blob_viewer/contributing.rb
+++ b/app/models/blob_viewer/contributing.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Contributing < Base
include Auxiliary
diff --git a/app/models/blob_viewer/dependency_manager.rb b/app/models/blob_viewer/dependency_manager.rb
index cc4950240af..711465c7c79 100644
--- a/app/models/blob_viewer/dependency_manager.rb
+++ b/app/models/blob_viewer/dependency_manager.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class DependencyManager < Base
include Auxiliary
diff --git a/app/models/blob_viewer/download.rb b/app/models/blob_viewer/download.rb
index 074e7204814..8228a83c2b1 100644
--- a/app/models/blob_viewer/download.rb
+++ b/app/models/blob_viewer/download.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Download < Base
include Simple
diff --git a/app/models/blob_viewer/empty.rb b/app/models/blob_viewer/empty.rb
index 2380578ed72..766be349d83 100644
--- a/app/models/blob_viewer/empty.rb
+++ b/app/models/blob_viewer/empty.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Empty < Base
include Simple
diff --git a/app/models/blob_viewer/gemfile.rb b/app/models/blob_viewer/gemfile.rb
index fae8c8df23f..77220cdbd08 100644
--- a/app/models/blob_viewer/gemfile.rb
+++ b/app/models/blob_viewer/gemfile.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Gemfile < DependencyManager
include Static
diff --git a/app/models/blob_viewer/gemspec.rb b/app/models/blob_viewer/gemspec.rb
index 7802edeb754..274859a7710 100644
--- a/app/models/blob_viewer/gemspec.rb
+++ b/app/models/blob_viewer/gemspec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Gemspec < DependencyManager
include ServerSide
diff --git a/app/models/blob_viewer/gitlab_ci_yml.rb b/app/models/blob_viewer/gitlab_ci_yml.rb
index 53bc247dec1..1a86f04b1b9 100644
--- a/app/models/blob_viewer/gitlab_ci_yml.rb
+++ b/app/models/blob_viewer/gitlab_ci_yml.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class GitlabCiYml < Base
include ServerSide
diff --git a/app/models/blob_viewer/godeps_json.rb b/app/models/blob_viewer/godeps_json.rb
index e19a602603b..743c759aea5 100644
--- a/app/models/blob_viewer/godeps_json.rb
+++ b/app/models/blob_viewer/godeps_json.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class GodepsJson < DependencyManager
include Static
diff --git a/app/models/blob_viewer/image.rb b/app/models/blob_viewer/image.rb
index c4eae5c79c2..56e27839fca 100644
--- a/app/models/blob_viewer/image.rb
+++ b/app/models/blob_viewer/image.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Image < Base
include Rich
diff --git a/app/models/blob_viewer/license.rb b/app/models/blob_viewer/license.rb
index 57355f2c3aa..3427227ad26 100644
--- a/app/models/blob_viewer/license.rb
+++ b/app/models/blob_viewer/license.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class License < Base
include Auxiliary
diff --git a/app/models/blob_viewer/markup.rb b/app/models/blob_viewer/markup.rb
index 33b59c4f512..f525180048e 100644
--- a/app/models/blob_viewer/markup.rb
+++ b/app/models/blob_viewer/markup.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Markup < Base
include Rich
diff --git a/app/models/blob_viewer/notebook.rb b/app/models/blob_viewer/notebook.rb
index e00b47e6c17..57d6d802db3 100644
--- a/app/models/blob_viewer/notebook.rb
+++ b/app/models/blob_viewer/notebook.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Notebook < Base
include Rich
diff --git a/app/models/blob_viewer/package_json.rb b/app/models/blob_viewer/package_json.rb
index 46cd2f04f4d..d12dd93ce2e 100644
--- a/app/models/blob_viewer/package_json.rb
+++ b/app/models/blob_viewer/package_json.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class PackageJson < DependencyManager
include ServerSide
diff --git a/app/models/blob_viewer/pdf.rb b/app/models/blob_viewer/pdf.rb
index 65805f5f388..2cf7752585c 100644
--- a/app/models/blob_viewer/pdf.rb
+++ b/app/models/blob_viewer/pdf.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class PDF < Base
include Rich
diff --git a/app/models/blob_viewer/podfile.rb b/app/models/blob_viewer/podfile.rb
index 507bc734cb4..73d714f48ca 100644
--- a/app/models/blob_viewer/podfile.rb
+++ b/app/models/blob_viewer/podfile.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Podfile < DependencyManager
include Static
diff --git a/app/models/blob_viewer/podspec.rb b/app/models/blob_viewer/podspec.rb
index a4c242db3a9..2303471583d 100644
--- a/app/models/blob_viewer/podspec.rb
+++ b/app/models/blob_viewer/podspec.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Podspec < DependencyManager
include ServerSide
diff --git a/app/models/blob_viewer/podspec_json.rb b/app/models/blob_viewer/podspec_json.rb
index 602f4a51fd9..d3f6ae269da 100644
--- a/app/models/blob_viewer/podspec_json.rb
+++ b/app/models/blob_viewer/podspec_json.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class PodspecJson < Podspec
self.file_types = %i(podspec_json)
diff --git a/app/models/blob_viewer/readme.rb b/app/models/blob_viewer/readme.rb
index 4604a9934a0..f1a5c6a6acc 100644
--- a/app/models/blob_viewer/readme.rb
+++ b/app/models/blob_viewer/readme.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Readme < Base
include Auxiliary
diff --git a/app/models/blob_viewer/requirements_txt.rb b/app/models/blob_viewer/requirements_txt.rb
index 83ac55f61d0..58161e83493 100644
--- a/app/models/blob_viewer/requirements_txt.rb
+++ b/app/models/blob_viewer/requirements_txt.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class RequirementsTxt < DependencyManager
include Static
diff --git a/app/models/blob_viewer/rich.rb b/app/models/blob_viewer/rich.rb
index be373dbc948..0f66a672102 100644
--- a/app/models/blob_viewer/rich.rb
+++ b/app/models/blob_viewer/rich.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
module Rich
extend ActiveSupport::Concern
diff --git a/app/models/blob_viewer/route_map.rb b/app/models/blob_viewer/route_map.rb
index 153b4eeb2c9..6731536dfe1 100644
--- a/app/models/blob_viewer/route_map.rb
+++ b/app/models/blob_viewer/route_map.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class RouteMap < Base
include ServerSide
diff --git a/app/models/blob_viewer/server_side.rb b/app/models/blob_viewer/server_side.rb
index 86afcc86aa0..29501f50396 100644
--- a/app/models/blob_viewer/server_side.rb
+++ b/app/models/blob_viewer/server_side.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
module ServerSide
extend ActiveSupport::Concern
diff --git a/app/models/blob_viewer/simple.rb b/app/models/blob_viewer/simple.rb
index 454a20495fc..c176784df46 100644
--- a/app/models/blob_viewer/simple.rb
+++ b/app/models/blob_viewer/simple.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
module Simple
extend ActiveSupport::Concern
diff --git a/app/models/blob_viewer/sketch.rb b/app/models/blob_viewer/sketch.rb
index 818456778e1..659ab11f30b 100644
--- a/app/models/blob_viewer/sketch.rb
+++ b/app/models/blob_viewer/sketch.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Sketch < Base
include Rich
diff --git a/app/models/blob_viewer/static.rb b/app/models/blob_viewer/static.rb
index c9e257e5388..5cac08aa189 100644
--- a/app/models/blob_viewer/static.rb
+++ b/app/models/blob_viewer/static.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
module Static
extend ActiveSupport::Concern
diff --git a/app/models/blob_viewer/svg.rb b/app/models/blob_viewer/svg.rb
index b7e5cd71e6b..454c6a57568 100644
--- a/app/models/blob_viewer/svg.rb
+++ b/app/models/blob_viewer/svg.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class SVG < Base
include Rich
diff --git a/app/models/blob_viewer/text.rb b/app/models/blob_viewer/text.rb
index f68cbb7e212..e0c586a6680 100644
--- a/app/models/blob_viewer/text.rb
+++ b/app/models/blob_viewer/text.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Text < Base
include Simple
diff --git a/app/models/blob_viewer/text_stl.rb b/app/models/blob_viewer/text_stl.rb
index 8184dc0104c..fb6b26d2e44 100644
--- a/app/models/blob_viewer/text_stl.rb
+++ b/app/models/blob_viewer/text_stl.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class TextSTL < BinarySTL
self.binary = false
diff --git a/app/models/blob_viewer/video.rb b/app/models/blob_viewer/video.rb
index 057f9fe516f..48bb2a13518 100644
--- a/app/models/blob_viewer/video.rb
+++ b/app/models/blob_viewer/video.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class Video < Base
include Rich
diff --git a/app/models/blob_viewer/yarn_lock.rb b/app/models/blob_viewer/yarn_lock.rb
index 31588ddcbab..196d9f96f23 100644
--- a/app/models/blob_viewer/yarn_lock.rb
+++ b/app/models/blob_viewer/yarn_lock.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module BlobViewer
class YarnLock < DependencyManager
include Static
diff --git a/app/models/board.rb b/app/models/board.rb
index bb6bb753daf..a137863456c 100644
--- a/app/models/board.rb
+++ b/app/models/board.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Board < ActiveRecord::Base
belongs_to :group
belongs_to :project
diff --git a/app/models/broadcast_message.rb b/app/models/broadcast_message.rb
index 4aa236555cb..baf8adb318b 100644
--- a/app/models/broadcast_message.rb
+++ b/app/models/broadcast_message.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class BroadcastMessage < ActiveRecord::Base
include CacheMarkdownField
include Sortable
diff --git a/app/models/chat_name.rb b/app/models/chat_name.rb
index fbd0f123341..03b0af53046 100644
--- a/app/models/chat_name.rb
+++ b/app/models/chat_name.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ChatName < ActiveRecord::Base
LAST_USED_AT_INTERVAL = 1.hour
diff --git a/app/models/chat_team.rb b/app/models/chat_team.rb
index 25ecf2d5937..4e724f9adf7 100644
--- a/app/models/chat_team.rb
+++ b/app/models/chat_team.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ChatTeam < ActiveRecord::Base
validates :team_id, presence: true
validates :namespace, uniqueness: true
diff --git a/app/models/ci/artifact_blob.rb b/app/models/ci/artifact_blob.rb
index 760f01f225b..cd0b31482d2 100644
--- a/app/models/ci/artifact_blob.rb
+++ b/app/models/ci/artifact_blob.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class ArtifactBlob
include BlobLike
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index db86400128c..9292929be98 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class Build < CommitStatus
prepend ArtifactMigratable
@@ -8,8 +10,6 @@ module Ci
include Importable
include Gitlab::Utils::StrongMemoize
- MissingDependenciesError = Class.new(StandardError)
-
belongs_to :project, inverse_of: :builds
belongs_to :runner
belongs_to :trigger_request
@@ -17,14 +17,19 @@ module Ci
has_many :deployments, as: :deployable
+ RUNNER_FEATURES = {
+ upload_multiple_artifacts: -> (build) { build.publishes_artifacts_reports? }
+ }.freeze
+
has_one :last_deployment, -> { order('deployments.id DESC') }, as: :deployable, class_name: 'Deployment'
has_many :trace_sections, class_name: 'Ci::BuildTraceSection'
has_many :trace_chunks, class_name: 'Ci::BuildTraceChunk', foreign_key: :build_id
has_many :job_artifacts, class_name: 'Ci::JobArtifact', foreign_key: :job_id, dependent: :destroy, inverse_of: :job # rubocop:disable Cop/ActiveRecordDependent
- has_one :job_artifacts_archive, -> { where(file_type: Ci::JobArtifact.file_types[:archive]) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
- has_one :job_artifacts_metadata, -> { where(file_type: Ci::JobArtifact.file_types[:metadata]) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
- has_one :job_artifacts_trace, -> { where(file_type: Ci::JobArtifact.file_types[:trace]) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
+
+ Ci::JobArtifact.file_types.each do |key, value|
+ has_one :"job_artifacts_#{key}", -> { where(file_type: value) }, class_name: 'Ci::JobArtifact', inverse_of: :job, foreign_key: :job_id
+ end
has_one :metadata, class_name: 'Ci::BuildMetadata'
has_one :runner_session, class_name: 'Ci::BuildRunnerSession', validate: true, inverse_of: :build
@@ -66,6 +71,11 @@ module Ci
where('NOT EXISTS (?)', Ci::JobArtifact.select(1).where('ci_builds.id = ci_job_artifacts.job_id').trace)
end
+ scope :with_test_reports, ->() do
+ includes(:job_artifacts_junit) # Prevent N+1 problem when iterating each ci_job_artifact row
+ .where('EXISTS (?)', Ci::JobArtifact.select(1).where('ci_builds.id = ci_job_artifacts.job_id').test_reports)
+ end
+
scope :with_artifacts_stored_locally, -> { with_artifacts_archive.where(artifacts_file_store: [nil, LegacyArtifactUploader::Store::LOCAL]) }
scope :with_artifacts_not_expired, ->() { with_artifacts_archive.where('artifacts_expire_at IS NULL OR artifacts_expire_at > ?', Time.now) }
scope :with_expired_artifacts, ->() { with_artifacts_archive.where('artifacts_expire_at < ?', Time.now) }
@@ -173,10 +183,6 @@ module Ci
end
end
- before_transition any => [:running] do |build|
- build.validates_dependencies! unless Feature.enabled?('ci_disable_validates_dependencies')
- end
-
after_transition pending: :running do |build|
build.ensure_metadata.update_timeout_state
end
@@ -386,6 +392,10 @@ module Ci
trace.exist?
end
+ def has_test_reports?
+ job_artifacts.test_reports.any?
+ end
+
def has_old_trace?
old_trace.present?
end
@@ -453,16 +463,22 @@ module Ci
save
end
+ def erase_test_reports!
+ # TODO: Use fast_destroy_all in the context of https://gitlab.com/gitlab-org/gitlab-ce/issues/35240
+ job_artifacts_junit&.destroy
+ end
+
def erase(opts = {})
return false unless erasable?
erase_artifacts!
+ erase_test_reports!
erase_trace!
update_erased!(opts[:erased_by])
end
def erasable?
- complete? && (artifacts? || has_trace?)
+ complete? && (artifacts? || has_test_reports? || has_trace?)
end
def erased?
@@ -539,10 +555,6 @@ module Ci
Gitlab::Ci::Build::Image.from_services(self)
end
- def artifacts
- [options[:artifacts]]
- end
-
def cache
cache = options[:cache]
@@ -574,10 +586,10 @@ module Ci
options[:dependencies]&.empty?
end
- def validates_dependencies!
- dependencies.each do |dependency|
- raise MissingDependenciesError unless dependency.valid_dependency?
- end
+ def has_valid_build_dependencies?
+ return true if Feature.enabled?('ci_disable_validates_dependencies')
+
+ dependencies.all?(&:valid_dependency?)
end
def valid_dependency?
@@ -587,6 +599,24 @@ module Ci
true
end
+ def runner_required_feature_names
+ strong_memoize(:runner_required_feature_names) do
+ RUNNER_FEATURES.select do |feature, method|
+ method.call(self)
+ end.keys
+ end
+ end
+
+ def supported_runner?(features)
+ runner_required_feature_names.all? do |feature_name|
+ features&.dig(feature_name)
+ end
+ end
+
+ def publishes_artifacts_reports?
+ options&.dig(:artifacts, :reports)&.any?
+ end
+
def hide_secrets(trace)
return unless trace
@@ -604,8 +634,24 @@ module Ci
running? && runner_session_url.present?
end
+ def collect_test_reports!(test_reports)
+ test_reports.get_suite(group_name).tap do |test_suite|
+ each_test_report do |file_type, blob|
+ Gitlab::Ci::Parsers.fabricate!(file_type).parse!(blob, test_suite)
+ end
+ end
+ end
+
private
+ def each_test_report
+ Ci::JobArtifact::TEST_REPORT_FILE_TYPES.each do |file_type|
+ public_send("job_artifacts_#{file_type}").each_blob do |blob| # rubocop:disable GitlabSecurity/PublicSend
+ yield file_type, blob
+ end
+ end
+ end
+
def update_artifacts_size
self.artifacts_size = legacy_artifacts_file&.size
end
diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb
index 96762f8845c..9d588b862bd 100644
--- a/app/models/ci/build_metadata.rb
+++ b/app/models/ci/build_metadata.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
# The purpose of this class is to store Build related data that can be disposed.
# Data that should be persisted forever, should be stored with Ci::Build model.
diff --git a/app/models/ci/build_runner_session.rb b/app/models/ci/build_runner_session.rb
index 6f3be31d8e1..457d7eeab6a 100644
--- a/app/models/ci/build_runner_session.rb
+++ b/app/models/ci/build_runner_session.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
# The purpose of this class is to store Build related runner session.
# Data will be removed after transitioning from running to any state.
@@ -17,7 +19,7 @@ module Ci
{
subprotocols: ['terminal.gitlab.com'].freeze,
url: "#{url}/exec".sub("https://", "wss://"),
- headers: { Authorization: authorization.presence }.compact,
+ headers: { Authorization: [authorization.presence] }.compact,
ca_pem: certificate.presence
}
end
diff --git a/app/models/ci/build_trace_chunk.rb b/app/models/ci/build_trace_chunk.rb
index b442de34061..108874b75a6 100644
--- a/app/models/ci/build_trace_chunk.rb
+++ b/app/models/ci/build_trace_chunk.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class BuildTraceChunk < ActiveRecord::Base
include FastDestroyAll
diff --git a/app/models/ci/build_trace_chunks/database.rb b/app/models/ci/build_trace_chunks/database.rb
index 3666d77c790..73cb8abf381 100644
--- a/app/models/ci/build_trace_chunks/database.rb
+++ b/app/models/ci/build_trace_chunks/database.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
module BuildTraceChunks
class Database
diff --git a/app/models/ci/build_trace_chunks/fog.rb b/app/models/ci/build_trace_chunks/fog.rb
index 7506c40a39d..a849bd08427 100644
--- a/app/models/ci/build_trace_chunks/fog.rb
+++ b/app/models/ci/build_trace_chunks/fog.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
module BuildTraceChunks
class Fog
diff --git a/app/models/ci/build_trace_chunks/redis.rb b/app/models/ci/build_trace_chunks/redis.rb
index fdb6065e2a0..813eaf5d839 100644
--- a/app/models/ci/build_trace_chunks/redis.rb
+++ b/app/models/ci/build_trace_chunks/redis.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
module BuildTraceChunks
class Redis
diff --git a/app/models/ci/build_trace_section.rb b/app/models/ci/build_trace_section.rb
index ccdb95546c8..a4bee59c83b 100644
--- a/app/models/ci/build_trace_section.rb
+++ b/app/models/ci/build_trace_section.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class BuildTraceSection < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/build_trace_section_name.rb b/app/models/ci/build_trace_section_name.rb
index 0fdcb1ea329..cbdf3c4b673 100644
--- a/app/models/ci/build_trace_section_name.rb
+++ b/app/models/ci/build_trace_section_name.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class BuildTraceSectionName < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/group.rb b/app/models/ci/group.rb
index 9c1046e8715..9b2c3c807ac 100644
--- a/app/models/ci/group.rb
+++ b/app/models/ci/group.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
##
# This domain model is a representation of a group of jobs that are related
diff --git a/app/models/ci/group_variable.rb b/app/models/ci/group_variable.rb
index 44cb583e1bd..492d1d0329e 100644
--- a/app/models/ci/group_variable.rb
+++ b/app/models/ci/group_variable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class GroupVariable < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index 3b952391b7e..d7c5f29be96 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -1,14 +1,24 @@
+# frozen_string_literal: true
+
module Ci
class JobArtifact < ActiveRecord::Base
include AfterCommitQueue
include ObjectStorage::BackgroundMove
extend Gitlab::Ci::Model
+ NotSupportedAdapterError = Class.new(StandardError)
+
+ TEST_REPORT_FILE_TYPES = %w[junit].freeze
+ DEFAULT_FILE_NAMES = { junit: 'junit.xml' }.freeze
+ TYPE_AND_FORMAT_PAIRS = { archive: :zip, metadata: :gzip, trace: :raw, junit: :gzip }.freeze
+
belongs_to :project
belongs_to :job, class_name: "Ci::Build", foreign_key: :job_id
mount_uploader :file, JobArtifactUploader
+ validates :file_format, presence: true, unless: :trace?, on: :create
+ validate :valid_file_format?, unless: :trace?, on: :create
before_save :set_size, if: :file_changed?
after_save :update_project_statistics_after_save, if: :size_changed?
after_destroy :update_project_statistics_after_destroy, unless: :project_destroyed?
@@ -17,14 +27,37 @@ module Ci
scope :with_files_stored_locally, -> { where(file_store: [nil, ::JobArtifactUploader::Store::LOCAL]) }
+ scope :test_reports, -> do
+ types = self.file_types.select { |file_type| TEST_REPORT_FILE_TYPES.include?(file_type) }.values
+
+ where(file_type: types)
+ end
+
delegate :exists?, :open, to: :file
enum file_type: {
archive: 1,
metadata: 2,
- trace: 3
+ trace: 3,
+ junit: 4
+ }
+
+ enum file_format: {
+ raw: 1,
+ zip: 2,
+ gzip: 3
}
+ FILE_FORMAT_ADAPTERS = {
+ gzip: Gitlab::Ci::Build::Artifacts::GzipFileAdapter
+ }.freeze
+
+ def valid_file_format?
+ unless TYPE_AND_FORMAT_PAIRS[self.file_type&.to_sym] == self.file_format&.to_sym
+ errors.add(:file_format, 'Invalid file format with specified file type')
+ end
+ end
+
def update_file_store
# The file.object_store is set during `uploader.store!`
# which happens after object is inserted/updated
@@ -50,8 +83,22 @@ module Ci
end
end
+ def each_blob(&blk)
+ unless file_format_adapter_class
+ raise NotSupportedAdapterError, 'This file format requires a dedicated adapter'
+ end
+
+ file.open do |stream|
+ file_format_adapter_class.new(stream).each_blob(&blk)
+ end
+ end
+
private
+ def file_format_adapter_class
+ FILE_FORMAT_ADAPTERS[file_format.to_sym]
+ end
+
def set_size
self.size = file.size
end
diff --git a/app/models/ci/legacy_stage.rb b/app/models/ci/legacy_stage.rb
index ce691875e42..96dbc7b6895 100644
--- a/app/models/ci/legacy_stage.rb
+++ b/app/models/ci/legacy_stage.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
# Currently this is artificial object, constructed dynamically
# We should migrate this object to actual database record in the future
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index e5caa3ffa41..75dfa00d12e 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class Pipeline < ActiveRecord::Base
extend Gitlab::Ci::Model
@@ -603,6 +605,18 @@ module Ci
@latest_builds_with_artifacts ||= builds.latest.with_artifacts_archive.to_a
end
+ def has_test_reports?
+ complete? && builds.with_test_reports.any?
+ end
+
+ def test_reports
+ Gitlab::Ci::Reports::TestReports.new.tap do |test_reports|
+ builds.with_test_reports.each do |build|
+ build.collect_test_reports!(test_reports)
+ end
+ end
+ end
+
private
def ci_yaml_from_repo
diff --git a/app/models/ci/pipeline_schedule.rb b/app/models/ci/pipeline_schedule.rb
index b6abc3d7681..1c1f203bdb2 100644
--- a/app/models/ci/pipeline_schedule.rb
+++ b/app/models/ci/pipeline_schedule.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class PipelineSchedule < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/pipeline_schedule_variable.rb b/app/models/ci/pipeline_schedule_variable.rb
index 03df4e3e638..fbb9987cab2 100644
--- a/app/models/ci/pipeline_schedule_variable.rb
+++ b/app/models/ci/pipeline_schedule_variable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class PipelineScheduleVariable < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/pipeline_variable.rb b/app/models/ci/pipeline_variable.rb
index 38e14ffbc0c..017ec0b145a 100644
--- a/app/models/ci/pipeline_variable.rb
+++ b/app/models/ci/pipeline_variable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class PipelineVariable < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index bcd0c206bca..f41955f43e7 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class Runner < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/runner_namespace.rb b/app/models/ci/runner_namespace.rb
index 29508fdd326..22b80b98551 100644
--- a/app/models/ci/runner_namespace.rb
+++ b/app/models/ci/runner_namespace.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class RunnerNamespace < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/runner_project.rb b/app/models/ci/runner_project.rb
index 52437047300..1a718d24141 100644
--- a/app/models/ci/runner_project.rb
+++ b/app/models/ci/runner_project.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class RunnerProject < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb
index ea07f37e6c1..511ded55dc3 100644
--- a/app/models/ci/stage.rb
+++ b/app/models/ci/stage.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class Stage < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/trigger.rb b/app/models/ci/trigger.rb
index aa065e33739..55db42162ca 100644
--- a/app/models/ci/trigger.rb
+++ b/app/models/ci/trigger.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class Trigger < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/trigger_request.rb b/app/models/ci/trigger_request.rb
index 215b1cf6753..913936a0bcb 100644
--- a/app/models/ci/trigger_request.rb
+++ b/app/models/ci/trigger_request.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class TriggerRequest < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/ci/variable.rb b/app/models/ci/variable.rb
index 452cb910bca..524d79014f8 100644
--- a/app/models/ci/variable.rb
+++ b/app/models/ci/variable.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class Variable < ActiveRecord::Base
extend Gitlab::Ci::Model
diff --git a/app/models/clusters/applications/helm.rb b/app/models/clusters/applications/helm.rb
index 58de3448577..61df6174c86 100644
--- a/app/models/clusters/applications/helm.rb
+++ b/app/models/clusters/applications/helm.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
module Applications
class Helm < ActiveRecord::Base
diff --git a/app/models/clusters/applications/ingress.rb b/app/models/clusters/applications/ingress.rb
index 27fc3b85465..2440efe76ab 100644
--- a/app/models/clusters/applications/ingress.rb
+++ b/app/models/clusters/applications/ingress.rb
@@ -1,15 +1,20 @@
+# frozen_string_literal: true
+
module Clusters
module Applications
class Ingress < ActiveRecord::Base
+ VERSION = '0.23.0'.freeze
+
self.table_name = 'clusters_applications_ingress'
include ::Clusters::Concerns::ApplicationCore
include ::Clusters::Concerns::ApplicationStatus
+ include ::Clusters::Concerns::ApplicationVersion
include ::Clusters::Concerns::ApplicationData
include AfterCommitQueue
default_value_for :ingress_type, :nginx
- default_value_for :version, :nginx
+ default_value_for :version, VERSION
enum ingress_type: {
nginx: 1
@@ -33,6 +38,7 @@ module Clusters
def install_command
Gitlab::Kubernetes::Helm::InstallCommand.new(
name,
+ version: VERSION,
chart: chart,
values: values
)
diff --git a/app/models/clusters/applications/jupyter.rb b/app/models/clusters/applications/jupyter.rb
index 975d434e1a4..33d54ba86fe 100644
--- a/app/models/clusters/applications/jupyter.rb
+++ b/app/models/clusters/applications/jupyter.rb
@@ -1,12 +1,15 @@
+# frozen_string_literal: true
+
module Clusters
module Applications
class Jupyter < ActiveRecord::Base
- VERSION = '0.0.1'.freeze
+ VERSION = 'v0.6'.freeze
self.table_name = 'clusters_applications_jupyter'
include ::Clusters::Concerns::ApplicationCore
include ::Clusters::Concerns::ApplicationStatus
+ include ::Clusters::Concerns::ApplicationVersion
include ::Clusters::Concerns::ApplicationData
belongs_to :oauth_application, class_name: 'Doorkeeper::Application'
@@ -36,6 +39,7 @@ module Clusters
def install_command
Gitlab::Kubernetes::Helm::InstallCommand.new(
name,
+ version: VERSION,
chart: chart,
values: values,
repository: repository
diff --git a/app/models/clusters/applications/prometheus.rb b/app/models/clusters/applications/prometheus.rb
index 48137c2ed68..ccb415b3fe2 100644
--- a/app/models/clusters/applications/prometheus.rb
+++ b/app/models/clusters/applications/prometheus.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
module Applications
class Prometheus < ActiveRecord::Base
@@ -9,6 +11,7 @@ module Clusters
include ::Clusters::Concerns::ApplicationCore
include ::Clusters::Concerns::ApplicationStatus
+ include ::Clusters::Concerns::ApplicationVersion
include ::Clusters::Concerns::ApplicationData
default_value_for :version, VERSION
@@ -21,6 +24,14 @@ module Clusters
end
end
+ def ready_status
+ [:installed]
+ end
+
+ def ready?
+ ready_status.include?(status_name)
+ end
+
def chart
'stable/prometheus'
end
@@ -36,8 +47,8 @@ module Clusters
def install_command
Gitlab::Kubernetes::Helm::InstallCommand.new(
name,
+ version: VERSION,
chart: chart,
- version: version,
values: values
)
end
diff --git a/app/models/clusters/applications/runner.rb b/app/models/clusters/applications/runner.rb
index e6f795f3e0b..426aed91089 100644
--- a/app/models/clusters/applications/runner.rb
+++ b/app/models/clusters/applications/runner.rb
@@ -1,12 +1,15 @@
+# frozen_string_literal: true
+
module Clusters
module Applications
class Runner < ActiveRecord::Base
- VERSION = '0.1.13'.freeze
+ VERSION = '0.1.31'.freeze
self.table_name = 'clusters_applications_runners'
include ::Clusters::Concerns::ApplicationCore
include ::Clusters::Concerns::ApplicationStatus
+ include ::Clusters::Concerns::ApplicationVersion
include ::Clusters::Concerns::ApplicationData
belongs_to :runner, class_name: 'Ci::Runner', foreign_key: :runner_id
@@ -29,6 +32,7 @@ module Clusters
def install_command
Gitlab::Kubernetes::Helm::InstallCommand.new(
name,
+ version: VERSION,
chart: chart,
values: values,
repository: repository
diff --git a/app/models/clusters/cluster.rb b/app/models/clusters/cluster.rb
index b426b1bf8a1..7cf75403ab6 100644
--- a/app/models/clusters/cluster.rb
+++ b/app/models/clusters/cluster.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
class Cluster < ActiveRecord::Base
include Presentable
diff --git a/app/models/clusters/concerns/application_core.rb b/app/models/clusters/concerns/application_core.rb
index 623b836c0ed..e3deedfb036 100644
--- a/app/models/clusters/concerns/application_core.rb
+++ b/app/models/clusters/concerns/application_core.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
module Concerns
module ApplicationCore
diff --git a/app/models/clusters/concerns/application_data.rb b/app/models/clusters/concerns/application_data.rb
index 96ac757e99e..14e004b9a57 100644
--- a/app/models/clusters/concerns/application_data.rb
+++ b/app/models/clusters/concerns/application_data.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
module Concerns
module ApplicationData
diff --git a/app/models/clusters/concerns/application_status.rb b/app/models/clusters/concerns/application_status.rb
index 8f3eb75bfa9..d4d3859dfd5 100644
--- a/app/models/clusters/concerns/application_status.rb
+++ b/app/models/clusters/concerns/application_status.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
module Concerns
module ApplicationStatus
diff --git a/app/models/clusters/concerns/application_version.rb b/app/models/clusters/concerns/application_version.rb
new file mode 100644
index 00000000000..ccad74dc35a
--- /dev/null
+++ b/app/models/clusters/concerns/application_version.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Clusters
+ module Concerns
+ module ApplicationVersion
+ extend ActiveSupport::Concern
+
+ included do
+ state_machine :status do
+ after_transition any => [:installing] do |application|
+ application.update(version: application.class.const_get(:VERSION))
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/app/models/clusters/platforms/kubernetes.rb b/app/models/clusters/platforms/kubernetes.rb
index 36631d57ad1..e6ddca0d5d0 100644
--- a/app/models/clusters/platforms/kubernetes.rb
+++ b/app/models/clusters/platforms/kubernetes.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
module Platforms
class Kubernetes < ActiveRecord::Base
diff --git a/app/models/clusters/project.rb b/app/models/clusters/project.rb
index eeb734b20b8..839ce796081 100644
--- a/app/models/clusters/project.rb
+++ b/app/models/clusters/project.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
class Project < ActiveRecord::Base
self.table_name = 'cluster_projects'
diff --git a/app/models/clusters/providers/gcp.rb b/app/models/clusters/providers/gcp.rb
index 4db1bb35c12..16b59cd9d14 100644
--- a/app/models/clusters/providers/gcp.rb
+++ b/app/models/clusters/providers/gcp.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
module Providers
class Gcp < ActiveRecord::Base
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 56d4c86774e..8b9f4490ffa 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -1,4 +1,6 @@
# coding: utf-8
+# frozen_string_literal: true
+
class Commit
extend ActiveModel::Naming
extend Gitlab::Cache::RequestCache
@@ -339,21 +341,21 @@ class Commit
end
def cherry_pick_description(user)
- message_body = "(cherry picked from commit #{sha})"
+ message_body = ["(cherry picked from commit #{sha})"]
if merged_merge_request?(user)
commits_in_merge_request = merged_merge_request(user).commits
if commits_in_merge_request.present?
- message_body << "\n"
+ message_body << ""
commits_in_merge_request.reverse.each do |commit_in_merge|
- message_body << "\n#{commit_in_merge.short_id} #{commit_in_merge.title}"
+ message_body << "#{commit_in_merge.short_id} #{commit_in_merge.title}"
end
end
end
- message_body
+ message_body.join("\n")
end
def cherry_pick_message(user)
diff --git a/app/models/commit_range.rb b/app/models/commit_range.rb
index b93c111dabc..094747ee48d 100644
--- a/app/models/commit_range.rb
+++ b/app/models/commit_range.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# CommitRange makes it easier to work with commit ranges
#
# Examples:
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 97516079b66..b65d7672973 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class CommitStatus < ActiveRecord::Base
include HasStatus
include Importable
@@ -46,7 +48,8 @@ class CommitStatus < ActiveRecord::Base
api_failure: 2,
stuck_or_timeout_failure: 3,
runner_system_failure: 4,
- missing_dependency_failure: 5
+ missing_dependency_failure: 5,
+ runner_unsupported: 6
}
##
diff --git a/app/models/compare.rb b/app/models/compare.rb
index feb4b89c781..b2d46ada831 100644
--- a/app/models/compare.rb
+++ b/app/models/compare.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Compare
include Gitlab::Utils::StrongMemoize
diff --git a/app/models/concerns/atomic_internal_id.rb b/app/models/concerns/atomic_internal_id.rb
index 164c704260e..5e39676b24b 100644
--- a/app/models/concerns/atomic_internal_id.rb
+++ b/app/models/concerns/atomic_internal_id.rb
@@ -26,21 +26,30 @@ module AtomicInternalId
module ClassMethods
def has_internal_id(column, scope:, init:, presence: true) # rubocop:disable Naming/PredicateName
+ # We require init here to retain the ability to recalculate in the absence of a
+ # InternaLId record (we may delete records in `internal_ids` for example).
+ raise "has_internal_id requires a init block, none given." unless init
+
before_validation :"ensure_#{scope}_#{column}!", on: :create
validates column, presence: presence
define_method("ensure_#{scope}_#{column}!") do
scope_value = association(scope).reader
+ value = read_attribute(column)
+
+ return value unless scope_value
- if read_attribute(column).blank? && scope_value
- scope_attrs = { scope_value.class.table_name.singularize.to_sym => scope_value }
- usage = self.class.table_name.to_sym
+ scope_attrs = { scope_value.class.table_name.singularize.to_sym => scope_value }
+ usage = self.class.table_name.to_sym
- new_iid = InternalId.generate_next(self, scope_attrs, usage, init)
- write_attribute(column, new_iid)
+ if value.present?
+ InternalId.track_greatest(self, scope_attrs, usage, value, init)
+ else
+ value = InternalId.generate_next(self, scope_attrs, usage, init)
+ write_attribute(column, value)
end
- read_attribute(column)
+ value
end
end
end
diff --git a/app/models/concerns/label_eventable.rb b/app/models/concerns/label_eventable.rb
new file mode 100644
index 00000000000..d22d93448e4
--- /dev/null
+++ b/app/models/concerns/label_eventable.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+# == LabelEventable concern
+#
+# Contains functionality related to objects that support adding/removing labels.
+#
+# This concern is not used yet, it will be used for:
+# https://gitlab.com/gitlab-org/gitlab-ce/issues/48483
+
+module LabelEventable
+ extend ActiveSupport::Concern
+
+ included do
+ has_many :resource_label_events
+ end
+end
diff --git a/app/models/concerns/prometheus_adapter.rb b/app/models/concerns/prometheus_adapter.rb
index 18cbbd871a1..9c36f633395 100644
--- a/app/models/concerns/prometheus_adapter.rb
+++ b/app/models/concerns/prometheus_adapter.rb
@@ -24,11 +24,10 @@ module PrometheusAdapter
def query(query_name, *args)
return unless can_query?
- query_class = Gitlab::Prometheus::Queries.const_get("#{query_name.to_s.classify}Query")
+ query_class = query_klass_for(query_name)
+ query_args = build_query_args(*args)
- args.map!(&:id)
-
- with_reactive_cache(query_class.name, *args, &query_class.method(:transform_reactive_result))
+ with_reactive_cache(query_class.name, *query_args, &query_class.method(:transform_reactive_result))
end
# Cache metrics for specific environment
@@ -44,5 +43,13 @@ module PrometheusAdapter
rescue Gitlab::PrometheusClient::Error => err
{ success: false, result: err.message }
end
+
+ def query_klass_for(query_name)
+ Gitlab::Prometheus::Queries.const_get("#{query_name.to_s.classify}Query")
+ end
+
+ def build_query_args(*args)
+ args.map(&:id)
+ end
end
end
diff --git a/app/models/concerns/reactive_caching.rb b/app/models/concerns/reactive_caching.rb
index be0a5b49012..9155d82d567 100644
--- a/app/models/concerns/reactive_caching.rb
+++ b/app/models/concerns/reactive_caching.rb
@@ -59,6 +59,9 @@ module ReactiveCaching
raise NotImplementedError
end
+ def reactive_cache_updated(*args)
+ end
+
def with_reactive_cache(*args, &blk)
bootstrap = !within_reactive_cache_lifetime?(*args)
Rails.cache.write(alive_reactive_cache_key(*args), true, expires_in: self.class.reactive_cache_lifetime)
@@ -81,8 +84,11 @@ module ReactiveCaching
locking_reactive_cache(*args) do
if within_reactive_cache_lifetime?(*args)
enqueuing_update(*args) do
- value = calculate_reactive_cache(*args)
- Rails.cache.write(full_reactive_cache_key(*args), value)
+ key = full_reactive_cache_key(*args)
+ new_value = calculate_reactive_cache(*args)
+ old_value = Rails.cache.read(key)
+ Rails.cache.write(key, new_value)
+ reactive_cache_updated(*args) if new_value != old_value
end
end
end
diff --git a/app/models/concerns/routable.rb b/app/models/concerns/routable.rb
index 0176a12a131..cb91f8fbac8 100644
--- a/app/models/concerns/routable.rb
+++ b/app/models/concerns/routable.rb
@@ -90,34 +90,17 @@ module Routable
end
def full_name
- if route && route.name.present?
- @full_name ||= route.name # rubocop:disable Gitlab/ModuleWithInstanceVariables
- else
- update_route if persisted?
-
- build_full_name
- end
+ route&.name || build_full_name
end
- # Every time `project.namespace.becomes(Namespace)` is called for polymorphic_path,
- # a new instance is instantiated, and we end up duplicating the same query to retrieve
- # the route. Caching this per request ensures that even if we have multiple instances,
- # we will not have to duplicate work, avoiding N+1 queries in some cases.
def full_path
- return uncached_full_path unless RequestStore.active? && persisted?
-
- RequestStore[full_path_key] ||= uncached_full_path
+ route&.path || build_full_path
end
def full_path_components
full_path.split('/')
end
- def expires_full_path_cache
- RequestStore.delete(full_path_key) if RequestStore.active?
- @full_path = nil # rubocop:disable Gitlab/ModuleWithInstanceVariables
- end
-
def build_full_path
if parent && path
parent.full_path + '/' + path
@@ -138,16 +121,6 @@ module Routable
self.errors[:path].concat(route_path_errors) if route_path_errors
end
- def uncached_full_path
- if route && route.path.present?
- @full_path ||= route.path # rubocop:disable Gitlab/ModuleWithInstanceVariables
- else
- update_route if persisted?
-
- build_full_path
- end
- end
-
def full_name_changed?
name_changed? || parent_changed?
end
@@ -156,10 +129,6 @@ module Routable
path_changed? || parent_changed?
end
- def full_path_key
- @full_path_key ||= "routable/full_path/#{self.class.name}/#{self.id}"
- end
-
def build_full_name
if parent && name
parent.human_name + ' / ' + name
@@ -168,18 +137,9 @@ module Routable
end
end
- def update_route
- return if Gitlab::Database.read_only?
-
- prepare_route
- route.save
- end
-
def prepare_route
route || build_route(source: self)
route.path = build_full_path
route.name = build_full_name
- @full_path = nil # rubocop:disable Gitlab/ModuleWithInstanceVariables
- @full_name = nil # rubocop:disable Gitlab/ModuleWithInstanceVariables
end
end
diff --git a/app/models/concerns/storage/legacy_namespace.rb b/app/models/concerns/storage/legacy_namespace.rb
index f66bdd529f1..f5225cd81ed 100644
--- a/app/models/concerns/storage/legacy_namespace.rb
+++ b/app/models/concerns/storage/legacy_namespace.rb
@@ -11,8 +11,6 @@ module Storage
Namespace.find(parent_id_was) # raise NotFound early if needed
end
- expires_full_path_cache
-
move_repositories
if parent_changed?
@@ -34,13 +32,12 @@ module Storage
begin
send_update_instructions
write_projects_repository_config
-
- true
- rescue
- # Returning false does not rollback after_* transaction but gives
- # us information about failing some of tasks
- false
+ rescue => e
+ # Raise if development/test environment, else just notify Sentry
+ Gitlab::Sentry.track_exception(e, extra: { full_path_was: full_path_was, full_path: full_path, action: 'move_dir' })
end
+
+ true # false would cancel later callbacks but not rollback
end
# Hooks
diff --git a/app/models/container_repository.rb b/app/models/container_repository.rb
index d0c94d3b694..41413854d5c 100644
--- a/app/models/container_repository.rb
+++ b/app/models/container_repository.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ContainerRepository < ActiveRecord::Base
belongs_to :project
diff --git a/app/models/cycle_analytics.rb b/app/models/cycle_analytics.rb
index b34d1382d43..d0f5b6970b1 100644
--- a/app/models/cycle_analytics.rb
+++ b/app/models/cycle_analytics.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class CycleAnalytics
STAGES = %i[issue plan code test review staging production].freeze
diff --git a/app/models/dashboard_group_milestone.rb b/app/models/dashboard_group_milestone.rb
new file mode 100644
index 00000000000..13807d43265
--- /dev/null
+++ b/app/models/dashboard_group_milestone.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+# Dashboard Group Milestones are milestones that allow us to pull more info out for the UI that the Milestone object doesn't allow for
+class DashboardGroupMilestone < GlobalMilestone
+ extend ::Gitlab::Utils::Override
+
+ attr_reader :group_name
+
+ override :initialize
+ def initialize(milestone)
+ super(milestone.title, Array(milestone))
+
+ @group_name = milestone.group.full_name
+ end
+
+ def self.build_collection(groups)
+ MilestonesFinder.new(group_ids: groups.pluck(:id)).execute.map { |m| new(m) }
+ end
+
+ override :group_milestone?
+ def group_milestone?
+ @first_milestone.group_milestone?
+ end
+
+ override :milestoneish_ids
+ def milestoneish_ids
+ milestones.map(&:id)
+ end
+
+ def group
+ @first_milestone.group
+ end
+
+ def iid
+ @first_milestone.iid
+ end
+end
diff --git a/app/models/dashboard_milestone.rb b/app/models/dashboard_milestone.rb
index 86eb4ec76fc..96bc8090b81 100644
--- a/app/models/dashboard_milestone.rb
+++ b/app/models/dashboard_milestone.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class DashboardMilestone < GlobalMilestone
def issues_finder_params
{ authorized_only: true }
diff --git a/app/models/deploy_key.rb b/app/models/deploy_key.rb
index 89a74b7dcb1..fd5d7726fb6 100644
--- a/app/models/deploy_key.rb
+++ b/app/models/deploy_key.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class DeployKey < Key
include IgnorableColumn
diff --git a/app/models/deploy_keys_project.rb b/app/models/deploy_keys_project.rb
index 6eef12c4373..71fd02fac86 100644
--- a/app/models/deploy_keys_project.rb
+++ b/app/models/deploy_keys_project.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class DeployKeysProject < ActiveRecord::Base
belongs_to :project
belongs_to :deploy_key, inverse_of: :deploy_keys_projects
diff --git a/app/models/deploy_token.rb b/app/models/deploy_token.rb
index 7ab647abe93..0b2eedf3631 100644
--- a/app/models/deploy_token.rb
+++ b/app/models/deploy_token.rb
@@ -1,6 +1,9 @@
+# frozen_string_literal: true
+
class DeployToken < ActiveRecord::Base
include Expirable
include TokenAuthenticatable
+ include PolicyActor
add_authentication_token_field :token
AVAILABLE_SCOPES = %i(read_repository read_registry).freeze
@@ -27,7 +30,7 @@ class DeployToken < ActiveRecord::Base
end
def active?
- !revoked && expires_at > Date.today
+ !revoked && !expired?
end
def scopes
@@ -58,12 +61,14 @@ class DeployToken < ActiveRecord::Base
write_attribute(:expires_at, value.presence || Forever.date)
end
- def admin?
- false
- end
-
private
+ def expired?
+ return false unless expires_at
+
+ expires_at < Date.today
+ end
+
def ensure_at_least_one_scope
errors.add(:base, "Scopes can't be blank") unless read_repository || read_registry
end
diff --git a/app/models/deployment.rb b/app/models/deployment.rb
index 687246b47b2..6962b54441b 100644
--- a/app/models/deployment.rb
+++ b/app/models/deployment.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Deployment < ActiveRecord::Base
include AtomicInternalId
include IidRoutes
diff --git a/app/models/diff_discussion.rb b/app/models/diff_discussion.rb
index bd6af622bfb..93e3ebf7896 100644
--- a/app/models/diff_discussion.rb
+++ b/app/models/diff_discussion.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A discussion on merge request or commit diffs consisting of `DiffNote` notes.
#
# A discussion of this type can be resolvable.
diff --git a/app/models/diff_note.rb b/app/models/diff_note.rb
index d752d5bcdee..58d949315e0 100644
--- a/app/models/diff_note.rb
+++ b/app/models/diff_note.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A note on merge request or commit diffs
#
# A note of this type can be resolvable.
diff --git a/app/models/directly_addressed_user.rb b/app/models/directly_addressed_user.rb
index 0d519c6ac22..06df2d6c012 100644
--- a/app/models/directly_addressed_user.rb
+++ b/app/models/directly_addressed_user.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class DirectlyAddressedUser
class << self
def reference_pattern
diff --git a/app/models/discussion.rb b/app/models/discussion.rb
index 35a0ef00856..dbc7b6e67be 100644
--- a/app/models/discussion.rb
+++ b/app/models/discussion.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A non-diff discussion on an issue, merge request, commit, or snippet, consisting of `DiscussionNote` notes.
#
# A discussion of this type can be resolvable.
diff --git a/app/models/discussion_note.rb b/app/models/discussion_note.rb
index e660b024083..89d86aaed66 100644
--- a/app/models/discussion_note.rb
+++ b/app/models/discussion_note.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A note in a non-diff discussion on an issue, merge request, commit, or snippet.
#
# A note of this type can be resolvable.
diff --git a/app/models/email.rb b/app/models/email.rb
index d6516761f0a..b6a977dfa22 100644
--- a/app/models/email.rb
+++ b/app/models/email.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Email < ActiveRecord::Base
include Sortable
include Gitlab::SQL::Pattern
@@ -25,6 +27,10 @@ class Email < ActiveRecord::Base
self.errors.add(:email, 'has already been taken') if User.exists?(email: self.email)
end
+ def accept_pending_invitations!
+ user.accept_pending_invitations!
+ end
+
# once email is confirmed, update the gpg signatures
def update_invalid_gpg_signatures
user.update_invalid_gpg_signatures if confirmed?
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 4856d313318..c8d1d378ae0 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Environment < ActiveRecord::Base
# Used to generate random suffixes for the slug
LETTERS = 'a'..'z'
@@ -173,7 +175,7 @@ class Environment < ActiveRecord::Base
# * cannot end with `-`
def generate_slug
# Lowercase letters and numbers only
- slugified = name.to_s.downcase.gsub(/[^a-z0-9]/, '-')
+ slugified = +name.to_s.downcase.gsub(/[^a-z0-9]/, '-')
# Must start with a letter
slugified = 'env-' + slugified unless LETTERS.cover?(slugified[0])
diff --git a/app/models/epic.rb b/app/models/epic.rb
index 286b855de3f..f027993376c 100644
--- a/app/models/epic.rb
+++ b/app/models/epic.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# Placeholder class for model that is implemented in EE
# It reserves '&' as a reference prefix, but the table does not exists in CE
class Epic < ActiveRecord::Base
diff --git a/app/models/event.rb b/app/models/event.rb
index ac0b1c7b27c..ba28866e8e6 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Event < ActiveRecord::Base
include Sortable
include IgnorableColumn
diff --git a/app/models/event_collection.rb b/app/models/event_collection.rb
index 8b8244314af..a4c69b11781 100644
--- a/app/models/event_collection.rb
+++ b/app/models/event_collection.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A collection of events to display in an event list.
#
# An EventCollection is meant to be used for displaying events to a user (e.g.
diff --git a/app/models/external_issue.rb b/app/models/external_issue.rb
index 282fd7edcb7..4f73beaafc5 100644
--- a/app/models/external_issue.rb
+++ b/app/models/external_issue.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ExternalIssue
include Referable
diff --git a/app/models/fork_network.rb b/app/models/fork_network.rb
index 7f1728e8c77..1b9bf93cbbc 100644
--- a/app/models/fork_network.rb
+++ b/app/models/fork_network.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ForkNetwork < ActiveRecord::Base
belongs_to :root_project, class_name: 'Project'
has_many :fork_network_members
diff --git a/app/models/fork_network_member.rb b/app/models/fork_network_member.rb
index eb9417dc34f..36c66f21b0b 100644
--- a/app/models/fork_network_member.rb
+++ b/app/models/fork_network_member.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ForkNetworkMember < ActiveRecord::Base
belongs_to :fork_network
belongs_to :project
diff --git a/app/models/forked_project_link.rb b/app/models/forked_project_link.rb
index 8d35864eff6..0f7067238cd 100644
--- a/app/models/forked_project_link.rb
+++ b/app/models/forked_project_link.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ForkedProjectLink < ActiveRecord::Base
belongs_to :forked_to_project, -> { where.not(pending_delete: true) }, class_name: 'Project'
belongs_to :forked_from_project, -> { where.not(pending_delete: true) }, class_name: 'Project'
diff --git a/app/models/generic_commit_status.rb b/app/models/generic_commit_status.rb
index 5ac8bde44cd..3028bf21301 100644
--- a/app/models/generic_commit_status.rb
+++ b/app/models/generic_commit_status.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GenericCommitStatus < CommitStatus
before_validation :set_default_values
diff --git a/app/models/global_label.rb b/app/models/global_label.rb
index 2a1b7564962..c5b2492bbf6 100644
--- a/app/models/global_label.rb
+++ b/app/models/global_label.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GlobalLabel
attr_accessor :title, :labels
alias_attribute :name, :title
diff --git a/app/models/global_milestone.rb b/app/models/global_milestone.rb
index dc2f6817190..6e23e811b0e 100644
--- a/app/models/global_milestone.rb
+++ b/app/models/global_milestone.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+# Global Milestones are milestones that can be shared across multiple projects
class GlobalMilestone
include Milestoneish
diff --git a/app/models/gpg_key.rb b/app/models/gpg_key.rb
index 44eda741679..077afffd358 100644
--- a/app/models/gpg_key.rb
+++ b/app/models/gpg_key.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GpgKey < ActiveRecord::Base
KEY_PREFIX = '-----BEGIN PGP PUBLIC KEY BLOCK-----'.freeze
KEY_SUFFIX = '-----END PGP PUBLIC KEY BLOCK-----'.freeze
diff --git a/app/models/gpg_key_subkey.rb b/app/models/gpg_key_subkey.rb
index b57922aba30..440b588bc78 100644
--- a/app/models/gpg_key_subkey.rb
+++ b/app/models/gpg_key_subkey.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GpgKeySubkey < ActiveRecord::Base
include ShaAttribute
diff --git a/app/models/gpg_signature.rb b/app/models/gpg_signature.rb
index bf88d75246f..0816778deae 100644
--- a/app/models/gpg_signature.rb
+++ b/app/models/gpg_signature.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GpgSignature < ActiveRecord::Base
include ShaAttribute
diff --git a/app/models/group.rb b/app/models/group.rb
index ddebaff50b0..cd548fc0061 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'carrierwave/orm/activerecord'
class Group < Namespace
diff --git a/app/models/group_custom_attribute.rb b/app/models/group_custom_attribute.rb
index 8157d602d67..22f14885657 100644
--- a/app/models/group_custom_attribute.rb
+++ b/app/models/group_custom_attribute.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GroupCustomAttribute < ActiveRecord::Base
belongs_to :group
diff --git a/app/models/group_label.rb b/app/models/group_label.rb
index 92c83b54861..ff14529c6e6 100644
--- a/app/models/group_label.rb
+++ b/app/models/group_label.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GroupLabel < Label
belongs_to :group
diff --git a/app/models/group_milestone.rb b/app/models/group_milestone.rb
index 98135ee3c8b..9dfaebacc83 100644
--- a/app/models/group_milestone.rb
+++ b/app/models/group_milestone.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+# Group Milestones are milestones that can be shared among many projects within the same group
class GroupMilestone < GlobalMilestone
attr_accessor :group
diff --git a/app/models/guest.rb b/app/models/guest.rb
index df287c277a7..9c8097e1ac8 100644
--- a/app/models/guest.rb
+++ b/app/models/guest.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Guest
class << self
def can?(action, subject = :global)
diff --git a/app/models/identity.rb b/app/models/identity.rb
index 3fd0c5e751d..f5a13dbd6f2 100644
--- a/app/models/identity.rb
+++ b/app/models/identity.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Identity < ActiveRecord::Base
def self.uniqueness_scope
:provider
diff --git a/app/models/import_export_upload.rb b/app/models/import_export_upload.rb
index 60d53d6c2c8..f0cc5aafcd4 100644
--- a/app/models/import_export_upload.rb
+++ b/app/models/import_export_upload.rb
@@ -1,9 +1,12 @@
+# frozen_string_literal: true
+
class ImportExportUpload < ActiveRecord::Base
include WithUploads
include ObjectStorage::BackgroundMove
belongs_to :project
+ # These hold the project Import/Export archives (.tar.gz files)
mount_uploader :import_file, ImportExportUploader
mount_uploader :export_file, ImportExportUploader
diff --git a/app/models/individual_note_discussion.rb b/app/models/individual_note_discussion.rb
index 6be8ca45739..07ee7470ea2 100644
--- a/app/models/individual_note_discussion.rb
+++ b/app/models/individual_note_discussion.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A discussion to wrap a single `Note` note on the root of an issue, merge request,
# commit, or snippet, that is not displayed as a discussion.
#
diff --git a/app/models/instance_configuration.rb b/app/models/instance_configuration.rb
index b30b707e5fe..7d8ce0bbd05 100644
--- a/app/models/instance_configuration.rb
+++ b/app/models/instance_configuration.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'resolv'
class InstanceConfiguration
diff --git a/app/models/internal_id.rb b/app/models/internal_id.rb
index f50f28deffe..4eb211eff61 100644
--- a/app/models/internal_id.rb
+++ b/app/models/internal_id.rb
@@ -1,6 +1,11 @@
+# frozen_string_literal: true
+
# An InternalId is a strictly monotone sequence of integers
# generated for a given scope and usage.
#
+# The monotone sequence may be broken if an ID is explicitly provided
+# to `.track_greatest_and_save!` or `#track_greatest`.
+#
# For example, issues use their project to scope internal ids:
# In that sense, scope is "project" and usage is "issues".
# Generated internal ids for an issue are unique per project.
@@ -25,13 +30,34 @@ class InternalId < ActiveRecord::Base
# The operation locks the record and gathers a `ROW SHARE` lock (in PostgreSQL).
# As such, the increment is atomic and safe to be called concurrently.
def increment_and_save!
+ update_and_save { self.last_value = (last_value || 0) + 1 }
+ end
+
+ # Increments #last_value with new_value if it is greater than the current,
+ # and saves the record
+ #
+ # The operation locks the record and gathers a `ROW SHARE` lock (in PostgreSQL).
+ # As such, the increment is atomic and safe to be called concurrently.
+ def track_greatest_and_save!(new_value)
+ update_and_save { self.last_value = [last_value || 0, new_value].max }
+ end
+
+ private
+
+ def update_and_save(&block)
lock!
- self.last_value = (last_value || 0) + 1
+ yield
save!
last_value
end
class << self
+ def track_greatest(subject, scope, usage, new_value, init)
+ return new_value unless available?
+
+ InternalIdGenerator.new(subject, scope, usage, init).track_greatest(new_value)
+ end
+
def generate_next(subject, scope, usage, init)
# Shortcut if `internal_ids` table is not available (yet)
# This can be the case in other (unrelated) migration specs
@@ -94,6 +120,16 @@ class InternalId < ActiveRecord::Base
end
end
+ # Create a record in internal_ids if one does not yet exist
+ # and set its new_value if it is higher than the current last_value
+ #
+ # Note this will acquire a ROW SHARE lock on the InternalId record
+ def track_greatest(new_value)
+ subject.transaction do
+ (lookup || create_record).track_greatest_and_save!(new_value)
+ end
+ end
+
private
# Retrieve InternalId record for (project, usage) combination, if it exists
diff --git a/app/models/issue.rb b/app/models/issue.rb
index 4715d942c8d..0d135f54038 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'carrierwave/orm/activerecord'
class Issue < ActiveRecord::Base
@@ -12,6 +14,7 @@ class Issue < ActiveRecord::Base
include TimeTrackable
include ThrottledTouch
include IgnorableColumn
+ include LabelEventable
ignore_column :assignee_id, :branch_name, :deleted_at
diff --git a/app/models/issue_assignee.rb b/app/models/issue_assignee.rb
index 326b9eb7ad5..400c0256945 100644
--- a/app/models/issue_assignee.rb
+++ b/app/models/issue_assignee.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class IssueAssignee < ActiveRecord::Base
belongs_to :issue
belongs_to :assignee, class_name: "User", foreign_key: :user_id
diff --git a/app/models/issue_collection.rb b/app/models/issue_collection.rb
index 49f011c113f..05607fc3a08 100644
--- a/app/models/issue_collection.rb
+++ b/app/models/issue_collection.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# IssueCollection can be used to reduce a list of issues down to a subset.
#
# IssueCollection is not meant to be some sort of Enumerable, instead it's meant
diff --git a/app/models/key.rb b/app/models/key.rb
index ae5769c0627..3bb0d2f6f9c 100644
--- a/app/models/key.rb
+++ b/app/models/key.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'digest/md5'
class Key < ActiveRecord::Base
diff --git a/app/models/label.rb b/app/models/label.rb
index 7bbcaa121ca..96c1515b41a 100644
--- a/app/models/label.rb
+++ b/app/models/label.rb
@@ -1,7 +1,10 @@
+# frozen_string_literal: true
+
class Label < ActiveRecord::Base
include CacheMarkdownField
include Referable
include Subscribable
+ include Gitlab::SQL::Pattern
# Represents a "No Label" state used for filtering Issues and Merge
# Requests that have no label assigned.
@@ -103,6 +106,17 @@ class Label < ActiveRecord::Base
nil
end
+ # Searches for labels with a matching title or description.
+ #
+ # This method uses ILIKE on PostgreSQL and LIKE on MySQL.
+ #
+ # query - The search query as a String.
+ #
+ # Returns an ActiveRecord::Relation.
+ def self.search(query)
+ fuzzy_search(query, [:title, :description])
+ end
+
def open_issues_count(user = nil)
issues_count(user, state: 'opened')
end
diff --git a/app/models/label_link.rb b/app/models/label_link.rb
index d68e1f54317..779657b25d5 100644
--- a/app/models/label_link.rb
+++ b/app/models/label_link.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class LabelLink < ActiveRecord::Base
include Importable
diff --git a/app/models/label_priority.rb b/app/models/label_priority.rb
index 5b85e0b6533..8ed8bb7577f 100644
--- a/app/models/label_priority.rb
+++ b/app/models/label_priority.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class LabelPriority < ActiveRecord::Base
belongs_to :project
belongs_to :label
diff --git a/app/models/legacy_diff_discussion.rb b/app/models/legacy_diff_discussion.rb
index 80fc6304fd4..7d78c580fa2 100644
--- a/app/models/legacy_diff_discussion.rb
+++ b/app/models/legacy_diff_discussion.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A discussion on merge request or commit diffs consisting of `LegacyDiffNote` notes.
#
# All new diff discussions are of the type `DiffDiscussion`, but any diff discussions created
diff --git a/app/models/legacy_diff_note.rb b/app/models/legacy_diff_note.rb
index d90cafd14b4..20f9b18e4ca 100644
--- a/app/models/legacy_diff_note.rb
+++ b/app/models/legacy_diff_note.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A note on merge request or commit diffs, using the legacy implementation.
#
# All new diff notes are of the type `DiffNote`, but any diff notes created
diff --git a/app/models/lfs_file_lock.rb b/app/models/lfs_file_lock.rb
index 50bb6ca382d..431d37e12e9 100644
--- a/app/models/lfs_file_lock.rb
+++ b/app/models/lfs_file_lock.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class LfsFileLock < ActiveRecord::Base
belongs_to :project
belongs_to :user
diff --git a/app/models/lfs_object.rb b/app/models/lfs_object.rb
index 84487031ee5..2a1a4ef48b7 100644
--- a/app/models/lfs_object.rb
+++ b/app/models/lfs_object.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class LfsObject < ActiveRecord::Base
include AfterCommitQueue
include ObjectStorage::BackgroundMove
diff --git a/app/models/lfs_objects_project.rb b/app/models/lfs_objects_project.rb
index b0625c52b62..353602800d7 100644
--- a/app/models/lfs_objects_project.rb
+++ b/app/models/lfs_objects_project.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class LfsObjectsProject < ActiveRecord::Base
belongs_to :project
belongs_to :lfs_object
diff --git a/app/models/list.rb b/app/models/list.rb
index 4edcfa78835..eabe3ffccbb 100644
--- a/app/models/list.rb
+++ b/app/models/list.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class List < ActiveRecord::Base
belongs_to :board
belongs_to :label
diff --git a/app/models/member.rb b/app/models/member.rb
index 00a13a279a9..05c0bc8cb97 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Member < ActiveRecord::Base
include AfterCommitQueue
include Sortable
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index b4090fd8baf..6de44751f1b 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class MergeRequest < ActiveRecord::Base
include AtomicInternalId
include IidRoutes
@@ -10,6 +12,12 @@ class MergeRequest < ActiveRecord::Base
include EachBatch
include ThrottledTouch
include Gitlab::Utils::StrongMemoize
+ include LabelEventable
+ include ReactiveCaching
+
+ self.reactive_cache_key = ->(model) { [model.project.id, model.iid] }
+ self.reactive_cache_refresh_interval = 1.hour
+ self.reactive_cache_lifetime = 1.hour
ignore_column :locked_at,
:ref_fetched,
@@ -1009,6 +1017,30 @@ class MergeRequest < ActiveRecord::Base
.order(id: :desc)
end
+ def has_test_reports?
+ actual_head_pipeline&.has_test_reports?
+ end
+
+ def compare_test_reports
+ unless has_test_reports?
+ return { status: :error, status_reason: 'This merge request does not have test reports' }
+ end
+
+ with_reactive_cache(
+ :compare_test_results,
+ base_pipeline&.iid,
+ actual_head_pipeline.iid) { |data| data } || { status: :parsing }
+ end
+
+ def calculate_reactive_cache(identifier, *args)
+ case identifier.to_sym
+ when :compare_test_results
+ Ci::CompareTestReportsService.new(project).execute(*args)
+ else
+ raise NotImplementedError, "Unknown identifier: #{identifier}"
+ end
+ end
+
def all_commits
# MySQL doesn't support LIMIT in a subquery.
diffs_relation = if Gitlab::Database.postgresql?
@@ -1121,6 +1153,12 @@ class MergeRequest < ActiveRecord::Base
true
end
+ def base_pipeline
+ @base_pipeline ||= project.pipelines
+ .order(id: :desc)
+ .find_by(sha: diff_base_sha)
+ end
+
def discussions_rendered_on_frontend?
true
end
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index a073bbfad20..d9393b4e545 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class MergeRequestDiff < ActiveRecord::Base
include Sortable
include Importable
@@ -249,15 +251,13 @@ class MergeRequestDiff < ActiveRecord::Base
end
def load_diffs(options)
- raw = merge_request_diff_files.map(&:to_hash)
+ collection = merge_request_diff_files
if paths = options[:paths]
- raw = raw.select do |diff|
- paths.include?(diff[:old_path]) || paths.include?(diff[:new_path])
- end
+ collection = collection.where('old_path IN (?) OR new_path IN (?)', paths, paths)
end
- Gitlab::Git::DiffCollection.new(raw, options)
+ Gitlab::Git::DiffCollection.new(collection.map(&:to_hash), options)
end
def load_commits
diff --git a/app/models/merge_request_diff_commit.rb b/app/models/merge_request_diff_commit.rb
index 1c2e57bb01f..4ad3690512d 100644
--- a/app/models/merge_request_diff_commit.rb
+++ b/app/models/merge_request_diff_commit.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class MergeRequestDiffCommit < ActiveRecord::Base
include ShaAttribute
diff --git a/app/models/merge_request_diff_file.rb b/app/models/merge_request_diff_file.rb
index cd8ba6b904d..a9f110bec5c 100644
--- a/app/models/merge_request_diff_file.rb
+++ b/app/models/merge_request_diff_file.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class MergeRequestDiffFile < ActiveRecord::Base
include Gitlab::EncodingHelper
include DiffFile
diff --git a/app/models/merge_requests_closing_issues.rb b/app/models/merge_requests_closing_issues.rb
index 7f7c114803d..242b65bedc0 100644
--- a/app/models/merge_requests_closing_issues.rb
+++ b/app/models/merge_requests_closing_issues.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class MergeRequestsClosingIssues < ActiveRecord::Base
belongs_to :merge_request
belongs_to :issue
diff --git a/app/models/milestone.rb b/app/models/milestone.rb
index 14cc12b38a5..f2b2d291da9 100644
--- a/app/models/milestone.rb
+++ b/app/models/milestone.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Milestone < ActiveRecord::Base
# Represents a "No Milestone" state used for filtering Issues and Merge
# Requests that have no milestone assigned.
@@ -149,6 +151,10 @@ class Milestone < ActiveRecord::Base
reorder(Gitlab::Database.nulls_last_order('due_date', 'ASC'))
when 'due_date_desc'
reorder(Gitlab::Database.nulls_last_order('due_date', 'DESC'))
+ when 'name_asc'
+ reorder(Arel::Nodes::Ascending.new(arel_table[:title].lower))
+ when 'name_desc'
+ reorder(Arel::Nodes::Descending.new(arel_table[:title].lower))
when 'start_date_asc'
reorder(Gitlab::Database.nulls_last_order('start_date', 'ASC'))
when 'start_date_desc'
diff --git a/app/models/namespace.rb b/app/models/namespace.rb
index 7034c633268..b974309aeb6 100644
--- a/app/models/namespace.rb
+++ b/app/models/namespace.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Namespace < ActiveRecord::Base
include CacheMarkdownField
include Sortable
@@ -122,6 +124,7 @@ class Namespace < ActiveRecord::Base
def to_param
full_path
end
+ alias_method :flipper_id, :to_param
def human_name
owner_name
@@ -304,7 +307,6 @@ class Namespace < ActiveRecord::Base
def write_projects_repository_config
all_projects.find_each do |project|
- project.expires_full_path_cache # we need to clear cache to validate renames correctly
project.write_repository_config
end
end
diff --git a/app/models/note.rb b/app/models/note.rb
index fe3507adcb3..969d34ae09a 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# A note on the root of an issue, merge request, commit, or snippet.
#
# A note of this type is never resolvable.
@@ -101,7 +103,7 @@ class Note < ActiveRecord::Base
scope :inc_author_project, -> { includes(:project, :author) }
scope :inc_author, -> { includes(:author) }
scope :inc_relations_for_view, -> do
- includes(:project, :author, :updated_by, :resolved_by, :award_emoji,
+ includes(:project, { author: :status }, :updated_by, :resolved_by, :award_emoji,
:system_note_metadata, :note_diff_file)
end
diff --git a/app/models/note_diff_file.rb b/app/models/note_diff_file.rb
index e688018a6d9..27aef7adc48 100644
--- a/app/models/note_diff_file.rb
+++ b/app/models/note_diff_file.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class NoteDiffFile < ActiveRecord::Base
include DiffFile
diff --git a/app/models/notification_reason.rb b/app/models/notification_reason.rb
index c3965565022..0a13487574f 100644
--- a/app/models/notification_reason.rb
+++ b/app/models/notification_reason.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# Holds reasons for a notification to have been sent as well as a priority list to select which reason to use
# above the rest
class NotificationReason
diff --git a/app/models/notification_recipient.rb b/app/models/notification_recipient.rb
index 1a03dd9df56..9f16eefe074 100644
--- a/app/models/notification_recipient.rb
+++ b/app/models/notification_recipient.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class NotificationRecipient
include Gitlab::Utils::StrongMemoize
diff --git a/app/models/notification_setting.rb b/app/models/notification_setting.rb
index 1933c46ee44..1df3a51a7fc 100644
--- a/app/models/notification_setting.rb
+++ b/app/models/notification_setting.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class NotificationSetting < ActiveRecord::Base
include IgnorableColumn
diff --git a/app/models/oauth_access_grant.rb b/app/models/oauth_access_grant.rb
index 3a997406565..d5a8a1a25b6 100644
--- a/app/models/oauth_access_grant.rb
+++ b/app/models/oauth_access_grant.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class OauthAccessGrant < Doorkeeper::AccessGrant
belongs_to :resource_owner, class_name: 'User'
belongs_to :application, class_name: 'Doorkeeper::Application'
diff --git a/app/models/oauth_access_token.rb b/app/models/oauth_access_token.rb
index e8595b13d6d..0aa920fa828 100644
--- a/app/models/oauth_access_token.rb
+++ b/app/models/oauth_access_token.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class OauthAccessToken < Doorkeeper::AccessToken
belongs_to :resource_owner, class_name: 'User'
belongs_to :application, class_name: 'Doorkeeper::Application'
diff --git a/app/models/out_of_context_discussion.rb b/app/models/out_of_context_discussion.rb
index 4227c40b69a..4de717e2c51 100644
--- a/app/models/out_of_context_discussion.rb
+++ b/app/models/out_of_context_discussion.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# When notes on a commit are displayed in the context of a merge request that
# contains that commit, they are displayed as if they were a discussion.
#
diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb
index bfea64c3759..7739a3894d3 100644
--- a/app/models/pages_domain.rb
+++ b/app/models/pages_domain.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class PagesDomain < ActiveRecord::Base
VERIFICATION_KEY = 'gitlab-pages-verification-code'.freeze
VERIFICATION_THRESHOLD = 3.days.freeze
diff --git a/app/models/personal_access_token.rb b/app/models/personal_access_token.rb
index 063dc521324..207146479c0 100644
--- a/app/models/personal_access_token.rb
+++ b/app/models/personal_access_token.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class PersonalAccessToken < ActiveRecord::Base
include Expirable
include TokenAuthenticatable
diff --git a/app/models/personal_snippet.rb b/app/models/personal_snippet.rb
index 355624fd552..1b5be8698b1 100644
--- a/app/models/personal_snippet.rb
+++ b/app/models/personal_snippet.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class PersonalSnippet < Snippet
include WithUploads
end
diff --git a/app/models/programming_language.rb b/app/models/programming_language.rb
new file mode 100644
index 00000000000..400d6c407a7
--- /dev/null
+++ b/app/models/programming_language.rb
@@ -0,0 +1,4 @@
+class ProgrammingLanguage < ActiveRecord::Base
+ validates :name, presence: true
+ validates :color, allow_blank: false, color: true
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index f880d728839..02e956911a9 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'carrierwave/orm/activerecord'
class Project < ActiveRecord::Base
@@ -31,6 +33,7 @@ class Project < ActiveRecord::Base
BoardLimitExceeded = Class.new(StandardError)
+ STATISTICS_ATTRIBUTE = 'repositories_count'.freeze
NUMBER_OF_PERMITTED_BOARDS = 1
UNKNOWN_IMPORT_URL = 'http://unknown.git'.freeze
# Hashed Storage versions handle rolling out new storage to project and dependents models:
@@ -79,6 +82,10 @@ class Project < ActiveRecord::Base
after_create :create_project_feature, unless: :project_feature
+ after_create -> { SiteStatistic.track(STATISTICS_ATTRIBUTE) }
+ before_destroy ->(project) { project.project_feature.untrack_statistics_for_deletion! }
+ after_destroy -> { SiteStatistic.untrack(STATISTICS_ATTRIBUTE) }
+
after_create :create_ci_cd_settings,
unless: :ci_cd_settings,
if: proc { ProjectCiCdSetting.available? }
@@ -187,6 +194,7 @@ class Project < ActiveRecord::Base
has_many :hooks, class_name: 'ProjectHook'
has_many :protected_branches
has_many :protected_tags
+ has_many :repository_languages, -> { order "share DESC" }
has_many :project_authorizations
has_many :authorized_users, through: :project_authorizations, source: :user, class_name: 'User'
@@ -543,6 +551,10 @@ class Project < ActiveRecord::Base
repository.commit_by(oid: oid)
end
+ def commits_by(oids:)
+ repository.commits_by(oids: oids)
+ end
+
# ref can't be HEAD, can only be branch/tag name or SHA
def latest_successful_builds_for(ref = default_branch)
latest_pipeline = pipelines.latest_successful_for(ref)
@@ -1233,8 +1245,6 @@ class Project < ActiveRecord::Base
return true if skip_disk_validation
return false unless repository_storage
- expires_full_path_cache # we need to clear cache to validate renames correctly
-
# Check if repository with same path already exists on disk we can
# skip this for the hashed storage because the path does not change
if legacy_storage? && repository_with_same_path_already_exists?
@@ -1558,47 +1568,33 @@ class Project < ActiveRecord::Base
end
def rename_repo
- new_full_path = build_full_path
+ path_before = previous_changes['path'].first
+ full_path_before = full_path_was
+ full_path_after = build_full_path
- Rails.logger.error "Attempting to rename #{full_path_was} -> #{new_full_path}"
+ Gitlab::AppLogger.info("Attempting to rename #{full_path_was} -> #{full_path_after}")
if has_container_registry_tags?
- Rails.logger.error "Project #{full_path_was} cannot be renamed because container registry tags are present!"
+ Gitlab::AppLogger.info("Project #{full_path_was} cannot be renamed because container registry tags are present!")
- # we currently doesn't support renaming repository if it contains images in container registry
+ # we currently don't support renaming repository if it contains images in container registry
raise StandardError.new('Project cannot be renamed, because images are present in its container registry')
end
- expire_caches_before_rename(full_path_was)
+ expire_caches_before_rename(full_path_before)
- if storage.rename_repo
- Gitlab::AppLogger.info "Project was renamed: #{full_path_was} -> #{new_full_path}"
- rename_repo_notify!
- after_rename_repo
+ if rename_or_migrate_repository!
+ Gitlab::AppLogger.info("Project was renamed: #{full_path_before} -> #{full_path_after}")
+ after_rename_repository(full_path_before, path_before)
else
- Rails.logger.error "Repository could not be renamed: #{full_path_was} -> #{new_full_path}"
+ Gitlab::AppLogger.info("Repository could not be renamed: #{full_path_before} -> #{full_path_after}")
# if we cannot move namespace directory we should rollback
# db changes in order to prevent out of sync between db and fs
- raise StandardError.new('repository cannot be renamed')
+ raise StandardError.new('Repository cannot be renamed')
end
end
- def after_rename_repo
- write_repository_config
-
- path_before_change = previous_changes['path'].first
-
- # We need to check if project had been rolled out to move resource to hashed storage or not and decide
- # if we need execute any take action or no-op.
-
- unless hashed_storage?(:attachments)
- Gitlab::UploadsTransfer.new.rename_project(path_before_change, self.path, namespace.full_path)
- end
-
- Gitlab::PagesTransfer.new.rename_project(path_before_change, self.path, namespace.full_path)
- end
-
def write_repository_config(gl_full_path: full_path)
# We'd need to keep track of project full path otherwise directory tree
# created with hashed storage enabled cannot be usefully imported using
@@ -1609,18 +1605,6 @@ class Project < ActiveRecord::Base
nil
end
- def rename_repo_notify!
- # When we import a project overwriting the original project, there
- # is a move operation. In that case we don't want to send the instructions.
- send_move_instructions(full_path_was) unless import_started?
- expires_full_path_cache
-
- self.old_path_with_namespace = full_path_was
- SystemHooksService.new.execute_hooks_for(self, :rename)
-
- reload_repository!
- end
-
def after_import
repository.after_import
wiki.repository.after_import
@@ -2045,6 +2029,39 @@ class Project < ActiveRecord::Base
private
+ def rename_or_migrate_repository!
+ if Gitlab::CurrentSettings.hashed_storage_enabled? && storage_version != LATEST_STORAGE_VERSION
+ ::Projects::HashedStorageMigrationService.new(self, full_path_was).execute
+ else
+ storage.rename_repo
+ end
+ end
+
+ def after_rename_repository(full_path_before, path_before)
+ execute_rename_repository_hooks!(full_path_before)
+
+ write_repository_config
+
+ # We need to check if project had been rolled out to move resource to hashed storage or not and decide
+ # if we need execute any take action or no-op.
+ unless hashed_storage?(:attachments)
+ Gitlab::UploadsTransfer.new.rename_project(path_before, self.path, namespace.full_path)
+ end
+
+ Gitlab::PagesTransfer.new.rename_project(path_before, self.path, namespace.full_path)
+ end
+
+ def execute_rename_repository_hooks!(full_path_before)
+ # When we import a project overwriting the original project, there
+ # is a move operation. In that case we don't want to send the instructions.
+ send_move_instructions(full_path_before) unless import_started?
+
+ self.old_path_with_namespace = full_path_before
+ SystemHooksService.new.execute_hooks_for(self, :rename)
+
+ reload_repository!
+ end
+
def storage
@storage ||=
if hashed_storage?(:repository)
diff --git a/app/models/project_authorization.rb b/app/models/project_authorization.rb
index 73302207e6b..746bb4584c9 100644
--- a/app/models/project_authorization.rb
+++ b/app/models/project_authorization.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectAuthorization < ActiveRecord::Base
belongs_to :user
belongs_to :project
diff --git a/app/models/project_auto_devops.rb b/app/models/project_auto_devops.rb
index faa831b1949..155400d1a43 100644
--- a/app/models/project_auto_devops.rb
+++ b/app/models/project_auto_devops.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectAutoDevops < ActiveRecord::Base
belongs_to :project
diff --git a/app/models/project_ci_cd_setting.rb b/app/models/project_ci_cd_setting.rb
index 588cced5781..1dad235cc2b 100644
--- a/app/models/project_ci_cd_setting.rb
+++ b/app/models/project_ci_cd_setting.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectCiCdSetting < ActiveRecord::Base
belongs_to :project, inverse_of: :ci_cd_settings
diff --git a/app/models/project_custom_attribute.rb b/app/models/project_custom_attribute.rb
index 3f1a7b86a82..4e767cb3b26 100644
--- a/app/models/project_custom_attribute.rb
+++ b/app/models/project_custom_attribute.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectCustomAttribute < ActiveRecord::Base
belongs_to :project
diff --git a/app/models/project_deploy_token.rb b/app/models/project_deploy_token.rb
index ab4482f0c0b..719c492a1ff 100644
--- a/app/models/project_deploy_token.rb
+++ b/app/models/project_deploy_token.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectDeployToken < ActiveRecord::Base
belongs_to :project
belongs_to :deploy_token, inverse_of: :project_deploy_tokens
diff --git a/app/models/project_feature.rb b/app/models/project_feature.rb
index bfb8d703ec9..d74cb2506ba 100644
--- a/app/models/project_feature.rb
+++ b/app/models/project_feature.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectFeature < ActiveRecord::Base
# == Project features permissions
#
@@ -19,6 +21,7 @@ class ProjectFeature < ActiveRecord::Base
ENABLED = 20
FEATURES = %i(issues merge_requests wiki snippets builds repository).freeze
+ STATISTICS_ATTRIBUTE = 'wikis_count'.freeze
class << self
def access_level_attribute(feature)
@@ -52,6 +55,9 @@ class ProjectFeature < ActiveRecord::Base
default_value_for :wiki_access_level, value: ENABLED, allows_nil: false
default_value_for :repository_access_level, value: ENABLED, allows_nil: false
+ after_create ->(model) { SiteStatistic.track(STATISTICS_ATTRIBUTE) if model.wiki_enabled? }
+ after_update :update_site_statistics
+
def feature_available?(feature, user)
get_permission(user, access_level(feature))
end
@@ -76,8 +82,30 @@ class ProjectFeature < ActiveRecord::Base
issues_access_level > DISABLED
end
+ # This is a workaround for the removal hooks not been triggered when removing a Project.
+ #
+ # ProjectFeature is removed using database cascade index rule.
+ # This method is called by Project model when deletion starts.
+ def untrack_statistics_for_deletion!
+ return unless wiki_enabled?
+
+ SiteStatistic.untrack(STATISTICS_ATTRIBUTE)
+ end
+
private
+ def update_site_statistics
+ return unless wiki_access_level_changed?
+
+ if self.wiki_access_level_was == DISABLED
+ # possible new states are PRIVATE / ENABLED, both should be tracked
+ SiteStatistic.track(STATISTICS_ATTRIBUTE)
+ elsif self.wiki_access_level == DISABLED
+ # old state was either PRIVATE / ENABLED, only untrack if new state is DISABLED
+ SiteStatistic.untrack(STATISTICS_ATTRIBUTE)
+ end
+ end
+
# Validates builds and merge requests access level
# which cannot be higher than repository access level
def repository_children_level
diff --git a/app/models/project_group_link.rb b/app/models/project_group_link.rb
index cf8fc41e870..bc3759142ae 100644
--- a/app/models/project_group_link.rb
+++ b/app/models/project_group_link.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectGroupLink < ActiveRecord::Base
include Expirable
diff --git a/app/models/project_import_data.rb b/app/models/project_import_data.rb
index 1d7089ccfc7..2c3080c6d8d 100644
--- a/app/models/project_import_data.rb
+++ b/app/models/project_import_data.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'carrierwave/orm/activerecord'
class ProjectImportData < ActiveRecord::Base
diff --git a/app/models/project_import_state.rb b/app/models/project_import_state.rb
index 1605317ae14..89ed09af96a 100644
--- a/app/models/project_import_state.rb
+++ b/app/models/project_import_state.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectImportState < ActiveRecord::Base
include AfterCommitQueue
diff --git a/app/models/project_label.rb b/app/models/project_label.rb
index 313815e5869..d0b16cc98b4 100644
--- a/app/models/project_label.rb
+++ b/app/models/project_label.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectLabel < Label
MAX_NUMBER_OF_PRIORITIES = 1
diff --git a/app/models/project_snippet.rb b/app/models/project_snippet.rb
index 25b5d777641..b3585c4cf4c 100644
--- a/app/models/project_snippet.rb
+++ b/app/models/project_snippet.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectSnippet < Snippet
belongs_to :project
belongs_to :author, class_name: "User"
diff --git a/app/models/project_statistics.rb b/app/models/project_statistics.rb
index 5d4e3c34b39..781a197d56f 100644
--- a/app/models/project_statistics.rb
+++ b/app/models/project_statistics.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectStatistics < ActiveRecord::Base
belongs_to :project
belongs_to :namespace
@@ -5,7 +7,7 @@ class ProjectStatistics < ActiveRecord::Base
before_save :update_storage_size
COLUMNS_TO_REFRESH = [:repository_size, :lfs_objects_size, :commit_count].freeze
- INCREMENTABLE_COLUMNS = [:build_artifacts_size].freeze
+ INCREMENTABLE_COLUMNS = { build_artifacts_size: %i[storage_size] }.freeze
def total_repository_size
repository_size + lfs_objects_size
@@ -38,11 +40,28 @@ class ProjectStatistics < ActiveRecord::Base
self.storage_size = repository_size + lfs_objects_size + build_artifacts_size
end
+ # Since this incremental update method does not call update_storage_size above,
+ # we have to update the storage_size here as additional column.
+ # Additional columns are updated depending on key => [columns], which allows
+ # to update statistics which are and also those which aren't included in storage_size
+ # or any other additional summary column in the future.
def self.increment_statistic(project_id, key, amount)
- raise ArgumentError, "Cannot increment attribute: #{key}" unless key.in?(INCREMENTABLE_COLUMNS)
+ raise ArgumentError, "Cannot increment attribute: #{key}" unless INCREMENTABLE_COLUMNS.key?(key)
return if amount == 0
where(project_id: project_id)
- .update_all(["#{key} = COALESCE(#{key}, 0) + (?)", amount])
+ .columns_to_increment(key, amount)
+ end
+
+ def self.columns_to_increment(key, amount)
+ updates = ["#{key} = COALESCE(#{key}, 0) + (#{amount})"]
+
+ if (additional = INCREMENTABLE_COLUMNS[key])
+ additional.each do |column|
+ updates << "#{column} = COALESCE(#{column}, 0) + (#{amount})"
+ end
+ end
+
+ update_all(updates.join(', '))
end
end
diff --git a/app/models/project_team.rb b/app/models/project_team.rb
index c7d0f49d837..33bc6a561f9 100644
--- a/app/models/project_team.rb
+++ b/app/models/project_team.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectTeam
include BulkMemberAccessLoad
diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb
index 3aa56b3983f..f4b3421f04b 100644
--- a/app/models/project_wiki.rb
+++ b/app/models/project_wiki.rb
@@ -82,7 +82,7 @@ class ProjectWiki
# Returns an Array of Gitlab WikiPage instances or an
# empty Array if this Wiki has no pages.
- def pages(limit: nil)
+ def pages(limit: 0)
wiki.pages(limit: limit).map { |page| WikiPage.new(self, page, true) }
end
diff --git a/app/models/protectable_dropdown.rb b/app/models/protectable_dropdown.rb
index c96edc5a259..25e70ab406c 100644
--- a/app/models/protectable_dropdown.rb
+++ b/app/models/protectable_dropdown.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProtectableDropdown
REF_TYPES = %i[branches tags].freeze
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb
index dff99cfca35..6c1073265a1 100644
--- a/app/models/protected_branch.rb
+++ b/app/models/protected_branch.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProtectedBranch < ActiveRecord::Base
include Gitlab::ShellAdapter
include ProtectedRef
diff --git a/app/models/protected_ref_matcher.rb b/app/models/protected_ref_matcher.rb
index d970f2b01fc..bfa9180ac93 100644
--- a/app/models/protected_ref_matcher.rb
+++ b/app/models/protected_ref_matcher.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProtectedRefMatcher
def initialize(protected_ref)
@protected_ref = protected_ref
diff --git a/app/models/protected_tag.rb b/app/models/protected_tag.rb
index 42a9bcf7723..a36f0d36262 100644
--- a/app/models/protected_tag.rb
+++ b/app/models/protected_tag.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProtectedTag < ActiveRecord::Base
include Gitlab::ShellAdapter
include ProtectedRef
diff --git a/app/models/push_event.rb b/app/models/push_event.rb
index 90c085c888e..9c0267c3140 100644
--- a/app/models/push_event.rb
+++ b/app/models/push_event.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class PushEvent < Event
# This validation exists so we can't accidentally use PushEvent with a
# different "action" value.
diff --git a/app/models/push_event_payload.rb b/app/models/push_event_payload.rb
index 6cdb1cd4fe9..c7769edf055 100644
--- a/app/models/push_event_payload.rb
+++ b/app/models/push_event_payload.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class PushEventPayload < ActiveRecord::Base
include ShaAttribute
diff --git a/app/models/readme_blob.rb b/app/models/readme_blob.rb
index 1863a08f1de..7b49fa632f6 100644
--- a/app/models/readme_blob.rb
+++ b/app/models/readme_blob.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ReadmeBlob < SimpleDelegator
attr_reader :repository
diff --git a/app/models/redirect_route.rb b/app/models/redirect_route.rb
index 31de204d824..c6bd4bb6dfa 100644
--- a/app/models/redirect_route.rb
+++ b/app/models/redirect_route.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class RedirectRoute < ActiveRecord::Base
belongs_to :source, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
diff --git a/app/models/release.rb b/app/models/release.rb
index c936899799e..cba80ad30ca 100644
--- a/app/models/release.rb
+++ b/app/models/release.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Release < ActiveRecord::Base
include CacheMarkdownField
diff --git a/app/models/remote_mirror.rb b/app/models/remote_mirror.rb
index 976b501e297..833faf3bc82 100644
--- a/app/models/remote_mirror.rb
+++ b/app/models/remote_mirror.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class RemoteMirror < ActiveRecord::Base
include AfterCommitQueue
@@ -48,13 +50,13 @@ class RemoteMirror < ActiveRecord::Base
state :failed
after_transition any => :started do |remote_mirror, _|
- Gitlab::Metrics.add_event(:remote_mirrors_running, path: remote_mirror.project.full_path)
+ Gitlab::Metrics.add_event(:remote_mirrors_running)
remote_mirror.update(last_update_started_at: Time.now)
end
after_transition started: :finished do |remote_mirror, _|
- Gitlab::Metrics.add_event(:remote_mirrors_finished, path: remote_mirror.project.full_path)
+ Gitlab::Metrics.add_event(:remote_mirrors_finished)
timestamp = Time.now
remote_mirror.update!(
@@ -63,7 +65,7 @@ class RemoteMirror < ActiveRecord::Base
end
after_transition started: :failed do |remote_mirror, _|
- Gitlab::Metrics.add_event(:remote_mirrors_failed, path: remote_mirror.project.full_path)
+ Gitlab::Metrics.add_event(:remote_mirrors_failed)
remote_mirror.update(last_update_at: Time.now)
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index e248f94cbd8..69f375dc6f3 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'securerandom'
class Repository
@@ -235,6 +237,12 @@ class Repository
false
end
+ def languages
+ return [] if empty?
+
+ raw_repository.languages(root_ref)
+ end
+
# Makes sure a commit is kept around when Git garbage collection runs.
# Git GC will delete commits from the repository that are no longer in any
# branches or tags, but we want to keep some of these commits around, for
@@ -312,6 +320,8 @@ class Repository
# types - An Array of file types (e.g. `:readme`) used to refresh extra
# caches.
def refresh_method_caches(types)
+ return if types.empty?
+
to_refresh = []
types.each do |type|
@@ -430,6 +440,8 @@ class Repository
# Runs code after a repository has been forked/imported.
def after_import
expire_content_cache
+
+ DetectRepositoryLanguagesWorker.perform_async(project.id, project.owner.id)
end
# Runs code after a new commit has been pushed.
@@ -1029,7 +1041,7 @@ class Repository
end
def repository_event(event, tags = {})
- Gitlab::Metrics.add_event(event, { path: full_path }.merge(tags))
+ Gitlab::Metrics.add_event(event, tags)
end
def initialize_raw_repository
diff --git a/app/models/repository_language.rb b/app/models/repository_language.rb
new file mode 100644
index 00000000000..f467d4eafa3
--- /dev/null
+++ b/app/models/repository_language.rb
@@ -0,0 +1,12 @@
+class RepositoryLanguage < ActiveRecord::Base
+ belongs_to :project
+ belongs_to :programming_language
+
+ default_scope { includes(:programming_language) }
+
+ validates :project, presence: true
+ validates :share, inclusion: { in: 0..100, message: "The share of a lanuage is between 0 and 100" }
+ validates :programming_language, uniqueness: { scope: :project_id }
+
+ delegate :name, :color, to: :programming_language
+end
diff --git a/app/models/resource_label_event.rb b/app/models/resource_label_event.rb
new file mode 100644
index 00000000000..42c255fcd1e
--- /dev/null
+++ b/app/models/resource_label_event.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+# This model is not used yet, it will be used for:
+# https://gitlab.com/gitlab-org/gitlab-ce/issues/48483
+class ResourceLabelEvent < ActiveRecord::Base
+ belongs_to :user
+ belongs_to :issue
+ belongs_to :merge_request
+ belongs_to :label
+
+ validates :user, presence: true, on: :create
+ validates :label, presence: true, on: :create
+ validate :exactly_one_issuable
+
+ enum action: {
+ add: 1,
+ remove: 2
+ }
+
+ def self.issuable_columns
+ %i(issue_id merge_request_id).freeze
+ end
+
+ def issuable
+ issue || merge_request
+ end
+
+ private
+
+ def exactly_one_issuable
+ if self.class.issuable_columns.count { |attr| self[attr] } != 1
+ errors.add(:base, "Exactly one of #{self.class.issuable_columns.join(', ')} is required")
+ end
+ end
+end
diff --git a/app/models/route.rb b/app/models/route.rb
index 2d609920051..4b23dfa5778 100644
--- a/app/models/route.rb
+++ b/app/models/route.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Route < ActiveRecord::Base
include CaseSensitivity
diff --git a/app/models/security_event.rb b/app/models/security_event.rb
index d131c11cb6c..3fe4cc99c9b 100644
--- a/app/models/security_event.rb
+++ b/app/models/security_event.rb
@@ -1,2 +1,4 @@
+# frozen_string_literal: true
+
class SecurityEvent < AuditEvent
end
diff --git a/app/models/sent_notification.rb b/app/models/sent_notification.rb
index 3da7c301d28..e65b3df0fb6 100644
--- a/app/models/sent_notification.rb
+++ b/app/models/sent_notification.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class SentNotification < ActiveRecord::Base
serialize :position, Gitlab::Diff::Position # rubocop:disable Cop/ActiveRecordSerialize
diff --git a/app/models/service.rb b/app/models/service.rb
index cbfe0c6eedd..140058771ee 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# To add new service you should build a class inherited from Service
# and implement a set of methods
class Service < ActiveRecord::Base
diff --git a/app/models/site_statistic.rb b/app/models/site_statistic.rb
new file mode 100644
index 00000000000..9c9c3172fe6
--- /dev/null
+++ b/app/models/site_statistic.rb
@@ -0,0 +1,74 @@
+class SiteStatistic < ActiveRecord::Base
+ # prevents the creation of multiple rows
+ default_value_for :id, 1
+
+ COUNTER_ATTRIBUTES = %w(repositories_count wikis_count).freeze
+ REQUIRED_SCHEMA_VERSION = 20180629153018
+
+ # Tracks specific attribute
+ #
+ # @param [String] raw_attribute must be one of the values listed in COUNTER_ATTRIBUTES
+ def self.track(raw_attribute)
+ with_statistics_available(raw_attribute) do |attribute|
+ SiteStatistic.update_all(["#{attribute} = #{attribute}+1"])
+ end
+ end
+
+ # Untracks specific attribute
+ #
+ # @param [String] raw_attribute must be one of the values listed in COUNTER_ATTRIBUTES
+ def self.untrack(raw_attribute)
+ with_statistics_available(raw_attribute) do |attribute|
+ SiteStatistic.update_all(["#{attribute} = #{attribute}-1 WHERE #{attribute} > 0"])
+ end
+ end
+
+ # Wrapper for track/untrack operations with basic validations and enforced requirements
+ #
+ # @param [String] raw_attribute must be one of the values listed in COUNTER_ATTRIBUTES
+ # @yield [String] attribute quoted to be used inside SQL / Arel query
+ def self.with_statistics_available(raw_attribute)
+ unless raw_attribute.in?(COUNTER_ATTRIBUTES)
+ raise ArgumentError, "Invalid attribute: '#{raw_attribute}' to '#{caller_locations(1, 1)[0].label}' method. " \
+ "Valid attributes are: #{COUNTER_ATTRIBUTES.join(', ')}"
+ end
+
+ return unless available?
+
+ self.fetch # make sure record exists
+
+ attribute = self.connection.quote_column_name(raw_attribute)
+
+ # will be running on its own transaction context
+ yield(attribute)
+ end
+
+ # Returns a site statistic record with tracked information
+ #
+ # @return [SiteStatistic] record with tracked information
+ def self.fetch
+ SiteStatistic.transaction(requires_new: true) do
+ SiteStatistic.first_or_create!
+ end
+ rescue ActiveRecord::RecordNotUnique
+ retry
+ end
+
+ # Return whether required schema change is available
+ #
+ # This is needed in order to degrade gracefully when testing schema migrations
+ #
+ # @return [Boolean] whether schema is available
+ def self.available?
+ @available_flag ||= ActiveRecord::Migrator.current_version >= REQUIRED_SCHEMA_VERSION
+ end
+
+ # Resets cached column information
+ #
+ # This is called during schema migration specs, in order to reset internal cache state
+ def self.reset_column_information
+ @available_flag = nil
+
+ super
+ end
+end
diff --git a/app/models/snippet.rb b/app/models/snippet.rb
index 644120453cf..5b394e3fa79 100644
--- a/app/models/snippet.rb
+++ b/app/models/snippet.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Snippet < ActiveRecord::Base
include Gitlab::VisibilityLevel
include CacheMarkdownField
@@ -49,6 +51,7 @@ class Snippet < ActiveRecord::Base
scope :are_public, -> { where(visibility_level: Snippet::PUBLIC) }
scope :public_and_internal, -> { where(visibility_level: [Snippet::PUBLIC, Snippet::INTERNAL]) }
scope :fresh, -> { order("created_at DESC") }
+ scope :inc_relations_for_view, -> { includes(author: :status) }
participant :author
participant :notes_with_associations
diff --git a/app/models/snippet_blob.rb b/app/models/snippet_blob.rb
index fa5fa151607..cf1ab089829 100644
--- a/app/models/snippet_blob.rb
+++ b/app/models/snippet_blob.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class SnippetBlob
include BlobLike
diff --git a/app/models/spam_log.rb b/app/models/spam_log.rb
index 56a115d1db4..ef3f974b959 100644
--- a/app/models/spam_log.rb
+++ b/app/models/spam_log.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class SpamLog < ActiveRecord::Base
belongs_to :user
diff --git a/app/models/subscription.rb b/app/models/subscription.rb
index 2f0c9640744..0f6ee0ddf7e 100644
--- a/app/models/subscription.rb
+++ b/app/models/subscription.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :project
diff --git a/app/models/system_note_metadata.rb b/app/models/system_note_metadata.rb
index 1c2161accc4..c5c77bc8333 100644
--- a/app/models/system_note_metadata.rb
+++ b/app/models/system_note_metadata.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class SystemNoteMetadata < ActiveRecord::Base
# These notes's action text might contain a reference that is external.
# We should always force a deep validation upon references that are found
diff --git a/app/models/term_agreement.rb b/app/models/term_agreement.rb
index c317bd0c90b..9b3c8ac68bd 100644
--- a/app/models/term_agreement.rb
+++ b/app/models/term_agreement.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class TermAgreement < ActiveRecord::Base
belongs_to :term, class_name: 'ApplicationSetting::Term'
belongs_to :user
diff --git a/app/models/timelog.rb b/app/models/timelog.rb
index 659146f43e4..e04c644a53a 100644
--- a/app/models/timelog.rb
+++ b/app/models/timelog.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Timelog < ActiveRecord::Base
validates :time_spent, :user, presence: true
validate :issuable_id_is_present
diff --git a/app/models/todo.rb b/app/models/todo.rb
index a2ab405fdbe..5f5c2f9073d 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Todo < ActiveRecord::Base
include Sortable
diff --git a/app/models/tree.rb b/app/models/tree.rb
index 4c1856b67a8..3641c33254c 100644
--- a/app/models/tree.rb
+++ b/app/models/tree.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Tree
include Gitlab::MarkupHelper
diff --git a/app/models/trending_project.rb b/app/models/trending_project.rb
index 27e3732da17..7b22e8cb760 100644
--- a/app/models/trending_project.rb
+++ b/app/models/trending_project.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class TrendingProject < ActiveRecord::Base
belongs_to :project
diff --git a/app/models/u2f_registration.rb b/app/models/u2f_registration.rb
index 808acec098f..37598173fd1 100644
--- a/app/models/u2f_registration.rb
+++ b/app/models/u2f_registration.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# Registration information for U2F (universal 2nd factor) devices, like Yubikeys
class U2fRegistration < ActiveRecord::Base
diff --git a/app/models/upload.rb b/app/models/upload.rb
index cf71a7b76fc..23bc9ca42fc 100644
--- a/app/models/upload.rb
+++ b/app/models/upload.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class Upload < ActiveRecord::Base
# Upper limit for foreground checksum processing
CHECKSUM_THRESHOLD = 100.megabytes
diff --git a/app/models/user.rb b/app/models/user.rb
index 58429f8d607..37f2e8b680e 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require 'carrierwave/orm/activerecord'
class User < ActiveRecord::Base
@@ -128,7 +130,7 @@ class User < ActiveRecord::Base
has_many :builds, dependent: :nullify, class_name: 'Ci::Build' # rubocop:disable Cop/ActiveRecordDependent
has_many :pipelines, dependent: :nullify, class_name: 'Ci::Pipeline' # rubocop:disable Cop/ActiveRecordDependent
has_many :todos
- has_many :notification_settings, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
+ has_many :notification_settings
has_many :award_emoji, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
has_many :triggers, dependent: :destroy, class_name: 'Ci::Trigger', foreign_key: :owner_id # rubocop:disable Cop/ActiveRecordDependent
@@ -141,6 +143,8 @@ class User < ActiveRecord::Base
has_many :term_agreements
belongs_to :accepted_term, class_name: 'ApplicationSetting::Term'
+ has_one :status, class_name: 'UserStatus'
+
#
# Validations
#
@@ -248,6 +252,7 @@ class User < ActiveRecord::Base
scope :todo_authors, ->(user_id, state) { where(id: Todo.where(user_id: user_id, state: state).select(:author_id)) }
scope :order_recent_sign_in, -> { reorder(Gitlab::Database.nulls_last_order('current_sign_in_at', 'DESC')) }
scope :order_oldest_sign_in, -> { reorder(Gitlab::Database.nulls_last_order('current_sign_in_at', 'ASC')) }
+ scope :confirmed, -> { where.not(confirmed_at: nil) }
def self.with_two_factor_indistinct
joins("LEFT OUTER JOIN u2f_registrations AS u2f ON u2f.user_id = users.id")
@@ -293,14 +298,17 @@ class User < ActiveRecord::Base
end
# Find a User by their primary email or any associated secondary email
- def find_by_any_email(email)
- by_any_email(email).take
+ def find_by_any_email(email, confirmed: false)
+ by_any_email(email, confirmed: confirmed).take
end
# Returns a relation containing all the users for the given Email address
- def by_any_email(email)
+ def by_any_email(email, confirmed: false)
users = where(email: email)
+ users = users.confirmed if confirmed
+
emails = joins(:emails).where(emails: { email: email })
+ emails = emails.confirmed if confirmed
union = Gitlab::SQL::Union.new([users, emails])
from("(#{union.to_sql}) #{table_name}")
diff --git a/app/models/user_agent_detail.rb b/app/models/user_agent_detail.rb
index 2d05fdd3e54..e2b2e7f1df9 100644
--- a/app/models/user_agent_detail.rb
+++ b/app/models/user_agent_detail.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class UserAgentDetail < ActiveRecord::Base
belongs_to :subject, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations
diff --git a/app/models/user_callout.rb b/app/models/user_callout.rb
index 9d461c6750a..97e955ace36 100644
--- a/app/models/user_callout.rb
+++ b/app/models/user_callout.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class UserCallout < ActiveRecord::Base
belongs_to :user
diff --git a/app/models/user_custom_attribute.rb b/app/models/user_custom_attribute.rb
index eff25b31f9b..e0ffe8ebbfd 100644
--- a/app/models/user_custom_attribute.rb
+++ b/app/models/user_custom_attribute.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class UserCustomAttribute < ActiveRecord::Base
belongs_to :user
diff --git a/app/models/user_interacted_project.rb b/app/models/user_interacted_project.rb
index dd55a6acb79..ae6778e49be 100644
--- a/app/models/user_interacted_project.rb
+++ b/app/models/user_interacted_project.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class UserInteractedProject < ActiveRecord::Base
belongs_to :user
belongs_to :project
diff --git a/app/models/user_status.rb b/app/models/user_status.rb
new file mode 100644
index 00000000000..2bbb0c59ac1
--- /dev/null
+++ b/app/models/user_status.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class UserStatus < ActiveRecord::Base
+ include CacheMarkdownField
+
+ self.primary_key = :user_id
+
+ DEFAULT_EMOJI = 'speech_balloon'.freeze
+
+ belongs_to :user
+
+ validates :user, presence: true
+ validates :emoji, inclusion: { in: Gitlab::Emoji.emojis_names }
+ validates :message, length: { maximum: 100 }, allow_blank: true
+
+ cache_markdown_field :message, pipeline: :emoji
+end
diff --git a/app/models/user_synced_attributes_metadata.rb b/app/models/user_synced_attributes_metadata.rb
index 688432a9d67..7115262942d 100644
--- a/app/models/user_synced_attributes_metadata.rb
+++ b/app/models/user_synced_attributes_metadata.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class UserSyncedAttributesMetadata < ActiveRecord::Base
belongs_to :user
diff --git a/app/models/users_star_project.rb b/app/models/users_star_project.rb
index 0dfe597317e..bdaf58ae1c1 100644
--- a/app/models/users_star_project.rb
+++ b/app/models/users_star_project.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class UsersStarProject < ActiveRecord::Base
belongs_to :project, counter_cache: :star_count, touch: true
belongs_to :user
diff --git a/app/models/wiki_directory.rb b/app/models/wiki_directory.rb
index 9340fc2dbbe..712ba79bbd2 100644
--- a/app/models/wiki_directory.rb
+++ b/app/models/wiki_directory.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class WikiDirectory
include ActiveModel::Validations
diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb
index 55243136140..33790afc35e 100644
--- a/app/models/wiki_page.rb
+++ b/app/models/wiki_page.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# rubocop:disable Rails/ActiveRecordAliases
class WikiPage
PageChangedError = Class.new(StandardError)
diff --git a/app/policies/application_setting/term_policy.rb b/app/policies/application_setting/term_policy.rb
index f03bf748c76..17f00f33d35 100644
--- a/app/policies/application_setting/term_policy.rb
+++ b/app/policies/application_setting/term_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ApplicationSetting
class TermPolicy < BasePolicy
include Gitlab::Utils::StrongMemoize
diff --git a/app/policies/base_policy.rb b/app/policies/base_policy.rb
index 603218aa6df..0d0f1c28bad 100644
--- a/app/policies/base_policy.rb
+++ b/app/policies/base_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
require_dependency 'declarative_policy'
class BasePolicy < DeclarativePolicy::Base
diff --git a/app/policies/ci/build_policy.rb b/app/policies/ci/build_policy.rb
index 75c7e529902..3858b29c82c 100644
--- a/app/policies/ci/build_policy.rb
+++ b/app/policies/ci/build_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class BuildPolicy < CommitStatusPolicy
condition(:protected_ref) do
diff --git a/app/policies/ci/pipeline_policy.rb b/app/policies/ci/pipeline_policy.rb
index b81329d0625..f9623587957 100644
--- a/app/policies/ci/pipeline_policy.rb
+++ b/app/policies/ci/pipeline_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class PipelinePolicy < BasePolicy
delegate { @subject.project }
diff --git a/app/policies/ci/pipeline_schedule_policy.rb b/app/policies/ci/pipeline_schedule_policy.rb
index ecba0488d3c..cf3f784f851 100644
--- a/app/policies/ci/pipeline_schedule_policy.rb
+++ b/app/policies/ci/pipeline_schedule_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class PipelineSchedulePolicy < PipelinePolicy
alias_method :pipeline_schedule, :subject
diff --git a/app/policies/ci/runner_policy.rb b/app/policies/ci/runner_policy.rb
index 895abe87d86..c44f22b6ad3 100644
--- a/app/policies/ci/runner_policy.rb
+++ b/app/policies/ci/runner_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class RunnerPolicy < BasePolicy
with_options scope: :subject, score: 0
diff --git a/app/policies/ci/trigger_policy.rb b/app/policies/ci/trigger_policy.rb
index 5592ac30812..209db44539c 100644
--- a/app/policies/ci/trigger_policy.rb
+++ b/app/policies/ci/trigger_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class TriggerPolicy < BasePolicy
delegate { @subject.project }
diff --git a/app/policies/clusters/cluster_policy.rb b/app/policies/clusters/cluster_policy.rb
index b5b24491655..147943a3d6c 100644
--- a/app/policies/clusters/cluster_policy.rb
+++ b/app/policies/clusters/cluster_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
class ClusterPolicy < BasePolicy
alias_method :cluster, :subject
diff --git a/app/policies/commit_status_policy.rb b/app/policies/commit_status_policy.rb
index 24b2a4cc7fd..eea2a24fb2d 100644
--- a/app/policies/commit_status_policy.rb
+++ b/app/policies/commit_status_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class CommitStatusPolicy < BasePolicy
delegate { @subject.project }
diff --git a/app/policies/concerns/policy_actor.rb b/app/policies/concerns/policy_actor.rb
new file mode 100644
index 00000000000..069d065280e
--- /dev/null
+++ b/app/policies/concerns/policy_actor.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+# Include this module if we want to pass something else than the user to
+# check policies. This defines several methods which the policy checker
+# would call and check.
+module PolicyActor
+ extend ActiveSupport::Concern
+
+ def blocked?
+ false
+ end
+
+ def admin?
+ false
+ end
+
+ def external?
+ false
+ end
+
+ def internal?
+ false
+ end
+
+ def access_locked?
+ false
+ end
+
+ def required_terms_not_accepted?
+ false
+ end
+
+ def can_create_group
+ false
+ end
+end
diff --git a/app/policies/deploy_key_policy.rb b/app/policies/deploy_key_policy.rb
index 62a22a59be6..204c54a5b20 100644
--- a/app/policies/deploy_key_policy.rb
+++ b/app/policies/deploy_key_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class DeployKeyPolicy < BasePolicy
with_options scope: :subject, score: 0
condition(:private_deploy_key) { @subject.private? }
diff --git a/app/policies/deploy_token_policy.rb b/app/policies/deploy_token_policy.rb
index d1b459cfc90..e648df3edfc 100644
--- a/app/policies/deploy_token_policy.rb
+++ b/app/policies/deploy_token_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class DeployTokenPolicy < BasePolicy
with_options scope: :subject, score: 0
condition(:maintainer) { @subject.project.team.maintainer?(@user) }
diff --git a/app/policies/deployment_policy.rb b/app/policies/deployment_policy.rb
index 62b63b9f87b..56ac898b6ab 100644
--- a/app/policies/deployment_policy.rb
+++ b/app/policies/deployment_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class DeploymentPolicy < BasePolicy
delegate { @subject.project }
end
diff --git a/app/policies/environment_policy.rb b/app/policies/environment_policy.rb
index 2d07311db72..d1243491f5a 100644
--- a/app/policies/environment_policy.rb
+++ b/app/policies/environment_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class EnvironmentPolicy < BasePolicy
delegate { @subject.project }
diff --git a/app/policies/external_issue_policy.rb b/app/policies/external_issue_policy.rb
index e031b38078c..1106536e075 100644
--- a/app/policies/external_issue_policy.rb
+++ b/app/policies/external_issue_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ExternalIssuePolicy < BasePolicy
delegate { @subject.project }
end
diff --git a/app/policies/global_policy.rb b/app/policies/global_policy.rb
index 1cf5515d9d7..16c58730878 100644
--- a/app/policies/global_policy.rb
+++ b/app/policies/global_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GlobalPolicy < BasePolicy
desc "User is blocked"
with_options scope: :user, score: 0
@@ -17,6 +19,11 @@ class GlobalPolicy < BasePolicy
@user&.required_terms_not_accepted?
end
+ condition(:private_instance_statistics, score: 0) { Gitlab::CurrentSettings.instance_statistics_visibility_private? }
+
+ rule { admin | (~private_instance_statistics & ~anonymous) }
+ .enable :read_instance_statistics
+
rule { anonymous }.policy do
prevent :log_in
prevent :receive_notifications
diff --git a/app/policies/group_label_policy.rb b/app/policies/group_label_policy.rb
index e3dd3296699..9f3acd44b23 100644
--- a/app/policies/group_label_policy.rb
+++ b/app/policies/group_label_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GroupLabelPolicy < BasePolicy
delegate { @subject.group }
end
diff --git a/app/policies/group_member_policy.rb b/app/policies/group_member_policy.rb
index 23dd0d7cd23..6f1afb87c85 100644
--- a/app/policies/group_member_policy.rb
+++ b/app/policies/group_member_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GroupMemberPolicy < BasePolicy
delegate :group
diff --git a/app/policies/group_policy.rb b/app/policies/group_policy.rb
index dc339b71ec7..a8d7a05f509 100644
--- a/app/policies/group_policy.rb
+++ b/app/policies/group_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GroupPolicy < BasePolicy
desc "Group is public"
with_options scope: :subject, score: 0
diff --git a/app/policies/issuable_policy.rb b/app/policies/issuable_policy.rb
index b431d376e3d..198bb168d85 100644
--- a/app/policies/issuable_policy.rb
+++ b/app/policies/issuable_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class IssuablePolicy < BasePolicy
delegate { @subject.project }
diff --git a/app/policies/issue_policy.rb b/app/policies/issue_policy.rb
index 263c6e3039c..94b5f37c682 100644
--- a/app/policies/issue_policy.rb
+++ b/app/policies/issue_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class IssuePolicy < IssuablePolicy
# This class duplicates the same check of Issue#readable_by? for performance reasons
# Make sure to sync this class checks with issue.rb to avoid security problems.
diff --git a/app/policies/merge_request_policy.rb b/app/policies/merge_request_policy.rb
index c3fe857f8a2..a2950951d03 100644
--- a/app/policies/merge_request_policy.rb
+++ b/app/policies/merge_request_policy.rb
@@ -1,2 +1,4 @@
+# frozen_string_literal: true
+
class MergeRequestPolicy < IssuablePolicy
end
diff --git a/app/policies/namespace_policy.rb b/app/policies/namespace_policy.rb
index eb01218eb0a..2babcb0a2d9 100644
--- a/app/policies/namespace_policy.rb
+++ b/app/policies/namespace_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class NamespacePolicy < BasePolicy
rule { anonymous }.prevent_all
diff --git a/app/policies/nil_policy.rb b/app/policies/nil_policy.rb
index 13f46ba60f0..fc969f8cd05 100644
--- a/app/policies/nil_policy.rb
+++ b/app/policies/nil_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class NilPolicy < BasePolicy
rule { default }.prevent_all
end
diff --git a/app/policies/note_policy.rb b/app/policies/note_policy.rb
index 077a6761ee6..bbc2b48b856 100644
--- a/app/policies/note_policy.rb
+++ b/app/policies/note_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class NotePolicy < BasePolicy
delegate { @subject.project }
delegate { @subject.noteable if DeclarativePolicy.has_policy?(@subject.noteable) }
diff --git a/app/policies/personal_snippet_policy.rb b/app/policies/personal_snippet_policy.rb
index c1a84727cfa..777f933cdcd 100644
--- a/app/policies/personal_snippet_policy.rb
+++ b/app/policies/personal_snippet_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class PersonalSnippetPolicy < BasePolicy
condition(:public_snippet, scope: :subject) { @subject.public? }
condition(:is_author) { @user && @subject.author == @user }
diff --git a/app/policies/project_label_policy.rb b/app/policies/project_label_policy.rb
index 2d0f021118b..5ce896ecaf2 100644
--- a/app/policies/project_label_policy.rb
+++ b/app/policies/project_label_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectLabelPolicy < BasePolicy
delegate { @subject.project }
end
diff --git a/app/policies/project_member_policy.rb b/app/policies/project_member_policy.rb
index 9aedb620be9..f2f18406bd3 100644
--- a/app/policies/project_member_policy.rb
+++ b/app/policies/project_member_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectMemberPolicy < BasePolicy
delegate { @subject.project }
diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb
index bc49092633f..f52a3bad77d 100644
--- a/app/policies/project_policy.rb
+++ b/app/policies/project_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectPolicy < BasePolicy
extend ClassMethods
diff --git a/app/policies/project_policy/class_methods.rb b/app/policies/project_policy/class_methods.rb
index 60e5aba00ba..42d993406a9 100644
--- a/app/policies/project_policy/class_methods.rb
+++ b/app/policies/project_policy/class_methods.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectPolicy
module ClassMethods
def create_read_update_admin_destroy(name)
diff --git a/app/policies/project_snippet_policy.rb b/app/policies/project_snippet_policy.rb
index dd270643bbf..288bf070cfc 100644
--- a/app/policies/project_snippet_policy.rb
+++ b/app/policies/project_snippet_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectSnippetPolicy < BasePolicy
delegate :project
diff --git a/app/policies/protected_branch_policy.rb b/app/policies/protected_branch_policy.rb
index 1a7faa4db40..0e83d2e5834 100644
--- a/app/policies/protected_branch_policy.rb
+++ b/app/policies/protected_branch_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProtectedBranchPolicy < BasePolicy
delegate { @subject.project }
diff --git a/app/policies/user_policy.rb b/app/policies/user_policy.rb
index ee219f0a0d0..e1efd84e510 100644
--- a/app/policies/user_policy.rb
+++ b/app/policies/user_policy.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class UserPolicy < BasePolicy
desc "The current user is the user in question"
condition(:user_is_self, score: 0) { @subject == @user }
@@ -5,11 +7,18 @@ class UserPolicy < BasePolicy
desc "This is the ghost user"
condition(:subject_ghost, scope: :subject, score: 0) { @subject.ghost? }
+ desc "The profile is private"
+ condition(:private_profile, scope: :subject, score: 0) { @subject.private_profile? }
+
rule { ~restricted_public_level }.enable :read_user
rule { ~anonymous }.enable :read_user
rule { ~subject_ghost & (user_is_self | admin) }.policy do
enable :destroy_user
enable :update_user
+ enable :update_user_status
end
+
+ rule { default }.enable :read_user_profile
+ rule { private_profile & ~(user_is_self | admin) }.prevent :read_user_profile
end
diff --git a/app/presenters/ci/build_metadata_presenter.rb b/app/presenters/ci/build_metadata_presenter.rb
index 5048f967ea8..015b1f67db7 100644
--- a/app/presenters/ci/build_metadata_presenter.rb
+++ b/app/presenters/ci/build_metadata_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class BuildMetadataPresenter < Gitlab::View::Presenter::Delegated
TIMEOUT_SOURCES = {
diff --git a/app/presenters/ci/build_presenter.rb b/app/presenters/ci/build_presenter.rb
index e0aaa5cb736..5331cdf632b 100644
--- a/app/presenters/ci/build_presenter.rb
+++ b/app/presenters/ci/build_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class BuildPresenter < CommitStatusPresenter
def erased_by_user?
diff --git a/app/presenters/ci/build_runner_presenter.rb b/app/presenters/ci/build_runner_presenter.rb
new file mode 100644
index 00000000000..02f6c5bdf81
--- /dev/null
+++ b/app/presenters/ci/build_runner_presenter.rb
@@ -0,0 +1,43 @@
+module Ci
+ class BuildRunnerPresenter < SimpleDelegator
+ def artifacts
+ return unless options[:artifacts]
+
+ list = []
+ list << create_archive(options[:artifacts])
+ list << create_reports(options[:artifacts][:reports], expire_in: options[:artifacts][:expire_in])
+ list.flatten.compact
+ end
+
+ private
+
+ def create_archive(artifacts)
+ return unless artifacts[:untracked] || artifacts[:paths]
+
+ {
+ artifact_type: :archive,
+ artifact_format: :zip,
+ name: artifacts[:name],
+ untracked: artifacts[:untracked],
+ paths: artifacts[:paths],
+ when: artifacts[:when],
+ expire_in: artifacts[:expire_in]
+ }
+ end
+
+ def create_reports(reports, expire_in:)
+ return unless reports&.any?
+
+ reports.map do |k, v|
+ {
+ artifact_type: k.to_sym,
+ artifact_format: :gzip,
+ name: ::Ci::JobArtifact::DEFAULT_FILE_NAMES[k.to_sym],
+ paths: v,
+ when: 'always',
+ expire_in: expire_in
+ }
+ end
+ end
+ end
+end
diff --git a/app/presenters/ci/group_variable_presenter.rb b/app/presenters/ci/group_variable_presenter.rb
index 98d68bc7a83..99011150c84 100644
--- a/app/presenters/ci/group_variable_presenter.rb
+++ b/app/presenters/ci/group_variable_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class GroupVariablePresenter < Gitlab::View::Presenter::Delegated
presents :variable
diff --git a/app/presenters/ci/pipeline_presenter.rb b/app/presenters/ci/pipeline_presenter.rb
index cc2bce9862d..93a38f92073 100644
--- a/app/presenters/ci/pipeline_presenter.rb
+++ b/app/presenters/ci/pipeline_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class PipelinePresenter < Gitlab::View::Presenter::Delegated
include Gitlab::Utils::StrongMemoize
diff --git a/app/presenters/ci/variable_presenter.rb b/app/presenters/ci/variable_presenter.rb
index 96159f88c59..f027f3aa560 100644
--- a/app/presenters/ci/variable_presenter.rb
+++ b/app/presenters/ci/variable_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Ci
class VariablePresenter < Gitlab::View::Presenter::Delegated
presents :variable
diff --git a/app/presenters/clusters/cluster_presenter.rb b/app/presenters/clusters/cluster_presenter.rb
index a424da5ab24..dfdd8e82f97 100644
--- a/app/presenters/clusters/cluster_presenter.rb
+++ b/app/presenters/clusters/cluster_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Clusters
class ClusterPresenter < Gitlab::View::Presenter::Delegated
presents :cluster
diff --git a/app/presenters/commit_status_presenter.rb b/app/presenters/commit_status_presenter.rb
index 9a7aaf4ef32..a08f34e2335 100644
--- a/app/presenters/commit_status_presenter.rb
+++ b/app/presenters/commit_status_presenter.rb
@@ -1,16 +1,20 @@
+# frozen_string_literal: true
+
class CommitStatusPresenter < Gitlab::View::Presenter::Delegated
CALLOUT_FAILURE_MESSAGES = {
- unknown_failure: 'There is an unknown failure, please try again',
- api_failure: 'There has been an API failure, please try again',
- stuck_or_timeout_failure: 'There has been a timeout failure or the job got stuck. Check your timeout limits or try again',
- runner_system_failure: 'There has been a runner system failure, please try again',
- missing_dependency_failure: 'There has been a missing dependency failure'
+ unknown_failure: 'There is an unknown failure, please try again',
+ script_failure: nil,
+ api_failure: 'There has been an API failure, please try again',
+ stuck_or_timeout_failure: 'There has been a timeout failure or the job got stuck. Check your timeout limits or try again',
+ runner_system_failure: 'There has been a runner system failure, please try again',
+ missing_dependency_failure: 'There has been a missing dependency failure',
+ runner_unsupported: 'Your runner is outdated, please upgrade your runner'
}.freeze
presents :build
def callout_failure_message
- CALLOUT_FAILURE_MESSAGES[failure_reason.to_sym]
+ CALLOUT_FAILURE_MESSAGES.fetch(failure_reason.to_sym)
end
def recoverable?
diff --git a/app/presenters/conversational_development_index/metric_presenter.rb b/app/presenters/conversational_development_index/metric_presenter.rb
index bb65ba2646b..e0312c6f431 100644
--- a/app/presenters/conversational_development_index/metric_presenter.rb
+++ b/app/presenters/conversational_development_index/metric_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module ConversationalDevelopmentIndex
class MetricPresenter < Gitlab::View::Presenter::Simple
def cards
diff --git a/app/presenters/generic_commit_status_presenter.rb b/app/presenters/generic_commit_status_presenter.rb
index da09df29a37..a1dc72d5b98 100644
--- a/app/presenters/generic_commit_status_presenter.rb
+++ b/app/presenters/generic_commit_status_presenter.rb
@@ -1,2 +1,4 @@
+# frozen_string_literal: true
+
class GenericCommitStatusPresenter < CommitStatusPresenter
end
diff --git a/app/presenters/group_member_presenter.rb b/app/presenters/group_member_presenter.rb
index 8f53dfa105e..c4dcc9e60f9 100644
--- a/app/presenters/group_member_presenter.rb
+++ b/app/presenters/group_member_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class GroupMemberPresenter < MemberPresenter
private
diff --git a/app/presenters/member_presenter.rb b/app/presenters/member_presenter.rb
index 7d2f9303b8f..2497bea4aff 100644
--- a/app/presenters/member_presenter.rb
+++ b/app/presenters/member_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class MemberPresenter < Gitlab::View::Presenter::Delegated
presents :member
diff --git a/app/presenters/members_presenter.rb b/app/presenters/members_presenter.rb
index e4aba37b69e..03ebea36d49 100644
--- a/app/presenters/members_presenter.rb
+++ b/app/presenters/members_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class MembersPresenter < Gitlab::View::Presenter::Delegated
include Enumerable
diff --git a/app/presenters/merge_request_presenter.rb b/app/presenters/merge_request_presenter.rb
index f77b3541644..ffa238a63d5 100644
--- a/app/presenters/merge_request_presenter.rb
+++ b/app/presenters/merge_request_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
include ActionView::Helpers::UrlHelper
include GitlabRoutingHelper
diff --git a/app/presenters/project_member_presenter.rb b/app/presenters/project_member_presenter.rb
index 7f42d2b70df..e4731074e86 100644
--- a/app/presenters/project_member_presenter.rb
+++ b/app/presenters/project_member_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectMemberPresenter < MemberPresenter
private
diff --git a/app/presenters/project_presenter.rb b/app/presenters/project_presenter.rb
index d4d622d84ab..4c2f33213d6 100644
--- a/app/presenters/project_presenter.rb
+++ b/app/presenters/project_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ProjectPresenter < Gitlab::View::Presenter::Delegated
include ActionView::Helpers::NumberHelper
include ActionView::Helpers::UrlHelper
diff --git a/app/presenters/projects/settings/deploy_keys_presenter.rb b/app/presenters/projects/settings/deploy_keys_presenter.rb
index c226586fba5..28eaef00a12 100644
--- a/app/presenters/projects/settings/deploy_keys_presenter.rb
+++ b/app/presenters/projects/settings/deploy_keys_presenter.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Projects
module Settings
class DeployKeysPresenter < Gitlab::View::Presenter::Simple
diff --git a/app/serializers/concerns/user_status_tooltip.rb b/app/serializers/concerns/user_status_tooltip.rb
new file mode 100644
index 00000000000..aa6e67e3351
--- /dev/null
+++ b/app/serializers/concerns/user_status_tooltip.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module UserStatusTooltip
+ extend ActiveSupport::Concern
+ include ActionView::Helpers::TagHelper
+ include ActionView::Context
+ include EmojiHelper
+ include UsersHelper
+
+ included do
+ expose :user_status_if_loaded, as: :status_tooltip_html
+
+ def user_status_if_loaded
+ return nil unless object.association(:status).loaded?
+
+ user_status(object)
+ end
+ end
+end
diff --git a/app/serializers/discussion_entity.rb b/app/serializers/discussion_entity.rb
index 6f95e6f9ca1..b8321037fa5 100644
--- a/app/serializers/discussion_entity.rb
+++ b/app/serializers/discussion_entity.rb
@@ -6,7 +6,6 @@ class DiscussionEntity < Grape::Entity
expose :id, :reply_id
expose :position, if: -> (d, _) { d.diff_discussion? && !d.legacy_diff_discussion? }
- expose :original_position, if: -> (d, _) { d.diff_discussion? && !d.legacy_diff_discussion? }
expose :line_code, if: -> (d, _) { d.diff_discussion? }
expose :expanded?, as: :expanded
expose :active?, as: :active, if: -> (d, _) { d.diff_discussion? }
diff --git a/app/serializers/merge_request_widget_entity.rb b/app/serializers/merge_request_widget_entity.rb
index 4fe04e4b206..f55d448235a 100644
--- a/app/serializers/merge_request_widget_entity.rb
+++ b/app/serializers/merge_request_widget_entity.rb
@@ -132,6 +132,10 @@ class MergeRequestWidgetEntity < IssuableEntity
can?(request.current_user, :create_note, merge_request)
end
+ expose :can_create_issue do |merge_request|
+ can?(current_user, :create_issue, merge_request.project)
+ end
+
expose :can_update do |merge_request|
can?(request.current_user, :update_merge_request, merge_request)
end
@@ -227,6 +231,12 @@ class MergeRequestWidgetEntity < IssuableEntity
end
end
+ expose :test_reports_path do |merge_request|
+ if merge_request.has_test_reports?
+ test_reports_project_merge_request_path(merge_request.project, merge_request, format: :json)
+ end
+ end
+
private
delegate :current_user, to: :request
diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb
index 4a33160afa1..3205578b83e 100644
--- a/app/serializers/pipeline_serializer.rb
+++ b/app/serializers/pipeline_serializer.rb
@@ -11,10 +11,15 @@ class PipelineSerializer < BaseSerializer
:retryable_builds,
:cancelable_statuses,
:trigger_requests,
- :project,
:manual_actions,
:artifacts,
- { pending_builds: :project }
+ {
+ pending_builds: :project,
+ project: [:route, { namespace: :route }],
+ artifacts: {
+ project: [:route, { namespace: :route }]
+ }
+ }
])
end
diff --git a/app/serializers/test_case_entity.rb b/app/serializers/test_case_entity.rb
new file mode 100644
index 00000000000..5c1cbf37182
--- /dev/null
+++ b/app/serializers/test_case_entity.rb
@@ -0,0 +1,7 @@
+class TestCaseEntity < Grape::Entity
+ expose :status
+ expose :name
+ expose :execution_time
+ expose :system_output
+ expose :stack_trace
+end
diff --git a/app/serializers/test_reports_comparer_entity.rb b/app/serializers/test_reports_comparer_entity.rb
new file mode 100644
index 00000000000..b95d820d093
--- /dev/null
+++ b/app/serializers/test_reports_comparer_entity.rb
@@ -0,0 +1,11 @@
+class TestReportsComparerEntity < Grape::Entity
+ expose :total_status, as: :status
+
+ expose :summary do
+ expose :total_count, as: :total
+ expose :resolved_count, as: :resolved
+ expose :failed_count, as: :failed
+ end
+
+ expose :suite_comparers, as: :suites, using: TestSuiteComparerEntity
+end
diff --git a/app/serializers/test_reports_comparer_serializer.rb b/app/serializers/test_reports_comparer_serializer.rb
new file mode 100644
index 00000000000..a739858efb2
--- /dev/null
+++ b/app/serializers/test_reports_comparer_serializer.rb
@@ -0,0 +1,3 @@
+class TestReportsComparerSerializer < BaseSerializer
+ entity TestReportsComparerEntity
+end
diff --git a/app/serializers/test_suite_comparer_entity.rb b/app/serializers/test_suite_comparer_entity.rb
new file mode 100644
index 00000000000..a3965ba3930
--- /dev/null
+++ b/app/serializers/test_suite_comparer_entity.rb
@@ -0,0 +1,14 @@
+class TestSuiteComparerEntity < Grape::Entity
+ expose :name
+ expose :total_status, as: :status
+
+ expose :summary do
+ expose :total_count, as: :total
+ expose :resolved_count, as: :resolved
+ expose :failed_count, as: :failed
+ end
+
+ expose :new_failures, using: TestCaseEntity
+ expose :resolved_failures, using: TestCaseEntity
+ expose :existing_failures, using: TestCaseEntity
+end
diff --git a/app/serializers/user_entity.rb b/app/serializers/user_entity.rb
index 6236d66ff4a..656900bb8af 100644
--- a/app/serializers/user_entity.rb
+++ b/app/serializers/user_entity.rb
@@ -2,6 +2,7 @@
class UserEntity < API::Entities::UserBasic
include RequestAwareEntity
+ include UserStatusTooltip
expose :path do |user|
user_path(user)
diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb
index 81857d0cb4c..893b37b831a 100644
--- a/app/services/auth/container_registry_authentication_service.rb
+++ b/app/services/auth/container_registry_authentication_service.rb
@@ -9,11 +9,11 @@ module Auth
return error('UNAVAILABLE', status: 404, message: 'registry not enabled') unless registry.enabled
- unless scope || current_user || project
+ unless scopes.any? || current_user || project
return error('DENIED', status: 403, message: 'access forbidden')
end
- { token: authorized_token(scope).encoded }
+ { token: authorized_token(*scopes).encoded }
end
def self.full_access_token(*names)
@@ -47,10 +47,12 @@ module Auth
end
end
- def scope
- return unless params[:scope]
+ def scopes
+ return [] unless params[:scopes]
- @scope ||= process_scope(params[:scope])
+ @scopes ||= params[:scopes].map do |scope|
+ process_scope(scope)
+ end.compact
end
def process_scope(scope)
diff --git a/app/services/boards/issues/list_service.rb b/app/services/boards/issues/list_service.rb
index 50c11be0d15..0db1418b37a 100644
--- a/app/services/boards/issues/list_service.rb
+++ b/app/services/boards/issues/list_service.rb
@@ -3,14 +3,35 @@
module Boards
module Issues
class ListService < Boards::BaseService
+ include Gitlab::Utils::StrongMemoize
+
def execute
- issues = IssuesFinder.new(current_user, filter_params).execute
- issues = filter(issues)
- issues.order_by_position_and_priority
+ fetch_issues.order_by_position_and_priority
+ end
+
+ def metadata
+ keys = metadata_fields.keys
+ columns = metadata_fields.values_at(*keys).join(', ')
+ results = Issue.where(id: fetch_issues.select('issues.id')).pluck(columns)
+
+ Hash[keys.zip(results.flatten)]
end
private
+ def metadata_fields
+ { size: 'COUNT(*)' }
+ end
+
+ # We memoize the query here since the finder methods we use are quite complex. This does not memoize the result of the query.
+ def fetch_issues
+ strong_memoize(:fetch_issues) do
+ issues = IssuesFinder.new(current_user, filter_params).execute
+
+ filter(issues).reorder(nil)
+ end
+ end
+
def filter(issues)
issues = without_board_labels(issues) unless list&.movable? || list&.closed?
issues = with_list_label(issues) if list&.label?
diff --git a/app/services/ci/compare_test_reports_service.rb b/app/services/ci/compare_test_reports_service.rb
new file mode 100644
index 00000000000..7a112211d94
--- /dev/null
+++ b/app/services/ci/compare_test_reports_service.rb
@@ -0,0 +1,24 @@
+# frozen_string_literal: true
+
+module Ci
+ class CompareTestReportsService < ::BaseService
+ def execute(base_pipeline_iid, head_pipeline_iid)
+ base_pipeline = project.pipelines.find_by_iid(base_pipeline_iid) if base_pipeline_iid
+ head_pipeline = project.pipelines.find_by_iid(head_pipeline_iid)
+
+ begin
+ comparer = Gitlab::Ci::Reports::TestReportsComparer
+ .new(base_pipeline&.test_reports, head_pipeline.test_reports)
+
+ {
+ status: :parsed,
+ data: TestReportsComparerSerializer
+ .new(project: project)
+ .represent(comparer).as_json
+ }
+ rescue => e
+ { status: :error, status_reason: e.message }
+ end
+ end
+ end
+end
diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb
index f7ccec3a700..11f85627faf 100644
--- a/app/services/ci/register_job_service.rb
+++ b/app/services/ci/register_job_service.rb
@@ -41,16 +41,10 @@ module Ci
begin
# In case when 2 runners try to assign the same build, second runner will be declined
# with StateMachines::InvalidTransition or StaleObjectError when doing run! or save method.
- begin
- build.runner_id = runner.id
- build.runner_session_attributes = params[:session] if params[:session].present?
-
- build.run!
+ if assign_runner!(build, params)
register_success(build)
return Result.new(build, true) # rubocop:disable Cop/AvoidReturnFromBlocks
- rescue Ci::Build::MissingDependenciesError
- build.drop!(:missing_dependency_failure)
end
rescue StateMachines::InvalidTransition, ActiveRecord::StaleObjectError
# We are looping to find another build that is not conflicting
@@ -72,6 +66,24 @@ module Ci
private
+ def assign_runner!(build, params)
+ build.runner_id = runner.id
+ build.runner_session_attributes = params[:session] if params[:session].present?
+
+ unless build.has_valid_build_dependencies?
+ build.drop!(:missing_dependency_failure)
+ return false
+ end
+
+ unless build.supported_runner?(params.dig(:info, :features))
+ build.drop!(:runner_unsupported)
+ return false
+ end
+
+ build.run!
+ true
+ end
+
def builds_for_shared_runner
new_builds.
# don't run projects which have not enabled shared runners and builds
diff --git a/app/services/clusters/applications/check_installation_progress_service.rb b/app/services/clusters/applications/check_installation_progress_service.rb
index 4640c5a2d4b..35f5cff0e0c 100644
--- a/app/services/clusters/applications/check_installation_progress_service.rb
+++ b/app/services/clusters/applications/check_installation_progress_service.rb
@@ -35,7 +35,7 @@ module Clusters
def check_timeout
if timeouted?
begin
- app.make_errored!('Installation timeouted')
+ app.make_errored!('Installation timed out')
ensure
remove_installation_pod
end
@@ -50,17 +50,17 @@ module Clusters
end
def remove_installation_pod
- helm_api.delete_installation_pod!(install_command.pod_name)
+ helm_api.delete_pod!(install_command.pod_name)
rescue
# no-op
end
def installation_phase
- helm_api.installation_status(install_command.pod_name)
+ helm_api.status(install_command.pod_name)
end
def installation_errors
- helm_api.installation_log(install_command.pod_name)
+ helm_api.log(install_command.pod_name)
end
end
end
diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb
index 29c8ce5fea3..637c1df4ad9 100644
--- a/app/services/git_push_service.rb
+++ b/app/services/git_push_service.rb
@@ -3,6 +3,7 @@
class GitPushService < BaseService
attr_accessor :push_data, :push_commits
include Gitlab::Access
+ include Gitlab::Utils::StrongMemoize
# The N most recent commits to process in a single push payload.
PROCESS_COMMIT_LIMIT = 100
@@ -21,14 +22,14 @@ class GitPushService < BaseService
# 6. Checks if the project's main language has changed
#
def execute
- @project.repository.after_create if @project.empty_repo?
- @project.repository.after_push_commit(branch_name)
+ project.repository.after_create if project.empty_repo?
+ project.repository.after_push_commit(branch_name)
if push_remove_branch?
- @project.repository.after_remove_branch
+ project.repository.after_remove_branch
@push_commits = []
elsif push_to_new_branch?
- @project.repository.after_create_branch
+ project.repository.after_create_branch
# Re-find the pushed commits.
if default_branch?
@@ -38,14 +39,14 @@ class GitPushService < BaseService
# Use the pushed commits that aren't reachable by the default branch
# as a heuristic. This may include more commits than are actually pushed, but
# that shouldn't matter because we check for existing cross-references later.
- @push_commits = @project.repository.commits_between(@project.default_branch, params[:newrev])
+ @push_commits = project.repository.commits_between(project.default_branch, params[:newrev])
# don't process commits for the initial push to the default branch
process_commit_messages
end
elsif push_to_existing_branch?
# Collect data for this git push
- @push_commits = @project.repository.commits_between(params[:oldrev], params[:newrev])
+ @push_commits = project.repository.commits_between(params[:oldrev], params[:newrev])
process_commit_messages
@@ -64,7 +65,7 @@ class GitPushService < BaseService
end
def update_gitattributes
- @project.repository.copy_gitattributes(params[:ref])
+ project.repository.copy_gitattributes(params[:ref])
end
def update_caches
@@ -76,7 +77,7 @@ class GitPushService < BaseService
else
paths = Set.new
- @push_commits.last(PROCESS_COMMIT_LIMIT).each do |commit|
+ last_pushed_commits.each do |commit|
commit.raw_deltas.each do |diff|
paths << diff.new_path
end
@@ -84,15 +85,17 @@ class GitPushService < BaseService
types = Gitlab::FileDetector.types_in_paths(paths.to_a)
end
+
+ DetectRepositoryLanguagesWorker.perform_async(@project.id, current_user.id)
else
types = []
end
- ProjectCacheWorker.perform_async(@project.id, types, [:commit_count, :repository_size])
+ ProjectCacheWorker.perform_async(project.id, types, [:commit_count, :repository_size])
end
def update_signatures
- commit_shas = @push_commits.last(PROCESS_COMMIT_LIMIT).map(&:sha)
+ commit_shas = last_pushed_commits.map(&:sha)
return if commit_shas.empty?
@@ -103,16 +106,14 @@ class GitPushService < BaseService
commit_shas = Gitlab::Git::Commit.shas_with_signatures(project.repository, commit_shas)
- commit_shas.each do |sha|
- CreateGpgSignatureWorker.perform_async(sha, project.id)
- end
+ CreateGpgSignatureWorker.perform_async(commit_shas, project.id)
end
# Schedules processing of commit messages.
def process_commit_messages
default = default_branch?
- @push_commits.last(PROCESS_COMMIT_LIMIT).each do |commit|
+ last_pushed_commits.each do |commit|
if commit.matches_cross_reference_regex?
ProcessCommitWorker
.perform_async(project.id, current_user.id, commit.to_hash, default)
@@ -123,10 +124,10 @@ class GitPushService < BaseService
protected
def update_remote_mirrors
- return unless @project.has_remote_mirror?
+ return unless project.has_remote_mirror?
- @project.mark_stuck_remote_mirrors_as_failed!
- @project.update_remote_mirrors
+ project.mark_stuck_remote_mirrors_as_failed!
+ project.update_remote_mirrors
end
def execute_related_hooks
@@ -134,14 +135,14 @@ class GitPushService < BaseService
# could cause the last commit of a merge request to change.
#
UpdateMergeRequestsWorker
- .perform_async(@project.id, current_user.id, params[:oldrev], params[:newrev], params[:ref])
+ .perform_async(project.id, current_user.id, params[:oldrev], params[:newrev], params[:ref])
- EventCreateService.new.push(@project, current_user, build_push_data)
- Ci::CreatePipelineService.new(@project, current_user, build_push_data).execute(:push)
+ EventCreateService.new.push(project, current_user, build_push_data)
+ Ci::CreatePipelineService.new(project, current_user, build_push_data).execute(:push)
SystemHookPushWorker.perform_async(build_push_data.dup, :push_hooks)
- @project.execute_hooks(build_push_data.dup, :push_hooks)
- @project.execute_services(build_push_data.dup, :push_hooks)
+ project.execute_hooks(build_push_data.dup, :push_hooks)
+ project.execute_services(build_push_data.dup, :push_hooks)
if push_remove_branch?
AfterBranchDeleteService
@@ -151,52 +152,50 @@ class GitPushService < BaseService
end
def perform_housekeeping
- housekeeping = Projects::HousekeepingService.new(@project)
+ housekeeping = Projects::HousekeepingService.new(project)
housekeeping.increment!
housekeeping.execute if housekeeping.needed?
rescue Projects::HousekeepingService::LeaseTaken
end
def process_default_branch
- @push_commits_count = project.repository.commit_count_for_ref(params[:ref])
-
- offset = [@push_commits_count - PROCESS_COMMIT_LIMIT, 0].max
+ offset = [push_commits_count - PROCESS_COMMIT_LIMIT, 0].max
@push_commits = project.repository.commits(params[:newrev], offset: offset, limit: PROCESS_COMMIT_LIMIT)
- @project.after_create_default_branch
+ project.after_create_default_branch
end
def build_push_data
@push_data ||= Gitlab::DataBuilder::Push.build(
- @project,
+ project,
current_user,
params[:oldrev],
params[:newrev],
params[:ref],
@push_commits,
- commits_count: @push_commits_count)
+ commits_count: push_commits_count)
end
def push_to_existing_branch?
# Return if this is not a push to a branch (e.g. new commits)
- Gitlab::Git.branch_ref?(params[:ref]) && !Gitlab::Git.blank_ref?(params[:oldrev])
+ branch_ref? && !Gitlab::Git.blank_ref?(params[:oldrev])
end
def push_to_new_branch?
- Gitlab::Git.branch_ref?(params[:ref]) && Gitlab::Git.blank_ref?(params[:oldrev])
+ strong_memoize(:push_to_new_branch) do
+ branch_ref? && Gitlab::Git.blank_ref?(params[:oldrev])
+ end
end
def push_remove_branch?
- Gitlab::Git.branch_ref?(params[:ref]) && Gitlab::Git.blank_ref?(params[:newrev])
- end
-
- def push_to_branch?
- Gitlab::Git.branch_ref?(params[:ref])
+ strong_memoize(:push_remove_branch) do
+ branch_ref? && Gitlab::Git.blank_ref?(params[:newrev])
+ end
end
def default_branch?
- Gitlab::Git.branch_ref?(params[:ref]) &&
- (Gitlab::Git.ref_name(params[:ref]) == project.default_branch || project.default_branch.nil?)
+ branch_ref? &&
+ (branch_name == project.default_branch || project.default_branch.nil?)
end
def commit_user(commit)
@@ -204,6 +203,24 @@ class GitPushService < BaseService
end
def branch_name
- @branch_name ||= Gitlab::Git.ref_name(params[:ref])
+ strong_memoize(:branch_name) do
+ Gitlab::Git.ref_name(params[:ref])
+ end
+ end
+
+ def branch_ref?
+ strong_memoize(:branch_ref) do
+ Gitlab::Git.branch_ref?(params[:ref])
+ end
+ end
+
+ def push_commits_count
+ strong_memoize(:push_commits_count) do
+ project.repository.commit_count_for_ref(params[:ref])
+ end
+ end
+
+ def last_pushed_commits
+ @last_pushed_commits ||= @push_commits.last(PROCESS_COMMIT_LIMIT)
end
end
diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb
index 3ff2d1d107d..dbadafc0f52 100644
--- a/app/services/git_tag_push_service.rb
+++ b/app/services/git_tag_push_service.rb
@@ -9,12 +9,12 @@ class GitTagPushService < BaseService
@push_data = build_push_data
- EventCreateService.new.push(project, current_user, @push_data)
- Ci::CreatePipelineService.new(project, current_user, @push_data).execute(:push)
+ EventCreateService.new.push(project, current_user, push_data)
+ Ci::CreatePipelineService.new(project, current_user, push_data).execute(:push)
- SystemHooksService.new.execute_hooks(build_system_push_data.dup, :tag_push_hooks)
- project.execute_hooks(@push_data.dup, :tag_push_hooks)
- project.execute_services(@push_data.dup, :tag_push_hooks)
+ SystemHooksService.new.execute_hooks(build_system_push_data, :tag_push_hooks)
+ project.execute_hooks(push_data.dup, :tag_push_hooks)
+ project.execute_services(push_data.dup, :tag_push_hooks)
ProjectCacheWorker.perform_async(project.id, [], [:commit_count, :repository_size])
diff --git a/app/services/issues/update_service.rb b/app/services/issues/update_service.rb
index c02dddf67b2..faa4c8a5a4f 100644
--- a/app/services/issues/update_service.rb
+++ b/app/services/issues/update_service.rb
@@ -37,6 +37,8 @@ module Issues
end
if issue.previous_changes.include?('confidential')
+ # don't enqueue immediately to prevent todos removal in case of a mistake
+ TodosDestroyer::ConfidentialIssueWorker.perform_in(1.hour, issue.id) if issue.confidential?
create_confidentiality_note(issue)
end
diff --git a/app/services/members/destroy_service.rb b/app/services/members/destroy_service.rb
index aca0ba66646..c186a5971dc 100644
--- a/app/services/members/destroy_service.rb
+++ b/app/services/members/destroy_service.rb
@@ -15,6 +15,8 @@ module Members
notification_service.decline_access_request(member)
end
+ enqeue_delete_todos(member)
+
after_execute(member: member)
member
@@ -22,6 +24,12 @@ module Members
private
+ def enqeue_delete_todos(member)
+ type = member.is_a?(GroupMember) ? 'Group' : 'Project'
+ # don't enqueue immediately to prevent todos removal in case of a mistake
+ TodosDestroyer::EntityLeaveWorker.perform_in(1.hour, member.user_id, member.source_id, type)
+ end
+
def can_destroy_member?(member)
can?(current_user, destroy_member_permission(member), member)
end
diff --git a/app/services/projects/create_from_template_service.rb b/app/services/projects/create_from_template_service.rb
index f5c48e56880..8306d43ca7c 100644
--- a/app/services/projects/create_from_template_service.rb
+++ b/app/services/projects/create_from_template_service.rb
@@ -2,21 +2,27 @@
module Projects
class CreateFromTemplateService < BaseService
+ include Gitlab::Utils::StrongMemoize
+
def initialize(user, params)
@current_user, @params = user, params.dup
end
def execute
- template_name = params.delete(:template_name)
- file = Gitlab::ProjectTemplate.find(template_name).file
+ file = Gitlab::ProjectTemplate.find(template_name)&.file
override_params = params.dup
params[:file] = file
GitlabProjectsImportService.new(current_user, params, override_params).execute
-
ensure
file&.close
end
+
+ def template_name
+ strong_memoize(:template_name) do
+ params.delete(:template_name).presence
+ end
+ end
end
end
diff --git a/app/services/projects/detect_repository_languages_service.rb b/app/services/projects/detect_repository_languages_service.rb
new file mode 100644
index 00000000000..4b4108de231
--- /dev/null
+++ b/app/services/projects/detect_repository_languages_service.rb
@@ -0,0 +1,52 @@
+module Projects
+ class DetectRepositoryLanguagesService < BaseService
+ attr_reader :detected_repository_languages, :programming_languages
+
+ def execute
+ repository_languages = project.repository_languages
+ detection = Gitlab::LanguageDetection.new(repository, repository_languages)
+
+ matching_programming_languages = ensure_programming_languages(detection)
+
+ RepositoryLanguage.transaction do
+ project.repository_languages.where(programming_language_id: detection.deletions).delete_all
+
+ detection.updates.each do |update|
+ RepositoryLanguage
+ .where(project_id: project.id)
+ .where(programming_language_id: update[:programming_language_id])
+ .update_all(share: update[:share])
+ end
+
+ Gitlab::Database.bulk_insert(
+ RepositoryLanguage.table_name,
+ detection.insertions(matching_programming_languages)
+ )
+ end
+
+ project.repository_languages.reload
+ end
+
+ private
+
+ def ensure_programming_languages(detection)
+ existing_languages = ProgrammingLanguage.where(name: detection.languages)
+ return existing_languages if detection.languages.size == existing_languages.size
+
+ missing_languages = detection.languages - existing_languages.map(&:name)
+ created_languages = missing_languages.map do |name|
+ create_language(name, detection.language_color(name))
+ end
+
+ existing_languages + created_languages
+ end
+
+ def create_language(name, color)
+ ProgrammingLanguage.transaction do
+ ProgrammingLanguage.where(name: name).first_or_create(color: color)
+ end
+ rescue ActiveRecord::RecordNotUnique
+ retry
+ end
+ end
+end
diff --git a/app/services/projects/gitlab_projects_import_service.rb b/app/services/projects/gitlab_projects_import_service.rb
index bc6e9caebb8..044afa1d5e1 100644
--- a/app/services/projects/gitlab_projects_import_service.rb
+++ b/app/services/projects/gitlab_projects_import_service.rb
@@ -5,6 +5,9 @@
# The latter will under the hood just import an archive supplied by GitLab.
module Projects
class GitlabProjectsImportService
+ include Gitlab::Utils::StrongMemoize
+ include Gitlab::TemplateHelper
+
attr_reader :current_user, :params
def initialize(user, import_params, override_params = nil)
@@ -12,39 +15,17 @@ module Projects
end
def execute
- FileUtils.mkdir_p(File.dirname(import_upload_path))
-
- file = params.delete(:file)
- FileUtils.copy_entry(file.path, import_upload_path)
-
- @overwrite = params.delete(:overwrite)
- data = {}
- data[:override_params] = @override_params if @override_params
-
- if overwrite_project?
- data[:original_path] = params[:path]
- params[:path] += "-#{tmp_filename}"
- end
+ prepare_template_environment(template_file)
- params[:import_type] = 'gitlab_project'
- params[:import_source] = import_upload_path
- params[:import_data] = { data: data } if data.present?
+ prepare_import_params
::Projects::CreateService.new(current_user, params).execute
end
private
- def import_upload_path
- @import_upload_path ||= Gitlab::ImportExport.import_upload_path(filename: tmp_filename)
- end
-
- def tmp_filename
- SecureRandom.hex
- end
-
def overwrite_project?
- @overwrite && project_with_same_full_path?
+ overwrite? && project_with_same_full_path?
end
def project_with_same_full_path?
@@ -52,7 +33,37 @@ module Projects
end
def current_namespace
- @current_namespace ||= Namespace.find_by(id: params[:namespace_id])
+ strong_memoize(:current_namespace) do
+ Namespace.find_by(id: params[:namespace_id])
+ end
+ end
+
+ def overwrite?
+ strong_memoize(:overwrite) do
+ params.delete(:overwrite)
+ end
+ end
+
+ def template_file
+ strong_memoize(:template_file) do
+ params.delete(:file)
+ end
+ end
+
+ def prepare_import_params
+ data = {}
+ data[:override_params] = @override_params if @override_params
+
+ if overwrite_project?
+ data[:original_path] = params[:path]
+ params[:path] += "-#{tmp_filename}"
+ end
+
+ if template_file
+ params[:import_type] = 'gitlab_project'
+ end
+
+ params[:import_data] = { data: data } if data.present?
end
end
end
diff --git a/app/services/projects/hashed_storage/migrate_attachments_service.rb b/app/services/projects/hashed_storage/migrate_attachments_service.rb
index 649c916a593..a1f0302aeb7 100644
--- a/app/services/projects/hashed_storage/migrate_attachments_service.rb
+++ b/app/services/projects/hashed_storage/migrate_attachments_service.rb
@@ -5,18 +5,20 @@ module Projects
AttachmentMigrationError = Class.new(StandardError)
class MigrateAttachmentsService < BaseService
- attr_reader :logger, :old_path, :new_path
+ attr_reader :logger, :old_disk_path, :new_disk_path
- def initialize(project, logger = nil)
+ def initialize(project, old_disk_path, logger: nil)
@project = project
@logger = logger || Rails.logger
+ @old_disk_path = old_disk_path
+ @new_disk_path = project.disk_path
end
def execute
- @old_path = project.full_path
- @new_path = project.disk_path
-
origin = FileUploader.absolute_base_dir(project)
+ # It's possible that old_disk_path does not match project.disk_path. For example, that happens when we rename a project
+ origin.sub!(/#{Regexp.escape(project.full_path)}\z/, old_disk_path)
+
project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:attachments]
target = FileUploader.absolute_base_dir(project)
@@ -32,22 +34,22 @@ module Projects
private
- def move_folder!(old_path, new_path)
- unless File.directory?(old_path)
- logger.info("Skipped attachments migration from '#{old_path}' to '#{new_path}', source path doesn't exist or is not a directory (PROJECT_ID=#{project.id})")
+ def move_folder!(old_disk_path, new_disk_path)
+ unless File.directory?(old_disk_path)
+ logger.info("Skipped attachments migration from '#{old_disk_path}' to '#{new_disk_path}', source path doesn't exist or is not a directory (PROJECT_ID=#{project.id})")
return
end
- if File.exist?(new_path)
- logger.error("Cannot migrate attachments from '#{old_path}' to '#{new_path}', target path already exist (PROJECT_ID=#{project.id})")
- raise AttachmentMigrationError, "Target path '#{new_path}' already exist"
+ if File.exist?(new_disk_path)
+ logger.error("Cannot migrate attachments from '#{old_disk_path}' to '#{new_disk_path}', target path already exist (PROJECT_ID=#{project.id})")
+ raise AttachmentMigrationError, "Target path '#{new_disk_path}' already exist"
end
# Create hashed storage base path folder
- FileUtils.mkdir_p(File.dirname(new_path))
+ FileUtils.mkdir_p(File.dirname(new_disk_path))
- FileUtils.mv(old_path, new_path)
- logger.info("Migrated project attachments from '#{old_path}' to '#{new_path}' (PROJECT_ID=#{project.id})")
+ FileUtils.mv(old_disk_path, new_disk_path)
+ logger.info("Migrated project attachments from '#{old_disk_path}' to '#{new_disk_path}' (PROJECT_ID=#{project.id})")
true
end
diff --git a/app/services/projects/hashed_storage/migrate_repository_service.rb b/app/services/projects/hashed_storage/migrate_repository_service.rb
index 70f00b7fdeb..641d46e6591 100644
--- a/app/services/projects/hashed_storage/migrate_repository_service.rb
+++ b/app/services/projects/hashed_storage/migrate_repository_service.rb
@@ -5,28 +5,27 @@ module Projects
class MigrateRepositoryService < BaseService
include Gitlab::ShellAdapter
- attr_reader :old_disk_path, :new_disk_path, :old_wiki_disk_path, :old_storage_version, :logger
+ attr_reader :old_disk_path, :new_disk_path, :old_wiki_disk_path, :old_storage_version, :logger, :move_wiki
- def initialize(project, logger = nil)
+ def initialize(project, old_disk_path, logger: nil)
@project = project
@logger = logger || Rails.logger
+ @old_disk_path = old_disk_path
+ @old_wiki_disk_path = "#{old_disk_path}.wiki"
+ @move_wiki = has_wiki?
end
def execute
- @old_disk_path = project.disk_path
- has_wiki = project.wiki.repository_exists?
-
@old_storage_version = project.storage_version
project.storage_version = ::Project::HASHED_STORAGE_FEATURES[:repository]
project.ensure_storage_path_exists
@new_disk_path = project.disk_path
- result = move_repository(@old_disk_path, @new_disk_path)
+ result = move_repository(old_disk_path, new_disk_path)
- if has_wiki
- @old_wiki_disk_path = "#{@old_disk_path}.wiki"
- result &&= move_repository("#{@old_wiki_disk_path}", "#{@new_disk_path}.wiki")
+ if move_wiki
+ result &&= move_repository("#{old_wiki_disk_path}", "#{new_disk_path}.wiki")
end
if result
@@ -48,6 +47,10 @@ module Projects
private
+ def has_wiki?
+ gitlab_shell.exists?(project.repository_storage, "#{old_wiki_disk_path}.git")
+ end
+
def move_repository(from_name, to_name)
from_exists = gitlab_shell.exists?(project.repository_storage, "#{from_name}.git")
to_exists = gitlab_shell.exists?(project.repository_storage, "#{to_name}.git")
@@ -66,8 +69,8 @@ module Projects
end
def rollback_folder_move
- move_repository(@new_disk_path, @old_disk_path)
- move_repository("#{@new_disk_path}.wiki", "#{@old_disk_path}.wiki")
+ move_repository(new_disk_path, old_disk_path)
+ move_repository("#{new_disk_path}.wiki", old_wiki_disk_path)
end
end
end
diff --git a/app/services/projects/hashed_storage_migration_service.rb b/app/services/projects/hashed_storage_migration_service.rb
index 1828c99a65e..a0e734005f8 100644
--- a/app/services/projects/hashed_storage_migration_service.rb
+++ b/app/services/projects/hashed_storage_migration_service.rb
@@ -2,23 +2,26 @@
module Projects
class HashedStorageMigrationService < BaseService
- attr_reader :logger
+ attr_reader :logger, :old_disk_path
- def initialize(project, logger = nil)
+ def initialize(project, old_disk_path, logger: nil)
@project = project
+ @old_disk_path = old_disk_path
@logger = logger || Rails.logger
end
def execute
# Migrate repository from Legacy to Hashed Storage
unless project.hashed_storage?(:repository)
- return unless HashedStorage::MigrateRepositoryService.new(project, logger).execute
+ return unless HashedStorage::MigrateRepositoryService.new(project, old_disk_path, logger: logger).execute
end
# Migrate attachments from Legacy to Hashed Storage
unless project.hashed_storage?(:attachments)
- HashedStorage::MigrateAttachmentsService.new(project, logger).execute
+ HashedStorage::MigrateAttachmentsService.new(project, old_disk_path, logger: logger).execute
end
+
+ true
end
end
end
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index a4a66330546..c2a0c5fa7f3 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -77,7 +77,6 @@ module Projects
Gitlab::PagesTransfer.new.move_project(project.path, @old_namespace.full_path, @new_namespace.full_path)
project.old_path_with_namespace = @old_path
- project.expires_full_path_cache
write_repository_config(@new_path)
diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb
index d3dc11435fe..97f181ccea8 100644
--- a/app/services/projects/update_service.rb
+++ b/app/services/projects/update_service.rb
@@ -4,39 +4,27 @@ module Projects
class UpdateService < BaseService
include UpdateVisibilityLevel
- def execute
- unless valid_visibility_level_change?(project, params[:visibility_level])
- return error('New visibility level not allowed!')
- end
+ ValidationError = Class.new(StandardError)
- if renaming_project_with_container_registry_tags?
- return error('Cannot rename project because it contains container registry tags!')
- end
-
- if changing_default_branch?
- return error("Could not set the default branch") unless project.change_head(params[:default_branch])
- end
+ def execute
+ validate!
ensure_wiki_exists if enabling_wiki?
yield if block_given?
# If the block added errors, don't try to save the project
- return validation_failed! if project.errors.any?
+ return update_failed! if project.errors.any?
if project.update(params.except(:default_branch))
- if project.previous_changes.include?('path')
- project.rename_repo
- else
- system_hook_service.execute_hooks_for(project, :update)
- end
-
- update_pages_config if changing_pages_https_only?
+ after_update
success
else
- validation_failed!
+ update_failed!
end
+ rescue ValidationError => e
+ error(e.message)
end
def run_auto_devops_pipeline?
@@ -47,7 +35,45 @@ module Projects
private
- def validation_failed!
+ def validate!
+ unless valid_visibility_level_change?(project, params[:visibility_level])
+ raise ValidationError.new('New visibility level not allowed!')
+ end
+
+ if renaming_project_with_container_registry_tags?
+ raise ValidationError.new('Cannot rename project because it contains container registry tags!')
+ end
+
+ if changing_default_branch?
+ raise ValidationError.new("Could not set the default branch") unless project.change_head(params[:default_branch])
+ end
+ end
+
+ def after_update
+ todos_features_changes = %w(
+ issues_access_level
+ merge_requests_access_level
+ repository_access_level
+ )
+ project_changed_feature_keys = project.project_feature.previous_changes.keys
+
+ if project.previous_changes.include?(:visibility_level) && project.private?
+ # don't enqueue immediately to prevent todos removal in case of a mistake
+ TodosDestroyer::ProjectPrivateWorker.perform_in(1.hour, project.id)
+ elsif (project_changed_feature_keys & todos_features_changes).present?
+ TodosDestroyer::PrivateFeaturesWorker.perform_in(1.hour, project.id)
+ end
+
+ if project.previous_changes.include?('path')
+ project.rename_repo
+ else
+ system_hook_service.execute_hooks_for(project, :update)
+ end
+
+ update_pages_config if changing_pages_https_only?
+ end
+
+ def update_failed!
model_errors = project.errors.full_messages.to_sentence
error_message = model_errors.presence || 'Project could not be updated!'
@@ -69,7 +95,7 @@ module Projects
end
def enabling_wiki?
- return false if @project.wiki_enabled?
+ return false if project.wiki_enabled?
params.dig(:project_feature_attributes, :wiki_access_level).to_i > ProjectFeature::DISABLED
end
diff --git a/app/services/prometheus/adapter_service.rb b/app/services/prometheus/adapter_service.rb
index cbba79690c5..a791845ba20 100644
--- a/app/services/prometheus/adapter_service.rb
+++ b/app/services/prometheus/adapter_service.rb
@@ -30,7 +30,7 @@ module Prometheus
return unless deployment_platform.respond_to?(:cluster)
cluster = deployment_platform.cluster
- return unless cluster.application_prometheus&.installed?
+ return unless cluster.application_prometheus&.ready?
cluster.application_prometheus
end
diff --git a/app/services/resource_events/change_labels_service.rb b/app/services/resource_events/change_labels_service.rb
new file mode 100644
index 00000000000..8edb0ddb3ed
--- /dev/null
+++ b/app/services/resource_events/change_labels_service.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+# This service is not used yet, it will be used for:
+# https://gitlab.com/gitlab-org/gitlab-ce/issues/48483
+module ResourceEvents
+ class ChangeLabelsService
+ attr_reader :resource, :user
+
+ def initialize(resource, user)
+ @resource, @user = resource, user
+ end
+
+ def execute(added_labels: [], removed_labels: [])
+ label_hash = {
+ resource_column(resource) => resource.id,
+ user_id: user.id,
+ created_at: Time.now
+ }
+
+ labels = added_labels.map do |label|
+ label_hash.merge(label_id: label.id, action: ResourceLabelEvent.actions['add'])
+ end
+ labels += removed_labels.map do |label|
+ label_hash.merge(label_id: label.id, action: ResourceLabelEvent.actions['remove'])
+ end
+
+ Gitlab::Database.bulk_insert(ResourceLabelEvent.table_name, labels)
+ end
+
+ private
+
+ def resource_column(resource)
+ case resource
+ when Issue
+ :issue_id
+ when MergeRequest
+ :merge_request_id
+ else
+ raise ArgumentError, "Unknown resource type #{resource.class.name}"
+ end
+ end
+ end
+end
diff --git a/app/services/todos/destroy/base_service.rb b/app/services/todos/destroy/base_service.rb
new file mode 100644
index 00000000000..dff5e1f30e5
--- /dev/null
+++ b/app/services/todos/destroy/base_service.rb
@@ -0,0 +1,33 @@
+module Todos
+ module Destroy
+ class BaseService
+ def execute
+ return unless todos_to_remove?
+
+ without_authorized(todos).delete_all
+ end
+
+ private
+
+ def without_authorized(items)
+ items.where('user_id NOT IN (?)', authorized_users)
+ end
+
+ def authorized_users
+ ProjectAuthorization.select(:user_id).where(project_id: project_ids)
+ end
+
+ def todos
+ raise NotImplementedError
+ end
+
+ def project_ids
+ raise NotImplementedError
+ end
+
+ def todos_to_remove?
+ raise NotImplementedError
+ end
+ end
+ end
+end
diff --git a/app/services/todos/destroy/confidential_issue_service.rb b/app/services/todos/destroy/confidential_issue_service.rb
new file mode 100644
index 00000000000..c5b66df057a
--- /dev/null
+++ b/app/services/todos/destroy/confidential_issue_service.rb
@@ -0,0 +1,39 @@
+module Todos
+ module Destroy
+ class ConfidentialIssueService < ::Todos::Destroy::BaseService
+ extend ::Gitlab::Utils::Override
+
+ attr_reader :issue
+
+ def initialize(issue_id)
+ @issue = Issue.find_by(id: issue_id)
+ end
+
+ private
+
+ override :todos
+ def todos
+ Todo.where(target: issue)
+ .where('user_id != ?', issue.author_id)
+ .where('user_id NOT IN (?)', issue.assignees.select(:id))
+ end
+
+ override :todos_to_remove?
+ def todos_to_remove?
+ issue&.confidential?
+ end
+
+ override :project_ids
+ def project_ids
+ issue.project_id
+ end
+
+ override :authorized_users
+ def authorized_users
+ ProjectAuthorization.select(:user_id)
+ .where(project_id: project_ids)
+ .where('access_level >= ?', Gitlab::Access::REPORTER)
+ end
+ end
+ end
+end
diff --git a/app/services/todos/destroy/entity_leave_service.rb b/app/services/todos/destroy/entity_leave_service.rb
new file mode 100644
index 00000000000..2ff9f94b718
--- /dev/null
+++ b/app/services/todos/destroy/entity_leave_service.rb
@@ -0,0 +1,59 @@
+module Todos
+ module Destroy
+ class EntityLeaveService < ::Todos::Destroy::BaseService
+ extend ::Gitlab::Utils::Override
+
+ attr_reader :user_id, :entity
+
+ def initialize(user_id, entity_id, entity_type)
+ unless %w(Group Project).include?(entity_type)
+ raise ArgumentError.new("#{entity_type} is not an entity user can leave")
+ end
+
+ @user_id = user_id
+ @entity = entity_type.constantize.find_by(id: entity_id)
+ end
+
+ private
+
+ override :todos
+ def todos
+ if entity.private?
+ Todo.where(project_id: project_ids, user_id: user_id)
+ else
+ project_ids.each do |project_id|
+ TodosDestroyer::PrivateFeaturesWorker.perform_async(project_id, user_id)
+ end
+
+ Todo.where(
+ target_id: confidential_issues.select(:id), target_type: Issue, user_id: user_id
+ )
+ end
+ end
+
+ override :project_ids
+ def project_ids
+ case entity
+ when Project
+ [entity.id]
+ when Namespace
+ Project.select(:id).where(namespace_id: entity.self_and_descendants.select(:id))
+ end
+ end
+
+ override :todos_to_remove?
+ def todos_to_remove?
+ # if an entity is provided we want to check always at least private features
+ !!entity
+ end
+
+ def confidential_issues
+ assigned_ids = IssueAssignee.select(:issue_id).where(user_id: user_id)
+
+ Issue.where(project_id: project_ids, confidential: true)
+ .where('author_id != ?', user_id)
+ .where('id NOT IN (?)', assigned_ids)
+ end
+ end
+ end
+end
diff --git a/app/services/todos/destroy/private_features_service.rb b/app/services/todos/destroy/private_features_service.rb
new file mode 100644
index 00000000000..4d8e2877bfb
--- /dev/null
+++ b/app/services/todos/destroy/private_features_service.rb
@@ -0,0 +1,40 @@
+module Todos
+ module Destroy
+ class PrivateFeaturesService < ::Todos::Destroy::BaseService
+ attr_reader :project_ids, :user_id
+
+ def initialize(project_ids, user_id = nil)
+ @project_ids = project_ids
+ @user_id = user_id
+ end
+
+ def execute
+ ProjectFeature.where(project_id: project_ids).each do |project_features|
+ target_types = []
+ target_types << Issue if private?(project_features.issues_access_level)
+ target_types << MergeRequest if private?(project_features.merge_requests_access_level)
+ target_types << Commit if private?(project_features.repository_access_level)
+
+ next if target_types.empty?
+
+ remove_todos(project_features.project_id, target_types)
+ end
+ end
+
+ private
+
+ def private?(feature_level)
+ feature_level == ProjectFeature::PRIVATE
+ end
+
+ def remove_todos(project_id, target_types)
+ items = Todo.where(project_id: project_id)
+ items = items.where(user_id: user_id) if user_id
+
+ items.where('user_id NOT IN (?)', authorized_users)
+ .where(target_type: target_types)
+ .delete_all
+ end
+ end
+ end
+end
diff --git a/app/services/todos/destroy/project_private_service.rb b/app/services/todos/destroy/project_private_service.rb
new file mode 100644
index 00000000000..171933e7cbc
--- /dev/null
+++ b/app/services/todos/destroy/project_private_service.rb
@@ -0,0 +1,30 @@
+module Todos
+ module Destroy
+ class ProjectPrivateService < ::Todos::Destroy::BaseService
+ extend ::Gitlab::Utils::Override
+
+ attr_reader :project
+
+ def initialize(project_id)
+ @project = Project.find_by(id: project_id)
+ end
+
+ private
+
+ override :todos
+ def todos
+ Todo.where(project_id: project_ids)
+ end
+
+ override :project_ids
+ def project_ids
+ project.id
+ end
+
+ override :todos_to_remove?
+ def todos_to_remove?
+ project&.private?
+ end
+ end
+ end
+end
diff --git a/app/services/users/activity_service.rb b/app/services/users/activity_service.rb
index 822df6c646a..db03ba8756f 100644
--- a/app/services/users/activity_service.rb
+++ b/app/services/users/activity_service.rb
@@ -11,6 +11,7 @@ module Users
author.user
end
+ @user = nil unless @user.is_a?(User)
@activity = activity
end
diff --git a/app/services/users/build_service.rb b/app/services/users/build_service.rb
index c69b46cab5a..acc2fa153ae 100644
--- a/app/services/users/build_service.rb
+++ b/app/services/users/build_service.rb
@@ -64,7 +64,8 @@ module Users
:theme_id,
:twitter,
:username,
- :website_url
+ :website_url,
+ :private_profile
]
end
diff --git a/app/services/users/set_status_service.rb b/app/services/users/set_status_service.rb
new file mode 100644
index 00000000000..89008368d5f
--- /dev/null
+++ b/app/services/users/set_status_service.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+module Users
+ class SetStatusService
+ include Gitlab::Allowable
+
+ attr_reader :current_user, :target_user, :params
+
+ def initialize(current_user, params)
+ @current_user, @params = current_user, params.dup
+ @target_user = params.delete(:user) || current_user
+ end
+
+ def execute
+ return false unless can?(current_user, :update_user_status, target_user)
+
+ if params[:emoji].present? || params[:message].present?
+ set_status
+ else
+ remove_status
+ end
+ end
+
+ private
+
+ def set_status
+ params[:emoji] = UserStatus::DEFAULT_EMOJI if params[:emoji].blank?
+ user_status.update(params)
+ end
+
+ def remove_status
+ UserStatus.delete(target_user.id)
+ end
+
+ def user_status
+ target_user.status || target_user.build_status
+ end
+ end
+end
diff --git a/app/services/users/update_service.rb b/app/services/users/update_service.rb
index 6dadb5a4eac..a897e4bd56a 100644
--- a/app/services/users/update_service.rb
+++ b/app/services/users/update_service.rb
@@ -7,6 +7,7 @@ module Users
def initialize(current_user, params = {})
@current_user = current_user
@user = params.delete(:user)
+ @status_params = params.delete(:status)
@params = params.dup
end
@@ -17,10 +18,11 @@ module Users
assign_attributes(&block)
- if @user.save(validate: validate)
+ if @user.save(validate: validate) && update_status
notify_success(user_exists)
else
- error(@user.errors.full_messages.uniq.join('. '))
+ messages = @user.errors.full_messages + Array(@user.status&.errors&.full_messages)
+ error(messages.uniq.join('. '))
end
end
@@ -34,6 +36,12 @@ module Users
private
+ def update_status
+ return true unless @status_params
+
+ Users::SetStatusService.new(current_user, @status_params.merge(user: @user)).execute
+ end
+
def notify_success(user_exists)
notify_new_user(@user, nil) unless user_exists
diff --git a/app/uploaders/import_export_uploader.rb b/app/uploaders/import_export_uploader.rb
index 7c45ba5ca95..716922bc017 100644
--- a/app/uploaders/import_export_uploader.rb
+++ b/app/uploaders/import_export_uploader.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
class ImportExportUploader < AttachmentUploader
- EXTENSION_WHITELIST = %w[tar.gz].freeze
+ EXTENSION_WHITELIST = %w[tar.gz gz].freeze
def extension_whitelist
EXTENSION_WHITELIST
diff --git a/app/views/admin/application_settings/_repository_storage.html.haml b/app/views/admin/application_settings/_repository_storage.html.haml
index 685de99917e..596385abcb1 100644
--- a/app/views/admin/application_settings/_repository_storage.html.haml
+++ b/app/views/admin/application_settings/_repository_storage.html.haml
@@ -7,7 +7,7 @@
.form-check
= f.check_box :hashed_storage_enabled, class: 'form-check-input'
= f.label :hashed_storage_enabled, class: 'form-check-label' do
- Create new projects using hashed storage paths
+ Use hashed storage paths for newly created and renamed projects
.form-text.text-muted
Enable immutable, hash-based paths and repository names to store repositories on disk. This prevents
repositories from having to be moved or renamed when the Project URL changes and may improve disk I/O performance.
diff --git a/app/views/admin/application_settings/_usage.html.haml b/app/views/admin/application_settings/_usage.html.haml
index 49a3ee33a85..60ee9ebe6aa 100644
--- a/app/views/admin/application_settings/_usage.html.haml
+++ b/app/views/admin/application_settings/_usage.html.haml
@@ -23,13 +23,16 @@
periodically collect usage information.
= link_to 'Learn more', help_page_path("user/admin_area/settings/usage_statistics", anchor: "usage-ping")
about what information is shared with GitLab Inc. Visit
- = link_to 'Cohorts', admin_cohorts_path(anchor: 'usage-ping')
+ = link_to _('Cohorts'), instance_statistics_cohorts_path(anchor: 'usage-ping')
to see the JSON payload sent.
- else
The usage ping is disabled, and cannot be configured through this
form. For more information, see the documentation on
= succeed '.' do
= link_to 'deactivating the usage ping', help_page_path('user/admin_area/settings/usage_statistics', anchor: 'deactivate-the-usage-ping')
+ .form-group
+ = f.label :instance_statistics_visibility_private, _('Instance Statistics visibility')
+ = f.select :instance_statistics_visibility_private, options_for_select({_('All users') => false, _('Only admins') => true}, Gitlab::CurrentSettings.instance_statistics_visibility_private?), {}, class: 'form-control'
= f.submit 'Save changes', class: "btn btn-success"
diff --git a/app/views/admin/application_settings/show.html.haml b/app/views/admin/application_settings/show.html.haml
index 5cb8001a364..1c8801566d4 100644
--- a/app/views/admin/application_settings/show.html.haml
+++ b/app/views/admin/application_settings/show.html.haml
@@ -336,5 +336,6 @@
.settings-content
= render 'third_party_offers', application_setting: @application_setting
-= render_if_exists 'admin/application_settings/pseudonymizer_settings', expanded: expanded
+= render_if_exists 'admin/application_settings/custom_templates_form', expanded: expanded
+= render_if_exists 'admin/application_settings/pseudonymizer_settings', expanded: expanded
diff --git a/app/views/admin/projects/_projects.html.haml b/app/views/admin/projects/_projects.html.haml
index 00933d726d9..fdaacc098e0 100644
--- a/app/views/admin/projects/_projects.html.haml
+++ b/app/views/admin/projects/_projects.html.haml
@@ -17,7 +17,7 @@
- if project.archived
%span.badge.badge-warning archived
.title
- = link_to [:admin, project.namespace.becomes(Namespace), project] do
+ = link_to(admin_namespace_project_path(project.namespace, project)) do
.dash-project-avatar
.avatar-container.s40
= project_icon(project, alt: '', class: 'avatar project-avatar s40')
diff --git a/app/views/dashboard/milestones/_milestone.html.haml b/app/views/dashboard/milestones/_milestone.html.haml
index 6173ca6ab9b..b876d6fd1f3 100644
--- a/app/views/dashboard/milestones/_milestone.html.haml
+++ b/app/views/dashboard/milestones/_milestone.html.haml
@@ -1,5 +1,5 @@
= render 'shared/milestones/milestone',
- milestone_path: dashboard_milestone_path(milestone.safe_title, title: milestone.title),
+ milestone_path: group_or_dashboard_milestone_path(milestone),
issues_path: issues_dashboard_path(milestone_title: milestone.title),
merge_requests_path: merge_requests_dashboard_path(milestone_title: milestone.title),
milestone: milestone,
diff --git a/app/views/ide/index.html.haml b/app/views/ide/index.html.haml
index 9f8b0acd763..d29dda43c89 100644
--- a/app/views/ide/index.html.haml
+++ b/app/views/ide/index.html.haml
@@ -1,6 +1,9 @@
- @body_class = 'ide'
- page_title 'IDE'
+- content_for :page_specific_javascripts do
+ = stylesheet_link_tag 'page_bundles/ide'
+
#ide.ide-loading{ data: {"empty-state-svg-path" => image_path('illustrations/multi_file_editor_empty.svg'),
"no-changes-state-svg-path" => image_path('illustrations/multi-editor_no_changes_empty.svg'),
"committed-state-svg-path" => image_path('illustrations/multi-editor_all_changes_committed_empty.svg'),
diff --git a/app/views/admin/cohorts/_cohorts_table.html.haml b/app/views/instance_statistics/cohorts/_cohorts_table.html.haml
index 701a4e62b39..701a4e62b39 100644
--- a/app/views/admin/cohorts/_cohorts_table.html.haml
+++ b/app/views/instance_statistics/cohorts/_cohorts_table.html.haml
diff --git a/app/views/admin/cohorts/_usage_ping.html.haml b/app/views/instance_statistics/cohorts/_usage_ping.html.haml
index 3dda386fcf7..3dda386fcf7 100644
--- a/app/views/admin/cohorts/_usage_ping.html.haml
+++ b/app/views/instance_statistics/cohorts/_usage_ping.html.haml
diff --git a/app/views/admin/cohorts/index.html.haml b/app/views/instance_statistics/cohorts/index.html.haml
index 5e9a8c083af..5e9a8c083af 100644
--- a/app/views/admin/cohorts/index.html.haml
+++ b/app/views/instance_statistics/cohorts/index.html.haml
diff --git a/app/views/admin/conversational_development_index/_callout.html.haml b/app/views/instance_statistics/conversational_development_index/_callout.html.haml
index 33a4dab1e00..33a4dab1e00 100644
--- a/app/views/admin/conversational_development_index/_callout.html.haml
+++ b/app/views/instance_statistics/conversational_development_index/_callout.html.haml
diff --git a/app/views/admin/conversational_development_index/_card.html.haml b/app/views/instance_statistics/conversational_development_index/_card.html.haml
index 57eda06630b..57eda06630b 100644
--- a/app/views/admin/conversational_development_index/_card.html.haml
+++ b/app/views/instance_statistics/conversational_development_index/_card.html.haml
diff --git a/app/views/admin/conversational_development_index/_disabled.html.haml b/app/views/instance_statistics/conversational_development_index/_disabled.html.haml
index 0a741b50960..0a741b50960 100644
--- a/app/views/admin/conversational_development_index/_disabled.html.haml
+++ b/app/views/instance_statistics/conversational_development_index/_disabled.html.haml
diff --git a/app/views/admin/conversational_development_index/_no_data.html.haml b/app/views/instance_statistics/conversational_development_index/_no_data.html.haml
index d69c46194b4..d69c46194b4 100644
--- a/app/views/admin/conversational_development_index/_no_data.html.haml
+++ b/app/views/instance_statistics/conversational_development_index/_no_data.html.haml
diff --git a/app/views/admin/conversational_development_index/show.html.haml b/app/views/instance_statistics/conversational_development_index/index.html.haml
index e3d1aa31dc2..e3d1aa31dc2 100644
--- a/app/views/admin/conversational_development_index/show.html.haml
+++ b/app/views/instance_statistics/conversational_development_index/index.html.haml
diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml
index 9253a0652da..ac5916d129c 100644
--- a/app/views/layouts/_head.html.haml
+++ b/app/views/layouts/_head.html.haml
@@ -3,6 +3,11 @@
- site_name = "GitLab"
%head{ prefix: "og: http://ogp.me/ns#" }
%meta{ charset: "utf-8" }
+
+ - if Feature.enabled?('asset_host_prefetch') && ActionController::Base.asset_host
+ %link{ rel: 'dns-prefetch', href: ActionController::Base.asset_host }
+ %link{ rel: 'preconnnect', href: ActionController::Base.asset_host, crossorigin: '' }
+
%meta{ 'http-equiv' => 'X-UA-Compatible', content: 'IE=edge' }
-# Open Graph - http://ogp.me/
diff --git a/app/views/layouts/_recaptcha_verification.html.haml b/app/views/layouts/_recaptcha_verification.html.haml
index e6f87ddd383..3405fb9d5ef 100644
--- a/app/views/layouts/_recaptcha_verification.html.haml
+++ b/app/views/layouts/_recaptcha_verification.html.haml
@@ -1,10 +1,10 @@
- humanized_resource_name = spammable.class.model_name.human.downcase
%h3.page-title
- Anti-spam verification
+ = _('Anti-spam verification')
%hr
%p
- #{"We detected potential spam in the #{humanized_resource_name}. Please solve the reCAPTCHA to proceed."}
+ = _("We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed.") % { humanized_resource_name: humanized_resource_name }
= render 'shared/recaptcha_form', spammable: spammable
diff --git a/app/views/layouts/_search.html.haml b/app/views/layouts/_search.html.haml
index 91f796adb2e..556ad8cf306 100644
--- a/app/views/layouts/_search.html.haml
+++ b/app/views/layouts/_search.html.haml
@@ -1,7 +1,7 @@
- if controller.controller_path =~ /^groups/ && @group.persisted?
- - label = 'This group'
+ - label = _('This group')
- if controller.controller_path =~ /^projects/ && @project.persisted?
- - label = 'This project'
+ - label = _('This project')
- if @group && @group.persisted? && @group.path
- group_data_attrs = { group_path: j(@group.path), name: @group.name, issues_path: issues_group_path(j(@group.path)), mr_path: merge_requests_group_path(j(@group.path)) }
- if @project && @project.persisted?
@@ -13,21 +13,21 @@
.location-badge= label
.search-input-wrap
.dropdown{ data: { url: search_autocomplete_path } }
- = search_field_tag 'search', nil, placeholder: 'Search',
+ = search_field_tag 'search', nil, placeholder: _('Search'),
class: 'search-input dropdown-menu-toggle no-outline js-search-dashboard-options',
spellcheck: false,
tabindex: '1',
autocomplete: 'off',
data: { issues_path: issues_dashboard_path,
mr_path: merge_requests_dashboard_path },
- aria: { label: 'Search' }
+ aria: { label: _('Search') }
%button.hidden.js-dropdown-search-toggle{ type: 'button', data: { toggle: 'dropdown' } }
.dropdown-menu.dropdown-select
= dropdown_content do
%ul
%li.dropdown-menu-empty-item
%a
- Loading...
+ = _('Loading...')
= dropdown_loading
= sprite_icon('search', size: 16, css_class: 'search-icon')
= sprite_icon('close', size: 16, css_class: 'clear-icon js-clear-input')
diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml
index 8595157a997..31259b8ac25 100644
--- a/app/views/layouts/admin.html.haml
+++ b/app/views/layouts/admin.html.haml
@@ -1,5 +1,5 @@
-- page_title "Admin Area"
-- header_title "Admin Area", admin_root_path
+- page_title _("Admin Area")
+- header_title _("Admin Area"), admin_root_path
- nav "admin"
- @left_sidebar = true
diff --git a/app/views/layouts/dashboard.html.haml b/app/views/layouts/dashboard.html.haml
index cb96bcc2cf4..489ef245a4d 100644
--- a/app/views/layouts/dashboard.html.haml
+++ b/app/views/layouts/dashboard.html.haml
@@ -1,5 +1,5 @@
-- page_title "Dashboard"
-- header_title "Dashboard", root_path unless header_title
+- page_title _("Dashboard")
+- header_title _("Dashboard"), root_path unless header_title
- sidebar "dashboard"
= render template: "layouts/application"
diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml
index 81f35615555..43bd07679ba 100644
--- a/app/views/layouts/devise.html.haml
+++ b/app/views/layouts/devise.html.haml
@@ -17,12 +17,11 @@
- if current_appearance&.description?
= brand_text
- else
- %h3 Open source software to collaborate on code
+ %h3
+ = _('Open source software to collaborate on code')
%p
- Manage Git repositories with fine-grained access controls that keep your code secure.
- Perform code reviews and enhance collaboration with merge requests.
- Each project can also have an issue tracker and a wiki.
+ = _('Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki.')
- if Gitlab::CurrentSettings.sign_in_text.present?
= markdown_field(Gitlab::CurrentSettings.current_application_settings, :sign_in_text)
@@ -32,6 +31,6 @@
%hr.footer-fixed
.container.footer-container
.footer-links
- = link_to "Explore", explore_root_path
- = link_to "Help", help_path
- = link_to "About GitLab", "https://about.gitlab.com/"
+ = link_to _("Explore"), explore_root_path
+ = link_to _("Help"), help_path
+ = link_to _("About GitLab"), "https://about.gitlab.com/"
diff --git a/app/views/layouts/devise_empty.html.haml b/app/views/layouts/devise_empty.html.haml
index 52805e0da73..663e5b24368 100644
--- a/app/views/layouts/devise_empty.html.haml
+++ b/app/views/layouts/devise_empty.html.haml
@@ -12,6 +12,6 @@
%hr
.container
.footer-links
- = link_to "Explore", explore_root_path
- = link_to "Help", help_path
- = link_to "About GitLab", "https://about.gitlab.com/"
+ = link_to _("Explore"), explore_root_path
+ = link_to _("Help"), help_path
+ = link_to _("About GitLab"), "https://about.gitlab.com/"
diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml
index df65792be73..2ab9e55441b 100644
--- a/app/views/layouts/explore.html.haml
+++ b/app/views/layouts/explore.html.haml
@@ -1,5 +1,5 @@
-- page_title "Explore"
+- page_title = _("Explore")
- unless current_user
- - header_title "Explore GitLab", explore_root_path
+ - header_title = _("Explore GitLab"), explore_root_path
= render template: "layouts/application"
diff --git a/app/views/layouts/group_settings.html.haml b/app/views/layouts/group_settings.html.haml
index 66b115e36de..14c5f0ce04c 100644
--- a/app/views/layouts/group_settings.html.haml
+++ b/app/views/layouts/group_settings.html.haml
@@ -1,4 +1,4 @@
-- page_title "Settings"
+- page_title = _("Settings")
- nav "group"
= render template: "layouts/group"
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 3aa8eb18bf3..e8d31992149 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -4,7 +4,7 @@
.header-content
.title-container
%h1.title
- = link_to root_path, title: 'Dashboard', id: 'logo' do
+ = link_to root_path, title: _('Dashboard'), id: 'logo' do
= brand_header_logo
- logo_text = brand_header_logo_type
- if logo_text.present?
@@ -24,26 +24,26 @@
%li.nav-item.d-none.d-sm-none.d-md-block.m-auto
= render 'layouts/search' unless current_controller?(:search)
%li.nav-item.d-inline-block.d-sm-none.d-md-none
- = link_to search_path, title: 'Search', aria: { label: "Search" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = link_to search_path, title: _('Search'), aria: { label: _("Search") }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= sprite_icon('search', size: 16)
- if header_link?(:issues)
= nav_link(path: 'dashboard#issues', html_options: { class: "user-counter" }) do
- = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'dashboard-shortcuts-issues', aria: { label: "Issues" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = link_to assigned_issues_dashboard_path, title: _('Issues'), class: 'dashboard-shortcuts-issues', aria: { label: _("Issues") }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= sprite_icon('issues', size: 16)
- issues_count = assigned_issuables_count(:issues)
%span.badge.badge-pill.issues-count{ class: ('hidden' if issues_count.zero?) }
= number_with_delimiter(issues_count)
- if header_link?(:merge_requests)
= nav_link(path: 'dashboard#merge_requests', html_options: { class: "user-counter" }) do
- = link_to assigned_mrs_dashboard_path, title: 'Merge requests', class: 'dashboard-shortcuts-merge_requests', aria: { label: "Merge requests" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = link_to assigned_mrs_dashboard_path, title: _('Merge requests'), class: 'dashboard-shortcuts-merge_requests', aria: { label: _("Merge requests") }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= sprite_icon('git-merge', size: 16)
- merge_requests_count = assigned_issuables_count(:merge_requests)
%span.badge.badge-pill.merge-requests-count{ class: ('hidden' if merge_requests_count.zero?) }
= number_with_delimiter(merge_requests_count)
- if header_link?(:todos)
= nav_link(controller: 'dashboard/todos', html_options: { class: "user-counter" }) do
- = link_to dashboard_todos_path, title: 'Todos', aria: { label: "Todos" }, class: 'shortcuts-todos', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = link_to dashboard_todos_path, title: _('Todos'), aria: { label: _("Todos") }, class: 'shortcuts-todos', data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= sprite_icon('todo-done', size: 16)
%span.badge.badge-pill.todos-count{ class: ('hidden' if todos_pending_count.zero?) }
= todos_count_format(todos_pending_count)
@@ -56,16 +56,16 @@
= render 'layouts/header/current_user_dropdown'
- if header_link?(:admin_impersonation)
%li.nav-item.impersonation
- = link_to admin_impersonation_path, class: 'nav-link impersonation-btn', method: :delete, title: "Stop impersonation", aria: { label: 'Stop impersonation' }, data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do
+ = link_to admin_impersonation_path, class: 'nav-link impersonation-btn', method: :delete, title: _("Stop impersonation"), aria: { label: _('Stop impersonation') }, data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do
= icon('user-secret')
- if header_link?(:sign_in)
%li.nav-item
%div
- - sign_in_text = allow_signup? ? 'Sign in / Register' : 'Sign in'
+ - sign_in_text = allow_signup? ? _('Sign in / Register') : _('Sign in')
= link_to sign_in_text, new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in'
%button.navbar-toggler.d-block.d-sm-none{ type: 'button' }
- %span.sr-only Toggle navigation
- = sprite_icon('more', size: 12, css_class: 'more-icon js-navbar-toggle-right')
+ %span.sr-only= _("Toggle navigation")
+ = sprite_icon('ellipsis_h', size: 12, css_class: 'more-icon js-navbar-toggle-right')
= sprite_icon('close', size: 12, css_class: 'close-icon js-navbar-toggle-left')
diff --git a/app/views/layouts/header/_new_dropdown.haml b/app/views/layouts/header/_new_dropdown.haml
index 792291bde75..e134f416c70 100644
--- a/app/views/layouts/header/_new_dropdown.haml
+++ b/app/views/layouts/header/_new_dropdown.haml
@@ -1,5 +1,5 @@
%li.header-new.dropdown
- = link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip qa-new-menu-toggle", title: "New...", ref: 'tooltip', aria: { label: "New..." }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body', display: 'static' } do
+ = link_to new_project_path, class: "header-new-dropdown-toggle has-tooltip qa-new-menu-toggle", title: _("New..."), ref: 'tooltip', aria: { label: _("New...") }, data: { toggle: 'dropdown', placement: 'bottom', container: 'body', display: 'static' } do
= sprite_icon('plus-square', size: 16)
= sprite_icon('angle-down', css_class: 'caret-down')
.dropdown-menu.dropdown-menu-right
@@ -8,13 +8,14 @@
- create_group_project = can?(current_user, :create_projects, @group)
- create_group_subgroup = can?(current_user, :create_subgroup, @group)
- if create_group_project || create_group_subgroup
- %li.dropdown-bold-header This group
+ %li.dropdown-bold-header
+ = _('This group')
- if create_group_project
%li.header-new-group-project
- = link_to 'New project', new_project_path(namespace_id: @group.id)
+ = link_to _('New project'), new_project_path(namespace_id: @group.id)
- if create_group_subgroup
%li
- = link_to 'New subgroup', new_group_path(parent_id: @group.id)
+ = link_to _('New subgroup'), new_group_path(parent_id: @group.id)
%li.divider
%li.dropdown-bold-header GitLab
@@ -23,23 +24,24 @@
- merge_project = merge_request_source_project_for_project(@project)
- create_project_snippet = can?(current_user, :create_project_snippet, @project)
- if create_project_issue || merge_project || create_project_snippet
- %li.dropdown-bold-header This project
+ %li.dropdown-bold-header
+ = _('This project')
- if create_project_issue
%li
- = link_to 'New issue', new_project_issue_path(@project)
+ = link_to _('New issue'), new_project_issue_path(@project)
- if merge_project
%li
- = link_to 'New merge request', project_new_merge_request_path(merge_project)
+ = link_to _('New merge request'), project_new_merge_request_path(merge_project)
- if create_project_snippet
%li.header-new-project-snippet
- = link_to 'New snippet', new_project_snippet_path(@project)
+ = link_to _('New snippet'), new_project_snippet_path(@project)
%li.divider
%li.dropdown-bold-header GitLab
- if current_user.can_create_project?
%li
- = link_to 'New project', new_project_path, class: 'qa-global-new-project-link'
+ = link_to _('New project'), new_project_path, class: 'qa-global-new-project-link'
- if current_user.can_create_group?
%li
- = link_to 'New group', new_group_path
+ = link_to _('New group'), new_group_path
%li
- = link_to 'New snippet', new_snippet_path
+ = link_to _('New snippet'), new_snippet_path
diff --git a/app/views/layouts/help.html.haml b/app/views/layouts/help.html.haml
index 78927bfffcd..a913bea0c93 100644
--- a/app/views/layouts/help.html.haml
+++ b/app/views/layouts/help.html.haml
@@ -1,5 +1,5 @@
-- @breadcrumb_title = "Help"
-- page_title "Help"
-- header_title "Help", help_path
+- @breadcrumb_title = _("Help")
+- page_title _("Help")
+- header_title _("Help"), help_path
= render template: "layouts/application"
diff --git a/app/views/layouts/instance_statistics.html.haml b/app/views/layouts/instance_statistics.html.haml
new file mode 100644
index 00000000000..bebd9c4536f
--- /dev/null
+++ b/app/views/layouts/instance_statistics.html.haml
@@ -0,0 +1,6 @@
+- page_title _('Instance Statistics')
+- header_title _('Instance Statistics'), instance_statistics_root_path
+- nav 'instance_statistics'
+- @left_sidebar = true
+
+= render template: 'layouts/application'
diff --git a/app/views/layouts/koding.html.haml b/app/views/layouts/koding.html.haml
index 22319bba745..45ccd38f687 100644
--- a/app/views/layouts/koding.html.haml
+++ b/app/views/layouts/koding.html.haml
@@ -1,5 +1,5 @@
-- page_title "Koding"
-- page_description "Koding Dashboard"
-- header_title "Koding", koding_path
+- page_title _("Koding")
+- page_description _("Koding Dashboard")
+- header_title _("Koding"), koding_path
= render template: "layouts/application"
diff --git a/app/views/layouts/mailer.text.erb b/app/views/layouts/mailer.text.erb
index 8e20c4a4b2a..8e11174f8d7 100644
--- a/app/views/layouts/mailer.text.erb
+++ b/app/views/layouts/mailer.text.erb
@@ -1,4 +1,4 @@
<%= yield -%>
-- <%# signature marker %>
-You're receiving this email because of your account on <%= Gitlab.config.gitlab.host %>.
+<%= _("You're receiving this email because of your account on %{host}.") % { host: Gitlab.config.gitlab.host } %>
diff --git a/app/views/layouts/mailer/devise.html.haml b/app/views/layouts/mailer/devise.html.haml
index 054b2c2fa26..beaaaa5cd68 100644
--- a/app/views/layouts/mailer/devise.html.haml
+++ b/app/views/layouts/mailer/devise.html.haml
@@ -3,17 +3,17 @@
%tr
%td{ style: "font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;line-height:1.6;color:#5c5c5c;" }
%div
- Everyone can contribute
+ = _('Everyone can contribute')
%div
- = link_to 'Blog', 'https://about.gitlab.com/blog/', style: "color:#3777b0;text-decoration:none;"
+ = link_to _('Blog'), 'https://about.gitlab.com/blog/', style: "color:#3777b0;text-decoration:none;"
&middot;
- = link_to 'Twitter', 'https://twitter.com/gitlab', style: "color:#3777b0;text-decoration:none;"
+ = link_to _('Twitter'), 'https://twitter.com/gitlab', style: "color:#3777b0;text-decoration:none;"
&middot;
- = link_to 'Facebook', 'https://www.facebook.com/gitlab/', style: "color:#3777b0;text-decoration:none;"
+ = link_to _('Facebook'), 'https://www.facebook.com/gitlab/', style: "color:#3777b0;text-decoration:none;"
&middot;
- = link_to 'YouTube', 'https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg', style: "color:#3777b0;text-decoration:none;"
+ = link_to _('YouTube'), 'https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg', style: "color:#3777b0;text-decoration:none;"
&middot;
- = link_to 'LinkedIn', 'https://www.linkedin.com/company/gitlab-com', style: "color:#3777b0;text-decoration:none;"
+ = link_to _('LinkedIn'), 'https://www.linkedin.com/company/gitlab-com', style: "color:#3777b0;text-decoration:none;"
= render layout: 'layouts/mailer' do
%tr
diff --git a/app/views/layouts/nav/_breadcrumbs.html.haml b/app/views/layouts/nav/_breadcrumbs.html.haml
index 002922e13f1..f53bd2b5e4d 100644
--- a/app/views/layouts/nav/_breadcrumbs.html.haml
+++ b/app/views/layouts/nav/_breadcrumbs.html.haml
@@ -5,7 +5,7 @@
.breadcrumbs-container
- if defined?(@left_sidebar)
= button_tag class: 'toggle-mobile-nav', type: 'button' do
- %span.sr-only Open sidebar
+ %span.sr-only= _("Open sidebar")
= icon ('bars')
.breadcrumbs-links.js-title-container
%ul.list-unstyled.breadcrumbs-list.js-breadcrumbs-list
diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml
index 4029287fc0e..5e467c862ab 100644
--- a/app/views/layouts/nav/_dashboard.html.haml
+++ b/app/views/layouts/nav/_dashboard.html.haml
@@ -2,7 +2,7 @@
- if dashboard_nav_link?(:projects)
= nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: { id: 'nav-projects-dropdown', class: "home dropdown header-projects qa-projects-dropdown" }) do
%button{ type: 'button', data: { toggle: "dropdown" } }
- Projects
+ = _('Projects')
= sprite_icon('angle-down', css_class: 'caret-down')
.dropdown-menu.frequent-items-dropdown-menu
= render "layouts/nav/projects_dropdown/show"
@@ -10,68 +10,72 @@
- if dashboard_nav_link?(:groups)
= nav_link(controller: ['dashboard/groups', 'explore/groups'], html_options: { id: 'nav-groups-dropdown', class: "home dropdown header-groups qa-groups-dropdown" }) do
%button{ type: 'button', data: { toggle: "dropdown" } }
- Groups
+ = _('Groups')
= sprite_icon('angle-down', css_class: 'caret-down')
.dropdown-menu.frequent-items-dropdown-menu
= render "layouts/nav/groups_dropdown/show"
- if dashboard_nav_link?(:activity)
= nav_link(path: 'dashboard#activity', html_options: { class: "d-none d-lg-block d-xl-block" }) do
- = link_to activity_dashboard_path, class: 'dashboard-shortcuts-activity', title: 'Activity' do
- Activity
+ = link_to activity_dashboard_path, class: 'dashboard-shortcuts-activity', title: _('Activity') do
+ = _('Activity')
- if dashboard_nav_link?(:milestones)
= nav_link(controller: 'dashboard/milestones', html_options: { class: "d-none d-lg-block d-xl-block" }) do
- = link_to dashboard_milestones_path, class: 'dashboard-shortcuts-milestones', title: 'Milestones' do
- Milestones
+ = link_to dashboard_milestones_path, class: 'dashboard-shortcuts-milestones', title: _('Milestones') do
+ = _('Milestones')
- if dashboard_nav_link?(:snippets)
= nav_link(controller: 'dashboard/snippets', html_options: { class: "d-none d-lg-block d-xl-block" }) do
- = link_to dashboard_snippets_path, class: 'dashboard-shortcuts-snippets', title: 'Snippets' do
- Snippets
+ = link_to dashboard_snippets_path, class: 'dashboard-shortcuts-snippets', title: _('Snippets') do
+ = _('Snippets')
- if any_dashboard_nav_link?([:groups, :milestones, :activity, :snippets])
%li.header-more.dropdown.d-lg-none.d-xl-none
%a{ href: "#", data: { toggle: "dropdown" } }
- More
+ = _('More')
= sprite_icon('angle-down', css_class: 'caret-down')
.dropdown-menu
%ul
- if dashboard_nav_link?(:activity)
= nav_link(path: 'dashboard#activity') do
- = link_to activity_dashboard_path, title: 'Activity' do
- Activity
+ = link_to activity_dashboard_path, title: _('Activity') do
+ = _('Activity')
- if dashboard_nav_link?(:milestones)
= nav_link(controller: 'dashboard/milestones') do
- = link_to dashboard_milestones_path, class: 'dashboard-shortcuts-milestones', title: 'Milestones' do
- Milestones
+ = link_to dashboard_milestones_path, class: 'dashboard-shortcuts-milestones', title: _('Milestones') do
+ = _('Milestones')
- if dashboard_nav_link?(:snippets)
= nav_link(controller: 'dashboard/snippets') do
- = link_to dashboard_snippets_path, class: 'dashboard-shortcuts-snippets', title: 'Snippets' do
- Snippets
+ = link_to dashboard_snippets_path, class: 'dashboard-shortcuts-snippets', title: _('Snippets') do
+ = _('Snippets')
-# Shortcut to Dashboard > Projects
- if dashboard_nav_link?(:projects)
%li.hidden
- = link_to dashboard_projects_path, title: 'Projects', class: 'dashboard-shortcuts-projects' do
- Projects
+ = link_to dashboard_projects_path, title: _('Projects'), class: 'dashboard-shortcuts-projects' do
+ = _('Projects')
- if current_controller?('ide')
%li.line-separator.d-none.d-sm-block
= nav_link(controller: 'ide') do
- = link_to '#', class: 'dashboard-shortcuts-web-ide', title: 'Web IDE' do
- Web IDE
+ = link_to '#', class: 'dashboard-shortcuts-web-ide', title: _('Web IDE') do
+ = _('Web IDE')
- - if current_user.admin? || Gitlab::Sherlock.enabled?
+ - if Gitlab::Sherlock.enabled? || can?(current_user, :read_instance_statistics)
%li.line-separator.d-none.d-sm-block
+ - if can?(current_user, :read_instance_statistics)
+ = nav_link(controller: [:conversational_development_index, :cohorts]) do
+ = link_to instance_statistics_root_path, title: _('Instance Statistics'), aria: { label: _('Instance Statistics') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = sprite_icon('chart', size: 18)
- if current_user.admin?
= nav_link(controller: 'admin/dashboard') do
- = link_to admin_root_path, class: 'admin-icon qa-admin-area-link', title: 'Admin area', aria: { label: "Admin area" }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
+ = link_to admin_root_path, class: 'admin-icon qa-admin-area-link', title: _('Admin area'), aria: { label: _('Admin area') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= sprite_icon('admin', size: 18)
- if Gitlab::Sherlock.enabled?
%li
- = link_to sherlock_transactions_path, class: 'admin-icon', title: 'Sherlock Transactions',
+ = link_to sherlock_transactions_path, class: 'admin-icon', title: _('Sherlock Transactions'),
data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= icon('tachometer fw')
diff --git a/app/views/layouts/nav/_explore.html.haml b/app/views/layouts/nav/_explore.html.haml
index 50bde9d1754..7d18cd8978b 100644
--- a/app/views/layouts/nav/_explore.html.haml
+++ b/app/views/layouts/nav/_explore.html.haml
@@ -1,15 +1,15 @@
%ul.list-unstyled.navbar-sub-nav
- if explore_nav_link?(:projects)
= nav_link(path: ['dashboard#show', 'root#show', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do
- = link_to explore_root_path, title: 'Projects', class: 'dashboard-shortcuts-projects' do
- Projects
+ = link_to explore_root_path, title: _('Projects'), class: 'dashboard-shortcuts-projects' do
+ = _('Projects')
- if explore_nav_link?(:groups)
= nav_link(controller: [:groups, 'groups/milestones', 'groups/group_members']) do
- = link_to explore_groups_path, title: 'Groups', class: 'dashboard-shortcuts-groups' do
- Groups
+ = link_to explore_groups_path, title: _('Groups'), class: 'dashboard-shortcuts-groups' do
+ = _('Groups')
- if explore_nav_link?(:snippets)
= nav_link(controller: :snippets) do
- = link_to explore_snippets_path, title: 'Snippets', class: 'dashboard-shortcuts-snippets' do
- Snippets
+ = link_to explore_snippets_path, title: _('Snippets'), class: 'dashboard-shortcuts-snippets' do
+ = _('Snippets')
%li
- = link_to "Help", help_path, title: 'About GitLab CE'
+ = link_to _("Help"), help_path, title: _('About GitLab CE')
diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml
index 4c73da4c75b..ff25b040913 100644
--- a/app/views/layouts/nav/sidebar/_admin.html.haml
+++ b/app/views/layouts/nav/sidebar/_admin.html.haml
@@ -1,142 +1,135 @@
.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?) }
.nav-sidebar-inner-scroll
.context-header
- = link_to admin_root_path, title: 'Admin Overview' do
+ = link_to admin_root_path, title: _('Admin Overview') do
.avatar-container.s40.settings-avatar
= sprite_icon('admin', size: 24)
- .sidebar-context-title Admin Area
+ .sidebar-context-title
+ = _('Admin Area')
%ul.sidebar-top-level-items
- = nav_link(controller: %w(dashboard admin projects users groups jobs runners gitaly_servers cohorts conversational_development_index), html_options: {class: 'home'}) do
+ = nav_link(controller: %w(dashboard admin projects users groups jobs runners gitaly_servers), html_options: {class: 'home'}) do
= link_to admin_root_path, class: 'shortcuts-tree' do
.nav-icon-container
= sprite_icon('overview')
%span.nav-item-name
- Overview
+ = _('Overview')
%ul.sidebar-sub-level-items
- = nav_link(controller: %w(dashboard admin projects users groups jobs runners gitaly_servers cohorts conversational_development_index), html_options: { class: "fly-out-top-item" } ) do
+ = nav_link(controller: %w(dashboard admin projects users groups jobs runners gitaly_servers), html_options: { class: "fly-out-top-item" } ) do
= link_to admin_root_path do
%strong.fly-out-top-item-name
- #{ _('Overview') }
+ = _('Overview')
%li.divider.fly-out-top-item
= nav_link(controller: :dashboard, html_options: {class: 'home'}) do
- = link_to admin_root_path, title: 'Overview' do
+ = link_to admin_root_path, title: _('Overview') do
%span
- Dashboard
+ = _('Dashboard')
= nav_link(controller: [:admin, :projects]) do
- = link_to admin_projects_path, title: 'Projects' do
+ = link_to admin_projects_path, title: _('Projects') do
%span
- Projects
+ = _('Projects')
= nav_link(controller: :users) do
- = link_to admin_users_path, title: 'Users' do
+ = link_to admin_users_path, title: _('Users') do
%span
- Users
+ = _('Users')
= nav_link(controller: :groups) do
- = link_to admin_groups_path, title: 'Groups' do
+ = link_to admin_groups_path, title: _('Groups') do
%span
- Groups
+ = _('Groups')
= nav_link path: 'jobs#index' do
- = link_to admin_jobs_path, title: 'Jobs' do
+ = link_to admin_jobs_path, title: _('Jobs') do
%span
- Jobs
+ = _('Jobs')
= nav_link path: ['runners#index', 'runners#show'] do
- = link_to admin_runners_path, title: 'Runners' do
+ = link_to admin_runners_path, title: _('Runners') do
%span
- Runners
+ = _('Runners')
= nav_link(controller: :gitaly_servers) do
= link_to admin_gitaly_servers_path, title: 'Gitaly Servers' do
%span
- Gitaly Servers
- = nav_link path: 'cohorts#index' do
- = link_to admin_cohorts_path, title: 'Cohorts' do
- %span
- Cohorts
- = nav_link(controller: :conversational_development_index) do
- = link_to admin_conversational_development_index_path, title: 'ConvDev Index' do
- %span
- ConvDev Index
+ = _('Gitaly Servers')
= nav_link(controller: %w(system_info background_jobs logs health_check requests_profiles)) do
= link_to admin_system_info_path do
.nav-icon-container
= sprite_icon('monitor')
%span.nav-item-name
- Monitoring
+ = _('Monitoring')
%ul.sidebar-sub-level-items
= nav_link(controller: %w(system_info background_jobs logs health_check requests_profiles), html_options: { class: "fly-out-top-item" } ) do
= link_to admin_system_info_path do
%strong.fly-out-top-item-name
- #{ _('Monitoring') }
+ = _('Monitoring')
%li.divider.fly-out-top-item
= nav_link(controller: :system_info) do
- = link_to admin_system_info_path, title: 'System Info' do
+ = link_to admin_system_info_path, title: _('System Info') do
%span
- System Info
+ = _('System Info')
= nav_link(controller: :background_jobs) do
- = link_to admin_background_jobs_path, title: 'Background Jobs' do
+ = link_to admin_background_jobs_path, title: _('Background Jobs') do
%span
- Background Jobs
+ = _('Background Jobs')
= nav_link(controller: :logs) do
- = link_to admin_logs_path, title: 'Logs' do
+ = link_to admin_logs_path, title: _('Logs') do
%span
- Logs
+ = _('Logs')
= nav_link(controller: :health_check) do
- = link_to admin_health_check_path, title: 'Health Check' do
+ = link_to admin_health_check_path, title: _('Health Check') do
%span
- Health Check
+ = _('Health Check')
= nav_link(controller: :requests_profiles) do
- = link_to admin_requests_profiles_path, title: 'Requests Profiles' do
+ = link_to admin_requests_profiles_path, title: _('Requests Profiles') do
%span
- Requests Profiles
+ = _('Requests Profiles')
= nav_link(controller: :broadcast_messages) do
= link_to admin_broadcast_messages_path do
.nav-icon-container
= sprite_icon('messages')
%span.nav-item-name
- Messages
+ = _('Messages')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :broadcast_messages, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_broadcast_messages_path do
%strong.fly-out-top-item-name
- #{ _('Messages') }
+ = _('Messages')
= nav_link(controller: [:hooks, :hook_logs]) do
= link_to admin_hooks_path do
.nav-icon-container
= sprite_icon('hook')
%span.nav-item-name
- System Hooks
+ = _('System Hooks')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: [:hooks, :hook_logs], html_options: { class: "fly-out-top-item" } ) do
= link_to admin_hooks_path do
%strong.fly-out-top-item-name
- #{ _('System Hooks') }
+ = _('System Hooks')
= nav_link(controller: :applications) do
= link_to admin_applications_path do
.nav-icon-container
= sprite_icon('applications')
%span.nav-item-name
- Applications
+ = _('Applications')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :applications, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_applications_path do
%strong.fly-out-top-item-name
- #{ _('Applications') }
+ = _('Applications')
= nav_link(controller: :abuse_reports) do
= link_to admin_abuse_reports_path do
.nav-icon-container
= sprite_icon('slight-frown')
%span.nav-item-name
- Abuse Reports
+ = _('Abuse Reports')
%span.badge.badge-pill.count= number_with_delimiter(AbuseReport.count(:all))
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :abuse_reports, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_abuse_reports_path do
%strong.fly-out-top-item-name
- #{ _('Abuse Reports') }
+ = _('Abuse Reports')
%span.badge.badge-pill.count.merge_counter.js-merge-counter.fly-out-badge= number_with_delimiter(AbuseReport.count(:all))
- if akismet_enabled?
@@ -145,71 +138,71 @@
.nav-icon-container
= sprite_icon('spam')
%span.nav-item-name
- Spam Logs
+ = _('Spam Logs')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :spam_logs, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_spam_logs_path do
%strong.fly-out-top-item-name
- #{ _('Spam Logs') }
+ = _('Spam Logs')
= nav_link(controller: :deploy_keys) do
= link_to admin_deploy_keys_path do
.nav-icon-container
= sprite_icon('key')
%span.nav-item-name
- Deploy Keys
+ = _('Deploy Keys')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :deploy_keys, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_deploy_keys_path do
%strong.fly-out-top-item-name
- #{ _('Deploy Keys') }
+ = _('Deploy Keys')
= nav_link(controller: :services) do
= link_to admin_application_settings_services_path do
.nav-icon-container
= sprite_icon('template')
%span.nav-item-name
- Service Templates
+ = _('Service Templates')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :services, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_application_settings_services_path do
%strong.fly-out-top-item-name
- #{ _('Service Templates') }
+ = _('Service Templates')
= nav_link(controller: :labels) do
= link_to admin_labels_path do
.nav-icon-container
= sprite_icon('labels')
%span.nav-item-name
- Labels
+ = _('Labels')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :labels, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_labels_path do
%strong.fly-out-top-item-name
- #{ _('Labels') }
+ = _('Labels')
= nav_link(controller: :appearances) do
= link_to admin_appearances_path do
.nav-icon-container
= sprite_icon('appearance')
%span.nav-item-name
- Appearance
+ = _('Appearance')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :appearances, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_appearances_path do
%strong.fly-out-top-item-name
- #{ _('Appearance') }
+ = _('Appearance')
= nav_link(controller: :application_settings) do
= link_to admin_application_settings_path do
.nav-icon-container
= sprite_icon('settings')
%span.nav-item-name
- Settings
+ = _('Settings')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :application_settings, html_options: { class: "fly-out-top-item" } ) do
= link_to admin_application_settings_path do
%strong.fly-out-top-item-name
- #{ _('Settings') }
+ = _('Settings')
= render 'shared/sidebar_toggle_button'
diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml
index 39a033337ff..d471dd84550 100644
--- a/app/views/layouts/nav/sidebar/_group.html.haml
+++ b/app/views/layouts/nav/sidebar/_group.html.haml
@@ -15,26 +15,26 @@
= nav_link(path: ['groups#show', 'groups#activity', 'groups#subgroups', 'analytics#show'], html_options: { class: 'home' }) do
= link_to group_path(@group) do
.nav-icon-container
- = sprite_icon('project')
+ = sprite_icon('home')
%span.nav-item-name
- Overview
+ = _('Overview')
%ul.sidebar-sub-level-items
= nav_link(path: ['groups#show', 'groups#activity', 'groups#subgroups'], html_options: { class: "fly-out-top-item" } ) do
= link_to group_path(@group) do
%strong.fly-out-top-item-name
- #{ _('Overview') }
+ = _('Overview')
%li.divider.fly-out-top-item
= nav_link(path: ['groups#show', 'groups#subgroups'], html_options: { class: 'home' }) do
- = link_to group_path(@group), title: 'Group details' do
+ = link_to group_path(@group), title: _('Group details') do
%span
- Details
+ = _('Details')
- if group_sidebar_link?(:activity)
= nav_link(path: 'groups#activity') do
- = link_to activity_group_path(@group), title: 'Activity' do
+ = link_to activity_group_path(@group), title: _('Activity') do
%span
- Activity
+ = _('Activity')
- if group_sidebar_link?(:issues)
= nav_link(path: issues_sub_menu_items) do
@@ -42,21 +42,21 @@
.nav-icon-container
= sprite_icon('issues')
%span.nav-item-name
- Issues
+ = _('Issues')
%span.badge.badge-pill.count= number_with_delimiter(issues_count)
%ul.sidebar-sub-level-items
= nav_link(path: ['groups#issues', 'labels#index', 'milestones#index'], html_options: { class: "fly-out-top-item" } ) do
= link_to issues_group_path(@group) do
%strong.fly-out-top-item-name
- #{ _('Issues') }
+ = _('Issues')
%span.badge.badge-pill.count.issue_counter.fly-out-badge= number_with_delimiter(issues_count)
%li.divider.fly-out-top-item
= nav_link(path: 'groups#issues', html_options: { class: 'home' }) do
- = link_to issues_group_path(@group), title: 'List' do
+ = link_to issues_group_path(@group), title: _('List') do
%span
- List
+ = _('List')
- if group_sidebar_link?(:boards)
= nav_link(path: ['boards#index', 'boards#show']) do
@@ -66,15 +66,15 @@
- if group_sidebar_link?(:labels)
= nav_link(path: 'labels#index') do
- = link_to group_labels_path(@group), title: 'Labels' do
+ = link_to group_labels_path(@group), title: _('Labels') do
%span
- Labels
+ = _('Labels')
- if group_sidebar_link?(:milestones)
= nav_link(path: 'milestones#index') do
- = link_to group_milestones_path(@group), title: 'Milestones' do
+ = link_to group_milestones_path(@group), title: _('Milestones') do
%span
- Milestones
+ = _('Milestones')
- if group_sidebar_link?(:merge_requests)
= nav_link(path: 'groups#merge_requests') do
@@ -82,13 +82,13 @@
.nav-icon-container
= sprite_icon('git-merge')
%span.nav-item-name
- Merge Requests
+ = _('Merge Requests')
%span.badge.badge-pill.count= number_with_delimiter(merge_requests_count)
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(path: 'groups#merge_requests', html_options: { class: "fly-out-top-item" } ) do
= link_to merge_requests_group_path(@group) do
%strong.fly-out-top-item-name
- #{ _('Merge Requests') }
+ = _('Merge Requests')
%span.badge.badge-pill.count.merge_counter.js-merge-counter.fly-out-badge= number_with_delimiter(merge_requests_count)
- if group_sidebar_link?(:group_members)
@@ -97,12 +97,12 @@
.nav-icon-container
= sprite_icon('users')
%span.nav-item-name
- Members
+ = _('Members')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(path: 'group_members#index', html_options: { class: "fly-out-top-item" } ) do
= link_to group_group_members_path(@group) do
%strong.fly-out-top-item-name
- #{ _('Members') }
+ = _('Members')
- if group_sidebar_link?(:settings)
= nav_link(path: group_nav_link_paths) do
@@ -110,17 +110,17 @@
.nav-icon-container
= sprite_icon('settings')
%span.nav-item-name
- Settings
+ = _('Settings')
%ul.sidebar-sub-level-items
= nav_link(path: %w[groups#projects groups#edit badges#index ci_cd#show], html_options: { class: "fly-out-top-item" } ) do
= link_to edit_group_path(@group) do
%strong.fly-out-top-item-name
- #{ _('Settings') }
+ = _('Settings')
%li.divider.fly-out-top-item
= nav_link(path: 'groups#edit') do
- = link_to edit_group_path(@group), title: 'General' do
+ = link_to edit_group_path(@group), title: _('General') do
%span
- General
+ = _('General')
= nav_link(controller: :badges) do
= link_to group_settings_badges_path(@group), title: _('Project Badges') do
@@ -129,13 +129,13 @@
= nav_link(path: 'groups#projects') do
- = link_to projects_group_path(@group), title: 'Projects' do
+ = link_to projects_group_path(@group), title: _('Projects') do
%span
- Projects
+ = _('Projects')
= nav_link(controller: :ci_cd) do
- = link_to group_settings_ci_cd_path(@group), title: 'CI / CD' do
+ = link_to group_settings_ci_cd_path(@group), title: _('CI / CD') do
%span
- CI / CD
+ = _('CI / CD')
= render 'shared/sidebar_toggle_button'
diff --git a/app/views/layouts/nav/sidebar/_instance_statistics.html.haml b/app/views/layouts/nav/sidebar/_instance_statistics.html.haml
new file mode 100644
index 00000000000..b8ff448f261
--- /dev/null
+++ b/app/views/layouts/nav/sidebar/_instance_statistics.html.haml
@@ -0,0 +1,33 @@
+.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?) }
+ .nav-sidebar-inner-scroll
+ .context-header
+ = link_to instance_statistics_root_path, title: _('Instance Statistics') do
+ .avatar-container.s40.settings-avatar
+ = sprite_icon('chart', size: 24)
+ .sidebar-context-title= _('Instance Statistics')
+ %ul.sidebar-top-level-items
+ = nav_link(controller: :conversational_development_index) do
+ = link_to instance_statistics_conversational_development_index_index_path do
+ .nav-icon-container
+ = sprite_icon('comment')
+ %span.nav-item-name
+ = _('ConvDev Index')
+ %ul.sidebar-sub-level-items.is-fly-out-only
+ = nav_link(controller: :conversational_development_index, html_options: { class: "fly-out-top-item" } ) do
+ = link_to instance_statistics_conversational_development_index_index_path do
+ %strong.fly-out-top-item-name
+ = _('ConvDev Index')
+
+ = nav_link(controller: :cohorts) do
+ = link_to instance_statistics_cohorts_path do
+ .nav-icon-container
+ = sprite_icon('users')
+ %span.nav-item-name
+ = _('Cohorts')
+ %ul.sidebar-sub-level-items.is-fly-out-only
+ = nav_link(controller: :cohorts, html_options: { class: "fly-out-top-item" } ) do
+ = link_to instance_statistics_cohorts_path do
+ %strong.fly-out-top-item-name
+ = _('Cohorts')
+
+ = render 'shared/sidebar_toggle_button'
diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml
index 6cbd163dd41..d65f153b451 100644
--- a/app/views/layouts/nav/sidebar/_profile.html.haml
+++ b/app/views/layouts/nav/sidebar/_profile.html.haml
@@ -1,7 +1,7 @@
.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?) }
.nav-sidebar-inner-scroll
.context-header
- = link_to profile_path, title: 'Profile Settings' do
+ = link_to profile_path, title: _('Profile Settings') do
.avatar-container.s40.settings-avatar
= sprite_icon('user', size: 24)
.sidebar-context-title User Settings
@@ -11,145 +11,145 @@
.nav-icon-container
= sprite_icon('profile')
%span.nav-item-name
- Profile
+ = _('Profile')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(path: 'profiles#show', html_options: { class: "fly-out-top-item" } ) do
= link_to profile_path do
%strong.fly-out-top-item-name
- #{ _('Profile') }
+ = _('Profile')
= nav_link(controller: [:accounts, :two_factor_auths]) do
= link_to profile_account_path do
.nav-icon-container
= sprite_icon('account')
%span.nav-item-name
- Account
+ = _('Account')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: [:accounts, :two_factor_auths], html_options: { class: "fly-out-top-item" } ) do
= link_to profile_account_path do
%strong.fly-out-top-item-name
- #{ _('Account') }
+ = _('Account')
- if Gitlab::CurrentSettings.user_oauth_applications?
= nav_link(controller: 'oauth/applications') do
= link_to applications_profile_path do
.nav-icon-container
= sprite_icon('applications')
%span.nav-item-name
- Applications
+ = _('Applications')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: 'oauth/applications', html_options: { class: "fly-out-top-item" } ) do
= link_to applications_profile_path do
%strong.fly-out-top-item-name
- #{ _('Applications') }
+ = _('Applications')
= nav_link(controller: :chat_names) do
= link_to profile_chat_names_path do
.nav-icon-container
= sprite_icon('comment')
%span.nav-item-name
- Chat
+ = _('Chat')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :chat_names, html_options: { class: "fly-out-top-item" } ) do
= link_to profile_chat_names_path do
%strong.fly-out-top-item-name
- #{ _('Chat') }
+ = _('Chat')
= nav_link(controller: :personal_access_tokens) do
= link_to profile_personal_access_tokens_path do
.nav-icon-container
= sprite_icon('token')
%span.nav-item-name
- Access Tokens
+ = _('Access Tokens')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :personal_access_tokens, html_options: { class: "fly-out-top-item" } ) do
= link_to profile_personal_access_tokens_path do
%strong.fly-out-top-item-name
- #{ _('Access Tokens') }
+ = _('Access Tokens')
= nav_link(controller: :emails) do
= link_to profile_emails_path do
.nav-icon-container
= sprite_icon('mail')
%span.nav-item-name
- Emails
+ = _('Emails')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :emails, html_options: { class: "fly-out-top-item" } ) do
= link_to profile_emails_path do
%strong.fly-out-top-item-name
- #{ _('Emails') }
+ = _('Emails')
- if current_user.allow_password_authentication?
= nav_link(controller: :passwords) do
= link_to edit_profile_password_path do
.nav-icon-container
= sprite_icon('lock')
%span.nav-item-name
- Password
+ = _('Password')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :passwords, html_options: { class: "fly-out-top-item" } ) do
= link_to edit_profile_password_path do
%strong.fly-out-top-item-name
- #{ _('Password') }
+ = _('Password')
= nav_link(controller: :notifications) do
= link_to profile_notifications_path do
.nav-icon-container
= sprite_icon('notifications')
%span.nav-item-name
- Notifications
+ = _('Notifications')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :notifications, html_options: { class: "fly-out-top-item" } ) do
= link_to profile_notifications_path do
%strong.fly-out-top-item-name
- #{ _('Notifications') }
+ = _('Notifications')
= nav_link(controller: :keys) do
= link_to profile_keys_path do
.nav-icon-container
= sprite_icon('key')
%span.nav-item-name
- SSH Keys
+ = _('SSH Keys')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :keys, html_options: { class: "fly-out-top-item" } ) do
= link_to profile_keys_path do
%strong.fly-out-top-item-name
- #{ _('SSH Keys') }
+ = _('SSH Keys')
= nav_link(controller: :gpg_keys) do
= link_to profile_gpg_keys_path do
.nav-icon-container
- = sprite_icon('key-2')
+ = sprite_icon('key-modern')
%span.nav-item-name
- GPG Keys
+ = _('GPG Keys')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :gpg_keys, html_options: { class: "fly-out-top-item" } ) do
= link_to profile_gpg_keys_path do
%strong.fly-out-top-item-name
- #{ _('GPG Keys') }
+ = _('GPG Keys')
= nav_link(controller: :preferences) do
= link_to profile_preferences_path do
.nav-icon-container
= sprite_icon('preferences')
%span.nav-item-name
- Preferences
+ = _('Preferences')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :preferences, html_options: { class: "fly-out-top-item" } ) do
= link_to profile_preferences_path do
%strong.fly-out-top-item-name
- #{ _('Preferences') }
+ = _('Preferences')
= nav_link(controller: :active_sessions) do
= link_to profile_active_sessions_path do
.nav-icon-container
= sprite_icon('monitor-lines')
%span.nav-item-name
- Active Sessions
+ = _('Active Sessions')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :active_sessions, html_options: { class: "fly-out-top-item" } ) do
= link_to profile_active_sessions_path do
%strong.fly-out-top-item-name
- #{ _('Active Sessions') }
+ = _('Active Sessions')
= nav_link(path: 'profiles#audit_log') do
= link_to audit_log_profile_path do
.nav-icon-container
= sprite_icon('log')
%span.nav-item-name
- Authentication log
+ = _('Authentication log')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(path: 'profiles#audit_log', html_options: { class: "fly-out-top-item" } ) do
= link_to audit_log_profile_path do
%strong.fly-out-top-item-name
- #{ _('Authentication Log') }
+ = _('Authentication Log')
= render 'shared/sidebar_toggle_button'
diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml
index 33de74dbaa2..2c262a2b7dd 100644
--- a/app/views/layouts/nav/sidebar/_project.html.haml
+++ b/app/views/layouts/nav/sidebar/_project.html.haml
@@ -11,7 +11,7 @@
= nav_link(path: sidebar_projects_paths, html_options: { class: 'home' }) do
= link_to project_path(@project), class: 'shortcuts-project' do
.nav-icon-container
- = sprite_icon('project')
+ = sprite_icon('home')
%span.nav-item-name
= _('Project')
@@ -40,7 +40,7 @@
= nav_link(controller: sidebar_repository_paths) do
= link_to project_tree_path(@project), class: 'shortcuts-tree' do
.nav-icon-container
- = sprite_icon('doc_text')
+ = sprite_icon('doc-text')
%span.nav-item-name
= _('Repository')
@@ -105,7 +105,7 @@
= number_with_delimiter(@project.open_issues_count(current_user))
%li.divider.fly-out-top-item
= nav_link(controller: :issues, action: :index) do
- = link_to project_issues_path(@project), title: 'Issues' do
+ = link_to project_issues_path(@project), title: _('Issues') do
%span
= _('List')
@@ -115,14 +115,14 @@
= boards_link_text
= nav_link(controller: :labels) do
- = link_to project_labels_path(@project), title: 'Labels' do
+ = link_to project_labels_path(@project), title: _('Labels') do
%span
= _('Labels')
= render_if_exists 'projects/sidebar/issues_service_desk'
= nav_link(controller: :milestones) do
- = link_to project_milestones_path(@project), title: 'Milestones', class: 'qa-milestones-link' do
+ = link_to project_milestones_path(@project), title: _('Milestones'), class: 'qa-milestones-link' do
%span
= _('Milestones')
- if project_nav_tab? :external_issue_tracker
@@ -172,25 +172,25 @@
%li.divider.fly-out-top-item
- if project_nav_tab? :pipelines
= nav_link(path: ['pipelines#index', 'pipelines#show']) do
- = link_to project_pipelines_path(@project), title: 'Pipelines', class: 'shortcuts-pipelines' do
+ = link_to project_pipelines_path(@project), title: _('Pipelines'), class: 'shortcuts-pipelines' do
%span
= _('Pipelines')
- if project_nav_tab? :builds
= nav_link(controller: [:jobs, :artifacts]) do
- = link_to project_jobs_path(@project), title: 'Jobs', class: 'shortcuts-builds' do
+ = link_to project_jobs_path(@project), title: _('Jobs'), class: 'shortcuts-builds' do
%span
= _('Jobs')
- if project_nav_tab? :pipelines
= nav_link(controller: :pipeline_schedules) do
- = link_to pipeline_schedules_path(@project), title: 'Schedules', class: 'shortcuts-builds' do
+ = link_to pipeline_schedules_path(@project), title: _('Schedules'), class: 'shortcuts-builds' do
%span
= _('Schedules')
- if @project.feature_available?(:builds, current_user) && !@project.empty_repo?
= nav_link(path: 'pipelines#charts') do
- = link_to charts_project_pipelines_path(@project), title: 'Charts', class: 'shortcuts-pipelines-charts' do
+ = link_to charts_project_pipelines_path(@project), title: _('Charts'), class: 'shortcuts-pipelines-charts' do
%span
= _('Charts')
@@ -242,7 +242,7 @@
%p= _('Allows you to add and manage Kubernetes clusters.')
%p
= _('Protip:')
- = link_to 'Auto DevOps', help_page_path('topics/autodevops/index.md')
+ = link_to _('Auto DevOps'), help_page_path('topics/autodevops/index.md')
%span= _('uses Kubernetes clusters to deploy your code!')
%hr
%button.btn.btn-create.btn-sm.dismiss-feature-highlight{ type: 'button' }
@@ -305,11 +305,11 @@
= _('Settings')
%li.divider.fly-out-top-item
= nav_link(path: %w[projects#edit]) do
- = link_to edit_project_path(@project), title: 'General' do
+ = link_to edit_project_path(@project), title: _('General') do
%span
= _('General')
= nav_link(controller: :project_members) do
- = link_to project_project_members_path(@project), title: 'Members' do
+ = link_to project_project_members_path(@project), title: _('Members') do
%span
= _('Members')
- if can_edit
@@ -319,21 +319,21 @@
= _('Badges')
- if can_edit
= nav_link(controller: [:integrations, :services, :hooks, :hook_logs]) do
- = link_to project_settings_integrations_path(@project), title: 'Integrations' do
+ = link_to project_settings_integrations_path(@project), title: _('Integrations') do
%span
= _('Integrations')
= nav_link(controller: :repository) do
- = link_to project_settings_repository_path(@project), title: 'Repository' do
+ = link_to project_settings_repository_path(@project), title: _('Repository') do
%span
= _('Repository')
- if @project.feature_available?(:builds, current_user)
= nav_link(controller: :ci_cd) do
- = link_to project_settings_ci_cd_path(@project), title: 'CI / CD' do
+ = link_to project_settings_ci_cd_path(@project), title: _('CI / CD') do
%span
= _('CI / CD')
- if @project.pages_available?
= nav_link(controller: :pages) do
- = link_to project_pages_path(@project), title: 'Pages' do
+ = link_to project_pages_path(@project), title: _('Pages') do
%span
= _('Pages')
@@ -341,7 +341,7 @@
- else
= nav_link(controller: :project_members) do
- = link_to project_settings_members_path(@project), title: 'Members', class: 'shortcuts-tree' do
+ = link_to project_settings_members_path(@project), title: _('Members'), class: 'shortcuts-tree' do
.nav-icon-container
= sprite_icon('users')
%span.nav-item-name
@@ -356,41 +356,41 @@
-# Shortcut to Project > Activity
%li.hidden
- = link_to activity_project_path(@project), title: 'Activity', class: 'shortcuts-project-activity' do
+ = link_to activity_project_path(@project), title: _('Activity'), class: 'shortcuts-project-activity' do
%span
- Activity
+ = _('Activity')
-# Shortcut to Repository > Graph (formerly, Network)
- if project_nav_tab? :network
%li.hidden
- = link_to project_network_path(@project, current_ref), title: 'Network', class: 'shortcuts-network' do
- Graph
+ = link_to project_network_path(@project, current_ref), title: _('Network'), class: 'shortcuts-network' do
+ = _('Graph')
-# Shortcut to Repository > Charts (formerly, top-nav item "Graphs")
- unless @project.empty_repo?
%li.hidden
- = link_to charts_project_graph_path(@project, current_ref), title: 'Charts', class: 'shortcuts-repository-charts' do
- Charts
+ = link_to charts_project_graph_path(@project, current_ref), title: _('Charts'), class: 'shortcuts-repository-charts' do
+ = _('Charts')
-# Shortcut to Issues > New Issue
- if project_nav_tab?(:issues)
%li.hidden
= link_to new_project_issue_path(@project), class: 'shortcuts-new-issue' do
- Create a new issue
+ = _('Create a new issue')
-# Shortcut to Pipelines > Jobs
- if project_nav_tab? :builds
%li.hidden
- = link_to project_jobs_path(@project), title: 'Jobs', class: 'shortcuts-builds' do
- Jobs
+ = link_to project_jobs_path(@project), title: _('Jobs'), class: 'shortcuts-builds' do
+ = _('Jobs')
-# Shortcut to commits page
- if project_nav_tab? :commits
%li.hidden
- = link_to project_commits_path(@project), title: 'Commits', class: 'shortcuts-commits' do
- Commits
+ = link_to project_commits_path(@project), title: _('Commits'), class: 'shortcuts-commits' do
+ = _('Commits')
-# Shortcut to issue boards
- if project_nav_tab?(:issues)
%li.hidden
- = link_to 'Issue Boards', project_boards_path(@project), title: 'Issue Boards', class: 'shortcuts-issue-boards'
+ = link_to _('Issue Boards'), project_boards_path(@project), title: _('Issue Boards'), class: 'shortcuts-issue-boards'
diff --git a/app/views/layouts/notify.html.haml b/app/views/layouts/notify.html.haml
index ab8b1271212..1c3e05e07f4 100644
--- a/app/views/layouts/notify.html.haml
+++ b/app/views/layouts/notify.html.haml
@@ -14,13 +14,12 @@
%br
- if @target_url
- if @reply_by_email
- Reply to this email directly or
- #{link_to "view it on GitLab", @target_url}.
+ = _('Reply to this email directly or %{view_it_on_gitlab}.').html_safe % { view_it_on_gitlab: link_to(_("view it on GitLab"), @target_url) }
- else
- #{link_to "View it on GitLab", @target_url}.
+ #{link_to _("View it on GitLab"), @target_url}.
%br
-# Don't link the host in the line below, one link in the email is easier to quickly click than two.
- You're receiving this email because #{notification_reason_text(@reason)}.
+ = _("You're receiving this email because %{reason}.") % { reason: notification_reason_text(@reason) }
If you'd like to receive fewer emails, you can
- if @labels_url
adjust your #{link_to 'label subscriptions', @labels_url}.
diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml
index 67aa05b655c..7aca64663e0 100644
--- a/app/views/layouts/profile.html.haml
+++ b/app/views/layouts/profile.html.haml
@@ -1,5 +1,5 @@
-- page_title "User Settings"
-- header_title "User Settings", profile_path unless header_title
+- page_title _("User Settings")
+- header_title _("User Settings"), profile_path unless header_title
- sidebar "dashboard"
- nav "profile"
- @left_sidebar = true
diff --git a/app/views/layouts/project_settings.html.haml b/app/views/layouts/project_settings.html.haml
index 4bc94bd132d..93214c2a674 100644
--- a/app/views/layouts/project_settings.html.haml
+++ b/app/views/layouts/project_settings.html.haml
@@ -1,4 +1,4 @@
-- page_title "Settings"
+- page_title _("Settings")
- nav "project"
= render template: "layouts/project"
diff --git a/app/views/layouts/search.html.haml b/app/views/layouts/search.html.haml
index fd4c7ad21a7..dd4b9e45207 100644
--- a/app/views/layouts/search.html.haml
+++ b/app/views/layouts/search.html.haml
@@ -1,4 +1,4 @@
-- page_title "Search"
-- header_title "Search", search_path
+- page_title _("Search")
+- header_title _("Search"), search_path
= render template: "layouts/application"
diff --git a/app/views/layouts/snippets.html.haml b/app/views/layouts/snippets.html.haml
index 849075a0ba5..6418500d5d1 100644
--- a/app/views/layouts/snippets.html.haml
+++ b/app/views/layouts/snippets.html.haml
@@ -1,4 +1,4 @@
-- header_title "Snippets", snippets_path
+- header_title _("Snippets"), snippets_path
- content_for :page_specific_javascripts do
- if @snippet && current_user
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 507cd5dcc12..e7044f722c5 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -30,6 +30,18 @@
- if @user.avatar?
%hr
= link_to _('Remove avatar'), profile_avatar_path, data: { confirm: _('Avatar will be removed. Are you sure?') }, method: :delete, class: 'btn btn-danger btn-inverted'
+
+ - if show_user_status_field?
+ %hr
+ .row
+ .col-lg-4.profile-settings-sidebar
+ %h4.prepend-top-0= s_("User|Current Status")
+ %p= s_("Profiles|This emoji and message will appear on your profile and throughout the interface. The message can contain emoji codes, too.")
+ .col-lg-8
+ .row
+ = f.fields_for :status, @user.status do |status_form|
+ = status_form.text_field :emoji
+ = status_form.text_field :message, maxlength: 100
%hr
.row
.col-lg-4.profile-settings-sidebar
@@ -69,6 +81,12 @@
= f.text_field :location
= f.text_field :organization
= f.text_area :bio, rows: 4, maxlength: 250, help: 'Tell us about yourself in fewer than 250 characters.'
+ %hr
+ %h5 Private profile
+ - private_profile_label = capture do
+ Don't display activity-related personal information on your profile
+ = link_to icon('question-circle'), help_page_path('user/profile/index.md', anchor: 'private-profile')
+ = f.check_box :private_profile, label: private_profile_label
.prepend-top-default.append-bottom-default
= f.submit 'Update profile settings', class: 'btn btn-success'
= link_to 'Cancel', user_path(current_user), class: 'btn btn-cancel'
diff --git a/app/views/projects/_project_templates.html.haml b/app/views/projects/_project_templates.html.haml
index 9d8627c9eb1..e90a6355214 100644
--- a/app/views/projects/_project_templates.html.haml
+++ b/app/views/projects/_project_templates.html.haml
@@ -1,27 +1,8 @@
-.project-templates-buttons.import-buttons
- - Gitlab::ProjectTemplate.all.each do |template|
- .template-option
- = custom_icon(template.logo)
- .template-title= template.title
- .template-description= template.description
- %label.btn.btn-success.template-button.choose-template.append-right-10{ for: template.name }
- %input{ type: "radio", autocomplete: "off", name: "project[template_name]", id: template.name, value: template.name }
- %span Use template
- %a.btn.btn-default{ href: template.preview, rel: 'noopener noreferrer', target: '_blank' } Preview
+- f ||= local_assigns[:f]
- .project-fields-form
- .row
- .form-group.col-sm-12
- %label.label-bold
- Template
- .input-group.template-input-group
- .input-group-prepend
- .input-group-text
- .selected-icon
- - Gitlab::ProjectTemplate.all.each do |template|
- = custom_icon(template.logo)
- .selected-template
- .input-group-append
- %button.btn.btn-default.change-template{ type: "button" } Change template
+.project-templates-buttons.import-buttons.col-sm-12
+ = render 'projects/project_templates/built_in_templates'
- = render 'new_project_fields', f: f, project_name_id: "template-project-name"
+.project-fields-form
+ = render 'projects/project_templates/project_fields_form'
+ = render 'projects/new_project_fields', f: f, project_name_id: "template-project-name"
diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml
index 78522393d4b..aab5712d197 100644
--- a/app/views/projects/commit/_commit_box.html.haml
+++ b/app/views/projects/commit/_commit_box.html.haml
@@ -13,6 +13,7 @@
= author_avatar(@commit, size: 24, has_tooltip: false)
%strong
= commit_author_link(@commit, avatar: true, size: 24)
+ = user_status(@commit.author)
- if @commit.different_committer?
%span.light= _('Committed by')
%strong
@@ -54,7 +55,7 @@
%h3.commit-title
= markdown_field(@commit, :title)
- if @commit.description.present?
- .commit-description<
+ %pre.commit-description<
= preserve(markdown_field(@commit, :description))
.info-well
diff --git a/app/views/projects/commits/_commit.html.haml b/app/views/projects/commits/_commit.html.haml
index feaf44e8c0a..7951a5ddc9e 100644
--- a/app/views/projects/commits/_commit.html.haml
+++ b/app/views/projects/commits/_commit.html.haml
@@ -44,7 +44,7 @@
#{ commit_text.html_safe }
- if commit.description?
- %pre.commit-row-description.js-toggle-content.prepend-top-8.append-bottom-8
+ %pre.commit-row-description.js-toggle-content.append-bottom-8
= preserve(markdown_field(commit, :description))
.commit-actions.flex-row.d-none.d-sm-flex
diff --git a/app/views/projects/environments/metrics.html.haml b/app/views/projects/environments/metrics.html.haml
index 290970a1045..af86b8e8e67 100644
--- a/app/views/projects/environments/metrics.html.haml
+++ b/app/views/projects/environments/metrics.html.haml
@@ -2,17 +2,11 @@
- page_title "Metrics for environment", @environment.name
.prometheus-container{ class: container_class }
- #prometheus-graphs{ data: { "settings-path": edit_project_service_path(@project, 'prometheus'),
- "clusters-path": project_clusters_path(@project),
- "current-environment-name": @environment.name,
- "documentation-path": help_page_path('administration/monitoring/prometheus/index.md'),
- "empty-getting-started-svg-path": image_path('illustrations/monitoring/getting_started.svg'),
- "empty-loading-svg-path": image_path('illustrations/monitoring/loading.svg'),
- "empty-no-data-svg-path": image_path('illustrations/monitoring/no_data.svg'),
- "empty-unable-to-connect-svg-path": image_path('illustrations/monitoring/unable_to_connect.svg'),
- "metrics-endpoint": additional_metrics_project_environment_path(@project, @environment, format: :json),
- "deployment-endpoint": project_environment_deployments_path(@project, @environment, format: :json),
- "environments-endpoint": project_environments_path(@project, format: :json),
- "project-path": project_path(@project),
- "tags-path": project_tags_path(@project),
- "has-metrics": "#{@environment.has_metrics?}" } }
+ .top-area
+ .row
+ .col-sm-6
+ %h3
+ Environment:
+ = link_to @environment.name, environment_path(@environment)
+
+ #prometheus-graphs{ data: metrics_data(@project, @environment) }
diff --git a/app/views/projects/jobs/_sidebar.html.haml b/app/views/projects/jobs/_sidebar.html.haml
index b88fe47726d..759efd4e9d4 100644
--- a/app/views/projects/jobs/_sidebar.html.haml
+++ b/app/views/projects/jobs/_sidebar.html.haml
@@ -86,7 +86,7 @@
- HasStatus::ORDERED_STATUSES.each do |build_status|
- builds.select{|build| build.status == build_status}.each do |build|
.build-job{ class: sidebar_build_class(build, @build), data: { stage: build.stage } }
- - tooltip = build.tooltip_message
+ - tooltip = sanitize(build.tooltip_message.dup)
= link_to(project_job_path(@project, build), data: { toggle: 'tooltip', html: 'true', title: tooltip, container: 'body' }) do
= sprite_icon('arrow-right', size:16, css_class: 'icon-arrow-right')
%span{ class: "ci-status-icon-#{build.status}" }
diff --git a/app/views/projects/jobs/show.html.haml b/app/views/projects/jobs/show.html.haml
index 1f33bb3a129..078f40c4477 100644
--- a/app/views/projects/jobs/show.html.haml
+++ b/app/views/projects/jobs/show.html.haml
@@ -22,7 +22,7 @@
%br
Go to
- = link_to project_runners_path(@build.project) do
+ = link_to project_runners_path(@build.project, anchor: 'js-runners-settings') do
Runners page
- if @build.starts_environment?
diff --git a/app/views/projects/jobs/terminal.html.haml b/app/views/projects/jobs/terminal.html.haml
index efea666a4d9..f7e7535ee92 100644
--- a/app/views/projects/jobs/terminal.html.haml
+++ b/app/views/projects/jobs/terminal.html.haml
@@ -5,7 +5,7 @@
- page_title 'Terminal', "#{@build.name} (##{@build.id})", 'Jobs'
- content_for :page_specific_javascripts do
- = stylesheet_link_tag "xterm/xterm"
+ = stylesheet_link_tag "xterm.css"
.terminal-container{ class: container_class }
#terminal{ data: { project_path: terminal_project_job_path(@project, @build, format: :ws) } }
diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml
index fb5b0fc15c9..768ce9bd103 100644
--- a/app/views/projects/labels/index.html.haml
+++ b/app/views/projects/labels/index.html.haml
@@ -2,32 +2,45 @@
- page_title "Labels"
- can_admin_label = can?(current_user, :admin_label, @project)
- hide_class = ''
+- search = params[:search]
- if can_admin_label
- content_for(:header_content) do
.nav-controls
= link_to _('New label'), new_project_label_path(@project), class: "btn btn-new"
-- if @labels.exists? || @prioritized_labels.exists?
+- if @labels.exists? || @prioritized_labels.exists? || search.present?
#promote-label-modal
%div{ class: container_class }
.top-area.adjust
.nav-text
= _('Labels can be applied to issues and merge requests.')
- - if can_admin_label
- = _('Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging.')
- .labels-container.prepend-top-5
+ .nav-controls
+ = form_tag project_labels_path(@project), method: :get do
+ .input-group
+ = search_field_tag :search, params[:search], { placeholder: _('Filter'), id: 'label-search', class: 'form-control search-text-input input-short', spellcheck: false }
+ %span.input-group-append
+ %button.btn.btn-default{ type: "submit", "aria-label" => _('Submit search') }
+ = icon("search")
+
+ .labels-container.prepend-top-10
- if can_admin_label
+ - if search.blank?
+ %p.text-muted
+ = _('Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging.')
-# Only show it in the first page
- hide = @available_labels.empty? || (params[:page].present? && params[:page] != '1')
.prioritized-labels{ class: ('hide' if hide) }
%h5.prepend-top-10= _('Prioritized Labels')
.content-list.manage-labels-list.js-prioritized-labels{ "data-url" => set_priorities_project_labels_path(@project) }
- #js-priority-labels-empty-state.priority-labels-empty-state{ class: "#{'hidden' unless @prioritized_labels.empty?}" }
+ #js-priority-labels-empty-state.priority-labels-empty-state{ class: "#{'hidden' unless @prioritized_labels.empty? && search.blank?}" }
= render 'shared/empty_states/priority_labels'
- if @prioritized_labels.present?
= render partial: 'shared/label', subject: @project, collection: @prioritized_labels, as: :label, locals: { force_priority: true }
+ - elsif search.present?
+ .nothing-here-block
+ = _('No prioritised labels with such name or description')
- if @labels.present?
.other-labels
@@ -36,6 +49,18 @@
.content-list.manage-labels-list.js-other-labels
= render partial: 'shared/label', subject: @project, collection: @labels, as: :label
= paginate @labels, theme: 'gitlab'
+ - elsif search.present?
+ .other-labels
+ - if @available_labels.any?
+ %h5
+ = _('Other Labels')
+ .nothing-here-block
+ = _('No other labels with such name or description')
+ - else
+ .nothing-here-block
+ = _('No labels with such name or description')
+
+
- else
= render 'shared/empty_states/labels'
diff --git a/app/views/projects/merge_requests/creations/_new_compare.html.haml b/app/views/projects/merge_requests/creations/_new_compare.html.haml
index ca0f7d6098f..afa7eb06cb4 100644
--- a/app/views/projects/merge_requests/creations/_new_compare.html.haml
+++ b/app/views/projects/merge_requests/creations/_new_compare.html.haml
@@ -27,7 +27,7 @@
= dropdown_filter(_("Search branches"))
= dropdown_content
= dropdown_loading
- .panel-footer
+ .card-footer
.text-center= icon('spinner spin', class: 'js-source-loading')
%ul.list-unstyled.mr_source_commit
diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml
index bc247460d28..ccb83148ded 100644
--- a/app/views/projects/pipelines/_info.html.haml
+++ b/app/views/projects/pipelines/_info.html.haml
@@ -1,37 +1,34 @@
-#js-pipeline-header-vue.pipeline-header-container
+.commit-box
+ %h3.commit-title
+ = markdown(commit.title, pipeline: :single_line)
+ - if commit.description.present?
+ %pre.commit-description<
+ = preserve(markdown(commit.description, pipeline: :single_line))
-- if @commit.present?
- .commit-box
- %h3.commit-title
- = markdown(@commit.title, pipeline: :single_line)
- - if @commit.description.present?
- .commit-description<
- = preserve(markdown(@commit.description, pipeline: :single_line))
+.info-well
+ - if commit.status
+ .well-segment.pipeline-info
+ .icon-container
+ = icon('clock-o')
+ = pluralize @pipeline.total_size, "job"
+ - if @pipeline.ref
+ from
+ = link_to @pipeline.ref, project_ref_path(@project, @pipeline.ref), class: "ref-name"
+ - if @pipeline.duration
+ in
+ = time_interval_in_words(@pipeline.duration)
+ - if @pipeline.queued_duration
+ = "(queued for #{time_interval_in_words(@pipeline.queued_duration)})"
- .info-well
- - if @commit.status
- .well-segment.pipeline-info
- .icon-container
- = icon('clock-o')
- = pluralize @pipeline.total_size, "job"
- - if @pipeline.ref
- from
- = link_to @pipeline.ref, project_ref_path(@project, @pipeline.ref), class: "ref-name"
- - if @pipeline.duration
- in
- = time_interval_in_words(@pipeline.duration)
- - if @pipeline.queued_duration
- = "(queued for #{time_interval_in_words(@pipeline.queued_duration)})"
+ .well-segment.branch-info
+ .icon-container.commit-icon
+ = custom_icon("icon_commit")
+ = link_to commit.short_id, project_commit_path(@project, @pipeline.sha), class: "commit-sha js-details-short"
+ = link_to("#", class: "js-details-expand d-none d-sm-none d-md-inline") do
+ %span.text-expander
+ = sprite_icon('ellipsis_h', size: 12)
+ %span.js-details-content.hide
+ = link_to @pipeline.sha, project_commit_path(@project, @pipeline.sha), class: "commit-sha commit-hash-full"
+ = clipboard_button(text: @pipeline.sha, title: "Copy commit SHA to clipboard")
- .well-segment.branch-info
- .icon-container.commit-icon
- = custom_icon("icon_commit")
- = link_to @commit.short_id, project_commit_path(@project, @pipeline.sha), class: "commit-sha js-details-short"
- = link_to("#", class: "js-details-expand d-none d-sm-none d-md-inline") do
- %span.text-expander
- = sprite_icon('ellipsis_h', size: 12)
- %span.js-details-content.hide
- = link_to @pipeline.sha, project_commit_path(@project, @pipeline.sha), class: "commit-sha commit-hash-full"
- = clipboard_button(text: @pipeline.sha, title: "Copy commit SHA to clipboard")
-
- = render_if_exists "projects/pipelines/info_extension", pipeline: @pipeline
+ = render_if_exists "projects/pipelines/info_extension", pipeline: @pipeline
diff --git a/app/views/projects/pipelines/show.html.haml b/app/views/projects/pipelines/show.html.haml
index a7d7c923957..ff0ed3ed30d 100644
--- a/app/views/projects/pipelines/show.html.haml
+++ b/app/views/projects/pipelines/show.html.haml
@@ -4,8 +4,10 @@
- page_title "Pipeline"
.js-pipeline-container{ class: container_class, data: { controller_action: "#{controller.action_name}" } }
- - if @commit
- = render "projects/pipelines/info"
+ #js-pipeline-header-vue.pipeline-header-container
+
+ - if @pipeline.commit.present?
+ = render "projects/pipelines/info", commit: @pipeline.commit
= render "projects/pipelines/with_tabs", pipeline: @pipeline
diff --git a/app/views/projects/project_templates/_built_in_templates.html.haml b/app/views/projects/project_templates/_built_in_templates.html.haml
new file mode 100644
index 00000000000..e7636099be6
--- /dev/null
+++ b/app/views/projects/project_templates/_built_in_templates.html.haml
@@ -0,0 +1,17 @@
+- Gitlab::ProjectTemplate.all.each do |template|
+ .template-option.d-flex.align-items-center
+ .logo.append-right-10
+ = custom_icon(template.logo, size: 40)
+ .description
+ %strong
+ = template.title
+ %br
+ .text-muted
+ = template.description
+ .controls.d-flex.align-items-center
+ %label.btn.btn-success.template-button.choose-template.append-right-10.append-bottom-0{ for: template.name }
+ %input{ type: "radio", autocomplete: "off", name: "project[template_name]", id: template.name, value: template.name }
+ %span
+ = _("Use template")
+ %a.btn.btn-default{ href: template.preview, rel: 'noopener noreferrer', target: '_blank' }
+ = _("Preview")
diff --git a/app/views/projects/project_templates/_project_fields_form.html.haml b/app/views/projects/project_templates/_project_fields_form.html.haml
new file mode 100644
index 00000000000..c96010550d8
--- /dev/null
+++ b/app/views/projects/project_templates/_project_fields_form.html.haml
@@ -0,0 +1,12 @@
+.row
+ .form-group.col-sm-12
+ %label.label-bold
+ = _('Template')
+ .input-group.template-input-group
+ .input-group-prepend
+ .input-group-text
+ .selected-icon.append-right-10
+ .selected-template
+ .input-group-append
+ %button.btn.btn-default.change-template{ type: "button" }
+ = _('Change template')
diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml
index be22bbd7a9b..16961784e00 100644
--- a/app/views/projects/settings/ci_cd/show.html.haml
+++ b/app/views/projects/settings/ci_cd/show.html.haml
@@ -28,7 +28,9 @@
.settings-content
= render 'autodevops_form'
-%section.qa-runners-settings.settings.no-animate{ class: ('expanded' if expanded) }
+= render_if_exists 'projects/settings/ci_cd/protected_environments', expanded: expanded
+
+%section.qa-runners-settings.settings.no-animate#js-runners-settings{ class: ('expanded' if expanded) }
.settings-header
%h4
= _("Runners")
diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml
index 803ecca48f7..e011851be78 100644
--- a/app/views/projects/show.html.haml
+++ b/app/views/projects/show.html.haml
@@ -18,10 +18,11 @@
= render "home_panel"
- if can?(current_user, :download_code, @project)
- %nav.project-stats{ class: container_class }
+ %nav.project-stats{ class: [container_class, ("limit-container-width" unless fluid_layout)] }
= render 'stat_anchor_list', anchors: @project.statistics_anchors(show_auto_devops_callout: show_auto_devops_callout)
= render 'stat_anchor_list', anchors: @project.statistics_buttons(show_auto_devops_callout: show_auto_devops_callout)
-
+ - if Feature.enabled?(:repository_languages, @project.namespace.becomes(Namespace))
+ = repository_languages_bar(@project.repository_languages)
%div{ class: [container_class, ("limit-container-width" unless fluid_layout)] }
- if @project.archived?
diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml
index cadda0a33c2..8d91f411f89 100644
--- a/app/views/projects/wikis/_main_links.html.haml
+++ b/app/views/projects/wikis/_main_links.html.haml
@@ -4,6 +4,6 @@
= s_("Wiki|New page")
= link_to project_wiki_history_path(@project, @page), class: "btn" do
= s_("Wiki|Page history")
- - if can?(current_user, :create_wiki, @project) && @page.latest?
+ - if can?(current_user, :create_wiki, @project) && @page.latest? && @valid_encoding
= link_to project_wiki_edit_path(@project, @page), class: "btn js-wiki-edit" do
= _("Edit")
diff --git a/app/views/shared/boards/components/_board.html.haml b/app/views/shared/boards/components/_board.html.haml
index 03e008f5fa0..b35877e5518 100644
--- a/app/views/shared/boards/components/_board.html.haml
+++ b/app/views/shared/boards/components/_board.html.haml
@@ -32,17 +32,21 @@
"v-if" => "!list.preset && list.id" }
%button.board-delete.has-tooltip.float-right{ type: "button", title: _("Delete list"), "aria-label" => _("Delete list"), data: { placement: "bottom" }, "@click.stop" => "deleteBoard" }
= icon("trash")
- .issue-count-badge.clearfix{ "v-if" => 'list.type !== "blank" && list.type !== "promotion"' }
- %span.issue-count-badge-count.float-left{ ":class" => '{ "has-btn": list.type !== "closed" && !disabled }' }
+ .issue-count-badge.text-secondary{ "v-if" => 'list.type !== "blank" && list.type !== "promotion"', ":title": "counterTooltip", "v-tooltip": true, data: { placement: "top" } }
+ %span.issue-count-badge-count
+ %icon.mr-1{ name: "issues" }
{{ list.issuesSize }}
- - if can?(current_user, :admin_list, current_board_parent)
- %button.issue-count-badge-add-button.btn.btn-sm.btn-default.has-tooltip.js-no-trigger-collapse{ type: "button",
- "@click" => "showNewIssueForm",
- "v-if" => 'list.type !== "closed"',
- "aria-label" => _("New issue"),
- "title" => _("New issue"),
- data: { placement: "top", container: "body" } }
- = icon("plus", class: "js-no-trigger-collapse")
+ = render_if_exists "shared/boards/components/list_weight"
+
+ - if can?(current_user, :admin_list, current_board_parent)
+ %button.issue-count-badge-add-button.btn.btn-sm.btn-default.ml-1.has-tooltip.js-no-trigger-collapse{ type: "button",
+ "@click" => "showNewIssueForm",
+ "v-if" => 'list.type !== "closed"',
+ "aria-label" => _("New issue"),
+ "title" => _("New issue"),
+ data: { placement: "top", container: "body" } }
+ = icon("plus", class: "js-no-trigger-collapse")
+
%board-list{ "v-if" => 'list.type !== "blank" && list.type !== "promotion"',
":list" => "list",
":issues" => "list.issues",
diff --git a/app/views/shared/builds/_build_output.html.haml b/app/views/shared/builds/_build_output.html.haml
index 0e18128a8f1..380fac4d0e4 100644
--- a/app/views/shared/builds/_build_output.html.haml
+++ b/app/views/shared/builds/_build_output.html.haml
@@ -1,3 +1,6 @@
%pre.build-trace#build-trace
%code.bash.js-build-output
.build-loader-animation.js-build-refresh
+ .dot
+ .dot
+ .dot
diff --git a/app/views/shared/members/_member.html.haml b/app/views/shared/members/_member.html.haml
index 46debe1f2b9..af29c0fe59e 100644
--- a/app/views/shared/members/_member.html.haml
+++ b/app/views/shared/members/_member.html.haml
@@ -11,6 +11,7 @@
= image_tag avatar_icon_for_user(user, 40), class: "avatar s40", alt: ''
.user-info
= link_to user.name, user_path(user), class: 'member'
+ = user_status(user)
%span.cgray= user.to_reference
- if user == current_user
diff --git a/app/views/shared/notes/_note.html.haml b/app/views/shared/notes/_note.html.haml
index f5464058bc0..84adbd444c5 100644
--- a/app/views/shared/notes/_note.html.haml
+++ b/app/views/shared/notes/_note.html.haml
@@ -31,7 +31,9 @@
.note-header
.note-header-info
%a{ href: user_path(note.author) }
- %span.note-header-author-name= sanitize(note.author.name)
+ %span.note-header-author-name
+ = sanitize(note.author.name)
+ = user_status(note.author)
%span.note-headline-light
= note.author.to_reference
%span.note-headline-light
diff --git a/app/views/shared/notes/_notes_with_form.html.haml b/app/views/shared/notes/_notes_with_form.html.haml
index e0832fd9136..9dd1c24fdfa 100644
--- a/app/views/shared/notes/_notes_with_form.html.haml
+++ b/app/views/shared/notes/_notes_with_form.html.haml
@@ -13,7 +13,7 @@
.flash-container.timeline-content
.timeline-icon.d-none.d-sm-none.d-md-block
- %a.author_link{ href: user_path(current_user) }
+ %a.author-link{ href: user_path(current_user) }
= image_tag avatar_icon_for_user(current_user), alt: current_user.to_reference, class: 'avatar s40'
.timeline-content.timeline-content-form
= render "shared/notes/form", view: diff_view, supports_autocomplete: autocomplete
diff --git a/app/views/shared/snippets/_embed.html.haml b/app/views/shared/snippets/_embed.html.haml
index 36f56fbad1a..c7f0511d1de 100644
--- a/app/views/shared/snippets/_embed.html.haml
+++ b/app/views/shared/snippets/_embed.html.haml
@@ -2,7 +2,7 @@
.gitlab-embed-snippets
.js-file-title.file-title-flex-parent
.file-header-content
- = external_snippet_icon('doc_text')
+ = external_snippet_icon('doc-text')
%strong.file-title-name
%a.gitlab-embedded-snippets-title{ href: url_for(only_path: false, overwrite_params: nil) }
diff --git a/app/views/shared/snippets/_header.html.haml b/app/views/shared/snippets/_header.html.haml
index 828ec870dc0..10bfc30492a 100644
--- a/app/views/shared/snippets/_header.html.haml
+++ b/app/views/shared/snippets/_header.html.haml
@@ -8,6 +8,7 @@
Authored
= time_ago_with_tooltip(@snippet.created_at, placement: 'bottom', html_class: 'snippet_updated_ago')
by #{link_to_member(@project, @snippet.author, size: 24, author_class: "author item-title", avatar_class: "d-none d-sm-inline")}
+ = user_status(@snippet.author)
.detail-page-header-actions
- if @snippet.project_id?
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index b2ec7166832..7a38d290915 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -23,8 +23,9 @@
= link_to new_abuse_report_path(user_id: @user.id, ref_url: request.referrer), class: 'btn',
title: 'Report abuse', data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } do
= icon('exclamation-circle')
- = link_to user_path(@user, rss_url_options), class: 'btn btn-default has-tooltip', title: 'Subscribe', 'aria-label': 'Subscribe' do
- = icon('rss')
+ - if can?(current_user, :read_user_profile, @user)
+ = link_to user_path(@user, rss_url_options), class: 'btn btn-default has-tooltip', title: 'Subscribe', 'aria-label': 'Subscribe' do
+ = icon('rss')
- if current_user && current_user.admin?
= link_to [:admin, @user], class: 'btn btn-default', title: 'View user in admin area',
data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
@@ -39,11 +40,18 @@
.cover-title
= @user.name
+ - if @user.status
+ .cover-status
+ = emoji_icon(@user.status.emoji)
+ = markdown_field(@user.status, :message)
+
.cover-desc.member-date
- %span.middle-dot-divider
- @#{@user.username}
- %span.middle-dot-divider
- Member since #{@user.created_at.to_date.to_s(:long)}
+ %p
+ %span.middle-dot-divider
+ @#{@user.username}
+ - if can?(current_user, :read_user_profile, @user)
+ %span.middle-dot-divider
+ Member since #{@user.created_at.to_date.to_s(:long)}
.cover-desc
- unless @user.public_email.blank?
@@ -78,30 +86,31 @@
%p.profile-user-bio
= @user.bio
- .scrolling-tabs-container
- .fade-left= icon('angle-left')
- .fade-right= icon('angle-right')
- %ul.nav-links.user-profile-nav.scrolling-tabs.nav.nav-tabs
- - if profile_tab?(:activity)
- %li.js-activity-tab
- = link_to user_path, data: { target: 'div#activity', action: 'activity', toggle: 'tab' } do
- Activity
- - if profile_tab?(:groups)
- %li.js-groups-tab
- = link_to user_groups_path, data: { target: 'div#groups', action: 'groups', toggle: 'tab', endpoint: user_groups_path(format: :json) } do
- Groups
- - if profile_tab?(:contributed)
- %li.js-contributed-tab
- = link_to user_contributed_projects_path, data: { target: 'div#contributed', action: 'contributed', toggle: 'tab', endpoint: user_contributed_projects_path(format: :json) } do
- Contributed projects
- - if profile_tab?(:projects)
- %li.js-projects-tab
- = link_to user_projects_path, data: { target: 'div#projects', action: 'projects', toggle: 'tab', endpoint: user_projects_path(format: :json) } do
- Personal projects
- - if profile_tab?(:snippets)
- %li.js-snippets-tab
- = link_to user_snippets_path, data: { target: 'div#snippets', action: 'snippets', toggle: 'tab', endpoint: user_snippets_path(format: :json) } do
- Snippets
+ - unless profile_tabs.empty?
+ .scrolling-tabs-container
+ .fade-left= icon('angle-left')
+ .fade-right= icon('angle-right')
+ %ul.nav-links.user-profile-nav.scrolling-tabs.nav.nav-tabs
+ - if profile_tab?(:activity)
+ %li.js-activity-tab
+ = link_to user_path, data: { target: 'div#activity', action: 'activity', toggle: 'tab' } do
+ Activity
+ - if profile_tab?(:groups)
+ %li.js-groups-tab
+ = link_to user_groups_path, data: { target: 'div#groups', action: 'groups', toggle: 'tab', endpoint: user_groups_path(format: :json) } do
+ Groups
+ - if profile_tab?(:contributed)
+ %li.js-contributed-tab
+ = link_to user_contributed_projects_path, data: { target: 'div#contributed', action: 'contributed', toggle: 'tab', endpoint: user_contributed_projects_path(format: :json) } do
+ Contributed projects
+ - if profile_tab?(:projects)
+ %li.js-projects-tab
+ = link_to user_projects_path, data: { target: 'div#projects', action: 'projects', toggle: 'tab', endpoint: user_projects_path(format: :json) } do
+ Personal projects
+ - if profile_tab?(:snippets)
+ %li.js-snippets-tab
+ = link_to user_snippets_path, data: { target: 'div#snippets', action: 'snippets', toggle: 'tab', endpoint: user_snippets_path(format: :json) } do
+ Snippets
%div{ class: container_class }
.tab-content
@@ -137,3 +146,13 @@
.loading-status
= spinner
+
+ - if profile_tabs.empty?
+ .row
+ .col-12
+ .svg-content
+ = image_tag 'illustrations/profile_private_mode.svg'
+ .col-12.text-center
+ .text-content
+ %h4
+ This user has a private profile
diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml
index 4de35b9bd06..e8b9999f83b 100644
--- a/app/workers/all_queues.yml
+++ b/app/workers/all_queues.yml
@@ -73,6 +73,11 @@
- repository_check:repository_check_batch
- repository_check:repository_check_single_repository
+- todos_destroyer:todos_destroyer_confidential_issue
+- todos_destroyer:todos_destroyer_entity_leave
+- todos_destroyer:todos_destroyer_project_private
+- todos_destroyer:todos_destroyer_private_features
+
- default
- mailers # ActionMailer::DeliveryJob.queue_name
@@ -118,3 +123,4 @@
- repository_update_remote_mirror
- create_note_diff_file
- delete_diff_files
+- detect_repository_languages
diff --git a/app/workers/concerns/gitlab/github_import/object_importer.rb b/app/workers/concerns/gitlab/github_import/object_importer.rb
index 100d86e38c8..eeeff6e93a0 100644
--- a/app/workers/concerns/gitlab/github_import/object_importer.rb
+++ b/app/workers/concerns/gitlab/github_import/object_importer.rb
@@ -22,7 +22,7 @@ module Gitlab
importer_class.new(object, project, client).execute
- counter.increment(project: project.full_path)
+ counter.increment
end
def counter
diff --git a/app/workers/concerns/todos_destroyer_queue.rb b/app/workers/concerns/todos_destroyer_queue.rb
new file mode 100644
index 00000000000..8e2b1d30579
--- /dev/null
+++ b/app/workers/concerns/todos_destroyer_queue.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+##
+# Concern for setting Sidekiq settings for the various Todos Destroyers.
+#
+module TodosDestroyerQueue
+ extend ActiveSupport::Concern
+
+ included do
+ queue_namespace :todos_destroyer
+ end
+end
diff --git a/app/workers/create_gpg_signature_worker.rb b/app/workers/create_gpg_signature_worker.rb
index a2da1bda11f..a1aeeb7c4fc 100644
--- a/app/workers/create_gpg_signature_worker.rb
+++ b/app/workers/create_gpg_signature_worker.rb
@@ -3,15 +3,27 @@
class CreateGpgSignatureWorker
include ApplicationWorker
- def perform(commit_sha, project_id)
+ def perform(commit_shas, project_id)
+ # Older versions of GitPushService may push a single commit ID on the stack.
+ # We need this to be backwards compatible.
+ commit_shas = Array(commit_shas)
+
+ return if commit_shas.empty?
+
project = Project.find_by(id: project_id)
return unless project
- commit = project.commit(commit_sha)
+ commits = project.commits_by(oids: commit_shas)
- return unless commit
+ return if commits.empty?
# This calculates and caches the signature in the database
- Gitlab::Gpg::Commit.new(commit).signature
+ commits.each do |commit|
+ begin
+ Gitlab::Gpg::Commit.new(commit).signature
+ rescue => e
+ Rails.logger.error("Failed to create signature for commit #{commit.id}. Error: #{e.message}")
+ end
+ end
end
end
diff --git a/app/workers/detect_repository_languages_worker.rb b/app/workers/detect_repository_languages_worker.rb
new file mode 100644
index 00000000000..537b8fd5963
--- /dev/null
+++ b/app/workers/detect_repository_languages_worker.rb
@@ -0,0 +1,33 @@
+class DetectRepositoryLanguagesWorker
+ include ApplicationWorker
+ include ExceptionBacktrace
+ include ExclusiveLeaseGuard
+
+ sidekiq_options retry: 1
+
+ LEASE_TIMEOUT = 300
+
+ attr_reader :project
+
+ def perform(project_id, user_id)
+ @project = Project.find_by(id: project_id)
+ user = User.find_by(id: user_id)
+ return unless project && user
+
+ return if Feature.disabled?(:repository_languages, project.namespace)
+
+ try_obtain_lease do
+ ::Projects::DetectRepositoryLanguagesService.new(project, user).execute
+ end
+ end
+
+ private
+
+ def lease_timeout
+ LEASE_TIMEOUT
+ end
+
+ def lease_key
+ "gitlab:detect_repository_languages:#{project.id}"
+ end
+end
diff --git a/app/workers/project_migrate_hashed_storage_worker.rb b/app/workers/project_migrate_hashed_storage_worker.rb
index 9e4d66250a4..ad0003e7bff 100644
--- a/app/workers/project_migrate_hashed_storage_worker.rb
+++ b/app/workers/project_migrate_hashed_storage_worker.rb
@@ -5,13 +5,13 @@ class ProjectMigrateHashedStorageWorker
LEASE_TIMEOUT = 30.seconds.to_i
- def perform(project_id)
+ def perform(project_id, old_disk_path = nil)
project = Project.find_by(id: project_id)
return if project.nil? || project.pending_delete?
uuid = lease_for(project_id).try_obtain
if uuid
- ::Projects::HashedStorageMigrationService.new(project, logger).execute
+ ::Projects::HashedStorageMigrationService.new(project, old_disk_path || project.full_path, logger: logger).execute
else
false
end
diff --git a/app/workers/repository_fork_worker.rb b/app/workers/repository_fork_worker.rb
index 5ef9b744db3..68ec66e8499 100644
--- a/app/workers/repository_fork_worker.rb
+++ b/app/workers/repository_fork_worker.rb
@@ -23,9 +23,7 @@ class RepositoryForkWorker
def fork_repository(target_project, source_repository_storage_name, source_disk_path)
return unless start_fork(target_project)
- Gitlab::Metrics.add_event(:fork_repository,
- source_path: source_disk_path,
- target_path: target_project.disk_path)
+ Gitlab::Metrics.add_event(:fork_repository)
result = gitlab_shell.fork_repository(source_repository_storage_name, source_disk_path,
target_project.repository_storage, target_project.disk_path)
diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb
index 25fec542ac7..82189a3c9f5 100644
--- a/app/workers/repository_import_worker.rb
+++ b/app/workers/repository_import_worker.rb
@@ -7,13 +7,11 @@ class RepositoryImportWorker
include ProjectImportOptions
def perform(project_id)
- project = Project.find(project_id)
+ @project = Project.find(project_id)
- return unless start_import(project)
+ return unless start_import
- Gitlab::Metrics.add_event(:import_repository,
- import_url: project.import_url,
- path: project.full_path)
+ Gitlab::Metrics.add_event(:import_repository)
service = Projects::ImportService.new(project, project.creator)
result = service.execute
@@ -23,7 +21,7 @@ class RepositoryImportWorker
return if service.async?
if result[:status] == :error
- fail_import(project, result[:message]) if project.gitlab_project_import?
+ fail_import(result[:message]) if template_import?
raise result[:message]
end
@@ -33,14 +31,20 @@ class RepositoryImportWorker
private
- def start_import(project)
+ attr_reader :project
+
+ def start_import
return true if start(project)
Rails.logger.info("Project #{project.full_path} was in inconsistent state (#{project.import_status}) while importing.")
false
end
- def fail_import(project, message)
+ def fail_import(message)
project.mark_import_as_failed(message)
end
+
+ def template_import?
+ project.gitlab_project_import?
+ end
end
diff --git a/app/workers/todos_destroyer/confidential_issue_worker.rb b/app/workers/todos_destroyer/confidential_issue_worker.rb
new file mode 100644
index 00000000000..9d640c14963
--- /dev/null
+++ b/app/workers/todos_destroyer/confidential_issue_worker.rb
@@ -0,0 +1,10 @@
+module TodosDestroyer
+ class ConfidentialIssueWorker
+ include ApplicationWorker
+ include TodosDestroyerQueue
+
+ def perform(issue_id)
+ ::Todos::Destroy::ConfidentialIssueService.new(issue_id).execute
+ end
+ end
+end
diff --git a/app/workers/todos_destroyer/entity_leave_worker.rb b/app/workers/todos_destroyer/entity_leave_worker.rb
new file mode 100644
index 00000000000..e62d9876f4a
--- /dev/null
+++ b/app/workers/todos_destroyer/entity_leave_worker.rb
@@ -0,0 +1,10 @@
+module TodosDestroyer
+ class EntityLeaveWorker
+ include ApplicationWorker
+ include TodosDestroyerQueue
+
+ def perform(user_id, entity_id, entity_type)
+ ::Todos::Destroy::EntityLeaveService.new(user_id, entity_id, entity_type).execute
+ end
+ end
+end
diff --git a/app/workers/todos_destroyer/private_features_worker.rb b/app/workers/todos_destroyer/private_features_worker.rb
new file mode 100644
index 00000000000..f457d5e0471
--- /dev/null
+++ b/app/workers/todos_destroyer/private_features_worker.rb
@@ -0,0 +1,10 @@
+module TodosDestroyer
+ class PrivateFeaturesWorker
+ include ApplicationWorker
+ include TodosDestroyerQueue
+
+ def perform(project_id, user_id = nil)
+ ::Todos::Destroy::PrivateFeaturesService.new(project_id, user_id).execute
+ end
+ end
+end
diff --git a/app/workers/todos_destroyer/project_private_worker.rb b/app/workers/todos_destroyer/project_private_worker.rb
new file mode 100644
index 00000000000..7a853c36370
--- /dev/null
+++ b/app/workers/todos_destroyer/project_private_worker.rb
@@ -0,0 +1,10 @@
+module TodosDestroyer
+ class ProjectPrivateWorker
+ include ApplicationWorker
+ include TodosDestroyerQueue
+
+ def perform(project_id)
+ ::Todos::Destroy::ProjectPrivateService.new(project_id).execute
+ end
+ end
+end
diff --git a/changelogs/unreleased/1756-set-iid-via-api.yml b/changelogs/unreleased/1756-set-iid-via-api.yml
new file mode 100644
index 00000000000..680a9464ab4
--- /dev/null
+++ b/changelogs/unreleased/1756-set-iid-via-api.yml
@@ -0,0 +1,5 @@
+---
+title: Allow issues API to receive an internal ID (iid) on create
+merge_request: 20626
+author: Jamie Schembri
+type: fixed
diff --git a/changelogs/unreleased/25990-improve-web-terminal.yml b/changelogs/unreleased/25990-improve-web-terminal.yml
new file mode 100644
index 00000000000..3f8a8c6211c
--- /dev/null
+++ b/changelogs/unreleased/25990-improve-web-terminal.yml
@@ -0,0 +1,5 @@
+---
+title: Move xterm to a node dependency and remove it from vendor's folder
+merge_request: 20588
+author:
+type: other
diff --git a/changelogs/unreleased/25990-interactive-web-terminals-authorization.yml b/changelogs/unreleased/25990-interactive-web-terminals-authorization.yml
new file mode 100644
index 00000000000..0a2853c20c6
--- /dev/null
+++ b/changelogs/unreleased/25990-interactive-web-terminals-authorization.yml
@@ -0,0 +1,5 @@
+---
+title: Fix authorization for interactive web terminals
+merge_request: 20811
+author:
+type: fixed
diff --git a/changelogs/unreleased/31576-redirect-commits-to-root-if-no-ref.yml b/changelogs/unreleased/31576-redirect-commits-to-root-if-no-ref.yml
new file mode 100644
index 00000000000..21d9d25d342
--- /dev/null
+++ b/changelogs/unreleased/31576-redirect-commits-to-root-if-no-ref.yml
@@ -0,0 +1,5 @@
+---
+title: Redirect commits to root if no ref is provided (31576)
+merge_request: 20738
+author: Kia Mei Somabes
+type: added
diff --git a/changelogs/unreleased/32783-api-all-members-with-ancestors.yml b/changelogs/unreleased/32783-api-all-members-with-ancestors.yml
new file mode 100644
index 00000000000..ca53d02845d
--- /dev/null
+++ b/changelogs/unreleased/32783-api-all-members-with-ancestors.yml
@@ -0,0 +1,6 @@
+---
+title: Adds API endpoint /api/v4/(project/group)/:id/members/all to list also inherited
+ members
+merge_request: 19748
+author: Jacopo Beschi @jacopo-beschi
+type: added
diff --git a/changelogs/unreleased/32821-better-error-message-add-invalid-user-to-project.yml b/changelogs/unreleased/32821-better-error-message-add-invalid-user-to-project.yml
new file mode 100644
index 00000000000..587d7209c2f
--- /dev/null
+++ b/changelogs/unreleased/32821-better-error-message-add-invalid-user-to-project.yml
@@ -0,0 +1,5 @@
+---
+title: Improve error message when adding invalid user to a project
+merge_request: 20885
+author: Jacopo Beschi @jacopo-beschi
+type: added
diff --git a/changelogs/unreleased/34572-ssh-certificates.yml b/changelogs/unreleased/34572-ssh-certificates.yml
new file mode 100644
index 00000000000..76a08a188de
--- /dev/null
+++ b/changelogs/unreleased/34572-ssh-certificates.yml
@@ -0,0 +1,5 @@
+---
+title: Add support for SSH certificate authentication
+merge_request: 19911
+author: Ævar Arnfjörð Bjarmason
+type: added
diff --git a/changelogs/unreleased/38604-add-private-profile.yml b/changelogs/unreleased/38604-add-private-profile.yml
new file mode 100644
index 00000000000..e40e7d9321e
--- /dev/null
+++ b/changelogs/unreleased/38604-add-private-profile.yml
@@ -0,0 +1,5 @@
+---
+title: Add an option to have a private profile on GitLab.
+merge_request: 20387
+author: jxterry
+type: added
diff --git a/changelogs/unreleased/40973-disable-rack-attack-by-default.yml b/changelogs/unreleased/40973-disable-rack-attack-by-default.yml
new file mode 100644
index 00000000000..681aa761e2a
--- /dev/null
+++ b/changelogs/unreleased/40973-disable-rack-attack-by-default.yml
@@ -0,0 +1,5 @@
+---
+title: Rack attack is now disabled by default
+merge_request: 16669
+author:
+type: changed
diff --git a/changelogs/unreleased/41416-making-instance-wide-data-tools-more-accessible.yml b/changelogs/unreleased/41416-making-instance-wide-data-tools-more-accessible.yml
new file mode 100644
index 00000000000..b980b719d68
--- /dev/null
+++ b/changelogs/unreleased/41416-making-instance-wide-data-tools-more-accessible.yml
@@ -0,0 +1,5 @@
+---
+title: Allow non-admins to view instance statistics (if permitted by the instance admins)
+merge_request: 20874
+author:
+type: changed
diff --git a/changelogs/unreleased/44824-remove-ghost-notification-settings-for-group-and-project.yml b/changelogs/unreleased/44824-remove-ghost-notification-settings-for-group-and-project.yml
new file mode 100644
index 00000000000..ddc878ee710
--- /dev/null
+++ b/changelogs/unreleased/44824-remove-ghost-notification-settings-for-group-and-project.yml
@@ -0,0 +1,5 @@
+---
+title: Adds foreign key to notification_settings.user_id
+merge_request: 20567
+author: Jacopo Beschi @jacopo-beschi
+type: added
diff --git a/changelogs/unreleased/4525-fix-project-indexes.yml b/changelogs/unreleased/4525-fix-project-indexes.yml
deleted file mode 100644
index 930e3b934c2..00000000000
--- a/changelogs/unreleased/4525-fix-project-indexes.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Rework some projects table indexes around repository_storage field
-merge_request: 20377
-author:
-type: fixed
diff --git a/changelogs/unreleased/45318-junit-FE.yml b/changelogs/unreleased/45318-junit-FE.yml
new file mode 100644
index 00000000000..bbc08f54484
--- /dev/null
+++ b/changelogs/unreleased/45318-junit-FE.yml
@@ -0,0 +1,5 @@
+---
+title: Adds frontend support to render test reports on the MR widget
+merge_request: 20936
+author:
+type: added
diff --git a/changelogs/unreleased/46940-hashed-storage-extend-enable-hashed-storage-for-all-new-projects-to-for-all-new-and-renamed-projects.yml b/changelogs/unreleased/46940-hashed-storage-extend-enable-hashed-storage-for-all-new-projects-to-for-all-new-and-renamed-projects.yml
new file mode 100644
index 00000000000..71e523e6de8
--- /dev/null
+++ b/changelogs/unreleased/46940-hashed-storage-extend-enable-hashed-storage-for-all-new-projects-to-for-all-new-and-renamed-projects.yml
@@ -0,0 +1,5 @@
+---
+title: Enable hashed storage for all newly created or renamed projects
+merge_request: 19747
+author:
+type: changed
diff --git a/changelogs/unreleased/47548-monospace-commit-messages.yml b/changelogs/unreleased/47548-monospace-commit-messages.yml
new file mode 100644
index 00000000000..7344f72207b
--- /dev/null
+++ b/changelogs/unreleased/47548-monospace-commit-messages.yml
@@ -0,0 +1,5 @@
+---
+title: Update commit message styles with monospace font and overflow-x
+merge_request: 20988
+author:
+type: changed
diff --git a/changelogs/unreleased/47728-mr-api-documentation-changes.yml b/changelogs/unreleased/47728-mr-api-documentation-changes.yml
new file mode 100644
index 00000000000..12720f280a1
--- /dev/null
+++ b/changelogs/unreleased/47728-mr-api-documentation-changes.yml
@@ -0,0 +1,5 @@
+---
+title: Remove changes_count from MR API documentation where necessary
+merge_request: 19745
+author: Jan Beckmann
+type: fixed
diff --git a/changelogs/unreleased/48055-web-ide-resize-handles.yml b/changelogs/unreleased/48055-web-ide-resize-handles.yml
new file mode 100644
index 00000000000..0f650cdda6f
--- /dev/null
+++ b/changelogs/unreleased/48055-web-ide-resize-handles.yml
@@ -0,0 +1,5 @@
+---
+title: Increase width of Web IDE sidebar resize handles
+merge_request: 20818
+author:
+type: fixed
diff --git a/changelogs/unreleased/48246-osw-load-diffs-improvement.yml b/changelogs/unreleased/48246-osw-load-diffs-improvement.yml
new file mode 100644
index 00000000000..c4292ab0d29
--- /dev/null
+++ b/changelogs/unreleased/48246-osw-load-diffs-improvement.yml
@@ -0,0 +1,5 @@
+---
+title: Improve performance when fetching collapsed diffs and commenting in merge requests
+merge_request: 20940
+author:
+type: performance
diff --git a/changelogs/unreleased/48542-code-link.yml b/changelogs/unreleased/48542-code-link.yml
new file mode 100644
index 00000000000..8d8d9bf8d74
--- /dev/null
+++ b/changelogs/unreleased/48542-code-link.yml
@@ -0,0 +1,5 @@
+---
+title: Fix link color in markdown code brackets
+merge_request: 20841
+author:
+type: fixed
diff --git a/changelogs/unreleased/48617-promoting-milestone.yml b/changelogs/unreleased/48617-promoting-milestone.yml
new file mode 100644
index 00000000000..7fbc15051cf
--- /dev/null
+++ b/changelogs/unreleased/48617-promoting-milestone.yml
@@ -0,0 +1,5 @@
+---
+title: Escapes milestone and label's names on flash notice when promoting them
+merge_request:
+author:
+type: fixed
diff --git a/changelogs/unreleased/48636-new-mr-card-styles.yml b/changelogs/unreleased/48636-new-mr-card-styles.yml
new file mode 100644
index 00000000000..94f62e677fb
--- /dev/null
+++ b/changelogs/unreleased/48636-new-mr-card-styles.yml
@@ -0,0 +1,5 @@
+---
+title: Fix new MR card styles
+merge_request: 20822
+author:
+type: fixed
diff --git a/changelogs/unreleased/48773-gitlab-project-import-should-use-object-storage.yml b/changelogs/unreleased/48773-gitlab-project-import-should-use-object-storage.yml
new file mode 100644
index 00000000000..f298380b920
--- /dev/null
+++ b/changelogs/unreleased/48773-gitlab-project-import-should-use-object-storage.yml
@@ -0,0 +1,5 @@
+---
+title: Add object storage logic to project import
+merge_request: 20773
+author:
+type: added
diff --git a/changelogs/unreleased/48817-fix-mr-changes-discussion-navigation.yml b/changelogs/unreleased/48817-fix-mr-changes-discussion-navigation.yml
deleted file mode 100644
index ec4b843b863..00000000000
--- a/changelogs/unreleased/48817-fix-mr-changes-discussion-navigation.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Fix navigation to First and Next discussion on MR Changes tab
-merge_request: 20434
-author:
-type: fixed
diff --git a/changelogs/unreleased/48823-copy-gfm.yml b/changelogs/unreleased/48823-copy-gfm.yml
new file mode 100644
index 00000000000..b6137e2e3f9
--- /dev/null
+++ b/changelogs/unreleased/48823-copy-gfm.yml
@@ -0,0 +1,5 @@
+---
+title: Resolve Copy diff file path as GFM is broken
+merge_request: 20725
+author:
+type: fixed
diff --git a/changelogs/unreleased/48834-chart-versions-for-applications-installed-by-one-click-install-buttons-should-be-version-locked.yml b/changelogs/unreleased/48834-chart-versions-for-applications-installed-by-one-click-install-buttons-should-be-version-locked.yml
new file mode 100644
index 00000000000..d79b95411aa
--- /dev/null
+++ b/changelogs/unreleased/48834-chart-versions-for-applications-installed-by-one-click-install-buttons-should-be-version-locked.yml
@@ -0,0 +1,6 @@
+---
+title: Chart versions for applications installed by one click install buttons should
+ be version locked
+merge_request: 20765
+author:
+type: fixed
diff --git a/changelogs/unreleased/49025-docs-kubernetes-tiller.yml b/changelogs/unreleased/49025-docs-kubernetes-tiller.yml
new file mode 100644
index 00000000000..c4f01490cfa
--- /dev/null
+++ b/changelogs/unreleased/49025-docs-kubernetes-tiller.yml
@@ -0,0 +1,5 @@
+---
+title: Update docs of Helm Tiller
+merge_request: 20515
+author: Takuya Noguchi
+type: other
diff --git a/changelogs/unreleased/49107-prefetching-of-assets-and-cdn-domain.yml b/changelogs/unreleased/49107-prefetching-of-assets-and-cdn-domain.yml
new file mode 100644
index 00000000000..541b562adac
--- /dev/null
+++ b/changelogs/unreleased/49107-prefetching-of-assets-and-cdn-domain.yml
@@ -0,0 +1,5 @@
+---
+title: DNS prefetching if asset_host for CDN hosting is set
+merge_request: 20781
+author:
+type: performance
diff --git a/changelogs/unreleased/49161-disable-toggle-comments.yml b/changelogs/unreleased/49161-disable-toggle-comments.yml
new file mode 100644
index 00000000000..5ec16191f07
--- /dev/null
+++ b/changelogs/unreleased/49161-disable-toggle-comments.yml
@@ -0,0 +1,5 @@
+---
+title: Disables toggle comments button if diff has no discussions
+merge_request:
+author:
+type: other
diff --git a/changelogs/unreleased/49364-fix-broadcast-margin.yml b/changelogs/unreleased/49364-fix-broadcast-margin.yml
new file mode 100644
index 00000000000..821fb9df1af
--- /dev/null
+++ b/changelogs/unreleased/49364-fix-broadcast-margin.yml
@@ -0,0 +1,5 @@
+---
+title: Fix misalignment of broadcast message on login page
+merge_request: 20794
+author: Robin Naundorf
+type: fixed
diff --git a/changelogs/unreleased/49499-list-of-projects-not-loading-when-trying-to-create-an-issue-from-a-board-typeerror.yml b/changelogs/unreleased/49499-list-of-projects-not-loading-when-trying-to-create-an-issue-from-a-board-typeerror.yml
new file mode 100644
index 00000000000..043698269e2
--- /dev/null
+++ b/changelogs/unreleased/49499-list-of-projects-not-loading-when-trying-to-create-an-issue-from-a-board-typeerror.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed list of projects not loading in group boards
+merge_request: 20955
+author:
+type: fixed
diff --git a/changelogs/unreleased/49701-sorting-by-name-on-milestones-page-error.yml b/changelogs/unreleased/49701-sorting-by-name-on-milestones-page-error.yml
new file mode 100644
index 00000000000..7eb73110d60
--- /dev/null
+++ b/changelogs/unreleased/49701-sorting-by-name-on-milestones-page-error.yml
@@ -0,0 +1,5 @@
+---
+title: Fix sorting by name on milestones page
+merge_request: 20881
+author:
+type: fixed
diff --git a/changelogs/unreleased/49747-update-poll-2xx.yml b/changelogs/unreleased/49747-update-poll-2xx.yml
new file mode 100644
index 00000000000..359d1b80447
--- /dev/null
+++ b/changelogs/unreleased/49747-update-poll-2xx.yml
@@ -0,0 +1,5 @@
+---
+title: Changes poll.js to keep polling on any 2xx http status code
+merge_request: 20904
+author:
+type: other
diff --git a/changelogs/unreleased/49776-pipeline-job-log-page-uses-too-much-cpu-for-loading-animation.yml b/changelogs/unreleased/49776-pipeline-job-log-page-uses-too-much-cpu-for-loading-animation.yml
new file mode 100644
index 00000000000..96da2436a9f
--- /dev/null
+++ b/changelogs/unreleased/49776-pipeline-job-log-page-uses-too-much-cpu-for-loading-animation.yml
@@ -0,0 +1,5 @@
+---
+title: refactor pipeline job log animation to reduce CPU usage
+merge_request: 20915
+author:
+type: performance
diff --git a/changelogs/unreleased/49830-use-helm-272.yml b/changelogs/unreleased/49830-use-helm-272.yml
new file mode 100644
index 00000000000..f6ecc12dbfa
--- /dev/null
+++ b/changelogs/unreleased/49830-use-helm-272.yml
@@ -0,0 +1,5 @@
+---
+title: Use Helm 2.7.2 for GitLab Managed Apps
+merge_request: 20956
+author:
+type: changed
diff --git a/changelogs/unreleased/49851-link-to-runners.yml b/changelogs/unreleased/49851-link-to-runners.yml
new file mode 100644
index 00000000000..89fd6853bc8
--- /dev/null
+++ b/changelogs/unreleased/49851-link-to-runners.yml
@@ -0,0 +1,6 @@
+---
+title: Automatically expand runner's settings block when linking to the runner's settings
+ page
+merge_request:
+author:
+type: other
diff --git a/changelogs/unreleased/49861-top-nav-search-bar-produces-console-error-when-unauthenticated.yml b/changelogs/unreleased/49861-top-nav-search-bar-produces-console-error-when-unauthenticated.yml
new file mode 100644
index 00000000000..30f5002c5b5
--- /dev/null
+++ b/changelogs/unreleased/49861-top-nav-search-bar-produces-console-error-when-unauthenticated.yml
@@ -0,0 +1,5 @@
+---
+title: fix error caused when using the search bar while unauthenticated
+merge_request: 20970
+author:
+type: fixed
diff --git a/changelogs/unreleased/49899-merge-request-e-mail-link-has-full-url.yml b/changelogs/unreleased/49899-merge-request-e-mail-link-has-full-url.yml
new file mode 100644
index 00000000000..856a7c579f3
--- /dev/null
+++ b/changelogs/unreleased/49899-merge-request-e-mail-link-has-full-url.yml
@@ -0,0 +1,5 @@
+---
+title: Ensure links in notifications footer are not escaped
+merge_request: 21000
+author:
+type: fixed
diff --git a/changelogs/unreleased/6860-FE-instance-level-project-templates.yml b/changelogs/unreleased/6860-FE-instance-level-project-templates.yml
new file mode 100644
index 00000000000..74e0daee71b
--- /dev/null
+++ b/changelogs/unreleased/6860-FE-instance-level-project-templates.yml
@@ -0,0 +1,5 @@
+---
+title: Update design of project templates
+merge_request: 21012
+author:
+type: changed
diff --git a/changelogs/unreleased/_acet-fix-expanding-context-lines.yml b/changelogs/unreleased/_acet-fix-expanding-context-lines.yml
deleted file mode 100644
index 41b4dbca5d6..00000000000
--- a/changelogs/unreleased/_acet-fix-expanding-context-lines.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Fix rendering of the context lines in MR diffs page
-merge_request: 20642
-author:
-type: fixed
diff --git a/changelogs/unreleased/_acet-fix-mr-autosave.yml b/changelogs/unreleased/_acet-fix-mr-autosave.yml
deleted file mode 100644
index f87b32f68e2..00000000000
--- a/changelogs/unreleased/_acet-fix-mr-autosave.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Fix autosave and ESC confirmation issues for MR discussions
-merge_request: 20569
-author:
-type: fixed
diff --git a/changelogs/unreleased/_acet-fix-outdated-discussions.yml b/changelogs/unreleased/_acet-fix-outdated-discussions.yml
deleted file mode 100644
index d31483b4765..00000000000
--- a/changelogs/unreleased/_acet-fix-outdated-discussions.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Fix showing outdated discussions on Changes tab
-merge_request: 20445
-author:
-type: fixed
diff --git a/changelogs/unreleased/artifact-format-v2-with-parser.yml b/changelogs/unreleased/artifact-format-v2-with-parser.yml
new file mode 100644
index 00000000000..e1a779cf6dd
--- /dev/null
+++ b/changelogs/unreleased/artifact-format-v2-with-parser.yml
@@ -0,0 +1,5 @@
+---
+title: JUnit XML Test Summary In MR widget
+merge_request: 20576
+author:
+type: added
diff --git a/changelogs/unreleased/artifact-format-v2.yml b/changelogs/unreleased/artifact-format-v2.yml
new file mode 100644
index 00000000000..e264e0a9fa1
--- /dev/null
+++ b/changelogs/unreleased/artifact-format-v2.yml
@@ -0,0 +1,5 @@
+---
+title: Extend gitlab-ci.yml to request junit.xml test reports
+merge_request: 20390
+author:
+type: added
diff --git a/changelogs/unreleased/bvl-graphql-wip-mutation.yml b/changelogs/unreleased/bvl-graphql-wip-mutation.yml
new file mode 100644
index 00000000000..00aa1c48677
--- /dev/null
+++ b/changelogs/unreleased/bvl-graphql-wip-mutation.yml
@@ -0,0 +1,5 @@
+---
+title: Add the first mutations for merge requests to GraphQL
+merge_request: 20443
+author:
+type: added
diff --git a/changelogs/unreleased/bvl-user-status-message-35463.yml b/changelogs/unreleased/bvl-user-status-message-35463.yml
new file mode 100644
index 00000000000..c844e7ea0e4
--- /dev/null
+++ b/changelogs/unreleased/bvl-user-status-message-35463.yml
@@ -0,0 +1,5 @@
+---
+title: Users can set a status message and emoji
+merge_request: 20614
+author: niedermyer & davamr
+type: added
diff --git a/changelogs/unreleased/ce-6064-geo-sql-query-for-counting-projects-with-wikis-is-very-slow.yml b/changelogs/unreleased/ce-6064-geo-sql-query-for-counting-projects-with-wikis-is-very-slow.yml
new file mode 100644
index 00000000000..b76437a8773
--- /dev/null
+++ b/changelogs/unreleased/ce-6064-geo-sql-query-for-counting-projects-with-wikis-is-very-slow.yml
@@ -0,0 +1,5 @@
+---
+title: Tracking the number of repositories and wikis with a cached counter for site-wide statistics
+merge_request: 20413
+author:
+type: performance
diff --git a/changelogs/unreleased/cr-add-group-milestone-to-dashboard.yml b/changelogs/unreleased/cr-add-group-milestone-to-dashboard.yml
new file mode 100644
index 00000000000..b87a1e5faf7
--- /dev/null
+++ b/changelogs/unreleased/cr-add-group-milestone-to-dashboard.yml
@@ -0,0 +1,5 @@
+---
+title: Adds the ability to view group milestones on the dashboard milestone page.
+merge_request: 20618
+author:
+type: fixed
diff --git a/changelogs/unreleased/cr-add-path-of-group-milestone.yml b/changelogs/unreleased/cr-add-path-of-group-milestone.yml
new file mode 100644
index 00000000000..5ce240110ef
--- /dev/null
+++ b/changelogs/unreleased/cr-add-path-of-group-milestone.yml
@@ -0,0 +1,5 @@
+---
+title: Adds the project and group name to the return type for project and group milestones.
+merge_request: 20890
+author:
+type: changed
diff --git a/changelogs/custom_wiki_sidebar.yml b/changelogs/unreleased/custom_wiki_sidebar.yml
index 988fccc929c..988fccc929c 100644
--- a/changelogs/custom_wiki_sidebar.yml
+++ b/changelogs/unreleased/custom_wiki_sidebar.yml
diff --git a/changelogs/unreleased/dz-labels-search.yml b/changelogs/unreleased/dz-labels-search.yml
new file mode 100644
index 00000000000..49c1b6c1a86
--- /dev/null
+++ b/changelogs/unreleased/dz-labels-search.yml
@@ -0,0 +1,5 @@
+---
+title: Search for labels by title or description on project labels page
+merge_request: 20749
+author:
+type: added
diff --git a/changelogs/unreleased/feature-gb-login-activity-metrics.yml b/changelogs/unreleased/feature-gb-login-activity-metrics.yml
new file mode 100644
index 00000000000..5d687b984eb
--- /dev/null
+++ b/changelogs/unreleased/feature-gb-login-activity-metrics.yml
@@ -0,0 +1,5 @@
+---
+title: Add more comprehensive metrics tracking authentication activity
+merge_request: 20668
+author:
+type: added
diff --git a/changelogs/unreleased/fix-email-confirmation-addtional-email.yml b/changelogs/unreleased/fix-email-confirmation-addtional-email.yml
new file mode 100644
index 00000000000..56a2efa4d60
--- /dev/null
+++ b/changelogs/unreleased/fix-email-confirmation-addtional-email.yml
@@ -0,0 +1,5 @@
+---
+title: Fix email confirmation bug when user adds additional email to account
+merge_request: 20084
+author: muhammadn
+type: fixed
diff --git a/changelogs/unreleased/fix-multiple-scopes.yml b/changelogs/unreleased/fix-multiple-scopes.yml
new file mode 100644
index 00000000000..24e5172d9a1
--- /dev/null
+++ b/changelogs/unreleased/fix-multiple-scopes.yml
@@ -0,0 +1,5 @@
+---
+title: Support multiple scopes when authing container registry scopes
+merge_request: 20617
+author:
+type: fixed
diff --git a/changelogs/unreleased/fix-storage-size-for-artifacts-change.yml b/changelogs/unreleased/fix-storage-size-for-artifacts-change.yml
new file mode 100644
index 00000000000..6a3e1420726
--- /dev/null
+++ b/changelogs/unreleased/fix-storage-size-for-artifacts-change.yml
@@ -0,0 +1,5 @@
+---
+title: Update total storage size when changing size of artifacts
+merge_request: 20697
+author: Peter Marko
+type: fixed
diff --git a/changelogs/unreleased/fj-37736-improve-performance-post-receive-create-gpg-siganture-worker.yml b/changelogs/unreleased/fj-37736-improve-performance-post-receive-create-gpg-siganture-worker.yml
new file mode 100644
index 00000000000..0b35c5c6786
--- /dev/null
+++ b/changelogs/unreleased/fj-37736-improve-performance-post-receive-create-gpg-siganture-worker.yml
@@ -0,0 +1,5 @@
+---
+title: Performing Commit GPG signature calculation in bulk
+merge_request: 20870
+author:
+type: performance
diff --git a/changelogs/unreleased/fj-49512-fix-gitlab-git-pages-encoding.yml b/changelogs/unreleased/fj-49512-fix-gitlab-git-pages-encoding.yml
new file mode 100644
index 00000000000..3af90fff3f6
--- /dev/null
+++ b/changelogs/unreleased/fj-49512-fix-gitlab-git-pages-encoding.yml
@@ -0,0 +1,5 @@
+---
+title: Prevent editing and updating wiki pages with non UTF-8 encoding via web interface
+merge_request: 20906
+author:
+type: fixed
diff --git a/changelogs/unreleased/fj-49802-bug-api-set-http-headers.yml b/changelogs/unreleased/fj-49802-bug-api-set-http-headers.yml
new file mode 100644
index 00000000000..ba61d378cda
--- /dev/null
+++ b/changelogs/unreleased/fj-49802-bug-api-set-http-headers.yml
@@ -0,0 +1,5 @@
+---
+title: Fix bug setting http headers in Files API
+merge_request: 20938
+author:
+type: fixed
diff --git a/changelogs/unreleased/floating-avarage-commit-numbers.yml b/changelogs/unreleased/floating-avarage-commit-numbers.yml
new file mode 100644
index 00000000000..7f91ab16af4
--- /dev/null
+++ b/changelogs/unreleased/floating-avarage-commit-numbers.yml
@@ -0,0 +1,5 @@
+---
+title: Show one digit after dot in commit_per_day value in charts page.
+merge_request:
+author: msdundar
+type: changed
diff --git a/changelogs/unreleased/frozen-string-danger.yml b/changelogs/unreleased/frozen-string-danger.yml
new file mode 100644
index 00000000000..9910139b8a9
--- /dev/null
+++ b/changelogs/unreleased/frozen-string-danger.yml
@@ -0,0 +1,5 @@
+---
+title: Add Dangerfile for frozen_string_literal
+merge_request: 20767
+author: gfyoung
+type: performance
diff --git a/changelogs/unreleased/frozen-string-enable-app-models-more.yml b/changelogs/unreleased/frozen-string-enable-app-models-more.yml
new file mode 100644
index 00000000000..c0466984134
--- /dev/null
+++ b/changelogs/unreleased/frozen-string-enable-app-models-more.yml
@@ -0,0 +1,5 @@
+---
+title: Enable frozen string for app/models/**/*.rb
+merge_request: 21001
+author: gfyoung
+type: performance
diff --git a/changelogs/unreleased/frozen-string-enable-app-models.yml b/changelogs/unreleased/frozen-string-enable-app-models.yml
new file mode 100644
index 00000000000..4c149ea55ef
--- /dev/null
+++ b/changelogs/unreleased/frozen-string-enable-app-models.yml
@@ -0,0 +1,5 @@
+---
+title: Enable frozen string in app/models/*.rb
+merge_request: 20851
+author: gfyoung
+type: performance
diff --git a/changelogs/unreleased/frozen-string-enable-app-presenters-policies.yml b/changelogs/unreleased/frozen-string-enable-app-presenters-policies.yml
new file mode 100644
index 00000000000..5c6b1b1a904
--- /dev/null
+++ b/changelogs/unreleased/frozen-string-enable-app-presenters-policies.yml
@@ -0,0 +1,5 @@
+---
+title: Enable frozen string in app/presenters and app/policies
+merge_request: 20819
+author: gfyoung
+type: performance
diff --git a/changelogs/unreleased/full-list-of-vulnerabilities-5239.yml b/changelogs/unreleased/full-list-of-vulnerabilities-5239.yml
new file mode 100644
index 00000000000..b26eb82b6c9
--- /dev/null
+++ b/changelogs/unreleased/full-list-of-vulnerabilities-5239.yml
@@ -0,0 +1,5 @@
+---
+title: Removes "show all" on reports and adds an actionButtons slot
+merge_request: 20855
+author:
+type: changed
diff --git a/changelogs/unreleased/ide-delete-entries.yml b/changelogs/unreleased/ide-delete-entries.yml
new file mode 100644
index 00000000000..8cbc0739406
--- /dev/null
+++ b/changelogs/unreleased/ide-delete-entries.yml
@@ -0,0 +1,5 @@
+---
+title: Enabled deletion of files in the Web IDE
+merge_request:
+author:
+type: added
diff --git a/changelogs/unreleased/ide-rename-files.yml b/changelogs/unreleased/ide-rename-files.yml
new file mode 100644
index 00000000000..c2db284e07c
--- /dev/null
+++ b/changelogs/unreleased/ide-rename-files.yml
@@ -0,0 +1,5 @@
+---
+title: Enable renaming files and folders in Web IDE
+merge_request: 20835
+author:
+type: added
diff --git a/changelogs/unreleased/ide-warn-staged-files.yml b/changelogs/unreleased/ide-warn-staged-files.yml
new file mode 100644
index 00000000000..ae3c4f392c0
--- /dev/null
+++ b/changelogs/unreleased/ide-warn-staged-files.yml
@@ -0,0 +1,5 @@
+---
+title: Warn user when reload IDE with staged changes
+merge_request: 20857
+author:
+type: added
diff --git a/changelogs/unreleased/jprovazn-resource-events.yml b/changelogs/unreleased/jprovazn-resource-events.yml
new file mode 100644
index 00000000000..05643150f16
--- /dev/null
+++ b/changelogs/unreleased/jprovazn-resource-events.yml
@@ -0,0 +1,5 @@
+---
+title: Add new model for tracking label events.
+merge_request:
+author:
+type: added
diff --git a/changelogs/unreleased/mk-add-local-project-uploads-cleanup-task.yml b/changelogs/unreleased/mk-add-local-project-uploads-cleanup-task.yml
new file mode 100644
index 00000000000..9d38b353a41
--- /dev/null
+++ b/changelogs/unreleased/mk-add-local-project-uploads-cleanup-task.yml
@@ -0,0 +1,5 @@
+---
+title: Add local project uploads cleanup task
+merge_request: 20863
+author:
+type: added
diff --git a/changelogs/unreleased/mk-fix-callback-canceling-in-namespace-move-dir.yml b/changelogs/unreleased/mk-fix-callback-canceling-in-namespace-move-dir.yml
new file mode 100644
index 00000000000..8e71377d93f
--- /dev/null
+++ b/changelogs/unreleased/mk-fix-callback-canceling-in-namespace-move-dir.yml
@@ -0,0 +1,5 @@
+---
+title: Fix namespace move callback behavior, especially to fix Geo replication of namespace moves during certain exceptions.
+merge_request: 19297
+author:
+type: fixed
diff --git a/changelogs/unreleased/project-dropdown-list-overflow.yml b/changelogs/unreleased/project-dropdown-list-overflow.yml
deleted file mode 100644
index 9b74a68291b..00000000000
--- a/changelogs/unreleased/project-dropdown-list-overflow.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Don't overflow project/group dropdown results
-merge_request: 20704
-author: gfyoung
-type: fixed
diff --git a/changelogs/unreleased/rails5-fix-flaky-spec-user-uses-shortcuts.yml b/changelogs/unreleased/rails5-fix-flaky-spec-user-uses-shortcuts.yml
new file mode 100644
index 00000000000..5f2504c604d
--- /dev/null
+++ b/changelogs/unreleased/rails5-fix-flaky-spec-user-uses-shortcuts.yml
@@ -0,0 +1,5 @@
+---
+title: 'Rails5: fix flaky spec'
+merge_request: 20953
+author: Jasper Maes
+type: fixed
diff --git a/changelogs/unreleased/rails5-gpg-permit-concurrent.yml b/changelogs/unreleased/rails5-gpg-permit-concurrent.yml
new file mode 100644
index 00000000000..cf1b0023f86
--- /dev/null
+++ b/changelogs/unreleased/rails5-gpg-permit-concurrent.yml
@@ -0,0 +1,5 @@
+---
+title: Permit concurrent loads in gpg keychain mutex
+merge_request: 20894
+author: Jasper Maes
+type: fixed
diff --git a/changelogs/unreleased/rails5-update-gemfile-lock-2.yml b/changelogs/unreleased/rails5-update-gemfile-lock-2.yml
new file mode 100644
index 00000000000..1f3e9bd2238
--- /dev/null
+++ b/changelogs/unreleased/rails5-update-gemfile-lock-2.yml
@@ -0,0 +1,5 @@
+---
+title: Rails5 update Gemfile.rails5.lock
+merge_request: 20858
+author: Jasper Maes
+type: fixed
diff --git a/changelogs/unreleased/rails5-update-rouge.yml b/changelogs/unreleased/rails5-update-rouge.yml
new file mode 100644
index 00000000000..1173b3b7e9a
--- /dev/null
+++ b/changelogs/unreleased/rails5-update-rouge.yml
@@ -0,0 +1,5 @@
+---
+title: 'Rails5: update Rails5 lock for forgotten gem rouge'
+merge_request: 21010
+author: Jasper Maes
+type: fixed
diff --git a/changelogs/unreleased/replace-all-snake-case-in-scss-variables.yml b/changelogs/unreleased/replace-all-snake-case-in-scss-variables.yml
new file mode 100644
index 00000000000..8d5ecdfa57e
--- /dev/null
+++ b/changelogs/unreleased/replace-all-snake-case-in-scss-variables.yml
@@ -0,0 +1,5 @@
+---
+title: Replace snake case in SCSS variables
+merge_request: 20799
+author: George Tsiolis
+type: other
diff --git a/changelogs/unreleased/replace-snake-case-css-classes.yml b/changelogs/unreleased/replace-snake-case-css-classes.yml
new file mode 100644
index 00000000000..28ec5ee097f
--- /dev/null
+++ b/changelogs/unreleased/replace-snake-case-css-classes.yml
@@ -0,0 +1,5 @@
+---
+title: Replace author_link snake case in stylesheets, specs, and helpers
+merge_request: 20797
+author: George Tsiolis
+type: other
diff --git a/changelogs/unreleased/rouge-3-2-0.yml b/changelogs/unreleased/rouge-3-2-0.yml
new file mode 100644
index 00000000000..15ac4cc1e76
--- /dev/null
+++ b/changelogs/unreleased/rouge-3-2-0.yml
@@ -0,0 +1,5 @@
+---
+title: Update to Rouge 3.2.0, including Terraform and Crystal lexer and bug fixes
+merge_request: 20991
+author:
+type: changed
diff --git a/changelogs/unreleased/runner-features.yml b/changelogs/unreleased/runner-features.yml
new file mode 100644
index 00000000000..c5e0fff5a18
--- /dev/null
+++ b/changelogs/unreleased/runner-features.yml
@@ -0,0 +1,5 @@
+---
+title: Verify runner feature set
+merge_request: 20664
+author:
+type: added
diff --git a/changelogs/unreleased/security-fj-missing-csrf-system-hooks.yml b/changelogs/unreleased/security-fj-missing-csrf-system-hooks.yml
new file mode 100644
index 00000000000..fabf48acbbc
--- /dev/null
+++ b/changelogs/unreleased/security-fj-missing-csrf-system-hooks.yml
@@ -0,0 +1,5 @@
+---
+title: Adding CSRF protection to Hooks test action
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/security-ide-branch-name-xss.yml b/changelogs/unreleased/security-ide-branch-name-xss.yml
new file mode 100644
index 00000000000..51742ffa4e9
--- /dev/null
+++ b/changelogs/unreleased/security-ide-branch-name-xss.yml
@@ -0,0 +1,5 @@
+---
+title: Fixed XSS in branch name in Web IDE
+merge_request:
+author:
+type: security
diff --git a/changelogs/unreleased/sh-bump-haml-5-0-4.yml b/changelogs/unreleased/sh-bump-haml-5-0-4.yml
new file mode 100644
index 00000000000..269b1e55417
--- /dev/null
+++ b/changelogs/unreleased/sh-bump-haml-5-0-4.yml
@@ -0,0 +1,5 @@
+---
+title: Bump haml gem to 5.0.4
+merge_request: 20847
+author:
+type: performance
diff --git a/changelogs/unreleased/sh-fix-admin-jobs-controller-timing-out.yml b/changelogs/unreleased/sh-fix-admin-jobs-controller-timing-out.yml
new file mode 100644
index 00000000000..e1adebbf076
--- /dev/null
+++ b/changelogs/unreleased/sh-fix-admin-jobs-controller-timing-out.yml
@@ -0,0 +1,5 @@
+---
+title: Fix /admin/jobs failing to load due to statement timeout
+merge_request: 20909
+author:
+type: performance
diff --git a/changelogs/unreleased/sh-include-rbtrace.yml b/changelogs/unreleased/sh-include-rbtrace.yml
new file mode 100644
index 00000000000..41f0655e3f8
--- /dev/null
+++ b/changelogs/unreleased/sh-include-rbtrace.yml
@@ -0,0 +1,5 @@
+---
+title: Add rbtrace to Gemfile
+merge_request: 20831
+author:
+type: other
diff --git a/changelogs/unreleased/sh-lfs-fix-content-type.yml b/changelogs/unreleased/sh-lfs-fix-content-type.yml
new file mode 100644
index 00000000000..a839be9b3ae
--- /dev/null
+++ b/changelogs/unreleased/sh-lfs-fix-content-type.yml
@@ -0,0 +1,5 @@
+---
+title: Fix LFS uploads not working with git-lfs 2.5.0
+merge_request: 20923
+author:
+type: fixed
diff --git a/changelogs/unreleased/sh-simplify-liveness-check.yml b/changelogs/unreleased/sh-simplify-liveness-check.yml
new file mode 100644
index 00000000000..225e3dc1378
--- /dev/null
+++ b/changelogs/unreleased/sh-simplify-liveness-check.yml
@@ -0,0 +1,5 @@
+---
+title: Add /-/health basic health check endpoint
+merge_request: 20456
+author:
+type: added
diff --git a/changelogs/unreleased/sh-support-users-find-by-confirmed-emails.yml b/changelogs/unreleased/sh-support-users-find-by-confirmed-emails.yml
new file mode 100644
index 00000000000..4b0c8117b3e
--- /dev/null
+++ b/changelogs/unreleased/sh-support-users-find-by-confirmed-emails.yml
@@ -0,0 +1,5 @@
+---
+title: Add support for searching users by confirmed e-mails
+merge_request: 20893
+author:
+type: other
diff --git a/changelogs/unreleased/sh-use-wiki-limit-parameter-gitaly.yml b/changelogs/unreleased/sh-use-wiki-limit-parameter-gitaly.yml
new file mode 100644
index 00000000000..e8c2e11ad31
--- /dev/null
+++ b/changelogs/unreleased/sh-use-wiki-limit-parameter-gitaly.yml
@@ -0,0 +1,5 @@
+---
+title: Use limit parameter to retrieve Wikis from Gitaly
+merge_request: 20764
+author:
+type: performance
diff --git a/changelogs/unreleased/stop-dynamic-routable-creation.yml b/changelogs/unreleased/stop-dynamic-routable-creation.yml
new file mode 100644
index 00000000000..8bfcb5b2d11
--- /dev/null
+++ b/changelogs/unreleased/stop-dynamic-routable-creation.yml
@@ -0,0 +1,5 @@
+---
+title: Stop dynamically creating project and namespace routes
+merge_request: 20313
+author:
+type: performance
diff --git a/changelogs/unreleased/tc-reorder-mail-notify-references.yml b/changelogs/unreleased/tc-reorder-mail-notify-references.yml
new file mode 100644
index 00000000000..689afda0259
--- /dev/null
+++ b/changelogs/unreleased/tc-reorder-mail-notify-references.yml
@@ -0,0 +1,5 @@
+---
+title: Put fallback reply-key address first in the References header
+merge_request: 20871
+author:
+type: changed
diff --git a/changelogs/unreleased/todos-visibility-change.yml b/changelogs/unreleased/todos-visibility-change.yml
new file mode 100644
index 00000000000..b7632b94771
--- /dev/null
+++ b/changelogs/unreleased/todos-visibility-change.yml
@@ -0,0 +1,5 @@
+---
+title: Delete todos when user loses access to read the target
+merge_request: 20665
+author:
+type: other
diff --git a/changelogs/unreleased/tz-mr-refactor-memory-reduction.yml b/changelogs/unreleased/tz-mr-refactor-memory-reduction.yml
deleted file mode 100644
index 16003fa9cad..00000000000
--- a/changelogs/unreleased/tz-mr-refactor-memory-reduction.yml
+++ /dev/null
@@ -1,5 +0,0 @@
----
-title: Reduces the client side memory footprint on merge requests
-merge_request: 20744
-author:
-type: performance
diff --git a/changelogs/unreleased/wrap-job-name-on-jobs-sidebar.yml b/changelogs/unreleased/wrap-job-name-on-jobs-sidebar.yml
new file mode 100644
index 00000000000..97fa1592753
--- /dev/null
+++ b/changelogs/unreleased/wrap-job-name-on-jobs-sidebar.yml
@@ -0,0 +1,5 @@
+---
+title: Wrap job name on pipeline job sidebar
+merge_request: 20804
+author: George Tsiolis
+type: changed
diff --git a/changelogs/unreleased/zj-remove-git-rake-tasks.yml b/changelogs/unreleased/zj-remove-git-rake-tasks.yml
new file mode 100644
index 00000000000..8c90fc7d0fe
--- /dev/null
+++ b/changelogs/unreleased/zj-remove-git-rake-tasks.yml
@@ -0,0 +1,5 @@
+---
+title: Remove gitlab:user:check_repos, gitlab:check_repo, gitlab:git:prune, gitlab:git:gc, and gitlab:git:repack
+merge_request: 20806
+author:
+type: removed
diff --git a/changelogs/unreleased/zj-repository-languages.yml b/changelogs/unreleased/zj-repository-languages.yml
new file mode 100644
index 00000000000..c42ba60be29
--- /dev/null
+++ b/changelogs/unreleased/zj-repository-languages.yml
@@ -0,0 +1,5 @@
+---
+title: Show repository languages for projects
+merge_request: 19480
+author:
+type: added
diff --git a/config/application.rb b/config/application.rb
index 0304f466734..76a2c47a750 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -43,10 +43,12 @@ module Gitlab
#{config.root}/app/models/members
#{config.root}/app/models/project_services
#{config.root}/app/workers/concerns
+ #{config.root}/app/policies/concerns
#{config.root}/app/services/concerns
#{config.root}/app/serializers/concerns
#{config.root}/app/finders/concerns
- #{config.root}/app/graphql/resolvers/concerns])
+ #{config.root}/app/graphql/resolvers/concerns
+ #{config.root}/app/graphql/mutations/concerns])
config.generators.templates.push("#{config.root}/generator_templates")
@@ -131,7 +133,7 @@ module Gitlab
config.assets.precompile << "print.css"
config.assets.precompile << "notify.css"
config.assets.precompile << "mailers/*.css"
- config.assets.precompile << "xterm/xterm.css"
+ config.assets.precompile << "page_bundles/ide.css"
config.assets.precompile << "performance_bar.css"
config.assets.precompile << "lib/ace.js"
config.assets.precompile << "test.css"
@@ -146,11 +148,19 @@ module Gitlab
config.assets.precompile << "icons.json"
config.assets.precompile << "illustrations/*.svg"
+ # Import css for xterm
+ config.assets.paths << "#{config.root}/node_modules/xterm/src/"
+ config.assets.precompile << "xterm.css"
+
# Version of your assets, change this if you want to expire all your assets
config.assets.version = '1.0'
config.action_view.sanitized_allowed_protocols = %w(smb)
+ # This middleware needs to precede ActiveRecord::QueryCache and other middlewares that
+ # connect to the database.
+ config.middleware.insert_after "Rails::Rack::Logger", "Gitlab::Middleware::BasicHealthCheck"
+
config.middleware.insert_after Warden::Manager, Rack::Attack
# Allow access to GitLab API from other domains
diff --git a/config/dependency_decisions.yml b/config/dependency_decisions.yml
index 21c20cd5e93..73115449871 100644
--- a/config/dependency_decisions.yml
+++ b/config/dependency_decisions.yml
@@ -540,3 +540,9 @@
:why: https://github.com/xtuc/webassemblyjs/blob/master/LICENSE
:versions: []
:when: 2018-06-08 05:30:56.764116000 Z
+- - :approve
+ - "@gitlab-org/gitlab-ui"
+ - :who: Clement Ho
+ :why: Our own library
+ :versions: []
+ :when: 2018-07-17 21:02:54.529227000 Z
diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb
index c3122827a6b..9ad55e21d11 100644
--- a/config/initializers/1_settings.rb
+++ b/config/initializers/1_settings.rb
@@ -1,4 +1,5 @@
require_relative '../settings'
+require_relative '../object_store_settings'
# Default settings
Settings['ldap'] ||= Settingslogic.new({})
@@ -179,14 +180,7 @@ Settings.artifacts['storage_path'] = Settings.absolute(Settings.artifacts.values
# Settings.artifact['path'] is deprecated, use `storage_path` instead
Settings.artifacts['path'] = Settings.artifacts['storage_path']
Settings.artifacts['max_size'] ||= 100 # in megabytes
-Settings.artifacts['object_store'] ||= Settingslogic.new({})
-Settings.artifacts['object_store']['enabled'] = false if Settings.artifacts['object_store']['enabled'].nil?
-Settings.artifacts['object_store']['remote_directory'] ||= nil
-Settings.artifacts['object_store']['direct_upload'] = false if Settings.artifacts['object_store']['direct_upload'].nil?
-Settings.artifacts['object_store']['background_upload'] = true if Settings.artifacts['object_store']['background_upload'].nil?
-Settings.artifacts['object_store']['proxy_download'] = false if Settings.artifacts['object_store']['proxy_download'].nil?
-# Convert upload connection settings to use string keys, to make Fog happy
-Settings.artifacts['object_store']['connection']&.deep_stringify_keys!
+Settings.artifacts['object_store'] = ObjectStoreSettings.parse(Settings.artifacts['object_store'])
#
# Registry
@@ -225,14 +219,7 @@ Settings.pages.admin['certificate'] ||= ''
Settings['lfs'] ||= Settingslogic.new({})
Settings.lfs['enabled'] = true if Settings.lfs['enabled'].nil?
Settings.lfs['storage_path'] = Settings.absolute(Settings.lfs['storage_path'] || File.join(Settings.shared['path'], "lfs-objects"))
-Settings.lfs['object_store'] ||= Settingslogic.new({})
-Settings.lfs['object_store']['enabled'] = false if Settings.lfs['object_store']['enabled'].nil?
-Settings.lfs['object_store']['remote_directory'] ||= nil
-Settings.lfs['object_store']['direct_upload'] = false if Settings.lfs['object_store']['direct_upload'].nil?
-Settings.lfs['object_store']['background_upload'] = true if Settings.lfs['object_store']['background_upload'].nil?
-Settings.lfs['object_store']['proxy_download'] = false if Settings.lfs['object_store']['proxy_download'].nil?
-# Convert upload connection settings to use string keys, to make Fog happy
-Settings.lfs['object_store']['connection']&.deep_stringify_keys!
+Settings.lfs['object_store'] = ObjectStoreSettings.parse(Settings.lfs['object_store'])
#
# Uploads
@@ -240,14 +227,8 @@ Settings.lfs['object_store']['connection']&.deep_stringify_keys!
Settings['uploads'] ||= Settingslogic.new({})
Settings.uploads['storage_path'] = Settings.absolute(Settings.uploads['storage_path'] || 'public')
Settings.uploads['base_dir'] = Settings.uploads['base_dir'] || 'uploads/-/system'
-Settings.uploads['object_store'] ||= Settingslogic.new({})
-Settings.uploads['object_store']['enabled'] = false if Settings.uploads['object_store']['enabled'].nil?
+Settings.uploads['object_store'] = ObjectStoreSettings.parse(Settings.uploads['object_store'])
Settings.uploads['object_store']['remote_directory'] ||= 'uploads'
-Settings.uploads['object_store']['direct_upload'] = false if Settings.uploads['object_store']['direct_upload'].nil?
-Settings.uploads['object_store']['background_upload'] = true if Settings.uploads['object_store']['background_upload'].nil?
-Settings.uploads['object_store']['proxy_download'] = false if Settings.uploads['object_store']['proxy_download'].nil?
-# Convert upload connection settings to use string keys, to make Fog happy
-Settings.uploads['object_store']['connection']&.deep_stringify_keys!
#
# Mattermost
@@ -437,7 +418,7 @@ Settings['extra'] ||= Settingslogic.new({})
#
Settings['rack_attack'] ||= Settingslogic.new({})
Settings.rack_attack['git_basic_auth'] ||= Settingslogic.new({})
-Settings.rack_attack.git_basic_auth['enabled'] = true if Settings.rack_attack.git_basic_auth['enabled'].nil?
+Settings.rack_attack.git_basic_auth['enabled'] = false if Settings.rack_attack.git_basic_auth['enabled'].nil?
Settings.rack_attack.git_basic_auth['ip_whitelist'] ||= %w{127.0.0.1}
Settings.rack_attack.git_basic_auth['maxretry'] ||= 10
Settings.rack_attack.git_basic_auth['findtime'] ||= 1.minute
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index f6803eb0b5a..6f54bee4713 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -8,6 +8,8 @@ Sidekiq.default_worker_options = { retry: 3 }
enable_json_logs = Gitlab.config.sidekiq.log_format == 'json'
Sidekiq.configure_server do |config|
+ require 'rbtrace' if ENV['ENABLE_RBTRACE']
+
config.redis = queues_config_hash
config.server_middleware do |chain|
diff --git a/config/initializers/warden.rb b/config/initializers/warden.rb
index 8cc36820d3c..33f55069c3e 100644
--- a/config/initializers/warden.rb
+++ b/config/initializers/warden.rb
@@ -1,10 +1,20 @@
Rails.application.configure do |config|
Warden::Manager.after_set_user(scope: :user) do |user, auth, opts|
Gitlab::Auth::UniqueIpsLimiter.limit_user!(user)
- end
- Warden::Manager.before_failure(scope: :user) do |env, opts|
- Gitlab::Auth::BlockedUserTracker.log_if_user_blocked(env)
+ activity = Gitlab::Auth::Activity.new(opts)
+
+ case opts[:event]
+ when :authentication
+ activity.user_authenticated!
+ when :set_user
+ activity.user_authenticated!
+ activity.user_session_override!
+ when :fetch # rubocop:disable Lint/EmptyWhen
+ # We ignore session fetch events
+ else
+ activity.user_session_override!
+ end
end
Warden::Manager.after_authentication(scope: :user) do |user, auth, opts|
@@ -15,7 +25,33 @@ Rails.application.configure do |config|
ActiveSession.set(user, auth.request)
end
+ Warden::Manager.before_failure(scope: :user) do |env, opts|
+ Gitlab::Auth::Activity.new(opts).user_authentication_failed!
+ end
+
Warden::Manager.before_logout(scope: :user) do |user, auth, opts|
- ActiveSession.destroy(user || auth.user, auth.request.session.id)
+ user ||= auth.user
+ activity = Gitlab::Auth::Activity.new(opts)
+ tracker = Gitlab::Auth::BlockedUserTracker.new(user, auth)
+
+ ActiveSession.destroy(user, auth.request.session.id)
+ activity.user_session_destroyed!
+
+ ##
+ # It is possible that `before_logout` event is going to be triggered
+ # multiple times during the request lifecycle. We want to increment
+ # metrics and write logs only once in that case.
+ #
+ # 'warden.auth.*' is our custom hash key that follows usual convention
+ # of naming keys in the Rack env hash.
+ #
+ next if auth.env['warden.auth.user.blocked']
+
+ if user.blocked?
+ activity.user_blocked!
+ tracker.log_activity!
+ end
+
+ auth.env['warden.auth.user.blocked'] = true
end
end
diff --git a/config/object_store_settings.rb b/config/object_store_settings.rb
new file mode 100644
index 00000000000..d85ff394dcc
--- /dev/null
+++ b/config/object_store_settings.rb
@@ -0,0 +1,15 @@
+# Set default values for object_store settings
+class ObjectStoreSettings
+ def self.parse(object_store)
+ object_store ||= Settingslogic.new({})
+ object_store['enabled'] = false if object_store['enabled'].nil?
+ object_store['remote_directory'] ||= nil
+ object_store['direct_upload'] = false if object_store['direct_upload'].nil?
+ object_store['background_upload'] = true if object_store['background_upload'].nil?
+ object_store['proxy_download'] = false if object_store['proxy_download'].nil?
+
+ # Convert upload connection settings to use string keys, to make Fog happy
+ object_store['connection']&.deep_stringify_keys!
+ object_store
+ end
+end
diff --git a/config/routes.rb b/config/routes.rb
index e0a9139b1b4..d16a587c5ee 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -46,6 +46,7 @@ Rails.application.routes.draw do
get 'health_check(/:checks)' => 'health_check#index', as: :health_check
scope path: '-' do
+ # '/-/health' implemented by BasicHealthMiddleware
get 'liveness' => 'health#liveness'
get 'readiness' => 'health#readiness'
post 'storage_check' => 'health#storage_check'
@@ -70,6 +71,8 @@ Rails.application.routes.draw do
get 'ide' => 'ide#index'
get 'ide/*vueroute' => 'ide#index', format: false
+
+ draw :instance_statistics
end
# Koding route
diff --git a/config/routes/admin.rb b/config/routes/admin.rb
index ff27ceb50dc..7ee960970f8 100644
--- a/config/routes/admin.rb
+++ b/config/routes/admin.rb
@@ -54,7 +54,7 @@ namespace :admin do
resources :hooks, only: [:index, :create, :edit, :update, :destroy] do
member do
- get :test
+ post :test
end
resources :hook_logs, only: [:show] do
@@ -76,8 +76,6 @@ namespace :admin do
resource :system_info, controller: 'system_info', only: [:show]
resources :requests_profiles, only: [:index, :show], param: :name, constraints: { name: /.+\.html/ }
- get 'conversational_development_index' => 'conversational_development_index#show'
-
resources :projects, only: [:index]
scope(path: 'projects/*namespace_id',
@@ -123,8 +121,6 @@ namespace :admin do
end
end
- resources :cohorts, only: :index
-
resources :jobs, only: :index do
collection do
post :cancel_all
diff --git a/config/routes/instance_statistics.rb b/config/routes/instance_statistics.rb
new file mode 100644
index 00000000000..824ef47cda3
--- /dev/null
+++ b/config/routes/instance_statistics.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+namespace :instance_statistics do
+ root to: redirect('/-/instance_statistics/conversational_development_index')
+
+ resources :cohorts, only: :index
+ resources :conversational_development_index, only: :index
+end
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 5057e937941..0220e88c819 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -109,6 +109,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
post :assign_related_issues
get :discussions, format: :json
post :rebase
+ get :test_reports
scope constraints: { format: nil }, action: :show do
get :commits, defaults: { tab: 'commits' }
@@ -301,7 +302,7 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do
resources :hooks, only: [:index, :create, :edit, :update, :destroy], constraints: { id: /\d+/ } do
member do
- get :test
+ post :test
end
resources :hook_logs, only: [:show] do
diff --git a/config/routes/repository.rb b/config/routes/repository.rb
index e2bf8d6a7ff..d439cb9acbd 100644
--- a/config/routes/repository.rb
+++ b/config/routes/repository.rb
@@ -83,6 +83,7 @@ scope format: false do
get '/raw/*id', to: 'raw#show', as: :raw
get '/blame/*id', to: 'blame#show', as: :blame
+ get '/commits', to: 'commits#commits_root', as: :commits_root
get '/commits/*id/signatures', to: 'commits#signatures', as: :signatures
get '/commits/*id', to: 'commits#show', as: :commits
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index 70b584ff9e9..fb7738a5536 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -45,6 +45,7 @@
- [github_import_advance_stage, 1]
- [project_service, 1]
- [delete_user, 1]
+ - [todos_destroyer, 1]
- [delete_merged_branches, 1]
- [authorized_projects, 1]
- [expire_build_instance_artifacts, 1]
@@ -76,3 +77,4 @@
- [repository_remove_remote, 1]
- [create_note_diff_file, 1]
- [delete_diff_files, 1]
+ - [detect_repository_languages, 1]
diff --git a/config/unicorn.rb.example b/config/unicorn.rb.example
index 220a0191160..020e9a00d87 100644
--- a/config/unicorn.rb.example
+++ b/config/unicorn.rb.example
@@ -67,11 +67,11 @@ pid "/home/git/gitlab/tmp/pids/unicorn.pid"
stderr_path "/home/git/gitlab/log/unicorn.stderr.log"
stdout_path "/home/git/gitlab/log/unicorn.stdout.log"
-# combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings
-# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
+# Save memory by sharing the application code among multiple Unicorn workers
+# with "preload_app true". See:
+# https://www.rubydoc.info/gems/unicorn/5.1.0/Unicorn%2FConfigurator:preload_app
+# https://brandur.org/ruby-memory#copy-on-write
preload_app true
-GC.respond_to?(:copy_on_write_friendly=) and
- GC.copy_on_write_friendly = true
# Enable this flag to have unicorn test client connections by writing the
# beginning of the HTTP headers before calling the application. This
@@ -124,6 +124,10 @@ before_fork do |server, worker|
end
after_fork do |server, worker|
+ # Unicorn clears out signals before it forks, so rbtrace won't work
+ # unless it is enabled after the fork.
+ require 'rbtrace' if ENV['ENABLE_RBTRACE']
+
# per-process listener ports for debugging/admin/migrations
# addr = "127.0.0.1:#{9293 + worker.nr}"
# server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => true)
diff --git a/config/unicorn.rb.example.development b/config/unicorn.rb.example.development
index 0df028648d1..5712549a66d 100644
--- a/config/unicorn.rb.example.development
+++ b/config/unicorn.rb.example.development
@@ -1,7 +1,15 @@
worker_processes 2
timeout 60
+preload_app true
+check_client_connection false
+
before_fork do |server, worker|
+ # the following is highly recommended for Rails + "preload_app true"
+ # as there's no need for the master process to hold a connection
+ defined?(ActiveRecord::Base) and
+ ActiveRecord::Base.connection.disconnect!
+
if /darwin/ =~ RUBY_PLATFORM
require 'fiddle'
@@ -13,3 +21,12 @@ before_fork do |server, worker|
end
end
+after_fork do |server, worker|
+ # Unicorn clears out signals before it forks, so rbtrace won't work
+ # unless it is enabled after the fork.
+ require 'rbtrace' if ENV['ENABLE_RBTRACE']
+
+ # the following is *required* for Rails + "preload_app true",
+ defined?(ActiveRecord::Base) and
+ ActiveRecord::Base.establish_connection
+end
diff --git a/danger/database/Dangerfile b/danger/database/Dangerfile
index 6f48994945a..ad5f1c1e0f3 100644
--- a/danger/database/Dangerfile
+++ b/danger/database/Dangerfile
@@ -41,8 +41,8 @@ end
all_files = git.added_files + git.modified_files
-non_geo_db_schema_updated = !git.modified_files.grep(%r{\Adb/schema\.rb/}).empty?
-geo_db_schema_updated = !git.modified_files.grep(%r{\Aee/db/geo/schema\.rb/}).empty?
+non_geo_db_schema_updated = !git.modified_files.grep(%r{\Adb/schema\.rb}).empty?
+geo_db_schema_updated = !git.modified_files.grep(%r{\Aee/db/geo/schema\.rb}).empty?
non_geo_migration_created = !git.added_files.grep(%r{\A(db/(post_)?migrate)/}).empty?
geo_migration_created = !git.added_files.grep(%r{\Aee/db/geo/(post_)?migrate/}).empty?
diff --git a/danger/frozen_string/Dangerfile b/danger/frozen_string/Dangerfile
new file mode 100644
index 00000000000..b9687ef6b83
--- /dev/null
+++ b/danger/frozen_string/Dangerfile
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+FILE_EXTENSION = ".rb"
+MAGIC_COMMENT = "# frozen_string_literal: true"
+
+def get_files_with_no_magic_comment(files)
+ files.select do |file|
+ file.end_with?(FILE_EXTENSION) &&
+ !File.open(file, &:gets)&.start_with?(MAGIC_COMMENT)
+ end
+end
+
+files_to_fix = get_files_with_no_magic_comment(git.added_files)
+
+if files_to_fix.any?
+ warn 'This merge request adds files that do not enforce frozen string literal. ' \
+ 'See https://gitlab.com/gitlab-org/gitlab-ce/issues/47424 for more information.'
+
+ markdown(<<~MARKDOWN)
+ ## Enable Frozen String Literal
+
+ The following files should have `#{MAGIC_COMMENT}` on the first line:
+
+ * #{files_to_fix.map { |path| "`#{path}`" }.join("\n* ")}
+ MARKDOWN
+end
diff --git a/db/migrate/20140313092127_init_schema.rb b/db/migrate/20140313092127_init_schema.rb
index 895298ed4ed..29fb386ad76 100644
--- a/db/migrate/20140313092127_init_schema.rb
+++ b/db/migrate/20140313092127_init_schema.rb
@@ -1,6 +1,7 @@
class InitSchema < ActiveRecord::Migration
DOWNTIME = true
+ # rubocop:disable Metrics/AbcSize
def up
create_table "broadcast_messages", force: :cascade do |t|
t.text "message", null: false
@@ -157,9 +158,9 @@ class InitSchema < ActiveRecord::Migration
add_index "notes", ["author_id"], name: "index_notes_on_author_id", using: :btree
add_index "notes", ["commit_id"], name: "index_notes_on_commit_id", using: :btree
add_index "notes", ["created_at"], name: "index_notes_on_created_at", using: :btree
- add_index "notes", ["noteable_id", "noteable_type"], name: "index_notes_on_noteable_id_and_noteable_type", using: :btree
+ add_index "notes", %w[noteable_id noteable_type], name: "index_notes_on_noteable_id_and_noteable_type", using: :btree
add_index "notes", ["noteable_type"], name: "index_notes_on_noteable_type", using: :btree
- add_index "notes", ["project_id", "noteable_type"], name: "index_notes_on_project_id_and_noteable_type", using: :btree
+ add_index "notes", %w[project_id noteable_type], name: "index_notes_on_project_id_and_noteable_type", using: :btree
add_index "notes", ["project_id"], name: "index_notes_on_project_id", using: :btree
create_table "project_group_links", force: :cascade do |t|
t.integer "project_id", null: false
@@ -241,7 +242,7 @@ class InitSchema < ActiveRecord::Migration
t.datetime "created_at"
end
add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree
- add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree
+ add_index "taggings", %w[taggable_id taggable_type context], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree
create_table "tags", force: :cascade do |t|
t.string "name"
end
@@ -292,7 +293,7 @@ class InitSchema < ActiveRecord::Migration
add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
- add_index "users", ["extern_uid", "provider"], name: "index_users_on_extern_uid_and_provider", unique: true, using: :btree
+ add_index "users", %w[extern_uid provider], name: "index_users_on_extern_uid_and_provider", unique: true, using: :btree
add_index "users", ["name"], name: "index_users_on_name", using: :btree
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
add_index "users", ["username"], name: "index_users_on_username", using: :btree
diff --git a/db/migrate/20140407135544_fix_namespaces.rb b/db/migrate/20140407135544_fix_namespaces.rb
index 0026ce645a6..3d2ca5c13c4 100644
--- a/db/migrate/20140407135544_fix_namespaces.rb
+++ b/db/migrate/20140407135544_fix_namespaces.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class FixNamespaces < ActiveRecord::Migration
DOWNTIME = false
diff --git a/db/migrate/20140415124820_limits_to_mysql.rb b/db/migrate/20140415124820_limits_to_mysql.rb
index c712423bcd1..3f6e62617c5 100644
--- a/db/migrate/20140415124820_limits_to_mysql.rb
+++ b/db/migrate/20140415124820_limits_to_mysql.rb
@@ -1,2 +1 @@
-# rubocop:disable all
require_relative 'limits_to_mysql'
diff --git a/db/migrate/20140729145339_migrate_project_tags.rb b/db/migrate/20140729145339_migrate_project_tags.rb
index ac46847f3e6..5760e4bfeaa 100644
--- a/db/migrate/20140729145339_migrate_project_tags.rb
+++ b/db/migrate/20140729145339_migrate_project_tags.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class MigrateProjectTags < ActiveRecord::Migration
def up
ActsAsTaggableOn::Tagging.where(taggable_type: 'Project', context: 'labels').update_all(context: 'tags')
diff --git a/db/migrate/20141121133009_add_timestamps_to_members.rb b/db/migrate/20141121133009_add_timestamps_to_members.rb
index 68f164cd35d..ef6d4dedf32 100644
--- a/db/migrate/20141121133009_add_timestamps_to_members.rb
+++ b/db/migrate/20141121133009_add_timestamps_to_members.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
# In 20140914145549_migrate_to_new_members_model.rb we forgot to set the
# created_at and updated_at times for new records in the 'members' table. This
# became a problem after commit c8e78d972a5a628870eefca0f2ccea0199c55bda which
diff --git a/db/migrate/20141223135007_add_import_data_to_project_table.rb b/db/migrate/20141223135007_add_import_data_to_project_table.rb
index 9c8a483e4d5..5db78f94cc9 100644
--- a/db/migrate/20141223135007_add_import_data_to_project_table.rb
+++ b/db/migrate/20141223135007_add_import_data_to_project_table.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddImportDataToProjectTable < ActiveRecord::Migration
def change
add_column :projects, :import_type, :string
diff --git a/db/migrate/20150116234544_add_home_page_url_for_application_settings.rb b/db/migrate/20150116234544_add_home_page_url_for_application_settings.rb
index 10e6549c729..aa179ce3a4d 100644
--- a/db/migrate/20150116234544_add_home_page_url_for_application_settings.rb
+++ b/db/migrate/20150116234544_add_home_page_url_for_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddHomePageUrlForApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :home_page_url, :string
diff --git a/db/migrate/20150116234545_add_gitlab_access_token_to_user.rb b/db/migrate/20150116234545_add_gitlab_access_token_to_user.rb
index e083973615a..c28ba3197ac 100644
--- a/db/migrate/20150116234545_add_gitlab_access_token_to_user.rb
+++ b/db/migrate/20150116234545_add_gitlab_access_token_to_user.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddGitlabAccessTokenToUser < ActiveRecord::Migration
def change
add_column :users, :gitlab_access_token, :string
diff --git a/db/migrate/20150206222854_add_notification_email_to_user.rb b/db/migrate/20150206222854_add_notification_email_to_user.rb
index ebae092cac8..ab80f7e582f 100644
--- a/db/migrate/20150206222854_add_notification_email_to_user.rb
+++ b/db/migrate/20150206222854_add_notification_email_to_user.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddNotificationEmailToUser < ActiveRecord::Migration
def up
add_column :users, :notification_email, :string
diff --git a/db/migrate/20150211174341_allow_null_in_services_project_id.rb b/db/migrate/20150211174341_allow_null_in_services_project_id.rb
index fea95c79adf..68f02812791 100644
--- a/db/migrate/20150211174341_allow_null_in_services_project_id.rb
+++ b/db/migrate/20150211174341_allow_null_in_services_project_id.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AllowNullInServicesProjectId < ActiveRecord::Migration
def change
change_column :services, :project_id, :integer, null: true
diff --git a/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb b/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb
index 78e9fd0c3a9..23ac1b399ec 100644
--- a/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb
+++ b/db/migrate/20150217123345_add_bitbucket_access_token_and_secret_to_user.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddBitbucketAccessTokenAndSecretToUser < ActiveRecord::Migration
def change
add_column :users, :bitbucket_access_token, :string
diff --git a/db/migrate/20150223022001_set_missing_last_activity_at.rb b/db/migrate/20150223022001_set_missing_last_activity_at.rb
index 300381ad65b..3f6d4d83474 100644
--- a/db/migrate/20150223022001_set_missing_last_activity_at.rb
+++ b/db/migrate/20150223022001_set_missing_last_activity_at.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class SetMissingLastActivityAt < ActiveRecord::Migration
def up
execute "UPDATE projects SET last_activity_at = updated_at WHERE last_activity_at IS NULL"
diff --git a/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb b/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb
index 7d8d65ef2ee..494c3033bff 100644
--- a/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb
+++ b/db/migrate/20150301014758_add_restricted_visibility_levels_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddRestrictedVisibilityLevelsToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :restricted_visibility_levels, :text
diff --git a/db/migrate/20150320234437_add_location_to_user.rb b/db/migrate/20150320234437_add_location_to_user.rb
index df046570361..32731d37d75 100644
--- a/db/migrate/20150320234437_add_location_to_user.rb
+++ b/db/migrate/20150320234437_add_location_to_user.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddLocationToUser < ActiveRecord::Migration
def change
add_column :users, :location, :string
diff --git a/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb b/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb
index 9f8b6f4bd59..42dc8173e46 100644
--- a/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb
+++ b/db/migrate/20150324155957_set_incorrect_assignee_id_to_null.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class SetIncorrectAssigneeIdToNull < ActiveRecord::Migration
def up
execute "UPDATE issues SET assignee_id = NULL WHERE assignee_id = -1"
diff --git a/db/migrate/20150327150017_add_import_data_to_project.rb b/db/migrate/20150327150017_add_import_data_to_project.rb
index 67b1554dfd1..12c00339eec 100644
--- a/db/migrate/20150327150017_add_import_data_to_project.rb
+++ b/db/migrate/20150327150017_add_import_data_to_project.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddImportDataToProject < ActiveRecord::Migration
def change
add_column :projects, :import_data, :text
diff --git a/db/migrate/20150327223628_add_devise_two_factor_to_users.rb b/db/migrate/20150327223628_add_devise_two_factor_to_users.rb
index eccb0123e77..11b026ee8f3 100644
--- a/db/migrate/20150327223628_add_devise_two_factor_to_users.rb
+++ b/db/migrate/20150327223628_add_devise_two_factor_to_users.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddDeviseTwoFactorToUsers < ActiveRecord::Migration
def change
add_column :users, :encrypted_otp_secret, :string
diff --git a/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb b/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb
index 4c56a2fb78b..1d161674a9a 100644
--- a/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb
+++ b/db/migrate/20150328132231_add_max_attachment_size_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddMaxAttachmentSizeToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :max_attachment_size, :integer, default: 10, null: false
diff --git a/db/migrate/20150331183602_add_devise_two_factor_backupable_to_users.rb b/db/migrate/20150331183602_add_devise_two_factor_backupable_to_users.rb
index fdb6d72917e..913958db7c5 100644
--- a/db/migrate/20150331183602_add_devise_two_factor_backupable_to_users.rb
+++ b/db/migrate/20150331183602_add_devise_two_factor_backupable_to_users.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddDeviseTwoFactorBackupableToUsers < ActiveRecord::Migration
def change
add_column :users, :otp_backup_codes, :text
diff --git a/db/migrate/20150411000035_fix_identities.rb b/db/migrate/20150411000035_fix_identities.rb
index a10fcc001f4..d9051f9fffd 100644
--- a/db/migrate/20150411000035_fix_identities.rb
+++ b/db/migrate/20150411000035_fix_identities.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class FixIdentities < ActiveRecord::Migration
def up
# Up until now, legacy 'ldap' references in the database were charitably
diff --git a/db/migrate/20150411180045_rename_buildbox_service.rb b/db/migrate/20150411180045_rename_buildbox_service.rb
index 9f3b25c3971..5a0b5d07e50 100644
--- a/db/migrate/20150411180045_rename_buildbox_service.rb
+++ b/db/migrate/20150411180045_rename_buildbox_service.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RenameBuildboxService < ActiveRecord::Migration
def up
execute "UPDATE services SET type = 'BuildkiteService' WHERE type = 'BuildboxService';"
diff --git a/db/migrate/20150417121913_create_project_import_data.rb b/db/migrate/20150417121913_create_project_import_data.rb
index fc357cbacc8..c78f5fde85e 100644
--- a/db/migrate/20150417121913_create_project_import_data.rb
+++ b/db/migrate/20150417121913_create_project_import_data.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class CreateProjectImportData < ActiveRecord::Migration
def change
create_table :project_import_data do |t|
diff --git a/db/migrate/20150423033240_add_default_project_visibililty_to_application_settings.rb b/db/migrate/20150423033240_add_default_project_visibililty_to_application_settings.rb
index 129ce4d04af..50a9b2439e0 100644
--- a/db/migrate/20150423033240_add_default_project_visibililty_to_application_settings.rb
+++ b/db/migrate/20150423033240_add_default_project_visibililty_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddDefaultProjectVisibililtyToApplicationSettings < ActiveRecord::Migration
def up
add_column :application_settings, :default_project_visibility, :integer
diff --git a/db/migrate/20150425164646_gitlab_change_collation_for_tag_names.acts_as_taggable_on_engine.rb b/db/migrate/20150425164646_gitlab_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
index 8f352414ffd..281c88d2a7d 100644
--- a/db/migrate/20150425164646_gitlab_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
+++ b/db/migrate/20150425164646_gitlab_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
# This migration is a duplicate of 20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
# It shold be applied before the index additions to ensure that `name` is case sensitive.
diff --git a/db/migrate/20150425164650_add_missing_taggable_index.acts_as_taggable_on_engine.rb b/db/migrate/20150425164650_add_missing_taggable_index.acts_as_taggable_on_engine.rb
index 88829b87711..71f2d7f4330 100644
--- a/db/migrate/20150425164650_add_missing_taggable_index.acts_as_taggable_on_engine.rb
+++ b/db/migrate/20150425164650_add_missing_taggable_index.acts_as_taggable_on_engine.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
# This migration comes from acts_as_taggable_on_engine (originally 4)
class AddMissingTaggableIndex < ActiveRecord::Migration
def self.up
diff --git a/db/migrate/20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb b/db/migrate/20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
index 642c4745321..bfb06bc7cda 100644
--- a/db/migrate/20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
+++ b/db/migrate/20150425164651_change_collation_for_tag_names.acts_as_taggable_on_engine.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
# This migration comes from acts_as_taggable_on_engine (originally 5)
# This migration is added to circumvent issue #623 and have special characters
# work properly
diff --git a/db/migrate/20150425173433_add_default_snippet_visibility_to_app_settings.rb b/db/migrate/20150425173433_add_default_snippet_visibility_to_app_settings.rb
index dd13def4176..8f1b0cc8935 100644
--- a/db/migrate/20150425173433_add_default_snippet_visibility_to_app_settings.rb
+++ b/db/migrate/20150425173433_add_default_snippet_visibility_to_app_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddDefaultSnippetVisibilityToAppSettings < ActiveRecord::Migration
def up
add_column :application_settings, :default_snippet_visibility, :integer
diff --git a/db/migrate/20150429002313_remove_abandoned_group_members_records.rb b/db/migrate/20150429002313_remove_abandoned_group_members_records.rb
index d2c7f3c442e..244637e1c4a 100644
--- a/db/migrate/20150429002313_remove_abandoned_group_members_records.rb
+++ b/db/migrate/20150429002313_remove_abandoned_group_members_records.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RemoveAbandonedGroupMembersRecords < ActiveRecord::Migration
def up
execute("DELETE FROM members WHERE type = 'GroupMember' AND source_id NOT IN(\
diff --git a/db/migrate/20150502064022_add_restricted_signup_domains_to_application_settings.rb b/db/migrate/20150502064022_add_restricted_signup_domains_to_application_settings.rb
index b63ea9aec7a..184e2653610 100644
--- a/db/migrate/20150502064022_add_restricted_signup_domains_to_application_settings.rb
+++ b/db/migrate/20150502064022_add_restricted_signup_domains_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddRestrictedSignupDomainsToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :restricted_signup_domains, :text
diff --git a/db/migrate/20150509180749_convert_legacy_reference_notes.rb b/db/migrate/20150509180749_convert_legacy_reference_notes.rb
index cd8bf90108d..b02605489be 100644
--- a/db/migrate/20150509180749_convert_legacy_reference_notes.rb
+++ b/db/migrate/20150509180749_convert_legacy_reference_notes.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
# Convert legacy Markdown-emphasized notes to the current, non-emphasized format
#
# _mentioned in 54f7727c850972f0401c1312a7c4a6a380de5666_
diff --git a/db/migrate/20150529111607_add_user_oauth_applications_to_application_settings.rb b/db/migrate/20150529111607_add_user_oauth_applications_to_application_settings.rb
index 9b02eda56ab..6a78294f0b2 100644
--- a/db/migrate/20150529111607_add_user_oauth_applications_to_application_settings.rb
+++ b/db/migrate/20150529111607_add_user_oauth_applications_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddUserOauthApplicationsToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :user_oauth_applications, :bool, default: true
diff --git a/db/migrate/20150609141121_add_session_expire_delay_for_application_settings.rb b/db/migrate/20150609141121_add_session_expire_delay_for_application_settings.rb
index 1f5cf1fe5f1..61ff0af41f4 100644
--- a/db/migrate/20150609141121_add_session_expire_delay_for_application_settings.rb
+++ b/db/migrate/20150609141121_add_session_expire_delay_for_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddSessionExpireDelayForApplicationSettings < ActiveRecord::Migration
def change
unless column_exists?(:application_settings, :session_expire_delay)
diff --git a/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb b/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb
index da0fd457a34..8eed8678b2f 100644
--- a/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb
+++ b/db/migrate/20150620233230_add_default_otp_required_for_login_value.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddDefaultOtpRequiredForLoginValue < ActiveRecord::Migration
def up
execute %q{UPDATE users SET otp_required_for_login = FALSE WHERE otp_required_for_login IS NULL}
diff --git a/db/migrate/20150730122406_add_updated_by_to_issuables_and_notes.rb b/db/migrate/20150730122406_add_updated_by_to_issuables_and_notes.rb
index be30e881c74..78d45c7f96b 100644
--- a/db/migrate/20150730122406_add_updated_by_to_issuables_and_notes.rb
+++ b/db/migrate/20150730122406_add_updated_by_to_issuables_and_notes.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddUpdatedByToIssuablesAndNotes < ActiveRecord::Migration
def change
add_column :notes, :updated_by_id, :integer
diff --git a/db/migrate/20150818213832_add_sent_notifications.rb b/db/migrate/20150818213832_add_sent_notifications.rb
index fa0c3ce0acf..43e8d6a1a82 100644
--- a/db/migrate/20150818213832_add_sent_notifications.rb
+++ b/db/migrate/20150818213832_add_sent_notifications.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddSentNotifications < ActiveRecord::Migration
def change
create_table :sent_notifications do |t|
diff --git a/db/migrate/20150915001905_enable_ssl_verification_by_default.rb b/db/migrate/20150915001905_enable_ssl_verification_by_default.rb
index 3f070139418..6e924262a13 100644
--- a/db/migrate/20150915001905_enable_ssl_verification_by_default.rb
+++ b/db/migrate/20150915001905_enable_ssl_verification_by_default.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class EnableSslVerificationByDefault < ActiveRecord::Migration
def change
change_column :web_hooks, :enable_ssl_verification, :boolean, default: true
diff --git a/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb b/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb
index ea2ab6e4093..90ce6c2db3d 100644
--- a/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb
+++ b/db/migrate/20150916000405_enable_ssl_verification_for_web_hooks.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class EnableSslVerificationForWebHooks < ActiveRecord::Migration
def up
execute("UPDATE web_hooks SET enable_ssl_verification = true")
diff --git a/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb b/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb
index a504f25b1be..37a27f11935 100644
--- a/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb
+++ b/db/migrate/20150916114643_add_help_page_text_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddHelpPageTextToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :help_page_text, :text
diff --git a/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb b/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb
index c9b6e035122..6cf668a170e 100644
--- a/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb
+++ b/db/migrate/20150918084513_add_ci_enabled_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddCiEnabledToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :ci_enabled, :boolean, null: false, default: true
diff --git a/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb b/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb
index e1818b566d7..0aad6fe5e6e 100644
--- a/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb
+++ b/db/migrate/20150918161719_remove_invalid_milestones_from_merge_requests.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RemoveInvalidMilestonesFromMergeRequests < ActiveRecord::Migration
def up
execute("UPDATE merge_requests SET milestone_id = NULL where milestone_id NOT IN (SELECT id FROM milestones)")
diff --git a/db/migrate/20150920010715_add_consumed_timestep_to_users.rb b/db/migrate/20150920010715_add_consumed_timestep_to_users.rb
index e6975f5b9fe..c8438b3f6aa 100644
--- a/db/migrate/20150920010715_add_consumed_timestep_to_users.rb
+++ b/db/migrate/20150920010715_add_consumed_timestep_to_users.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddConsumedTimestepToUsers < ActiveRecord::Migration
def change
add_column :users, :consumed_timestep, :integer
diff --git a/db/migrate/20150920161119_add_line_code_to_sent_notification.rb b/db/migrate/20150920161119_add_line_code_to_sent_notification.rb
index 1bcb06e4bda..d9af4e71751 100644
--- a/db/migrate/20150920161119_add_line_code_to_sent_notification.rb
+++ b/db/migrate/20150920161119_add_line_code_to_sent_notification.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddLineCodeToSentNotification < ActiveRecord::Migration
def change
add_column :sent_notifications, :line_code, :string
diff --git a/db/migrate/20150924125150_add_project_id_to_ci_commit.rb b/db/migrate/20150924125150_add_project_id_to_ci_commit.rb
index 905332b7dc7..1a761fe0f86 100644
--- a/db/migrate/20150924125150_add_project_id_to_ci_commit.rb
+++ b/db/migrate/20150924125150_add_project_id_to_ci_commit.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddProjectIdToCiCommit < ActiveRecord::Migration
def up
add_column :ci_commits, :gl_project_id, :integer
diff --git a/db/migrate/20150924125436_migrate_project_id_for_ci_commits.rb b/db/migrate/20150924125436_migrate_project_id_for_ci_commits.rb
index fb0e0ba1fa5..2be57b6062e 100644
--- a/db/migrate/20150924125436_migrate_project_id_for_ci_commits.rb
+++ b/db/migrate/20150924125436_migrate_project_id_for_ci_commits.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class MigrateProjectIdForCiCommits < ActiveRecord::Migration
def up
subquery = 'SELECT gitlab_id FROM ci_projects WHERE ci_projects.id = ci_commits.project_id'
diff --git a/db/migrate/20150930001110_merge_request_error_field.rb b/db/migrate/20150930001110_merge_request_error_field.rb
index 71a8ae3938a..c2ee498ef3f 100644
--- a/db/migrate/20150930001110_merge_request_error_field.rb
+++ b/db/migrate/20150930001110_merge_request_error_field.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class MergeRequestErrorField < ActiveRecord::Migration
def up
add_column :merge_requests, :merge_error, :string
diff --git a/db/migrate/20150930095736_add_null_to_name_for_ci_projects.rb b/db/migrate/20150930095736_add_null_to_name_for_ci_projects.rb
index 229c9942b50..8d47dac6441 100644
--- a/db/migrate/20150930095736_add_null_to_name_for_ci_projects.rb
+++ b/db/migrate/20150930095736_add_null_to_name_for_ci_projects.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddNullToNameForCiProjects < ActiveRecord::Migration
def up
change_column_null :ci_projects, :name, true
diff --git a/db/migrate/20151002112914_add_stage_idx_to_builds.rb b/db/migrate/20151002112914_add_stage_idx_to_builds.rb
index 4297ba0e7c8..68a745ffef4 100644
--- a/db/migrate/20151002112914_add_stage_idx_to_builds.rb
+++ b/db/migrate/20151002112914_add_stage_idx_to_builds.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddStageIdxToBuilds < ActiveRecord::Migration
def change
add_column :ci_builds, :stage_idx, :integer
diff --git a/db/migrate/20151002122929_add_ref_and_tag_to_builds.rb b/db/migrate/20151002122929_add_ref_and_tag_to_builds.rb
index 3c0fcf6c45d..e3d2ac1cea5 100644
--- a/db/migrate/20151002122929_add_ref_and_tag_to_builds.rb
+++ b/db/migrate/20151002122929_add_ref_and_tag_to_builds.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddRefAndTagToBuilds < ActiveRecord::Migration
def change
add_column :ci_builds, :tag, :boolean
diff --git a/db/migrate/20151005075649_add_user_id_to_build.rb b/db/migrate/20151005075649_add_user_id_to_build.rb
index be9d403e002..0f4b92b8b79 100644
--- a/db/migrate/20151005075649_add_user_id_to_build.rb
+++ b/db/migrate/20151005075649_add_user_id_to_build.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddUserIdToBuild < ActiveRecord::Migration
def change
add_column :ci_builds, :user_id, :integer
diff --git a/db/migrate/20151008143519_add_admin_notification_email_setting.rb b/db/migrate/20151008143519_add_admin_notification_email_setting.rb
index f48ec9aa4a6..0bb581efe2c 100644
--- a/db/migrate/20151008143519_add_admin_notification_email_setting.rb
+++ b/db/migrate/20151008143519_add_admin_notification_email_setting.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddAdminNotificationEmailSetting < ActiveRecord::Migration
def change
add_column :application_settings, :admin_notification_email, :string
diff --git a/db/migrate/20151013092124_add_artifacts_file_to_builds.rb b/db/migrate/20151013092124_add_artifacts_file_to_builds.rb
index a54ac9d57a4..5a299f7b26d 100644
--- a/db/migrate/20151013092124_add_artifacts_file_to_builds.rb
+++ b/db/migrate/20151013092124_add_artifacts_file_to_builds.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddArtifactsFileToBuilds < ActiveRecord::Migration
def change
add_column :ci_builds, :artifacts_file, :text
diff --git a/db/migrate/20151019111551_fix_build_tags.rb b/db/migrate/20151019111551_fix_build_tags.rb
index 8c05acfc190..299a24b0a7c 100644
--- a/db/migrate/20151019111551_fix_build_tags.rb
+++ b/db/migrate/20151019111551_fix_build_tags.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class FixBuildTags < ActiveRecord::Migration
def up
execute("UPDATE taggings SET taggable_type='CommitStatus' WHERE taggable_type='Ci::Build'")
diff --git a/db/migrate/20151019111703_fail_build_without_names.rb b/db/migrate/20151019111703_fail_build_without_names.rb
index 362e31eb435..dcdb5d1b25d 100644
--- a/db/migrate/20151019111703_fail_build_without_names.rb
+++ b/db/migrate/20151019111703_fail_build_without_names.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class FailBuildWithoutNames < ActiveRecord::Migration
def up
execute("UPDATE ci_builds SET status='failed' WHERE name IS NULL AND status='pending'")
diff --git a/db/migrate/20151020173516_ci_limits_to_mysql.rb b/db/migrate/20151020173516_ci_limits_to_mysql.rb
index 5314611cbcd..9bb960082f5 100644
--- a/db/migrate/20151020173516_ci_limits_to_mysql.rb
+++ b/db/migrate/20151020173516_ci_limits_to_mysql.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class CiLimitsToMysql < ActiveRecord::Migration
def change
return unless ActiveRecord::Base.configurations[Rails.env]['adapter'] =~ /^mysql/
diff --git a/db/migrate/20151023112551_fail_build_with_empty_name.rb b/db/migrate/20151023112551_fail_build_with_empty_name.rb
index 0666dfeaef4..41c0f0649cd 100644
--- a/db/migrate/20151023112551_fail_build_with_empty_name.rb
+++ b/db/migrate/20151023112551_fail_build_with_empty_name.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class FailBuildWithEmptyName < ActiveRecord::Migration
def up
execute("UPDATE ci_builds SET status='failed' WHERE (name IS NULL OR name='') AND status='pending'")
diff --git a/db/migrate/20151023144219_remove_satellites.rb b/db/migrate/20151023144219_remove_satellites.rb
index 98fe0bd7d1d..e73f300028a 100644
--- a/db/migrate/20151023144219_remove_satellites.rb
+++ b/db/migrate/20151023144219_remove_satellites.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
require 'fileutils'
class RemoveSatellites < ActiveRecord::Migration
diff --git a/db/migrate/20151103133339_add_shared_runners_setting.rb b/db/migrate/20151103133339_add_shared_runners_setting.rb
index b5b34d4ca61..4231dfd5c2e 100644
--- a/db/migrate/20151103133339_add_shared_runners_setting.rb
+++ b/db/migrate/20151103133339_add_shared_runners_setting.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddSharedRunnersSetting < ActiveRecord::Migration
def up
add_column :application_settings, :shared_runners_enabled, :boolean, default: true, null: false
diff --git a/db/migrate/20151104105513_add_file_to_lfs_objects.rb b/db/migrate/20151104105513_add_file_to_lfs_objects.rb
index 4e46ae8101c..7c57f3f0df6 100644
--- a/db/migrate/20151104105513_add_file_to_lfs_objects.rb
+++ b/db/migrate/20151104105513_add_file_to_lfs_objects.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddFileToLfsObjects < ActiveRecord::Migration
def change
add_column :lfs_objects, :file, :string
diff --git a/db/migrate/20151109100728_add_max_artifacts_size_to_application_settings.rb b/db/migrate/20151109100728_add_max_artifacts_size_to_application_settings.rb
index 25106ace7e9..01d8c0f043e 100644
--- a/db/migrate/20151109100728_add_max_artifacts_size_to_application_settings.rb
+++ b/db/migrate/20151109100728_add_max_artifacts_size_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddMaxArtifactsSizeToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :max_artifacts_size, :integer, default: 100, null: false
diff --git a/db/migrate/20151110125604_add_import_error_to_project.rb b/db/migrate/20151110125604_add_import_error_to_project.rb
index 793358c305e..7fc990f8d0a 100644
--- a/db/migrate/20151110125604_add_import_error_to_project.rb
+++ b/db/migrate/20151110125604_add_import_error_to_project.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddImportErrorToProject < ActiveRecord::Migration
def change
add_column :projects, :import_error, :text
diff --git a/db/migrate/20151201203948_raise_hook_url_limit.rb b/db/migrate/20151201203948_raise_hook_url_limit.rb
index c490b7ace0f..98a7fca6f6f 100644
--- a/db/migrate/20151201203948_raise_hook_url_limit.rb
+++ b/db/migrate/20151201203948_raise_hook_url_limit.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RaiseHookUrlLimit < ActiveRecord::Migration
def change
change_column :web_hooks, :url, :string, limit: 2000
diff --git a/db/migrate/20151209144329_migrate_ci_web_hooks.rb b/db/migrate/20151209144329_migrate_ci_web_hooks.rb
index 62a6d334f04..e1e4729f821 100644
--- a/db/migrate/20151209144329_migrate_ci_web_hooks.rb
+++ b/db/migrate/20151209144329_migrate_ci_web_hooks.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class MigrateCiWebHooks < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20151209145909_migrate_ci_emails.rb b/db/migrate/20151209145909_migrate_ci_emails.rb
index 5de7b205fb1..e1d92f0157e 100644
--- a/db/migrate/20151209145909_migrate_ci_emails.rb
+++ b/db/migrate/20151209145909_migrate_ci_emails.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class MigrateCiEmails < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20151210030143_add_unlock_token_to_user.rb b/db/migrate/20151210030143_add_unlock_token_to_user.rb
index d23c648f782..0ea66ba65df 100644
--- a/db/migrate/20151210030143_add_unlock_token_to_user.rb
+++ b/db/migrate/20151210030143_add_unlock_token_to_user.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddUnlockTokenToUser < ActiveRecord::Migration
def change
add_column :users, :unlock_token, :string
diff --git a/db/migrate/20151210072243_add_runners_registration_token_to_application_settings.rb b/db/migrate/20151210072243_add_runners_registration_token_to_application_settings.rb
index 92c7b5befd2..00f88180e46 100644
--- a/db/migrate/20151210072243_add_runners_registration_token_to_application_settings.rb
+++ b/db/migrate/20151210072243_add_runners_registration_token_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddRunnersRegistrationTokenToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :runners_registration_token, :string
diff --git a/db/migrate/20151210125232_migrate_ci_slack_service.rb b/db/migrate/20151210125232_migrate_ci_slack_service.rb
index fff130b7b10..e6dca4c0008 100644
--- a/db/migrate/20151210125232_migrate_ci_slack_service.rb
+++ b/db/migrate/20151210125232_migrate_ci_slack_service.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class MigrateCiSlackService < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20151210125927_migrate_ci_hip_chat_service.rb b/db/migrate/20151210125927_migrate_ci_hip_chat_service.rb
index 824f6f84195..72fcebf2959 100644
--- a/db/migrate/20151210125927_migrate_ci_hip_chat_service.rb
+++ b/db/migrate/20151210125927_migrate_ci_hip_chat_service.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class MigrateCiHipChatService < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20151210125929_add_project_id_to_ci.rb b/db/migrate/20151210125929_add_project_id_to_ci.rb
index b5de64b82ca..84273591fa2 100644
--- a/db/migrate/20151210125929_add_project_id_to_ci.rb
+++ b/db/migrate/20151210125929_add_project_id_to_ci.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddProjectIdToCi < ActiveRecord::Migration
def change
add_column :ci_builds, :gl_project_id, :integer
diff --git a/db/migrate/20151210125930_migrate_ci_to_project.rb b/db/migrate/20151210125930_migrate_ci_to_project.rb
index bb6d74ae212..c32c7feb193 100644
--- a/db/migrate/20151210125930_migrate_ci_to_project.rb
+++ b/db/migrate/20151210125930_migrate_ci_to_project.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class MigrateCiToProject < ActiveRecord::Migration
def up
migrate_project_id_for_table('ci_runner_projects')
diff --git a/db/migrate/20151218154042_add_tfa_to_application_settings.rb b/db/migrate/20151218154042_add_tfa_to_application_settings.rb
index afdaf76b917..dd95db775c5 100644
--- a/db/migrate/20151218154042_add_tfa_to_application_settings.rb
+++ b/db/migrate/20151218154042_add_tfa_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddTfaToApplicationSettings < ActiveRecord::Migration
def change
change_table :application_settings do |t|
diff --git a/db/migrate/20151221234414_add_tfa_additional_fields.rb b/db/migrate/20151221234414_add_tfa_additional_fields.rb
index c3e4aaa606a..c16df47932f 100644
--- a/db/migrate/20151221234414_add_tfa_additional_fields.rb
+++ b/db/migrate/20151221234414_add_tfa_additional_fields.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddTfaAdditionalFields < ActiveRecord::Migration
def change
change_table :users do |t|
diff --git a/db/migrate/20151224123230_rename_emojis.rb b/db/migrate/20151224123230_rename_emojis.rb
index 2c24f3beeea..62d921dfdcc 100644
--- a/db/migrate/20151224123230_rename_emojis.rb
+++ b/db/migrate/20151224123230_rename_emojis.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
# Migration type: online without errors (works on previous version and new one)
class RenameEmojis < ActiveRecord::Migration
def up
diff --git a/db/migrate/20151228175719_add_recaptcha_to_application_settings.rb b/db/migrate/20151228175719_add_recaptcha_to_application_settings.rb
index e0dd19b2b06..259fd0248d2 100644
--- a/db/migrate/20151228175719_add_recaptcha_to_application_settings.rb
+++ b/db/migrate/20151228175719_add_recaptcha_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddRecaptchaToApplicationSettings < ActiveRecord::Migration
def change
change_table :application_settings do |t|
diff --git a/db/migrate/20151229102248_influxdb_udp_port_setting.rb b/db/migrate/20151229102248_influxdb_udp_port_setting.rb
index 3e1bfd43899..ae0499f936d 100644
--- a/db/migrate/20151229102248_influxdb_udp_port_setting.rb
+++ b/db/migrate/20151229102248_influxdb_udp_port_setting.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class InfluxdbUdpPortSetting < ActiveRecord::Migration
def change
add_column :application_settings, :metrics_port, :integer, default: 8089
diff --git a/db/migrate/20151230132518_add_artifacts_metadata_to_ci_build.rb b/db/migrate/20151230132518_add_artifacts_metadata_to_ci_build.rb
index 4fcca06d905..6c282fc5039 100644
--- a/db/migrate/20151230132518_add_artifacts_metadata_to_ci_build.rb
+++ b/db/migrate/20151230132518_add_artifacts_metadata_to_ci_build.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddArtifactsMetadataToCiBuild < ActiveRecord::Migration
def change
add_column :ci_builds, :artifacts_metadata, :text
diff --git a/db/migrate/20151231152326_add_akismet_to_application_settings.rb b/db/migrate/20151231152326_add_akismet_to_application_settings.rb
index 7b0fab6f557..3f52c758f9a 100644
--- a/db/migrate/20151231152326_add_akismet_to_application_settings.rb
+++ b/db/migrate/20151231152326_add_akismet_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddAkismetToApplicationSettings < ActiveRecord::Migration
def change
change_table :application_settings do |t|
diff --git a/db/migrate/20160113111034_add_metrics_sample_interval.rb b/db/migrate/20160113111034_add_metrics_sample_interval.rb
index c1041da818c..b741f5d2c75 100644
--- a/db/migrate/20160113111034_add_metrics_sample_interval.rb
+++ b/db/migrate/20160113111034_add_metrics_sample_interval.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddMetricsSampleInterval < ActiveRecord::Migration
def change
add_column :application_settings, :metrics_sample_interval, :integer,
diff --git a/db/migrate/20160118155830_add_sentry_to_application_settings.rb b/db/migrate/20160118155830_add_sentry_to_application_settings.rb
index a6f715263ef..fa7ff9d9228 100644
--- a/db/migrate/20160118155830_add_sentry_to_application_settings.rb
+++ b/db/migrate/20160118155830_add_sentry_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddSentryToApplicationSettings < ActiveRecord::Migration
def change
change_table :application_settings do |t|
diff --git a/db/migrate/20160120172143_add_base_commit_sha_to_merge_request_diffs.rb b/db/migrate/20160120172143_add_base_commit_sha_to_merge_request_diffs.rb
index 3837208f81e..d6c6aa4a4e8 100644
--- a/db/migrate/20160120172143_add_base_commit_sha_to_merge_request_diffs.rb
+++ b/db/migrate/20160120172143_add_base_commit_sha_to_merge_request_diffs.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddBaseCommitShaToMergeRequestDiffs < ActiveRecord::Migration
def change
add_column :merge_request_diffs, :base_commit_sha, :string
diff --git a/db/migrate/20160128233227_change_lfs_objects_size_column.rb b/db/migrate/20160128233227_change_lfs_objects_size_column.rb
index 645c0cdb192..e7fd1f71777 100644
--- a/db/migrate/20160128233227_change_lfs_objects_size_column.rb
+++ b/db/migrate/20160128233227_change_lfs_objects_size_column.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class ChangeLfsObjectsSizeColumn < ActiveRecord::Migration
def change
change_column :lfs_objects, :size, :integer, limit: 8
diff --git a/db/migrate/20160129135155_remove_dot_atom_path_ending_of_projects.rb b/db/migrate/20160129135155_remove_dot_atom_path_ending_of_projects.rb
index b10c0602e24..d3ea956952e 100644
--- a/db/migrate/20160129135155_remove_dot_atom_path_ending_of_projects.rb
+++ b/db/migrate/20160129135155_remove_dot_atom_path_ending_of_projects.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RemoveDotAtomPathEndingOfProjects < ActiveRecord::Migration
include Gitlab::ShellAdapter
diff --git a/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb b/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb
index 332b5a756e8..f0d94226514 100644
--- a/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb
+++ b/db/migrate/20160129155512_add_merge_commit_sha_to_merge_requests.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddMergeCommitShaToMergeRequests < ActiveRecord::Migration
def change
add_column :merge_requests, :merge_commit_sha, :string
diff --git a/db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb b/db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb
index 11b6ff31000..f996ae74dca 100644
--- a/db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb
+++ b/db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddRealSizeToMergeRequestDiffs < ActiveRecord::Migration
def change
add_column :merge_request_diffs, :real_size, :string
diff --git a/db/migrate/20160217100506_add_description_to_label.rb b/db/migrate/20160217100506_add_description_to_label.rb
index af5af167470..eed6d1f236a 100644
--- a/db/migrate/20160217100506_add_description_to_label.rb
+++ b/db/migrate/20160217100506_add_description_to_label.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddDescriptionToLabel < ActiveRecord::Migration
def change
add_column :labels, :description, :string
diff --git a/db/migrate/20160217174422_add_note_to_tasks.rb b/db/migrate/20160217174422_add_note_to_tasks.rb
index a9a2b77e423..da5cb2e05db 100644
--- a/db/migrate/20160217174422_add_note_to_tasks.rb
+++ b/db/migrate/20160217174422_add_note_to_tasks.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddNoteToTasks < ActiveRecord::Migration
def change
add_reference :tasks, :note, index: true
diff --git a/db/migrate/20160220123949_rename_tasks_to_todos.rb b/db/migrate/20160220123949_rename_tasks_to_todos.rb
index f16b37537f3..30c10d27146 100644
--- a/db/migrate/20160220123949_rename_tasks_to_todos.rb
+++ b/db/migrate/20160220123949_rename_tasks_to_todos.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RenameTasksToTodos < ActiveRecord::Migration
def change
rename_table :tasks, :todos
diff --git a/db/migrate/20160229193553_add_main_language_to_repository.rb b/db/migrate/20160229193553_add_main_language_to_repository.rb
index ad5167b4c93..b5446c6a447 100644
--- a/db/migrate/20160229193553_add_main_language_to_repository.rb
+++ b/db/migrate/20160229193553_add_main_language_to_repository.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddMainLanguageToRepository < ActiveRecord::Migration
def change
add_column :projects, :main_language, :string
diff --git a/db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb b/db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb
index 1f400566f9f..ffcd64266e3 100644
--- a/db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb
+++ b/db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddImportCredentialsToProjectImportData < ActiveRecord::Migration
def change
add_column :project_import_data, :encrypted_credentials, :text
diff --git a/db/migrate/20160307221555_disallow_blank_line_code_on_note.rb b/db/migrate/20160307221555_disallow_blank_line_code_on_note.rb
index 10f2b8cc56a..49e787d9a9a 100644
--- a/db/migrate/20160307221555_disallow_blank_line_code_on_note.rb
+++ b/db/migrate/20160307221555_disallow_blank_line_code_on_note.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class DisallowBlankLineCodeOnNote < ActiveRecord::Migration
def up
execute("UPDATE notes SET line_code = NULL WHERE line_code = ''")
diff --git a/db/migrate/20160316192622_change_target_id_to_null_on_todos.rb b/db/migrate/20160316192622_change_target_id_to_null_on_todos.rb
index 65e0e61c78f..6871b3920df 100644
--- a/db/migrate/20160316192622_change_target_id_to_null_on_todos.rb
+++ b/db/migrate/20160316192622_change_target_id_to_null_on_todos.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class ChangeTargetIdToNullOnTodos < ActiveRecord::Migration
def change
change_column_null :todos, :target_id, true
diff --git a/db/migrate/20160317092222_add_moved_to_to_issue.rb b/db/migrate/20160317092222_add_moved_to_to_issue.rb
index 9dde668ddff..461e7fb3a9b 100644
--- a/db/migrate/20160317092222_add_moved_to_to_issue.rb
+++ b/db/migrate/20160317092222_add_moved_to_to_issue.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddMovedToToIssue < ActiveRecord::Migration
def change
add_reference :issues, :moved_to, references: :issues
diff --git a/db/migrate/20160324020319_remove_todos_for_deleted_issues.rb b/db/migrate/20160324020319_remove_todos_for_deleted_issues.rb
index a9a851cfe63..1fff9759d1e 100644
--- a/db/migrate/20160324020319_remove_todos_for_deleted_issues.rb
+++ b/db/migrate/20160324020319_remove_todos_for_deleted_issues.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RemoveTodosForDeletedIssues < ActiveRecord::Migration
def up
execute <<-SQL
diff --git a/db/migrate/20160328115649_migrate_new_notification_setting.rb b/db/migrate/20160328115649_migrate_new_notification_setting.rb
index eb6b7d07219..3c81b2c37bf 100644
--- a/db/migrate/20160328115649_migrate_new_notification_setting.rb
+++ b/db/migrate/20160328115649_migrate_new_notification_setting.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
# This migration will create one row of NotificationSetting for each Member row
# It can take long time on big instances.
#
diff --git a/db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb b/db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb
index b15af79b9b5..54cea964ff2 100644
--- a/db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb
+++ b/db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RemoveTodosForDeletedMergeRequests < ActiveRecord::Migration
def up
execute <<-SQL
diff --git a/db/migrate/20160407120251_add_images_enabled_for_project.rb b/db/migrate/20160407120251_add_images_enabled_for_project.rb
index fcffc98b47a..47f0ca8e8de 100644
--- a/db/migrate/20160407120251_add_images_enabled_for_project.rb
+++ b/db/migrate/20160407120251_add_images_enabled_for_project.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddImagesEnabledForProject < ActiveRecord::Migration
def change
add_column :projects, :container_registry_enabled, :boolean
diff --git a/db/migrate/20160413115152_add_token_to_web_hooks.rb b/db/migrate/20160413115152_add_token_to_web_hooks.rb
index 628b1d51b30..f04225068cd 100644
--- a/db/migrate/20160413115152_add_token_to_web_hooks.rb
+++ b/db/migrate/20160413115152_add_token_to_web_hooks.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddTokenToWebHooks < ActiveRecord::Migration
def change
add_column :web_hooks, :token, :string
diff --git a/db/migrate/20160415062917_create_personal_access_tokens.rb b/db/migrate/20160415062917_create_personal_access_tokens.rb
index c7b49870bf7..94650026994 100644
--- a/db/migrate/20160415062917_create_personal_access_tokens.rb
+++ b/db/migrate/20160415062917_create_personal_access_tokens.rb
@@ -1,4 +1,3 @@
-# rubocop:disable Migration/Datetime
# rubocop:disable Migration/Timestamps
class CreatePersonalAccessTokens < ActiveRecord::Migration
def change
diff --git a/db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb b/db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb
index b53b9bc6c3d..d493044c67b 100644
--- a/db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb
+++ b/db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddSharedRunnersTextToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :shared_runners_text, :text
diff --git a/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb b/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb
index 95ee03611d9..50f159a80b1 100644
--- a/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb
+++ b/db/migrate/20160416182152_convert_award_note_to_emoji_award.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class ConvertAwardNoteToEmojiAward < ActiveRecord::Migration
disable_ddl_transaction!
diff --git a/db/migrate/20160419120017_add_metrics_packet_size.rb b/db/migrate/20160419120017_add_metrics_packet_size.rb
index c759427c590..78c163d62ac 100644
--- a/db/migrate/20160419120017_add_metrics_packet_size.rb
+++ b/db/migrate/20160419120017_add_metrics_packet_size.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddMetricsPacketSize < ActiveRecord::Migration
def change
add_column :application_settings, :metrics_packet_size, :integer, default: 1
diff --git a/db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb b/db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb
index bf50616656c..facd33875ba 100644
--- a/db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb
+++ b/db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddDisabledOauthSignInSourcesToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :disabled_oauth_sign_in_sources, :text
diff --git a/db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb b/db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb
index c60892a6279..84e5e4eabe2 100644
--- a/db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb
+++ b/db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddRunUntaggedToCiRunner < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
disable_ddl_transaction!
diff --git a/db/migrate/20160508215820_add_type_to_notes.rb b/db/migrate/20160508215820_add_type_to_notes.rb
index c1d07c9363f..58944d4e651 100644
--- a/db/migrate/20160508215820_add_type_to_notes.rb
+++ b/db/migrate/20160508215820_add_type_to_notes.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddTypeToNotes < ActiveRecord::Migration
def change
add_column :notes, :type, :string
diff --git a/db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb b/db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb
index b6a5bea79b6..9d729fec189 100644
--- a/db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb
+++ b/db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddHealthCheckAccessTokenToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :health_check_access_token, :string
diff --git a/db/migrate/20160527020117_remove_notification_settings_for_deleted_projects.rb b/db/migrate/20160527020117_remove_notification_settings_for_deleted_projects.rb
index 3e26be7c09c..7910120b4e0 100644
--- a/db/migrate/20160527020117_remove_notification_settings_for_deleted_projects.rb
+++ b/db/migrate/20160527020117_remove_notification_settings_for_deleted_projects.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RemoveNotificationSettingsForDeletedProjects < ActiveRecord::Migration
def up
execute <<-SQL
diff --git a/db/migrate/20160530150109_add_container_registry_token_expire_delay_to_application_settings.rb b/db/migrate/20160530150109_add_container_registry_token_expire_delay_to_application_settings.rb
index d811fd5271e..e21376bd571 100644
--- a/db/migrate/20160530150109_add_container_registry_token_expire_delay_to_application_settings.rb
+++ b/db/migrate/20160530150109_add_container_registry_token_expire_delay_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
# This is ONLINE migration
class AddContainerRegistryTokenExpireDelayToApplicationSettings < ActiveRecord::Migration
diff --git a/db/migrate/20160603180330_remove_duplicated_notification_settings.rb b/db/migrate/20160603180330_remove_duplicated_notification_settings.rb
index 4f4f58b1619..fe1c863b5b9 100644
--- a/db/migrate/20160603180330_remove_duplicated_notification_settings.rb
+++ b/db/migrate/20160603180330_remove_duplicated_notification_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RemoveDuplicatedNotificationSettings < ActiveRecord::Migration
def up
duplicates = exec_query(%Q{
diff --git a/db/migrate/20160608155312_add_after_sign_up_text_to_application_settings.rb b/db/migrate/20160608155312_add_after_sign_up_text_to_application_settings.rb
index 3c5d2ad910e..89826fb96cb 100644
--- a/db/migrate/20160608155312_add_after_sign_up_text_to_application_settings.rb
+++ b/db/migrate/20160608155312_add_after_sign_up_text_to_application_settings.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class AddAfterSignUpTextToApplicationSettings < ActiveRecord::Migration
def change
add_column :application_settings, :after_sign_up_text, :text
diff --git a/db/migrate/20160610204157_add_deployments.rb b/db/migrate/20160610204157_add_deployments.rb
index 0e7e6e747a3..0ee0b1f5a86 100644
--- a/db/migrate/20160610204157_add_deployments.rb
+++ b/db/migrate/20160610204157_add_deployments.rb
@@ -1,7 +1,5 @@
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
-
-# rubocop:disable Migration/Datetime
class AddDeployments < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20160610204158_add_environments.rb b/db/migrate/20160610204158_add_environments.rb
index 699cee2b246..534a73a5fb6 100644
--- a/db/migrate/20160610204158_add_environments.rb
+++ b/db/migrate/20160610204158_add_environments.rb
@@ -1,7 +1,5 @@
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
-
-# rubocop:disable Migration/Datetime
class AddEnvironments < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20160615173316_add_enabled_git_access_protocols_to_application_settings.rb b/db/migrate/20160615173316_add_enabled_git_access_protocols_to_application_settings.rb
index 013904b3f4f..d0e6d8d1ea1 100644
--- a/db/migrate/20160615173316_add_enabled_git_access_protocols_to_application_settings.rb
+++ b/db/migrate/20160615173316_add_enabled_git_access_protocols_to_application_settings.rb
@@ -1,6 +1,5 @@
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
-# rubocop:disable all
class AddEnabledGitAccessProtocolsToApplicationSettings < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20160616102642_remove_duplicated_keys.rb b/db/migrate/20160616102642_remove_duplicated_keys.rb
index 180a75e0998..5e41cc53e32 100644
--- a/db/migrate/20160616102642_remove_duplicated_keys.rb
+++ b/db/migrate/20160616102642_remove_duplicated_keys.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class RemoveDuplicatedKeys < ActiveRecord::Migration
def up
select_all("SELECT fingerprint FROM #{quote_table_name(:keys)} GROUP BY fingerprint HAVING COUNT(*) > 1").each do |row|
diff --git a/db/migrate/20160824124900_add_table_issue_metrics.rb b/db/migrate/20160824124900_add_table_issue_metrics.rb
index 30d35ef1db2..49be8bc949b 100644
--- a/db/migrate/20160824124900_add_table_issue_metrics.rb
+++ b/db/migrate/20160824124900_add_table_issue_metrics.rb
@@ -1,7 +1,5 @@
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
-
-# rubocop:disable Migration/Datetime
# rubocop:disable Migration/Timestamps
class AddTableIssueMetrics < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20160825052008_add_table_merge_request_metrics.rb b/db/migrate/20160825052008_add_table_merge_request_metrics.rb
index 56b39634dfd..3c9dcc08190 100644
--- a/db/migrate/20160825052008_add_table_merge_request_metrics.rb
+++ b/db/migrate/20160825052008_add_table_merge_request_metrics.rb
@@ -1,7 +1,5 @@
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
-
-# rubocop:disable Migration/Datetime
# rubocop:disable Migration/Timestamps
class AddTableMergeRequestMetrics < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20161113184239_create_user_chat_names_table.rb b/db/migrate/20161113184239_create_user_chat_names_table.rb
index 62ccb599f2e..7bead07fd76 100644
--- a/db/migrate/20161113184239_create_user_chat_names_table.rb
+++ b/db/migrate/20161113184239_create_user_chat_names_table.rb
@@ -1,4 +1,3 @@
-# rubocop:disable Migration/Datetime
# rubocop:disable Migration/Timestamps
class CreateUserChatNamesTable < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20170130221926_create_uploads.rb b/db/migrate/20170130221926_create_uploads.rb
index 4d9fa0bb692..6f06c5dd840 100644
--- a/db/migrate/20170130221926_create_uploads.rb
+++ b/db/migrate/20170130221926_create_uploads.rb
@@ -1,4 +1,3 @@
-# rubocop:disable Migration/Datetime
class CreateUploads < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20170222143317_drop_ci_projects.rb b/db/migrate/20170222143317_drop_ci_projects.rb
index 9973e53501c..4db8658f36f 100644
--- a/db/migrate/20170222143317_drop_ci_projects.rb
+++ b/db/migrate/20170222143317_drop_ci_projects.rb
@@ -1,4 +1,3 @@
-# rubocop:disable Migration/Datetime
class DropCiProjects < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20170301205639_remove_unused_ci_tables_and_columns.rb b/db/migrate/20170301205639_remove_unused_ci_tables_and_columns.rb
index 0535c2ddaf2..ee802ab34ca 100644
--- a/db/migrate/20170301205639_remove_unused_ci_tables_and_columns.rb
+++ b/db/migrate/20170301205639_remove_unused_ci_tables_and_columns.rb
@@ -1,5 +1,4 @@
# rubocop:disable Migration/RemoveColumn
-# rubocop:disable Migration/Datetime
class RemoveUnusedCiTablesAndColumns < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20170329095907_create_ci_trigger_schedules.rb b/db/migrate/20170329095907_create_ci_trigger_schedules.rb
index 06a2010db23..cfcfa27ebb5 100644
--- a/db/migrate/20170329095907_create_ci_trigger_schedules.rb
+++ b/db/migrate/20170329095907_create_ci_trigger_schedules.rb
@@ -1,4 +1,3 @@
-# rubocop:disable Migration/Datetime
class CreateCiTriggerSchedules < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20170402231018_remove_index_for_users_current_sign_in_at.rb b/db/migrate/20170402231018_remove_index_for_users_current_sign_in_at.rb
index 84635fa39b9..42c90103262 100644
--- a/db/migrate/20170402231018_remove_index_for_users_current_sign_in_at.rb
+++ b/db/migrate/20170402231018_remove_index_for_users_current_sign_in_at.rb
@@ -1,7 +1,5 @@
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
-
-# rubocop:disable RemoveIndex
class RemoveIndexForUsersCurrentSignInAt < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20170425112128_create_pipeline_schedules_table.rb b/db/migrate/20170425112128_create_pipeline_schedules_table.rb
index 4f9c56a1ad8..bd15b9eef19 100644
--- a/db/migrate/20170425112128_create_pipeline_schedules_table.rb
+++ b/db/migrate/20170425112128_create_pipeline_schedules_table.rb
@@ -1,4 +1,3 @@
-# rubocop:disable Migration/Datetime
# rubocop:disable Migration/Timestamps
class CreatePipelineSchedulesTable < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/migrate/20170502091007_markdown_cache_limits_to_mysql.rb b/db/migrate/20170502091007_markdown_cache_limits_to_mysql.rb
index 008a94d8334..1c5d4997d40 100644
--- a/db/migrate/20170502091007_markdown_cache_limits_to_mysql.rb
+++ b/db/migrate/20170502091007_markdown_cache_limits_to_mysql.rb
@@ -1,2 +1 @@
-# rubocop:disable all
require_relative 'markdown_cache_limits_to_mysql'
diff --git a/db/migrate/20170531202042_rename_users_ldap_email_to_external_email.rb b/db/migrate/20170531202042_rename_users_ldap_email_to_external_email.rb
index 470c3b8166c..f858611d24b 100644
--- a/db/migrate/20170531202042_rename_users_ldap_email_to_external_email.rb
+++ b/db/migrate/20170531202042_rename_users_ldap_email_to_external_email.rb
@@ -6,6 +6,7 @@ class RenameUsersLdapEmailToExternalEmail < ActiveRecord::Migration
disable_ddl_transaction!
def up
+ # rubocop:disable Migration/UpdateLargeTable
rename_column_concurrently :users, :ldap_email, :external_email
end
diff --git a/db/migrate/20171106171453_add_timezone_to_issues_closed_at.rb b/db/migrate/20171106171453_add_timezone_to_issues_closed_at.rb
index ad540b1e509..0f1e937545b 100644
--- a/db/migrate/20171106171453_add_timezone_to_issues_closed_at.rb
+++ b/db/migrate/20171106171453_add_timezone_to_issues_closed_at.rb
@@ -10,6 +10,7 @@ class AddTimezoneToIssuesClosedAt < ActiveRecord::Migration
disable_ddl_transaction!
def up
+ # rubocop:disable Migration/UpdateLargeTable
change_column_type_concurrently(:issues, :closed_at, :datetime_with_timezone)
end
diff --git a/db/migrate/20180201145907_migrate_remaining_issues_closed_at.rb b/db/migrate/20180201145907_migrate_remaining_issues_closed_at.rb
index 5a36dec6a9a..36a85b61968 100644
--- a/db/migrate/20180201145907_migrate_remaining_issues_closed_at.rb
+++ b/db/migrate/20180201145907_migrate_remaining_issues_closed_at.rb
@@ -25,6 +25,7 @@ class MigrateRemainingIssuesClosedAt < ActiveRecord::Migration
# Due to some EE merge problems some environments may not have the
# "closed_at_for_type_change" column. If this is the case we have no
# other option than to migrate the data _right now_.
+ # rubocop:disable Migration/UpdateLargeTable
change_column_type_concurrently(:issues, :closed_at, :datetime_with_timezone)
cleanup_concurrent_column_type_change(:issues, :closed_at)
end
diff --git a/db/migrate/20180214093516_create_badges.rb b/db/migrate/20180214093516_create_badges.rb
index 6559f834484..a1d77328f77 100644
--- a/db/migrate/20180214093516_create_badges.rb
+++ b/db/migrate/20180214093516_create_badges.rb
@@ -12,6 +12,7 @@ class CreateBadges < ActiveRecord::Migration
t.timestamps_with_timezone null: false
end
+ # rubocop:disable Migration/AddConcurrentForeignKey
add_foreign_key :badges, :namespaces, column: :group_id, on_delete: :cascade
end
end
diff --git a/db/migrate/20180227182112_add_group_id_to_boards_ce.rb b/db/migrate/20180227182112_add_group_id_to_boards_ce.rb
index f54dd8d7687..5b2691b3a00 100644
--- a/db/migrate/20180227182112_add_group_id_to_boards_ce.rb
+++ b/db/migrate/20180227182112_add_group_id_to_boards_ce.rb
@@ -8,6 +8,7 @@ class AddGroupIdToBoardsCe < ActiveRecord::Migration
def up
return if group_id_exists?
+ # rubocop:disable Migration/AddConcurrentForeignKey
add_column :boards, :group_id, :integer
add_foreign_key :boards, :namespaces, column: :group_id, on_delete: :cascade
add_concurrent_index :boards, :group_id
@@ -18,6 +19,7 @@ class AddGroupIdToBoardsCe < ActiveRecord::Migration
def down
return unless group_id_exists?
+ # rubocop:disable Migration/RemoveIndex
remove_foreign_key :boards, column: :group_id
remove_index :boards, :group_id if index_exists? :boards, :group_id
remove_column :boards, :group_id
diff --git a/db/migrate/20180302152117_ensure_foreign_keys_on_clusters_applications.rb b/db/migrate/20180302152117_ensure_foreign_keys_on_clusters_applications.rb
index 8298979e96a..e6cec39e61f 100644
--- a/db/migrate/20180302152117_ensure_foreign_keys_on_clusters_applications.rb
+++ b/db/migrate/20180302152117_ensure_foreign_keys_on_clusters_applications.rb
@@ -8,6 +8,7 @@ class EnsureForeignKeysOnClustersApplications < ActiveRecord::Migration
disable_ddl_transaction!
+ # rubocop:disable Cop/InBatches
def up
existing = Clusters::Cluster
.joins(:application_ingress)
diff --git a/db/migrate/20180309160427_add_partial_indexes_on_todos.rb b/db/migrate/20180309160427_add_partial_indexes_on_todos.rb
index 18a5c69df1b..671fa743cec 100644
--- a/db/migrate/20180309160427_add_partial_indexes_on_todos.rb
+++ b/db/migrate/20180309160427_add_partial_indexes_on_todos.rb
@@ -7,15 +7,16 @@ class AddPartialIndexesOnTodos < ActiveRecord::Migration
# Set this constant to true if this migration requires downtime.
DOWNTIME = false
- disable_ddl_transaction!
+ disable_ddl_transaction!
+
+ INDEX_NAME_PENDING = "index_todos_on_user_id_and_id_pending"
+ INDEX_NAME_DONE = "index_todos_on_user_id_and_id_done"
- INDEX_NAME_PENDING="index_todos_on_user_id_and_id_pending"
- INDEX_NAME_DONE="index_todos_on_user_id_and_id_done"
-
def up
unless index_exists?(:todos, [:user_id, :id], name: INDEX_NAME_PENDING)
add_concurrent_index(:todos, [:user_id, :id], where: "state='pending'", name: INDEX_NAME_PENDING)
end
+
unless index_exists?(:todos, [:user_id, :id], name: INDEX_NAME_DONE)
add_concurrent_index(:todos, [:user_id, :id], where: "state='done'", name: INDEX_NAME_DONE)
end
@@ -24,5 +25,5 @@ class AddPartialIndexesOnTodos < ActiveRecord::Migration
def down
remove_concurrent_index(:todos, [:user_id, :id], where: "state='pending'", name: INDEX_NAME_PENDING)
remove_concurrent_index(:todos, [:user_id, :id], where: "state='done'", name: INDEX_NAME_DONE)
- end
+ end
end
diff --git a/db/migrate/20180408143354_rename_users_rss_token_to_feed_token.rb b/db/migrate/20180408143354_rename_users_rss_token_to_feed_token.rb
index 007cbebaf1b..e852d50b25e 100644
--- a/db/migrate/20180408143354_rename_users_rss_token_to_feed_token.rb
+++ b/db/migrate/20180408143354_rename_users_rss_token_to_feed_token.rb
@@ -6,6 +6,7 @@ class RenameUsersRssTokenToFeedToken < ActiveRecord::Migration
disable_ddl_transaction!
def up
+ # rubocop:disable Migration/UpdateLargeTable
rename_column_concurrently :users, :rss_token, :feed_token
end
diff --git a/db/migrate/20180417090132_add_index_constraints_to_internal_id_table.rb b/db/migrate/20180417090132_add_index_constraints_to_internal_id_table.rb
index 582b89a3948..58de795472a 100644
--- a/db/migrate/20180417090132_add_index_constraints_to_internal_id_table.rb
+++ b/db/migrate/20180417090132_add_index_constraints_to_internal_id_table.rb
@@ -26,6 +26,7 @@ class AddIndexConstraintsToInternalIdTable < ActiveRecord::Migration
end
private
+
def replace_index(table, columns, name:)
temporary_name = "#{name}_old"
diff --git a/db/migrate/20180418053107_add_index_to_ci_job_artifacts_file_store.rb b/db/migrate/20180418053107_add_index_to_ci_job_artifacts_file_store.rb
index 1084ca14a34..ac91624c3d5 100644
--- a/db/migrate/20180418053107_add_index_to_ci_job_artifacts_file_store.rb
+++ b/db/migrate/20180418053107_add_index_to_ci_job_artifacts_file_store.rb
@@ -10,6 +10,7 @@ class AddIndexToCiJobArtifactsFileStore < ActiveRecord::Migration
end
def down
+ # rubocop:disable Migration/RemoveIndex
remove_index :ci_job_artifacts, :file_store if index_exists?(:ci_job_artifacts, :file_store)
end
end
diff --git a/db/migrate/20180424090541_add_enforce_terms_to_application_settings.rb b/db/migrate/20180424090541_add_enforce_terms_to_application_settings.rb
index 306cd737771..f5afdb0e4e6 100644
--- a/db/migrate/20180424090541_add_enforce_terms_to_application_settings.rb
+++ b/db/migrate/20180424090541_add_enforce_terms_to_application_settings.rb
@@ -4,6 +4,7 @@ class AddEnforceTermsToApplicationSettings < ActiveRecord::Migration
DOWNTIME = false
def change
+ # rubocop:disable Migration/SaferBooleanColumn
add_column :application_settings, :enforce_terms, :boolean, default: false
end
end
diff --git a/db/migrate/20180425075446_create_term_agreements.rb b/db/migrate/20180425075446_create_term_agreements.rb
index 22a9d7b574d..1fa2c8dd3be 100644
--- a/db/migrate/20180425075446_create_term_agreements.rb
+++ b/db/migrate/20180425075446_create_term_agreements.rb
@@ -21,6 +21,7 @@ class CreateTermAgreements < ActiveRecord::Migration
end
def down
+ # rubocop:disable Migration/RemoveIndex
remove_index :term_agreements, name: 'term_agreements_unique_index'
drop_table :term_agreements
diff --git a/db/migrate/20180503131624_create_remote_mirrors.rb b/db/migrate/20180503131624_create_remote_mirrors.rb
index 7800186455f..249882f8613 100644
--- a/db/migrate/20180503131624_create_remote_mirrors.rb
+++ b/db/migrate/20180503131624_create_remote_mirrors.rb
@@ -23,6 +23,7 @@ class CreateRemoteMirrors < ActiveRecord::Migration
t.string :encrypted_credentials_iv
t.string :encrypted_credentials_salt
+ # rubocop:disable Migration/Timestamps
t.timestamps null: false
end
end
diff --git a/db/migrate/20180503150427_add_index_to_namespaces_runners_token.rb b/db/migrate/20180503150427_add_index_to_namespaces_runners_token.rb
index 4c4e576d49f..9e55690bd33 100644
--- a/db/migrate/20180503150427_add_index_to_namespaces_runners_token.rb
+++ b/db/migrate/20180503150427_add_index_to_namespaces_runners_token.rb
@@ -14,6 +14,7 @@ class AddIndexToNamespacesRunnersToken < ActiveRecord::Migration
def down
if index_exists?(:namespaces, :runners_token, unique: true)
+ # rubocop:disable Migration/RemoveIndex
remove_index :namespaces, :runners_token
end
end
diff --git a/db/migrate/20180503175054_add_indexes_to_project_mirror_data.rb b/db/migrate/20180503175054_add_indexes_to_project_mirror_data.rb
index 17570269b2e..b59b941c815 100644
--- a/db/migrate/20180503175054_add_indexes_to_project_mirror_data.rb
+++ b/db/migrate/20180503175054_add_indexes_to_project_mirror_data.rb
@@ -11,6 +11,7 @@ class AddIndexesToProjectMirrorData < ActiveRecord::Migration
end
def down
+ # rubocop:disable Migration/RemoveIndex
remove_index :project_mirror_data, :jid if index_exists? :project_mirror_data, :jid
remove_index :project_mirror_data, :status if index_exists? :project_mirror_data, :status
end
diff --git a/db/migrate/20180503193542_add_indexes_to_remote_mirror.rb b/db/migrate/20180503193542_add_indexes_to_remote_mirror.rb
index 9a9decffdab..4af42b4fb29 100644
--- a/db/migrate/20180503193542_add_indexes_to_remote_mirror.rb
+++ b/db/migrate/20180503193542_add_indexes_to_remote_mirror.rb
@@ -10,6 +10,7 @@ class AddIndexesToRemoteMirror < ActiveRecord::Migration
end
def down
+ # rubocop:disable Migration/RemoveIndex
remove_index :remote_mirrors, :last_successful_update_at if index_exists? :remote_mirrors, :last_successful_update_at
end
end
diff --git a/db/migrate/20180511090724_add_index_on_ci_runners_runner_type.rb b/db/migrate/20180511090724_add_index_on_ci_runners_runner_type.rb
index 580f56007c7..f3ed20fd243 100644
--- a/db/migrate/20180511090724_add_index_on_ci_runners_runner_type.rb
+++ b/db/migrate/20180511090724_add_index_on_ci_runners_runner_type.rb
@@ -10,6 +10,7 @@ class AddIndexOnCiRunnersRunnerType < ActiveRecord::Migration
end
def down
+ # rubocop:disable Migration/RemoveIndex
remove_index :ci_runners, :runner_type
end
end
diff --git a/db/migrate/20180515005612_add_squash_to_merge_requests.rb b/db/migrate/20180515005612_add_squash_to_merge_requests.rb
index f526b45bd4b..fd85e968acd 100644
--- a/db/migrate/20180515005612_add_squash_to_merge_requests.rb
+++ b/db/migrate/20180515005612_add_squash_to_merge_requests.rb
@@ -9,6 +9,7 @@ class AddSquashToMergeRequests < ActiveRecord::Migration
def up
unless column_exists?(:merge_requests, :squash)
+ # rubocop:disable Migration/UpdateLargeTable
add_column_with_default :merge_requests, :squash, :boolean, default: false, allow_null: false
end
end
diff --git a/db/migrate/20180515121227_create_notes_diff_files.rb b/db/migrate/20180515121227_create_notes_diff_files.rb
index 7108bc1a64b..efcd3bb9c7e 100644
--- a/db/migrate/20180515121227_create_notes_diff_files.rb
+++ b/db/migrate/20180515121227_create_notes_diff_files.rb
@@ -16,6 +16,7 @@ class CreateNotesDiffFiles < ActiveRecord::Migration
t.text :old_path, null: false
end
+ # rubocop:disable Migration/AddConcurrentForeignKey
add_foreign_key :note_diff_files, :notes, column: :diff_note_id, on_delete: :cascade
end
end
diff --git a/db/migrate/20180521171529_increase_mysql_text_limit_for_gpg_keys.rb b/db/migrate/20180521171529_increase_mysql_text_limit_for_gpg_keys.rb
index df84898003f..08ce8cc3094 100644
--- a/db/migrate/20180521171529_increase_mysql_text_limit_for_gpg_keys.rb
+++ b/db/migrate/20180521171529_increase_mysql_text_limit_for_gpg_keys.rb
@@ -1,2 +1 @@
-# rubocop:disable all
require_relative 'gpg_keys_limits_to_mysql'
diff --git a/db/migrate/20180529093006_ensure_remote_mirror_columns.rb b/db/migrate/20180529093006_ensure_remote_mirror_columns.rb
index 290416cb61c..22e9482cb1d 100644
--- a/db/migrate/20180529093006_ensure_remote_mirror_columns.rb
+++ b/db/migrate/20180529093006_ensure_remote_mirror_columns.rb
@@ -6,6 +6,7 @@ class EnsureRemoteMirrorColumns < ActiveRecord::Migration
disable_ddl_transaction!
def up
+ # rubocop:disable Migration/Datetime
add_column :remote_mirrors, :last_update_started_at, :datetime unless column_exists?(:remote_mirrors, :last_update_started_at)
add_column :remote_mirrors, :remote_name, :string unless column_exists?(:remote_mirrors, :remote_name)
diff --git a/db/migrate/20180531185349_add_repository_languages.rb b/db/migrate/20180531185349_add_repository_languages.rb
new file mode 100644
index 00000000000..bfcfb618c87
--- /dev/null
+++ b/db/migrate/20180531185349_add_repository_languages.rb
@@ -0,0 +1,28 @@
+class AddRepositoryLanguages < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ create_table(:programming_languages) do |t|
+ t.string :name, null: false
+ t.string :color, null: false
+ t.datetime_with_timezone :created_at, null: false
+ end
+
+ create_table(:repository_languages, id: false) do |t|
+ t.references :project, null: false, foreign_key: { on_delete: :cascade }
+ t.references :programming_language, null: false
+ t.float :share, null: false
+ end
+
+ add_index :programming_languages, :name, unique: true
+ add_index :repository_languages, [:project_id, :programming_language_id],
+ unique: true, name: "index_repository_languages_on_project_and_languages_id"
+ end
+
+ def down
+ drop_table :repository_languages
+ drop_table :programming_languages
+ end
+end
diff --git a/db/migrate/20180531220618_change_default_value_for_dsa_key_restriction.rb b/db/migrate/20180531220618_change_default_value_for_dsa_key_restriction.rb
index d0dcacc5b66..dbbbcd1f622 100644
--- a/db/migrate/20180531220618_change_default_value_for_dsa_key_restriction.rb
+++ b/db/migrate/20180531220618_change_default_value_for_dsa_key_restriction.rb
@@ -4,13 +4,13 @@ class ChangeDefaultValueForDsaKeyRestriction < ActiveRecord::Migration
def up
change_column :application_settings, :dsa_key_restriction, :integer, null: false,
- default: -1
+ default: -1
execute("UPDATE application_settings SET dsa_key_restriction = -1")
end
def down
change_column :application_settings, :dsa_key_restriction, :integer, null: false,
- default: 0
+ default: 0
end
end
diff --git a/db/migrate/20180608110058_rename_merge_requests_allow_collaboration.rb b/db/migrate/20180608110058_rename_merge_requests_allow_collaboration.rb
index dcbbef9bd4a..36f2a593fbe 100644
--- a/db/migrate/20180608110058_rename_merge_requests_allow_collaboration.rb
+++ b/db/migrate/20180608110058_rename_merge_requests_allow_collaboration.rb
@@ -11,6 +11,7 @@ class RenameMergeRequestsAllowCollaboration < ActiveRecord::Migration
def up
if column_exists?(:merge_requests, :allow_collaboration)
+ # rubocop:disable Migration/UpdateLargeTable
rename_column_concurrently :merge_requests, :allow_collaboration, :allow_maintainer_to_push
end
end
diff --git a/db/migrate/20180629153018_create_site_statistics.rb b/db/migrate/20180629153018_create_site_statistics.rb
new file mode 100644
index 00000000000..085ce1ba64b
--- /dev/null
+++ b/db/migrate/20180629153018_create_site_statistics.rb
@@ -0,0 +1,18 @@
+class CreateSiteStatistics < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def up
+ create_table :site_statistics do |t|
+ t.integer :repositories_count, default: 0, null: false
+ t.integer :wikis_count, default: 0, null: false
+ end
+
+ execute('INSERT INTO site_statistics (id) VALUES(1)')
+ end
+
+ def down
+ drop_table :site_statistics
+ end
+end
diff --git a/db/migrate/20180702124358_remove_orphaned_routes.rb b/db/migrate/20180702124358_remove_orphaned_routes.rb
new file mode 100644
index 00000000000..6f6e289ba87
--- /dev/null
+++ b/db/migrate/20180702124358_remove_orphaned_routes.rb
@@ -0,0 +1,49 @@
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class RemoveOrphanedRoutes < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ class Route < ActiveRecord::Base
+ self.table_name = 'routes'
+ include EachBatch
+
+ def self.orphaned_namespace_routes
+ where(source_type: 'Namespace')
+ .where('NOT EXISTS ( SELECT 1 FROM namespaces WHERE namespaces.id = routes.source_id )')
+ end
+
+ def self.orphaned_project_routes
+ where(source_type: 'Project')
+ .where('NOT EXISTS ( SELECT 1 FROM projects WHERE projects.id = routes.source_id )')
+ end
+ end
+
+ def up
+ # Some of these queries can take up to 10 seconds to run on GitLab.com,
+ # which is pretty close to our 15 second statement timeout. To ensure a
+ # smooth deployment procedure we disable the statement timeouts for this
+ # migration, just in case.
+ disable_statement_timeout
+
+ # On GitLab.com there are around 4000 orphaned project routes, and around
+ # 150 orphaned namespace routes.
+ [
+ Route.orphaned_project_routes,
+ Route.orphaned_namespace_routes
+ ].each do |relation|
+ relation.each_batch(of: 1_000) do |batch|
+ batch.delete_all
+ end
+ end
+ end
+
+ def down
+ # There is no way to restore orphaned routes, and this doesn't make any
+ # sense anyway.
+ end
+end
diff --git a/db/migrate/20180702134423_generate_missing_routes.rb b/db/migrate/20180702134423_generate_missing_routes.rb
new file mode 100644
index 00000000000..994725f9bd1
--- /dev/null
+++ b/db/migrate/20180702134423_generate_missing_routes.rb
@@ -0,0 +1,143 @@
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+# This migration generates missing routes for any projects and namespaces that
+# don't already have a route.
+#
+# On GitLab.com this would insert 611 project routes, and 0 namespace routes.
+# The exact number could vary per instance, so we take care of both just in
+# case.
+class GenerateMissingRoutes < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ class User < ActiveRecord::Base
+ self.table_name = 'users'
+ end
+
+ class Route < ActiveRecord::Base
+ self.table_name = 'routes'
+ end
+
+ module Routable
+ def build_full_path
+ if parent && path
+ parent.build_full_path + '/' + path
+ else
+ path
+ end
+ end
+
+ def build_full_name
+ if parent && name
+ parent.human_name + ' / ' + name
+ else
+ name
+ end
+ end
+
+ def human_name
+ build_full_name
+ end
+
+ def attributes_for_insert
+ time = Time.zone.now
+
+ {
+ # We can't use "self.class.name" here as that would include the
+ # migration namespace.
+ source_type: source_type_for_route,
+ source_id: id,
+ created_at: time,
+ updated_at: time,
+ name: build_full_name,
+
+ # The route path might already be taken. Instead of trying to generate a
+ # new unique name on every conflict, we just append the row ID to the
+ # route path.
+ path: "#{build_full_path}-#{id}"
+ }
+ end
+ end
+
+ class Project < ActiveRecord::Base
+ self.table_name = 'projects'
+
+ include EachBatch
+ include GenerateMissingRoutes::Routable
+
+ belongs_to :namespace, class_name: 'GenerateMissingRoutes::Namespace'
+
+ has_one :route,
+ as: :source,
+ inverse_of: :source,
+ class_name: 'GenerateMissingRoutes::Route'
+
+ alias_method :parent, :namespace
+ alias_attribute :parent_id, :namespace_id
+
+ def self.without_routes
+ where(
+ 'NOT EXISTS (
+ SELECT 1
+ FROM routes
+ WHERE source_type = ?
+ AND source_id = projects.id
+ )',
+ 'Project'
+ )
+ end
+
+ def source_type_for_route
+ 'Project'
+ end
+ end
+
+ class Namespace < ActiveRecord::Base
+ self.table_name = 'namespaces'
+
+ include EachBatch
+ include GenerateMissingRoutes::Routable
+
+ belongs_to :parent, class_name: 'GenerateMissingRoutes::Namespace'
+ belongs_to :owner, class_name: 'GenerateMissingRoutes::User'
+
+ has_one :route,
+ as: :source,
+ inverse_of: :source,
+ class_name: 'GenerateMissingRoutes::Route'
+
+ def self.without_routes
+ where(
+ 'NOT EXISTS (
+ SELECT 1
+ FROM routes
+ WHERE source_type = ?
+ AND source_id = namespaces.id
+ )',
+ 'Namespace'
+ )
+ end
+
+ def source_type_for_route
+ 'Namespace'
+ end
+ end
+
+ def up
+ [Namespace, Project].each do |model|
+ model.without_routes.each_batch(of: 100) do |batch|
+ rows = batch.map(&:attributes_for_insert)
+
+ Gitlab::Database.bulk_insert(:routes, rows)
+ end
+ end
+ end
+
+ def down
+ # Removing routes we previously generated makes no sense.
+ end
+end
diff --git a/db/migrate/20180705160945_add_file_format_to_ci_job_artifacts.rb b/db/migrate/20180705160945_add_file_format_to_ci_job_artifacts.rb
new file mode 100644
index 00000000000..63c188693f3
--- /dev/null
+++ b/db/migrate/20180705160945_add_file_format_to_ci_job_artifacts.rb
@@ -0,0 +1,7 @@
+class AddFileFormatToCiJobArtifacts < ActiveRecord::Migration
+ DOWNTIME = false
+
+ def change
+ add_column :ci_job_artifacts, :file_format, :integer, limit: 2
+ end
+end
diff --git a/db/migrate/20180710162338_add_foreign_key_from_notification_settings_to_users.rb b/db/migrate/20180710162338_add_foreign_key_from_notification_settings_to_users.rb
new file mode 100644
index 00000000000..91656f194e5
--- /dev/null
+++ b/db/migrate/20180710162338_add_foreign_key_from_notification_settings_to_users.rb
@@ -0,0 +1,30 @@
+class AddForeignKeyFromNotificationSettingsToUsers < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ class NotificationSetting < ActiveRecord::Base
+ self.table_name = 'notification_settings'
+
+ include EachBatch
+ end
+
+ class User < ActiveRecord::Base
+ self.table_name = 'users'
+ end
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ NotificationSetting.each_batch(of: 1000) do |batch|
+ batch.where('NOT EXISTS (?)', User.select(1).where('users.id = notification_settings.user_id'))
+ .delete_all
+ end
+
+ add_concurrent_foreign_key(:notification_settings, :users, column: :user_id, on_delete: :cascade)
+ end
+
+ def down
+ remove_foreign_key(:notification_settings, column: :user_id)
+ end
+end
diff --git a/db/migrate/20180713092803_create_user_statuses.rb b/db/migrate/20180713092803_create_user_statuses.rb
new file mode 100644
index 00000000000..cbe21b89ad9
--- /dev/null
+++ b/db/migrate/20180713092803_create_user_statuses.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class CreateUserStatuses < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ create_table :user_statuses, id: false, primary_key: :user_id do |t|
+ t.references :user,
+ foreign_key: { on_delete: :cascade },
+ null: false,
+ primary_key: true
+ t.integer :cached_markdown_version, limit: 4
+ t.string :emoji, null: false, default: 'speech_balloon'
+ t.string :message, limit: 100
+ t.string :message_html
+ end
+ end
+end
diff --git a/db/migrate/20180718005113_add_instance_statistics_visibility_to_application_setting.rb b/db/migrate/20180718005113_add_instance_statistics_visibility_to_application_setting.rb
new file mode 100644
index 00000000000..4b6c1f74346
--- /dev/null
+++ b/db/migrate/20180718005113_add_instance_statistics_visibility_to_application_setting.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class AddInstanceStatisticsVisibilityToApplicationSetting < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_column_with_default(:application_settings, :instance_statistics_visibility_private,
+ :boolean,
+ default: false,
+ allow_null: false)
+ end
+
+ def down
+ remove_column(:application_settings, :instance_statistics_visibility_private)
+ end
+end
diff --git a/db/migrate/20180722103201_add_private_profile_to_users.rb b/db/migrate/20180722103201_add_private_profile_to_users.rb
new file mode 100644
index 00000000000..4f7ef1322d8
--- /dev/null
+++ b/db/migrate/20180722103201_add_private_profile_to_users.rb
@@ -0,0 +1,10 @@
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class AddPrivateProfileToUsers < ActiveRecord::Migration
+ DOWNTIME = false
+
+ def change
+ add_column :users, :private_profile, :boolean
+ end
+end
diff --git a/db/migrate/20180726172057_create_resource_label_events.rb b/db/migrate/20180726172057_create_resource_label_events.rb
new file mode 100644
index 00000000000..2ef7078d898
--- /dev/null
+++ b/db/migrate/20180726172057_create_resource_label_events.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+class CreateResourceLabelEvents < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ def change
+ create_table :resource_label_events, id: :bigserial do |t|
+ t.integer :action, null: false
+ t.references :issue, null: true, index: true, foreign_key: { on_delete: :cascade }
+ t.references :merge_request, null: true, index: true, foreign_key: { on_delete: :cascade }
+ t.references :label, index: true, foreign_key: { on_delete: :nullify }
+ t.references :user, index: true, foreign_key: { on_delete: :nullify }
+ t.datetime_with_timezone :created_at, null: false
+ end
+ end
+end
diff --git a/db/migrate/gpg_keys_limits_to_mysql.rb b/db/migrate/gpg_keys_limits_to_mysql.rb
index 780340d0564..38729320d8c 100644
--- a/db/migrate/gpg_keys_limits_to_mysql.rb
+++ b/db/migrate/gpg_keys_limits_to_mysql.rb
@@ -1,5 +1,4 @@
class IncreaseMysqlTextLimitForGpgKeys < ActiveRecord::Migration
-
# Set this constant to true if this migration requires downtime.
DOWNTIME = false
diff --git a/db/migrate/limits_ci_build_trace_chunks_raw_data_for_mysql.rb b/db/migrate/limits_ci_build_trace_chunks_raw_data_for_mysql.rb
index e1771912c3c..9fd23aae1e5 100644
--- a/db/migrate/limits_ci_build_trace_chunks_raw_data_for_mysql.rb
+++ b/db/migrate/limits_ci_build_trace_chunks_raw_data_for_mysql.rb
@@ -4,6 +4,6 @@ class LimitsCiBuildTraceChunksRawDataForMysql < ActiveRecord::Migration
# Mysql needs MEDIUMTEXT type (up to 16MB) rather than TEXT (up to 64KB)
# Because 'raw_data' is always capped by Ci::BuildTraceChunk::CHUNK_SIZE, which is 128KB
- change_column :ci_build_trace_chunks, :raw_data, :binary, limit: 16.megabytes - 1 #MEDIUMTEXT
+ change_column :ci_build_trace_chunks, :raw_data, :binary, limit: 16.megabytes - 1 # MEDIUMTEXT
end
end
diff --git a/db/migrate/limits_to_mysql.rb b/db/migrate/limits_to_mysql.rb
index 8f8d8f27410..7507a4bb431 100644
--- a/db/migrate/limits_to_mysql.rb
+++ b/db/migrate/limits_to_mysql.rb
@@ -1,4 +1,3 @@
-# rubocop:disable all
class LimitsToMysql < ActiveRecord::Migration
def up
return unless ActiveRecord::Base.configurations[Rails.env]['adapter'] =~ /^mysql/
diff --git a/db/optional_migrations/composite_primary_keys.rb b/db/optional_migrations/composite_primary_keys.rb
index 0fd3fca52dd..d45705021b0 100644
--- a/db/optional_migrations/composite_primary_keys.rb
+++ b/db/optional_migrations/composite_primary_keys.rb
@@ -21,8 +21,8 @@ class CompositePrimaryKeysMigration < ActiveRecord::Migration
Index.new(:merge_request_diff_commits, 'index_merge_request_diff_commits_on_mr_diff_id_and_order', %i(merge_request_diff_id relative_order)),
Index.new(:project_authorizations, 'index_project_authorizations_on_user_id_project_id_access_level', %i(user_id project_id access_level)),
Index.new(:push_event_payloads, 'index_push_event_payloads_on_event_id', %i(event_id)),
- Index.new(:schema_migrations, 'unique_schema_migrations', %(version)),
- ]
+ Index.new(:schema_migrations, 'unique_schema_migrations', %(version))
+ ].freeze
disable_ddl_transaction!
@@ -45,6 +45,7 @@ class CompositePrimaryKeysMigration < ActiveRecord::Migration
end
private
+
def add_primary_key(index)
execute "ALTER TABLE #{index.table} ADD PRIMARY KEY USING INDEX #{index.name}"
end
@@ -60,4 +61,3 @@ class CompositePrimaryKeysMigration < ActiveRecord::Migration
execute "ALTER TABLE #{index.table} DROP CONSTRAINT IF EXISTS #{temp_index_name}"
end
end
-
diff --git a/db/post_migrate/20161221153951_rename_reserved_project_names.rb b/db/post_migrate/20161221153951_rename_reserved_project_names.rb
index d322844e2fd..017c58477ac 100644
--- a/db/post_migrate/20161221153951_rename_reserved_project_names.rb
+++ b/db/post_migrate/20161221153951_rename_reserved_project_names.rb
@@ -124,7 +124,7 @@ class RenameReservedProjectNames < ActiveRecord::Migration
def rename_project_row(project, path)
project.respond_to?(:update_attributes) &&
- project.update_attributes(path: path) &&
+ project.update(path: path) &&
project.respond_to?(:rename_repo)
end
end
diff --git a/db/post_migrate/20170313133418_rename_more_reserved_project_names.rb b/db/post_migrate/20170313133418_rename_more_reserved_project_names.rb
index 6a49450cc50..3e8ccfdb899 100644
--- a/db/post_migrate/20170313133418_rename_more_reserved_project_names.rb
+++ b/db/post_migrate/20170313133418_rename_more_reserved_project_names.rb
@@ -66,7 +66,7 @@ class RenameMoreReservedProjectNames < ActiveRecord::Migration
def rename_project_row(project, path)
project.respond_to?(:update_attributes) &&
- project.update_attributes(path: path) &&
+ project.update(path: path) &&
project.respond_to?(:rename_repo)
end
end
diff --git a/db/post_migrate/20170425130047_drop_ci_trigger_schedules_table.rb b/db/post_migrate/20170425130047_drop_ci_trigger_schedules_table.rb
index 159b533eaaa..24750c58ef0 100644
--- a/db/post_migrate/20170425130047_drop_ci_trigger_schedules_table.rb
+++ b/db/post_migrate/20170425130047_drop_ci_trigger_schedules_table.rb
@@ -1,4 +1,3 @@
-# rubocop:disable Migration/Datetime
class DropCiTriggerSchedulesTable < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
diff --git a/db/post_migrate/20170531203055_cleanup_users_ldap_email_rename.rb b/db/post_migrate/20170531203055_cleanup_users_ldap_email_rename.rb
index 15edb402b86..a70e3985005 100644
--- a/db/post_migrate/20170531203055_cleanup_users_ldap_email_rename.rb
+++ b/db/post_migrate/20170531203055_cleanup_users_ldap_email_rename.rb
@@ -10,6 +10,7 @@ class CleanupUsersLdapEmailRename < ActiveRecord::Migration
end
def down
+ # rubocop:disable Migration/UpdateLargeTable
rename_column_concurrently :users, :external_email, :ldap_email
end
end
diff --git a/db/post_migrate/20170711145558_migrate_stages_statuses.rb b/db/post_migrate/20170711145558_migrate_stages_statuses.rb
index aeb900354db..65755c0e824 100644
--- a/db/post_migrate/20170711145558_migrate_stages_statuses.rb
+++ b/db/post_migrate/20170711145558_migrate_stages_statuses.rb
@@ -28,6 +28,7 @@ class MigrateStagesStatuses < ActiveRecord::Migration
def down
disable_statement_timeout
+ # rubocop:disable Migration/UpdateLargeTable
update_column_in_batches(:ci_stages, :status, nil)
end
end
diff --git a/db/post_migrate/20170830150306_drop_events_for_migration_table.rb b/db/post_migrate/20170830150306_drop_events_for_migration_table.rb
index 763ee9a810d..69a612ead40 100644
--- a/db/post_migrate/20170830150306_drop_events_for_migration_table.rb
+++ b/db/post_migrate/20170830150306_drop_events_for_migration_table.rb
@@ -18,7 +18,6 @@ class DropEventsForMigrationTable < ActiveRecord::Migration
end
end
- # rubocop: disable Migration/Datetime
def down
create_table :events_for_migration do |t|
t.string :target_type, index: true
diff --git a/db/post_migrate/20171106154015_remove_issues_branch_name.rb b/db/post_migrate/20171106154015_remove_issues_branch_name.rb
index 162b6bafab4..3d08225c96d 100644
--- a/db/post_migrate/20171106154015_remove_issues_branch_name.rb
+++ b/db/post_migrate/20171106154015_remove_issues_branch_name.rb
@@ -1,4 +1,3 @@
-# rubocop:disable Migration/RemoveColumn
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
diff --git a/db/post_migrate/20171106180641_cleanup_add_timezone_to_issues_closed_at.rb b/db/post_migrate/20171106180641_cleanup_add_timezone_to_issues_closed_at.rb
index 88dd8f89ba6..53f376f216b 100644
--- a/db/post_migrate/20171106180641_cleanup_add_timezone_to_issues_closed_at.rb
+++ b/db/post_migrate/20171106180641_cleanup_add_timezone_to_issues_closed_at.rb
@@ -13,6 +13,7 @@ class CleanupAddTimezoneToIssuesClosedAt < ActiveRecord::Migration
end
# rubocop:disable Migration/Datetime
+ # rubocop:disable Migration/UpdateLargeTable
def down
change_column_type_concurrently(:issues, :closed_at, :datetime)
end
diff --git a/db/post_migrate/20171128214150_schedule_populate_merge_request_metrics_with_events_data.rb b/db/post_migrate/20171128214150_schedule_populate_merge_request_metrics_with_events_data.rb
index fce1829c982..980f76e7d57 100644
--- a/db/post_migrate/20171128214150_schedule_populate_merge_request_metrics_with_events_data.rb
+++ b/db/post_migrate/20171128214150_schedule_populate_merge_request_metrics_with_events_data.rb
@@ -1,5 +1,4 @@
# frozen_string_literal: true
-# rubocop:disable GitlabSecurity/SqlInjection
class SchedulePopulateMergeRequestMetricsWithEventsData < ActiveRecord::Migration
DOWNTIME = false
diff --git a/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb b/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb
index 9addd36dca6..8c8dbb1a043 100644
--- a/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb
+++ b/db/post_migrate/20180223124427_build_user_interacted_projects_table.rb
@@ -43,8 +43,6 @@ class BuildUserInteractedProjectsTable < ActiveRecord::Migration
end
end
- private
-
class PostgresStrategy < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
@@ -79,6 +77,7 @@ class BuildUserInteractedProjectsTable < ActiveRecord::Migration
end
private
+
def insert_missing_records
iteration = 0
records = 0
diff --git a/db/post_migrate/20180408143355_cleanup_users_rss_token_rename.rb b/db/post_migrate/20180408143355_cleanup_users_rss_token_rename.rb
index bff83379087..3d77ff921c7 100644
--- a/db/post_migrate/20180408143355_cleanup_users_rss_token_rename.rb
+++ b/db/post_migrate/20180408143355_cleanup_users_rss_token_rename.rb
@@ -8,6 +8,7 @@ class CleanupUsersRssTokenRename < ActiveRecord::Migration
end
def down
+ # rubocop:disable Migration/UpdateLargeTable
rename_column_concurrently :users, :feed_token, :rss_token
end
end
diff --git a/db/post_migrate/20180424151928_fill_file_store.rb b/db/post_migrate/20180424151928_fill_file_store.rb
index b41feb233be..03d54dab250 100644
--- a/db/post_migrate/20180424151928_fill_file_store.rb
+++ b/db/post_migrate/20180424151928_fill_file_store.rb
@@ -38,7 +38,7 @@ class FillFileStore < ActiveRecord::Migration
def up
# NOTE: Schedule background migrations that fill 'NULL' value by '1'(ObjectStorage::Store::LOCAL) on `file_store`, `store` columns
- #
+ #
# Here are the target columns
# - ci_job_artifacts.file_store
# - lfs_objects.file_store
diff --git a/db/post_migrate/20180430143705_backfill_runner_type_for_ci_runners_post_migrate.rb b/db/post_migrate/20180430143705_backfill_runner_type_for_ci_runners_post_migrate.rb
index 38af5aae924..0e6ec46e5f0 100644
--- a/db/post_migrate/20180430143705_backfill_runner_type_for_ci_runners_post_migrate.rb
+++ b/db/post_migrate/20180430143705_backfill_runner_type_for_ci_runners_post_migrate.rb
@@ -9,6 +9,7 @@ class BackfillRunnerTypeForCiRunnersPostMigrate < ActiveRecord::Migration
disable_ddl_transaction!
def up
+ # rubocop:disable Migration/UpdateColumnInBatches
update_column_in_batches(:ci_runners, :runner_type, INSTANCE_RUNNER_TYPE) do |table, query|
query.where(table[:is_shared].eq(true)).where(table[:runner_type].eq(nil))
end
diff --git a/db/post_migrate/20180502134117_migrate_import_attributes_data_from_projects_to_project_mirror_data.rb b/db/post_migrate/20180502134117_migrate_import_attributes_data_from_projects_to_project_mirror_data.rb
index e39cd33c414..08d7d64a2c5 100644
--- a/db/post_migrate/20180502134117_migrate_import_attributes_data_from_projects_to_project_mirror_data.rb
+++ b/db/post_migrate/20180502134117_migrate_import_attributes_data_from_projects_to_project_mirror_data.rb
@@ -34,5 +34,4 @@ class MigrateImportAttributesDataFromProjectsToProjectMirrorData < ActiveRecord:
queue_background_migration_jobs_by_range_at_intervals(import_state, DOWN_MIGRATION, DELAY_INTERVAL, batch_size: BATCH_SIZE)
end
-
end
diff --git a/db/post_migrate/20180507083701_set_minimal_project_build_timeout.rb b/db/post_migrate/20180507083701_set_minimal_project_build_timeout.rb
index d9d9e93f5a3..fb9616f0c07 100644
--- a/db/post_migrate/20180507083701_set_minimal_project_build_timeout.rb
+++ b/db/post_migrate/20180507083701_set_minimal_project_build_timeout.rb
@@ -8,6 +8,8 @@ class SetMinimalProjectBuildTimeout < ActiveRecord::Migration
disable_ddl_transaction!
def up
+ # rubocop:disable Migration/UpdateLargeTable
+ # rubocop:disable Migration/UpdateColumnInBatches
update_column_in_batches(:projects, :build_timeout, MINIMUM_TIMEOUT) do |table, query|
query.where(table[:build_timeout].lt(MINIMUM_TIMEOUT))
end
diff --git a/db/post_migrate/20180523125103_cleanup_merge_requests_allow_maintainer_to_push_rename.rb b/db/post_migrate/20180523125103_cleanup_merge_requests_allow_maintainer_to_push_rename.rb
index 7301bcf2c6c..7eca7394f5f 100644
--- a/db/post_migrate/20180523125103_cleanup_merge_requests_allow_maintainer_to_push_rename.rb
+++ b/db/post_migrate/20180523125103_cleanup_merge_requests_allow_maintainer_to_push_rename.rb
@@ -11,6 +11,7 @@ class CleanupMergeRequestsAllowMaintainerToPushRename < ActiveRecord::Migration
def down
if column_exists?(:merge_requests, :allow_collaboration)
+ # rubocop:disable Migration/UpdateLargeTable
rename_column_concurrently :merge_requests, :allow_collaboration, :allow_maintainer_to_push
end
end
diff --git a/db/post_migrate/20180704145007_update_project_indexes.rb b/db/post_migrate/20180704145007_update_project_indexes.rb
index 193563b36db..0e2601ad4fa 100644
--- a/db/post_migrate/20180704145007_update_project_indexes.rb
+++ b/db/post_migrate/20180704145007_update_project_indexes.rb
@@ -14,7 +14,7 @@ class UpdateProjectIndexes < ActiveRecord::Migration
[:repository_storage, :created_at],
name: NEW_INDEX_NAME,
where: 'last_repository_check_at IS NULL'
- )
+ )
end
def down
diff --git a/db/post_migrate/20180706223200_populate_site_statistics.rb b/db/post_migrate/20180706223200_populate_site_statistics.rb
new file mode 100644
index 00000000000..e78e9eb900a
--- /dev/null
+++ b/db/post_migrate/20180706223200_populate_site_statistics.rb
@@ -0,0 +1,25 @@
+class PopulateSiteStatistics < ActiveRecord::Migration
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ transaction do
+ execute('SET LOCAL statement_timeout TO 0') if Gitlab::Database.postgresql? # see https://gitlab.com/gitlab-org/gitlab-ce/issues/48967
+
+ execute("UPDATE site_statistics SET repositories_count = (SELECT COUNT(*) FROM projects)")
+ end
+
+ transaction do
+ execute('SET LOCAL statement_timeout TO 0') if Gitlab::Database.postgresql? # see https://gitlab.com/gitlab-org/gitlab-ce/issues/48967
+
+ execute("UPDATE site_statistics SET wikis_count = (SELECT COUNT(*) FROM project_features WHERE wiki_access_level != 0)")
+ end
+ end
+
+ def down
+ # No downside in keeping the counter up-to-date
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 1a5555fb3a4..2bef2971f29 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: 20180704204006) do
+ActiveRecord::Schema.define(version: 20180726172057) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -168,6 +168,7 @@ ActiveRecord::Schema.define(version: 20180704204006) do
t.boolean "enforce_terms", default: false
t.boolean "mirror_available", default: true, null: false
t.boolean "hide_third_party_offers", default: false, null: false
+ t.boolean "instance_statistics_visibility_private", default: false, null: false
end
create_table "audit_events", force: :cascade do |t|
@@ -393,6 +394,7 @@ ActiveRecord::Schema.define(version: 20180704204006) do
t.datetime_with_timezone "expire_at"
t.string "file"
t.binary "file_sha256"
+ t.integer "file_format", limit: 2
end
add_index "ci_job_artifacts", ["expire_at", "job_id"], name: "index_ci_job_artifacts_on_expire_at_and_job_id", using: :btree
@@ -1500,6 +1502,14 @@ ActiveRecord::Schema.define(version: 20180704204006) do
add_index "personal_access_tokens", ["token"], name: "index_personal_access_tokens_on_token", unique: true, using: :btree
add_index "personal_access_tokens", ["user_id"], name: "index_personal_access_tokens_on_user_id", using: :btree
+ create_table "programming_languages", force: :cascade do |t|
+ t.string "name", null: false
+ t.string "color", null: false
+ t.datetime_with_timezone "created_at", null: false
+ end
+
+ add_index "programming_languages", ["name"], name: "index_programming_languages_on_name", unique: true, using: :btree
+
create_table "project_authorizations", id: false, force: :cascade do |t|
t.integer "user_id", null: false
t.integer "project_id", null: false
@@ -1786,6 +1796,28 @@ ActiveRecord::Schema.define(version: 20180704204006) do
add_index "remote_mirrors", ["last_successful_update_at"], name: "index_remote_mirrors_on_last_successful_update_at", using: :btree
add_index "remote_mirrors", ["project_id"], name: "index_remote_mirrors_on_project_id", using: :btree
+ create_table "repository_languages", id: false, force: :cascade do |t|
+ t.integer "project_id", null: false
+ t.integer "programming_language_id", null: false
+ t.float "share", null: false
+ end
+
+ add_index "repository_languages", ["project_id", "programming_language_id"], name: "index_repository_languages_on_project_and_languages_id", unique: true, using: :btree
+
+ create_table "resource_label_events", id: :bigserial, force: :cascade do |t|
+ t.integer "action", null: false
+ t.integer "issue_id"
+ t.integer "merge_request_id"
+ t.integer "label_id"
+ t.integer "user_id"
+ t.datetime_with_timezone "created_at", null: false
+ end
+
+ add_index "resource_label_events", ["issue_id"], name: "index_resource_label_events_on_issue_id", using: :btree
+ add_index "resource_label_events", ["label_id"], name: "index_resource_label_events_on_label_id", using: :btree
+ add_index "resource_label_events", ["merge_request_id"], name: "index_resource_label_events_on_merge_request_id", using: :btree
+ add_index "resource_label_events", ["user_id"], name: "index_resource_label_events_on_user_id", using: :btree
+
create_table "routes", force: :cascade do |t|
t.integer "source_id", null: false
t.string "source_type", null: false
@@ -1841,6 +1873,11 @@ ActiveRecord::Schema.define(version: 20180704204006) do
add_index "services", ["project_id"], name: "index_services_on_project_id", using: :btree
add_index "services", ["template"], name: "index_services_on_template", using: :btree
+ create_table "site_statistics", force: :cascade do |t|
+ t.integer "repositories_count", default: 0, null: false
+ t.integer "wikis_count", default: 0, null: false
+ end
+
create_table "snippets", force: :cascade do |t|
t.string "title"
t.text "content"
@@ -2048,6 +2085,13 @@ ActiveRecord::Schema.define(version: 20180704204006) do
add_index "user_interacted_projects", ["project_id", "user_id"], name: "index_user_interacted_projects_on_project_id_and_user_id", unique: true, using: :btree
add_index "user_interacted_projects", ["user_id"], name: "index_user_interacted_projects_on_user_id", using: :btree
+ create_table "user_statuses", primary_key: "user_id", force: :cascade do |t|
+ t.integer "cached_markdown_version"
+ t.string "emoji", default: "speech_balloon", null: false
+ t.string "message", limit: 100
+ t.string "message_html"
+ end
+
create_table "user_synced_attributes_metadata", force: :cascade do |t|
t.boolean "name_synced", default: false
t.boolean "email_synced", default: false
@@ -2124,6 +2168,7 @@ ActiveRecord::Schema.define(version: 20180704204006) do
t.integer "theme_id", limit: 2
t.integer "accepted_term_id"
t.string "feed_token"
+ t.boolean "private_profile"
end
add_index "users", ["admin"], name: "index_users_on_admin", using: :btree
@@ -2305,6 +2350,7 @@ ActiveRecord::Schema.define(version: 20180704204006) do
add_foreign_key "milestones", "projects", name: "fk_9bd0a0c791", on_delete: :cascade
add_foreign_key "note_diff_files", "notes", column: "diff_note_id", on_delete: :cascade
add_foreign_key "notes", "projects", name: "fk_99e097b079", on_delete: :cascade
+ add_foreign_key "notification_settings", "users", name: "fk_0c95e91db7", on_delete: :cascade
add_foreign_key "oauth_openid_requests", "oauth_access_grants", column: "access_grant_id", name: "fk_oauth_openid_requests_oauth_access_grants_access_grant_id"
add_foreign_key "pages_domains", "projects", name: "fk_ea2f6dfc6f", on_delete: :cascade
add_foreign_key "personal_access_tokens", "users"
@@ -2330,6 +2376,11 @@ ActiveRecord::Schema.define(version: 20180704204006) do
add_foreign_key "push_event_payloads", "events", name: "fk_36c74129da", on_delete: :cascade
add_foreign_key "releases", "projects", name: "fk_47fe2a0596", on_delete: :cascade
add_foreign_key "remote_mirrors", "projects", on_delete: :cascade
+ add_foreign_key "repository_languages", "projects", on_delete: :cascade
+ add_foreign_key "resource_label_events", "issues", on_delete: :cascade
+ add_foreign_key "resource_label_events", "labels", on_delete: :nullify
+ add_foreign_key "resource_label_events", "merge_requests", on_delete: :cascade
+ add_foreign_key "resource_label_events", "users", on_delete: :nullify
add_foreign_key "services", "projects", name: "fk_71cce407f9", on_delete: :cascade
add_foreign_key "snippets", "projects", name: "fk_be41fd4bb7", on_delete: :cascade
add_foreign_key "subscriptions", "projects", on_delete: :cascade
@@ -2348,6 +2399,7 @@ ActiveRecord::Schema.define(version: 20180704204006) do
add_foreign_key "user_custom_attributes", "users", on_delete: :cascade
add_foreign_key "user_interacted_projects", "projects", name: "fk_722ceba4f7", on_delete: :cascade
add_foreign_key "user_interacted_projects", "users", name: "fk_0894651f08", on_delete: :cascade
+ add_foreign_key "user_statuses", "users", on_delete: :cascade
add_foreign_key "user_synced_attributes_metadata", "users", on_delete: :cascade
add_foreign_key "users", "application_setting_terms", column: "accepted_term_id", name: "fk_789cd90b35", on_delete: :cascade
add_foreign_key "users_star_projects", "projects", name: "fk_22cd27ddfc", on_delete: :cascade
diff --git a/doc/README.md b/doc/README.md
index 32924942497..a814c787f94 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -177,7 +177,8 @@ instant how code changes impact your production environment.
- [Prometheus metrics](user/project/integrations/prometheus_library/metrics.md): Let Prometheus collect metrics from various services, like Kubernetes, NGINX, NGINX ingress controller, HAProxy, and Amazon Cloud Watch.
- [GitLab Performance Monitoring](administration/monitoring/performance/index.md): Use InfluxDB and Grafana to monitor the performance of your GitLab instance (will be eventually replaced by Prometheus).
- [Health check](user/admin_area/monitoring/health_check.md): GitLab provides liveness and readiness probes to indicate service health and reachability to required services.
-- [GitLab Cycle Analytics](user/project/cycle_analytics.md): Cycle Analytics measures the time it takes to go from an [idea to production](https://about.gitlab.com/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#from-idea-to-production-with-gitlab) for each project you have.
+- [GitLab Cycle Analytics](user/project/cycle_analytics.md): Cycle Analytics measures the time it takes to go from an
+ [idea to production](https://about.gitlab.com/2016/08/05/continuous-integration-delivery-and-deployment-with-gitlab/#from-idea-to-production-with-gitlab) for each project you have.
## Getting started with GitLab
diff --git a/doc/administration/high_availability/gitlab.md b/doc/administration/high_availability/gitlab.md
index 0d9c10687f2..637d44d2823 100644
--- a/doc/administration/high_availability/gitlab.md
+++ b/doc/administration/high_availability/gitlab.md
@@ -122,6 +122,11 @@ need some extra configuration.
from running on upgrade. Only the primary GitLab application server should
handle migrations.
+1. **Optional** Configure host keys. Copy all contents(primary and public keys) inside `/etc/ssh/` on
+ the primary application server to `/etc/ssh` on all secondary servers. This
+ prevents false man-in-the-middle-attack alerts when accessing servers in your
+ High Availability cluster behind a load balancer.
+
1. Run `sudo gitlab-ctl reconfigure` to compile the configuration.
## Troubleshooting
diff --git a/doc/administration/high_availability/nfs.md b/doc/administration/high_availability/nfs.md
index 87e96b71dd4..387c3fb6a5b 100644
--- a/doc/administration/high_availability/nfs.md
+++ b/doc/administration/high_availability/nfs.md
@@ -39,23 +39,11 @@ Our support team will not be able to assist on performance issues related to
file system access.
Customers and users have reported that AWS EFS does not perform well for GitLab's
-use-case. There are several issues that can cause problems. For these reasons
-GitLab does not recommend using EFS with GitLab.
-
-- EFS bases allowed IOPS on volume size. The larger the volume, the more IOPS
- are allocated. For smaller volumes, users may experience decent performance
- for a period of time due to 'Burst Credits'. Over a period of weeks to months
- credits may run out and performance will bottom out.
-- To keep "Burst Credits" available, it may be necessary to provision more space
- with 'dummy data'. However, this may get expensive.
-- Another option to maintain "Burst Credits" is to use FS Cache on the server so
- that AWS doesn't always have to go into EFS to access files.
-- For larger volumes, allocated IOPS may not be the problem. Workloads where
- many small files are written in a serialized manner are not well-suited for EFS.
- EBS with an NFS server on top will perform much better.
-
-In addition, avoid storing GitLab log files (e.g. those in `/var/log/gitlab`)
-because this will also affect performance. We recommend that the log files be
+use-case. Workloads where many small files are written in a serialized manner, like `git`,
+are not well-suited for EFS. EBS with an NFS server on top will perform much better.
+
+If you do choose to use EFS, avoid storing GitLab log files (e.g. those in `/var/log/gitlab`)
+there because this will also affect performance. We recommend that the log files be
stored on a local volume.
For more details on another person's experience with EFS, see
diff --git a/doc/administration/img/raketasks/check_repos_output.png b/doc/administration/img/raketasks/check_repos_output.png
deleted file mode 100644
index 7fda2ba0c0f..00000000000
--- a/doc/administration/img/raketasks/check_repos_output.png
+++ /dev/null
Binary files differ
diff --git a/doc/administration/index.md b/doc/administration/index.md
index 88190b2df5f..112d14652af 100644
--- a/doc/administration/index.md
+++ b/doc/administration/index.md
@@ -106,6 +106,7 @@ created in snippets, wikis, and repos.
- [Gitaly](gitaly/index.md): Configuring Gitaly, GitLab's Git repository storage service.
- [Default labels](../user/admin_area/labels.html): Create labels that will be automatically added to every new project.
- [Restrict the use of public or internal projects](../public_access/public_access.md#restricting-the-use-of-public-or-internal-projects): Restrict the use of visibility levels for users when they create a project or a snippet.
+- [Custom project templates](https://docs.gitlab.com/ee/user/admin_area/custom_project_templates.html): Configure a set of projects to be used as custom templates when creating a new project. **[PREMIUM ONLY]**
### Repository settings
diff --git a/doc/administration/operations/fast_ssh_key_lookup.md b/doc/administration/operations/fast_ssh_key_lookup.md
index 89331238ce4..752a2774bd7 100644
--- a/doc/administration/operations/fast_ssh_key_lookup.md
+++ b/doc/administration/operations/fast_ssh_key_lookup.md
@@ -1,3 +1,10 @@
+# Consider using SSH certificates instead of, or in addition to this
+
+This document describes a drop-in replacement for the
+`authorized_keys` file for normal (non-deploy key) users. Consider
+using [ssh certificates](ssh_certificates.md), they are even faster,
+but are not is not a drop-in replacement.
+
# Fast lookup of authorized SSH keys in the database
> [Introduced](https://gitlab.com/gitlab-org/gitlab-ee/issues/1631) in
diff --git a/doc/administration/operations/index.md b/doc/administration/operations/index.md
index 5655b7efec6..e9cad99c4b0 100644
--- a/doc/administration/operations/index.md
+++ b/doc/administration/operations/index.md
@@ -14,4 +14,7 @@ that to prioritize important jobs.
- [Sidekiq MemoryKiller](sidekiq_memory_killer.md): Configure Sidekiq MemoryKiller
to restart Sidekiq.
- [Unicorn](unicorn.md): Understand Unicorn and unicorn-worker-killer.
-- [Speed up SSH operations](fast_ssh_key_lookup.md): Authorize SSH users via a fast, indexed lookup to the GitLab database.
+- Speed up SSH operations by [Authorizing SSH users via a fast,
+indexed lookup to the GitLab database](fast_ssh_key_lookup.md), and/or
+by [doing away with user SSH keys stored on GitLab entirely in favor
+of SSH certificates](ssh_certificates.md).
diff --git a/doc/administration/operations/ssh_certificates.md b/doc/administration/operations/ssh_certificates.md
new file mode 100644
index 00000000000..8968afba01b
--- /dev/null
+++ b/doc/administration/operations/ssh_certificates.md
@@ -0,0 +1,165 @@
+# User lookup via OpenSSH's AuthorizedPrincipalsCommand
+
+> [Available in](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/19911) GitLab
+> Community Edition 11.2.
+
+GitLab's default SSH authentication requires users to upload their ssh
+public keys before they can use the SSH transport.
+
+In centralized (e.g. corporate) environments this can be a hassle
+operationally, particularly if the SSH keys are temporary keys issued
+to the user, e.g. ones that expire 24 hours after issuing.
+
+In such setups some external automated process is needed to constantly
+upload the new keys to GitLab.
+
+> **Warning:** OpenSSH version 6.9+ is required because that version
+introduced the `AuthorizedPrincipalsCommand` configuration option. If
+using CentOS 6, you can [follow these
+instructions](fast_ssh_key_lookup.html#compiling-a-custom-version-of-openssh-for-centos-6)
+to compile an up-to-date version.
+
+## Why use OpenSSH certificates?
+
+By using OpenSSH certificates all the information about what user on
+GitLab owns the key is encoded in the key itself, and OpenSSH itself
+guarantees that users can't fake this, since they'd need to have
+access to the private CA signing key.
+
+When correctly set up, this does away with the requirement of
+uploading user SSH keys to GitLab entirely.
+
+## Setting up SSH certificate lookup via GitLab Shell
+
+How to fully setup SSH certificates is outside the scope of this
+document. See [OpenSSH's
+PROTOCOL.certkeys](https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?annotate=HEAD)
+for how it works, and e.g. [RedHat's documentation about
+it](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/sec-using_openssh_certificate_authentication).
+
+We assume that you already have SSH certificates set up, and have
+added the `TrustedUserCAKeys` of your CA to your `sshd_config`, e.g.:
+
+```
+TrustedUserCAKeys /etc/security/mycompany_user_ca.pub
+```
+
+Usually `TrustedUserCAKeys` would not be scoped under a `Match User
+git` in such a setup, since it would also be used for system logins to
+the GitLab server itself, but your setup may vary. If the CA is only
+used for GitLab consider putting this in the `Match User git` section
+(described below).
+
+The SSH certificates being issued by that CA **MUST** have a "key id"
+corresponding to that user's username on GitLab, e.g. (some output
+omitted for brevity):
+
+```
+$ ssh-add -L | grep cert | ssh-keygen -L -f -
+(stdin):1:
+ Type: ssh-rsa-cert-v01@openssh.com user certificate
+ Public key: RSA-CERT SHA256:[...]
+ Signing CA: RSA SHA256:[...]
+ Key ID: "aearnfjord"
+ Serial: 8289829611021396489
+ Valid: from 2018-07-18T09:49:00 to 2018-07-19T09:50:34
+ Principals:
+ sshUsers
+ [...]
+ [...]
+```
+
+Technically that's not strictly true, e.g. it could be
+`prod-aearnfjord` if it's a SSH certificate you'd normally log in to
+servers as the `prod-aearnfjord` user, but then you must specify your
+own `AuthorizedPrincipalsCommand` to do that mapping instead of using
+our provided default.
+
+The important part is that the `AuthorizedPrincipalsCommand` must be
+able to map from the "key id" to a GitLab username in some way, the
+default command we ship assumes there's a 1=1 mapping between the two,
+since the whole point of this is to allow us to extract a GitLab
+username from the key itself, instead of relying on something like the
+default public key to username mapping.
+
+Then, in your `sshd_config` set up `AuthorizedPrincipalsCommand` for
+the `git` user. Hopefully you can use the default one shipped with
+GitLab:
+
+```
+Match User git
+ AuthorizedPrincipalsCommandUser root
+ AuthorizedPrincipalsCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-principals-check %i sshUsers
+```
+
+This command will emit output that looks something like:
+
+```
+command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell username-{KEY_ID}",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty {PRINCIPAL}
+```
+
+Where `{KEY_ID}` is the `%i` argument passed to the script
+(e.g. `aeanfjord`), and `{PRINCIPAL}` is the principal passed to it
+(e.g. `sshUsers`).
+
+You will need to customize the `sshUsers` part of that. It should be
+some principal that's guaranteed to be part of the key for all users
+who can log in to GitLab, or you must provide a list of principals,
+one of which is going to be present for the user, e.g.:
+
+```
+ [...]
+ AuthorizedPrincipalsCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-principals-check %i sshUsers windowsUsers
+```
+
+## Principals and security
+
+You can supply as many principals as you want, these will be turned
+into multiple lines of `authorized_keys` output, as described in the
+`AuthorizedPrincipalsFile` documentation in `sshd_config(5)`.
+
+Normally when using the `AuthorizedKeysCommand` with OpenSSH the
+principal is some "group" that's allowed to log into that
+server. However with GitLab it's only used to appease OpenSSH's
+requirement for it, we effectively only care about the "key id" being
+correct. Once that's extracted GitLab will enforce its own ACLs for
+that user (e.g. what projects the user can access).
+
+So it's OK to e.g. be overly generous in what you accept, since if the
+user e.g. has no access to GitLab at all it'll just error out with a
+message about this being an invalid user.
+
+## Interaction with the `authorized_keys` file
+
+SSH certificates can be used in conjunction with the `authorized_keys`
+file, and if setup as configured above the `authorized_keys` file will
+still serve as a fallback.
+
+This is because if the `AuthorizedPrincipalsCommand` can't
+authenticate the user, OpenSSH will fall back on
+`~/.ssh/authorized_keys` (or the `AuthorizedKeysCommand`).
+
+Therefore there may still be a reason to use the ["Fast lookup of
+authorized SSH keys in the database"](fast_ssh_key_lookup.html) method
+in conjunction with this. Since you'll be using SSH certificates for
+all your normal users, and relying on the `~/.ssh/authorized_keys`
+fallback for deploy keys, if you make use of those.
+
+But you may find that there's no reason to do that, since all your
+normal users will use the fast `AuthorizedPrincipalsCommand` path, and
+only automated deployment key access will fall back on
+`~/.ssh/authorized_keys`, or that you have a lot more keys for normal
+users (especially if they're renewed) than you have deploy keys.
+
+## Other security caveats
+
+Users can still bypass SSH certificate authentication by manually
+uploading an SSH public key to their profile, relying on the
+`~/.ssh/authorized_keys` fallback to authenticate it. There's
+currently no feature to prevent this, [but there's an open request for
+adding it](https://gitlab.com/gitlab-org/gitlab-ce/issues/49218).
+
+Such a restriction can currently be hacked in by e.g. providing a
+custom `AuthorizedKeysCommand` which checks if the discovered key-ID
+returned from `gitlab-shell-authorized-keys-check` is a deploy key or
+not (all non-deploy keys should be refused).
diff --git a/doc/administration/raketasks/check.md b/doc/administration/raketasks/check.md
index 2649bf61d74..0ca1d77f1d0 100644
--- a/doc/administration/raketasks/check.md
+++ b/doc/administration/raketasks/check.md
@@ -1,4 +1,4 @@
-# Check Rake Tasks
+# Integrity Check Rake Task
## Repository Integrity
@@ -28,14 +28,8 @@ exactly which repositories are causing the trouble.
### Check all GitLab repositories
->**Note:**
->
-> - `gitlab:repo:check` has been deprecated in favor of `gitlab:git:fsck`
-> - [Deprecated][ce-15931] in GitLab 10.4.
-> - `gitlab:repo:check` will be removed in the future. [Removal issue][ce-41699]
-
This task loops through all repositories on the GitLab server and runs the
-3 integrity checks described previously.
+integrity check described previously.
**Omnibus Installation**
@@ -49,33 +43,6 @@ sudo gitlab-rake gitlab:git:fsck
sudo -u git -H bundle exec rake gitlab:git:fsck RAILS_ENV=production
```
-### Check repositories for a specific user
-
-This task checks all repositories that a specific user has access to. This is important
-because sometimes you know which user is experiencing trouble but you don't know
-which project might be the cause.
-
-If the rake task is executed without brackets at the end, you will be prompted
-to enter a username.
-
-**Omnibus Installation**
-
-```bash
-sudo gitlab-rake gitlab:user:check_repos
-sudo gitlab-rake gitlab:user:check_repos[<username>]
-```
-
-**Source Installation**
-
-```bash
-sudo -u git -H bundle exec rake gitlab:user:check_repos RAILS_ENV=production
-sudo -u git -H bundle exec rake gitlab:user:check_repos[<username>] RAILS_ENV=production
-```
-
-Example output:
-
-![gitlab:user:check_repos output](../img/raketasks/check_repos_output.png)
-
## Uploaded Files Integrity
Various types of files can be uploaded to a GitLab installation by users.
@@ -121,6 +88,45 @@ sudo gitlab-rake gitlab:lfs:check BATCH=100 ID_FROM=50 ID_TO=250
sudo gitlab-rake gitlab:uploads:check BATCH=100 ID_FROM=50 ID_TO=250
```
+Example output:
+
+```
+$ sudo gitlab-rake gitlab:uploads:check
+Checking integrity of Uploads
+- 1..1350: Failures: 0
+- 1351..2743: Failures: 0
+- 2745..4349: Failures: 2
+- 4357..5762: Failures: 1
+- 5764..7140: Failures: 2
+- 7142..8651: Failures: 0
+- 8653..10134: Failures: 0
+- 10135..11773: Failures: 0
+- 11777..13315: Failures: 0
+Done!
+```
+
+Example verbose output:
+
+```
+$ sudo gitlab-rake gitlab:uploads:check VERBOSE=1
+Checking integrity of Uploads
+- 1..1350: Failures: 0
+- 1351..2743: Failures: 0
+- 2745..4349: Failures: 2
+ - Upload: 3573: #<Errno::ENOENT: No such file or directory @ rb_sysopen - /opt/gitlab/embedded/service/gitlab-rails/public/uploads/user-foo/project-bar/7a77cc52947bfe188adeff42f890bb77/image.png>
+ - Upload: 3580: #<Errno::ENOENT: No such file or directory @ rb_sysopen - /opt/gitlab/embedded/service/gitlab-rails/public/uploads/user-foo/project-bar/2840ba1ba3b2ecfa3478a7b161375f8a/pug.png>
+- 4357..5762: Failures: 1
+ - Upload: 4636: #<Google::Apis::ServerError: Server error>
+- 5764..7140: Failures: 2
+ - Upload: 5812: #<NoMethodError: undefined method `hashed_storage?' for nil:NilClass>
+ - Upload: 5837: #<NoMethodError: undefined method `hashed_storage?' for nil:NilClass>
+- 7142..8651: Failures: 0
+- 8653..10134: Failures: 0
+- 10135..11773: Failures: 0
+- 11777..13315: Failures: 0
+Done!
+```
+
## LDAP Check
The LDAP check Rake task will test the bind_dn and password credentials
@@ -128,5 +134,4 @@ The LDAP check Rake task will test the bind_dn and password credentials
executed as part of the `gitlab:check` task, but can run independently.
See [LDAP Rake Tasks - LDAP Check](ldap.md#check) for details.
-[ce-15931]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/15931
-[ce-41699]: https://gitlab.com/gitlab-org/gitlab-ce/issues/41699
+[git-fsck]: https://git-scm.com/docs/git-fsck
diff --git a/doc/administration/repository_storage_types.md b/doc/administration/repository_storage_types.md
index 087fe729b28..88221db78f1 100644
--- a/doc/administration/repository_storage_types.md
+++ b/doc/administration/repository_storage_types.md
@@ -73,7 +73,7 @@ by another folder with the next 2 characters. They are both stored in a special
### How to migrate to Hashed Storage
In GitLab, go to **Admin > Settings**, find the **Repository Storage** section
-and select "_Create new projects using hashed storage paths_".
+and select "_Use hashed storage paths for newly created and renamed projects_".
To migrate your existing projects to the new storage type, check the specific
[rake tasks].
diff --git a/doc/administration/troubleshooting/debug.md b/doc/administration/troubleshooting/debug.md
index 83a714810c1..2902af8c782 100644
--- a/doc/administration/troubleshooting/debug.md
+++ b/doc/administration/troubleshooting/debug.md
@@ -66,6 +66,24 @@ On CentOS:
sudo yum install gdb
```
+### rbtrace
+
+GitLab 11.2 ships with [rbtrace](https://github.com/tmm1/rbtrace), which
+allows you to trace Ruby code, view all running threads, take memory dumps,
+and more. However, this is not enabled by default. To enable it, define the
+`ENABLE_RBTRACE` variable to the environment. For example, in Omnibus:
+
+```ruby
+gitlab_rails['env'] = {"ENABLE_RBTRACE" => "1"}
+```
+
+Then reconfigure the system and restart Unicorn and Sidekiq. To run this
+in Omnibus, run as root:
+
+```ruby
+/opt/gitlab/embedded/bin/ruby /opt/gitlab/embedded/bin/rbtrace
+```
+
## Common Problems
Many of the tips to diagnose issues below apply to many different situations. We'll use one
diff --git a/doc/administration/uploads.md b/doc/administration/uploads.md
index 85eca403253..77e73b23021 100644
--- a/doc/administration/uploads.md
+++ b/doc/administration/uploads.md
@@ -142,12 +142,6 @@ These task complies with the `BATCH` environment variable to process uploads in
gitlab-rake "gitlab:uploads:migrate[FileUploader, MergeRequest]"
```
- Currently this has to be executed manually and it will allow you to
- migrate the existing uploads to the object storage, but all new
- uploads will still be stored on the local disk. In the future
- you will be given an option to define a default storage for all
- new files.
-
---
**In installations from source:**
@@ -200,12 +194,6 @@ _The uploads are stored by default in
```
- Currently this has to be executed manually and it will allow you to
- migrate the existing uploads to the object storage, but all new
- uploads will still be stored on the local disk. In the future
- you will be given an option to define a default storage for all
- new files.
-
[reconfigure gitlab]: restart_gitlab.md#omnibus-gitlab-reconfigure "How to reconfigure Omnibus GitLab"
[restart gitlab]: restart_gitlab.md#installations-from-source "How to restart GitLab"
[eep]: https://about.gitlab.com/gitlab-ee/ "GitLab Enterprise Edition Premium"
diff --git a/doc/api/issues.md b/doc/api/issues.md
index 92fb3e9c307..103eaa5655f 100644
--- a/doc/api/issues.md
+++ b/doc/api/issues.md
@@ -463,6 +463,7 @@ POST /projects/:id/issues
| Attribute | Type | Required | Description |
|-------------------------------------------|----------------|----------|--------------|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `iid` | integer/string | no | The internal ID of the project's issue (requires admin or project owner rights) |
| `title` | string | yes | The title of an issue |
| `description` | string | no | The description of an issue |
| `confidential` | boolean | no | Set an issue to be confidential. Default is `false`. |
diff --git a/doc/api/members.md b/doc/api/members.md
index 8ebe464c359..7b228b92594 100644
--- a/doc/api/members.md
+++ b/doc/api/members.md
@@ -40,7 +40,9 @@ Example response:
"username": "raymond_smith",
"name": "Raymond Smith",
"state": "active",
- "created_at": "2012-10-22T14:13:35Z",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ "expires_at": "2012-10-22T14:13:35Z",
"access_level": 30
},
{
@@ -48,7 +50,65 @@ Example response:
"username": "john_doe",
"name": "John Doe",
"state": "active",
- "created_at": "2012-10-22T14:13:35Z",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ "expires_at": "2012-10-22T14:13:35Z",
+ "access_level": 30
+ }
+]
+```
+
+## List all members of a group or project including inherited members
+
+Gets a list of group or project members viewable by the authenticated user, including inherited members through ancestor groups.
+
+```
+GET /groups/:id/members/all
+GET /projects/:id/members/all
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id` | integer/string | yes | The ID or [URL-encoded path of the project or group](README.md#namespaced-path-encoding) owned by the authenticated user |
+| `query` | string | no | A query string to search for members |
+
+```bash
+curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/groups/:id/members/all
+curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/projects/:id/members/all
+```
+
+Example response:
+
+```json
+[
+ {
+ "id": 1,
+ "username": "raymond_smith",
+ "name": "Raymond Smith",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ "expires_at": "2012-10-22T14:13:35Z",
+ "access_level": 30
+ },
+ {
+ "id": 2,
+ "username": "john_doe",
+ "name": "John Doe",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ "expires_at": "2012-10-22T14:13:35Z",
+ "access_level": 30
+ },
+ {
+ "id": 3,
+ "username": "foo_bar",
+ "name": "Foo bar",
+ "state": "active",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ "expires_at": "2012-11-22T14:13:35Z",
"access_level": 30
}
]
@@ -81,7 +141,8 @@ Example response:
"username": "raymond_smith",
"name": "Raymond Smith",
"state": "active",
- "created_at": "2012-10-22T14:13:35Z",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
"access_level": 30,
"expires_at": null
}
@@ -116,7 +177,9 @@ Example response:
"username": "raymond_smith",
"name": "Raymond Smith",
"state": "active",
- "created_at": "2012-10-22T14:13:35Z",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ "expires_at": "2012-10-22T14:13:35Z",
"access_level": 30
}
```
@@ -150,7 +213,9 @@ Example response:
"username": "raymond_smith",
"name": "Raymond Smith",
"state": "active",
- "created_at": "2012-10-22T14:13:35Z",
+ "avatar_url": "https://www.gravatar.com/avatar/c2525a7f58ae3776070e44c106c48e15?s=80&d=identicon",
+ "web_url": "http://192.168.1.8:3000/root",
+ "expires_at": "2012-10-22T14:13:35Z",
"access_level": 40
}
```
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index 34c2dd7b34d..58d05a70d05 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -15,11 +15,6 @@ given state (`opened`, `closed`, `locked`, or `merged`) or all of them (`all`).
The pagination parameters `page` and `per_page` can be used to
restrict the list of merge requests.
-**Note**: the `changes_count` value in the response is a string, not an
-integer. This is because when an MR has too many changes to display and store,
-it will be capped at 1,000. In that case, the API will return the string
-`"1000+"` for the changes count.
-
```
GET /merge_requests
GET /merge_requests?state=opened
@@ -104,7 +99,6 @@ Parameters:
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"user_notes_count": 1,
- "changes_count": "1",
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"squash": false,
@@ -144,10 +138,6 @@ will be the same. In the case of a merge request from a fork,
`target_project_id` and `project_id` will be the same and
`source_project_id` will be the fork project's ID.
-**Note**: the `changes_count` value in the response is a string, not an
-integer. This is because when an MR has too many changes to display and store,
-it will be capped at 1,000. In that case, the API will return the string
-`"1000+"` for the changes count.
Parameters:
@@ -224,7 +214,6 @@ Parameters:
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"user_notes_count": 1,
- "changes_count": "1",
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"squash": false,
@@ -331,7 +320,6 @@ Parameters:
"sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null,
"user_notes_count": 1,
- "changes_count": "1",
"should_remove_source_branch": true,
"force_remove_source_branch": false,
"web_url": "http://example.com/example/example/merge_requests/1",
@@ -350,6 +338,11 @@ Parameters:
Shows information about a single merge request.
+**Note**: the `changes_count` value in the response is a string, not an
+integer. This is because when an MR has too many changes to display and store,
+it will be capped at 1,000. In that case, the API will return the string
+`"1000+"` for the changes count.
+
```
GET /projects/:id/merge_requests/:merge_request_iid
```
diff --git a/doc/api/settings.md b/doc/api/settings.md
index b6f2101fc7b..68fc56b1fa3 100644
--- a/doc/api/settings.md
+++ b/doc/api/settings.md
@@ -55,7 +55,8 @@ Example response:
"ed25519_key_restriction": 0,
"enforce_terms": true,
"terms": "Hello world!",
- "performance_bar_allowed_group_id": 42
+ "performance_bar_allowed_group_id": 42,
+ "instance_statistics_visibility_private": false
}
```
@@ -159,6 +160,7 @@ PUT /application/settings
| `version_check_enabled` | boolean | no | Let GitLab inform you when an update is available. |
| `enforce_terms` | boolean | no | Enforce application ToS to all users |
| `terms` | text | yes (if `enforce_terms` is true) | Markdown content for the ToS |
+| `instance_statistics_visibility_private` | boolean | no | When set to `true` Instance statistics will only be available to admins |
```bash
curl --request PUT --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/application/settings?signup_enabled=false&default_project_visibility=internal
@@ -203,6 +205,7 @@ Example response:
"ed25519_key_restriction": 0,
"enforce_terms": true,
"terms": "Hello world!",
- "performance_bar_allowed_group_id": 42
+ "performance_bar_allowed_group_id": 42,
+ "instance_statistics_visibility_private": false
}
```
diff --git a/doc/api/users.md b/doc/api/users.md
index 72fdaaa2c74..a8858468cab 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -105,7 +105,8 @@ GET /users
"can_create_group": true,
"can_create_project": true,
"two_factor_enabled": true,
- "external": false
+ "external": false,
+ "private_profile": false
},
{
"id": 2,
@@ -135,7 +136,8 @@ GET /users
"can_create_group": true,
"can_create_project": true,
"two_factor_enabled": true,
- "external": false
+ "external": false,
+ "private_profile": false
}
]
```
@@ -248,7 +250,8 @@ Parameters:
"can_create_group": true,
"can_create_project": true,
"two_factor_enabled": true,
- "external": false
+ "external": false,
+ "private_profile": false
}
```
@@ -288,6 +291,7 @@ Parameters:
- `skip_confirmation` (optional) - Skip confirmation - true or false (default)
- `external` (optional) - Flags the user as external - true or false(default)
- `avatar` (optional) - Image file for user's avatar
+- `private_profile` (optional) - User's profile is private - true or false
## User modification
@@ -318,6 +322,7 @@ Parameters:
- `skip_reconfirmation` (optional) - Skip reconfirmation - true or false (default)
- `external` (optional) - Flags the user as external - true or false(default)
- `avatar` (optional) - Image file for user's avatar
+- `private_profile` (optional) - User's profile is private - true or false
On password update, user will be forced to change it upon next login.
Note, at the moment this method does only return a `404` error,
@@ -382,7 +387,8 @@ GET /user
"can_create_group": true,
"can_create_project": true,
"two_factor_enabled": true,
- "external": false
+ "external": false,
+ "private_profile": false
}
```
@@ -429,7 +435,85 @@ GET /user
"can_create_group": true,
"can_create_project": true,
"two_factor_enabled": true,
- "external": false
+ "external": false,
+ "private_profile": false
+}
+```
+
+## User status
+
+Get the status of the currently signed in user.
+
+```
+GET /user/status
+```
+
+```bash
+curl --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/user/status"
+```
+
+Example response:
+
+```json
+{
+ "emoji":"coffee",
+ "message":"I crave coffee :coffee:",
+ "message_html": "I crave coffee <gl-emoji title=\"hot beverage\" data-name=\"coffee\" data-unicode-version=\"4.0\">☕</gl-emoji>"
+}
+```
+
+## Get the status of a user
+
+Get the status of a user.
+
+```
+GET /users/:id_or_username/status
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `id_or_username` | string | yes | The id or username of the user to get a status of |
+
+```bash
+curl "https://gitlab.example.com/users/janedoe/status"
+```
+
+Example response:
+
+```json
+{
+ "emoji":"coffee",
+ "message":"I crave coffee :coffee:",
+ "message_html": "I crave coffee <gl-emoji title=\"hot beverage\" data-name=\"coffee\" data-unicode-version=\"4.0\">☕</gl-emoji>"
+}
+```
+
+## Set user status
+
+Set the status of the current user.
+
+```
+PUT /user/status
+```
+
+| Attribute | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `emoji` | string | no | The name of the emoji to use as status, if omitted `speech_balloon` is used. Emoji name can be one of the specified names in the [Gemojione index][gemojione-index]. |
+| `message` | string | no | The message to set as a status. It can also contain emoji codes. |
+
+When both parameters `emoji` and `message` are empty, the status will be cleared.
+
+```bash
+curl --request PUT --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" --data "emoji=coffee" --data "emoji=I crave coffee" https://gitlab.example.com/api/v4/user/status
+```
+
+Example responses
+
+```json
+{
+ "emoji":"coffee",
+ "message":"I crave coffee",
+ "message_html": "I crave coffee"
}
```
@@ -1160,3 +1244,5 @@ Example response:
```
Please note that `last_activity_at` is deprecated, please use `last_activity_on`.
+
+[gemojione-index]: https://github.com/jonathanwiesel/gemojione/blob/master/config/index.json
diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md
index fbac37e688e..63338ff632c 100644
--- a/doc/ci/docker/using_docker_build.md
+++ b/doc/ci/docker/using_docker_build.md
@@ -427,7 +427,7 @@ services:
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
- IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
+ IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
@@ -440,8 +440,10 @@ build:
```
Here, `$CI_REGISTRY_IMAGE` would be resolved to the address of the registry tied
-to this project, and `$CI_COMMIT_REF_NAME` would be resolved to the branch or
-tag name for this particular job. We also declare our own variable, `$IMAGE_TAG`,
+to this project. Since `$CI_COMMIT_REF_NAME` resolves to the branch or tag name,
+and your branch-name can contain forward slashes (e.g., feature/my-feature), it is
+safer to use `$CI_COMMIT_REF_SLUG` as the image tag. This is due to that image tags
+cannot contain forward slashes. We also declare our own variable, `$IMAGE_TAG`,
combining the two to save us some typing in the `script` section.
Here's a more elaborate example that splits up the tasks into 4 pipeline stages,
@@ -464,7 +466,7 @@ stages:
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
- CONTAINER_TEST_IMAGE: registry.example.com/my-group/my-project/my-image:$CI_COMMIT_REF_NAME
+ CONTAINER_TEST_IMAGE: registry.example.com/my-group/my-project/my-image:$CI_COMMIT_REF_SLUG
CONTAINER_RELEASE_IMAGE: registry.example.com/my-group/my-project/my-image:latest
before_script:
diff --git a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
index a433cd5a5dd..087b317ab73 100644
--- a/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
+++ b/doc/ci/examples/test-and-deploy-python-application-to-heroku.md
@@ -46,7 +46,7 @@ This project has three jobs:
## Store API keys
-You'll need to create two variables in `Project > Variables`:
+You'll need to create two variables in `Settings > CI/CD > Variables` on your GitLab project settings:
1. `HEROKU_STAGING_API_KEY` - Heroku API key used to deploy staging app,
2. `HEROKU_PRODUCTION_API_KEY` - Heroku API key used to deploy production app.
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index d95f8c7c8cc..95d705d3a3d 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -962,8 +962,8 @@ the binaries directory:
```yaml
job:
- artifacts:
- name: "$CI_COMMIT_REF_NAME"
+ artifacts:
+ name: "$CI_COMMIT_REF_NAME"
paths:
- binaries/
```
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index b4a2349844b..6c6e198a7c3 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -201,6 +201,148 @@ lot of dependant objects.
To limit the amount of queries performed, we can use `BatchLoader`.
+## Mutations
+
+Mutations are used to change any stored values, or to trigger
+actions. In the same way a GET-request should not modify data, we
+cannot modify data in a regular GraphQL-query. We can however in a
+mutation.
+
+### Fields
+
+In the most common situations, a mutation would return 2 fields:
+
+- The resource being modified
+- A list of errors explaining why the action could not be
+ performed. If the mutation succeeded, this list would be empty.
+
+By inheriting any new mutations from `Mutations::BaseMutation` the
+`errors` field is automatically added. A `clientMutationId` field is
+also added, this can be used by the client to identify the result of a
+single mutation when multiple are performed within a single request.
+
+### Building Mutations
+
+Mutations live in `app/graphql/mutations` ideally grouped per
+resources they are mutating, similar to our services. They should
+inherit `Mutations::BaseMutation`. The fields defined on the mutation
+will be returned as the result of the mutation.
+
+Always provide a consistent GraphQL-name to the mutation, this name is
+used to generate the input types and the field the mutation is mounted
+on. The name should look like `<Resource being modified><Mutation
+class name>`, for example the `Mutations::MergeRequests::SetWip`
+mutation has GraphQL name `MergeRequestSetWip`.
+
+Arguments required by the mutation can be defined as arguments
+required for a field. These will be wrapped up in an input type for
+the mutation. For example, the `Mutations::MergeRequests::SetWip`
+with GraphQL-name `MergeRequestSetWip` defines these arguments:
+
+```ruby
+argument :project_path, GraphQL::ID_TYPE,
+ required: true,
+ description: "The project the merge request to mutate is in"
+
+argument :iid, GraphQL::ID_TYPE,
+ required: true,
+ description: "The iid of the merge request to mutate"
+
+argument :wip,
+ GraphQL::BOOLEAN_TYPE,
+ required: false,
+ description: <<~DESC
+ Whether or not to set the merge request as a WIP.
+ If not passed, the value will be toggled.
+ DESC
+```
+
+This would automatically generate an input type called
+`MergeRequestSetWipInput` with the 3 arguments we specified and the
+`clientMutationId`.
+
+These arguments are then passed to the `resolve` method of a mutation
+as keyword arguments. From here, we can call the service that will
+modify the resource.
+
+The `resolve` method should then return a hash with the same field
+names as defined on the mutation and an `errors` array. For example,
+the `Mutations::MergeRequests::SetWip` defines a `merge_request`
+field:
+
+```ruby
+field :merge_request,
+ Types::MergeRequestType,
+ null: true,
+ description: "The merge request after mutation"
+```
+
+This means that the hash returned from `resolve` in this mutation
+should look like this:
+
+```ruby
+{
+ # The merge request modified, this will be wrapped in the type
+ # defined on the field
+ merge_request: merge_request,
+ # An array if strings if the mutation failed after authorization
+ errors: merge_request.errors.full_messages
+}
+```
+
+To make the mutation available it should be defined on the mutation
+type that lives in `graphql/types/mutation_types`. The
+`mount_mutation` helper method will define a field based on the
+GraphQL-name of the mutation:
+
+```ruby
+module Types
+ class MutationType < BaseObject
+ include Gitlab::Graphql::MountMutation
+
+ graphql_name "Mutation"
+
+ mount_mutation Mutations::MergeRequests::SetWip
+ end
+end
+```
+
+Will generate a field called `mergeRequestSetWip` that
+`Mutations::MergeRequests::SetWip` to be resolved.
+
+### Authorizing resources
+
+To authorize resources inside a mutation, we can include the
+`Gitlab::Graphql::Authorize::AuthorizeResource` concern in the
+mutation.
+
+This allows us to provide the required abilities on the mutation like
+this:
+
+```ruby
+module Mutations
+ module MergeRequests
+ class SetWip < Base
+ graphql_name 'MergeRequestSetWip'
+
+ authorize :update_merge_request
+ end
+ end
+end
+```
+
+We can then call `authorize!` in the `resolve` method, passing in the resource we
+want to validate the abilities for.
+
+Alternatively, we can add a `find_object` method that will load the
+object on the mutation. This would allow you to use the
+`authorized_find!` and `authorized_find!` helper methods.
+
+When a user is not allowed to perform the action, or an object is not
+found, we should raise a
+`Gitlab::Graphql::Errors::ResourceNotAvailable` error. Which will be
+correctly rendered to the clients.
+
## Testing
_full stack_ tests for a graphql query or mutation live in
@@ -212,3 +354,35 @@ be used to test if the query renders valid results.
Using the `GraphqlHelpers#all_graphql_fields_for`-helper, a query
including all available fields can be constructed. This makes it easy
to add a test rendering all possible fields for a query.
+
+To test GraphQL mutation requests, `GraphqlHelpers` provides 2
+helpers: `graphql_mutation` which takes the name of the mutation, and
+a hash with the input for the mutation. This will return a struct with
+a mutation query, and prepared variables.
+
+This struct can then be passed to the `post_graphql_mutation` helper,
+that will post the request with the correct params, like a GraphQL
+client would do.
+
+To access the response of a mutation, the `graphql_mutation_response`
+helper is available.
+
+Using these helpers, we can build specs like this:
+
+```ruby
+let(:mutation) do
+ graphql_mutation(
+ :merge_request_set_wip,
+ project_path: 'gitlab-org/gitlab-ce',
+ iid: '1',
+ wip: true
+ )
+end
+
+it 'returns a successfull response' do
+ post_graphql_mutation(mutation, current_user: user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(graphql_mutation_response(:merge_request_set_wip)['errors']).to be_empty
+end
+```
diff --git a/doc/development/background_migrations.md b/doc/development/background_migrations.md
index 46c5baddb9c..16195cbbbdf 100644
--- a/doc/development/background_migrations.md
+++ b/doc/development/background_migrations.md
@@ -296,10 +296,18 @@ for more details.
## Best practices
+1. Make sure to know how much data you're dealing with
1. Make sure that background migration jobs are idempotent.
1. Make sure that tests you write are not false positives.
1. Make sure that if the data being migrated is critical and cannot be lost, the
clean-up migration also checks the final state of the data before completing.
+1. Make sure to know how much time it'll take to run all scheduled migrations
+1. When migrating many columns, make sure it won't generate too many
+ dead tuples in the process (you may need to directly query the number of dead tuples
+ and adjust the scheduling according to this piece of data)
+1. Make sure to discuss the numbers with a database specialist, the migration may add
+ more pressure on DB than you expect (measure on staging,
+ or ask someone to measure on production)
[migrations-readme]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/spec/migrations/README.md
[issue-rspec-hooks]: https://gitlab.com/gitlab-org/gitlab-ce/issues/35351
diff --git a/doc/development/documentation/styleguide.md b/doc/development/documentation/styleguide.md
index a315cfdc116..ad49c77aac8 100644
--- a/doc/development/documentation/styleguide.md
+++ b/doc/development/documentation/styleguide.md
@@ -219,28 +219,26 @@ below.
- Every piece of documentation that comes with a new feature should declare the
GitLab version that feature got introduced. Right below the heading add a
- note:
+ blockquote:
```md
> Introduced in GitLab 8.3.
```
-- Whenever possible, every feature should have a link to the MR, issue, or epic that introduced it.
- The above note would be then transformed to:
+- Whenever possible, every feature should have a link to the issue, MR or epic
+ (in that order) that introduced it. The above quote would be then transformed to:
```md
- > [Introduced][ce-1242] in GitLab 8.3.
+ > [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/1242) in GitLab 8.3.
```
- , where the [link identifier](#links) is named after the repository (CE) and
- the MR number.
-
- If the feature is only available in GitLab Enterprise Edition, don't forget to mention
the [paid tier](https://about.gitlab.com/handbook/marketing/product-marketing/#tiers)
the feature is available in:
```md
- > [Introduced][ee-1234] in [GitLab Starter](https://about.gitlab.com/pricing/) 8.3.
+ > [Introduced](https://gitlab.com/gitlab-org/gitlab-ce/issues/1242)
+ in [GitLab Starter](https://about.gitlab.com/pricing/) 8.3.
```
### Product badges
diff --git a/doc/development/fe_guide/performance.md b/doc/development/fe_guide/performance.md
index 1320efaf767..da836a0e82e 100644
--- a/doc/development/fe_guide/performance.md
+++ b/doc/development/fe_guide/performance.md
@@ -15,7 +15,7 @@ Use the following rules when creating realtime solutions.
Use that as your polling interval. This way it is [easy for system administrators to change the
polling rate](../../administration/polling.md).
A `Poll-Interval: -1` means you should disable polling, and this must be implemented.
-1. A response with HTTP status `4XX` or `5XX` should disable polling as well.
+1. A response with HTTP status different from 2XX should disable polling as well.
1. Use a common library for polling.
1. Poll on active tabs only. Please use [Visibility](https://github.com/ai/visibilityjs).
1. Use regular polling intervals, do not use backoff polling, or jitter, as the interval will be
@@ -25,15 +25,15 @@ controlled by the server.
### Lazy Loading Images
-To improve the time to first render we are using lazy loading for images. This works by setting
-the actual image source on the `data-src` attribute. After the HTML is rendered and JavaScript is loaded,
+To improve the time to first render we are using lazy loading for images. This works by setting
+the actual image source on the `data-src` attribute. After the HTML is rendered and JavaScript is loaded,
the value of `data-src` will be moved to `src` automatically if the image is in the current viewport.
* Prepare images in HTML for lazy loading by renaming the `src` attribute to `data-src` AND adding the class `lazy`
* If you are using the Rails `image_tag` helper, all images will be lazy-loaded by default unless `lazy: false` is provided.
If you are asynchronously adding content which contains lazy images then you need to call the function
-`gl.lazyLoader.searchLazyImages()` which will search for lazy images and load them if needed.
+`gl.lazyLoader.searchLazyImages()` which will search for lazy images and load them if needed.
But in general it should be handled automatically through a `MutationObserver` in the lazy loading function.
### Animations
@@ -97,19 +97,19 @@ bundle and included on the page.
```javascript
import initMyWidget from './my_widget';
-
+
document.addEventListener('DOMContentLoaded', () => {
initMyWidget();
});
```
-- **Supporting Module Placement:**
+- **Supporting Module Placement:**
- If a class or a module is _specific to a particular route_, try to locate
it close to the entry point it will be used. For instance, if
`my_widget.js` is only imported within `pages/widget/show/index.js`, you
should place the module at `pages/widget/show/my_widget.js` and import it
with a relative path (e.g. `import initMyWidget from './my_widget';`).
-
+
- If a class or module is _used by multiple routes_, place it within a
shared directory at the closest common parent directory for the entry
points that import it. For example, if `my_widget.js` is imported within
diff --git a/doc/development/i18n/proofreader.md b/doc/development/i18n/proofreader.md
index ca8ebcdc984..ad5f6b2ecf6 100644
--- a/doc/development/i18n/proofreader.md
+++ b/doc/development/i18n/proofreader.md
@@ -15,6 +15,7 @@ are very appreciative of the work done by translators and proofreaders!
- Chinese Traditional, Hong Kong
- Huang Tao - [GitLab](https://gitlab.com/htve), [Crowdin](https://crowdin.com/profile/htve)
- Dutch
+ - Emily Hendle - [GitLab](https://gitlab.com/pundachan), [Crowdin](https://crowdin.com/profile/pandachan)
- Esperanto
- French
- Davy Defaud - [GitLab](https://gitlab.com/DevDef), [Crowdin](https://crowdin.com/profile/DevDef)
diff --git a/doc/development/performance.md b/doc/development/performance.md
index c4162a05b77..6b4cb6d72d1 100644
--- a/doc/development/performance.md
+++ b/doc/development/performance.md
@@ -347,13 +347,7 @@ def expire_first_branch_cache
end
```
-## Anti-Patterns
-
-This is a collection of [anti-patterns][anti-pattern] that should be avoided
-unless these changes have a measurable, significant and positive impact on
-production environments.
-
-### String Freezing
+## String Freezing
In recent Ruby versions calling `freeze` on a String leads to it being allocated
only once and re-used. For example, on Ruby 2.3 this will only allocate the
@@ -365,17 +359,38 @@ only once and re-used. For example, on Ruby 2.3 this will only allocate the
end
```
-Blindly adding a `.freeze` call to every String is an anti-pattern that should
-be avoided unless one can prove (using production data) the call actually has a
-positive impact on performance.
+Depending on the size of the String and how frequently it would be allocated
+(before the `.freeze` call was added), this _may_ make things faster, but
+there's no guarantee it will.
+
+Strings will be frozen by default in Ruby 3.0. To prepare our code base for
+this eventuality, it's a good practice to add the following header to all
+Ruby files:
+
+```ruby
+# frozen_string_literal: true
+```
+
+This may cause test failures in the code that expects to be able to manipulate
+strings. Instead of using `dup`, use the unary plus to get an unfrozen string:
+
+```ruby
+test = +"hello"
+test += " world"
+```
+
+## Anti-Patterns
-This feature of Ruby wasn't really meant to make things faster directly, instead
-it was meant to reduce the number of allocations. Depending on the size of the
-String and how frequently it would be allocated (before the `.freeze` call was
-added), this _may_ make things faster, but there's no guarantee it will.
+This is a collection of [anti-patterns][anti-pattern] that should be avoided
+unless these changes have a measurable, significant and positive impact on
+production environments.
-Another common flavour of this is to not only freeze a String, but also assign
-it to a constant, for example:
+### Moving Allocations to Constants
+
+Storing an object as a constant so you only allocate it once _may_ improve
+performance, but there's no guarantee this will. Looking up constants has an
+impact on runtime performance, and as such, using a constant instead of
+referencing an object directly may even slow code down. For example:
```ruby
SOME_CONSTANT = 'foo'.freeze
@@ -393,13 +408,6 @@ there's nothing stopping somebody from doing this elsewhere in the code:
SOME_CONSTANT = 'bar'
```
-### Moving Allocations to Constants
-
-Storing an object as a constant so you only allocate it once _may_ improve
-performance, but there's no guarantee this will. Looking up constants has an
-impact on runtime performance, and as such, using a constant instead of
-referencing an object directly may even slow code down.
-
[#15607]: https://gitlab.com/gitlab-org/gitlab-ce/issues/15607
[yorickpeterse]: https://gitlab.com/yorickpeterse
[anti-pattern]: https://en.wikipedia.org/wiki/Anti-pattern
diff --git a/doc/gitlab-basics/create-project.md b/doc/gitlab-basics/create-project.md
index dd8d95a3bca..2517908e5b1 100644
--- a/doc/gitlab-basics/create-project.md
+++ b/doc/gitlab-basics/create-project.md
@@ -43,7 +43,7 @@
When you create a new repo locally, instead of going to GitLab to manually
create a new project and then push the repo, you can directly push it to
GitLab to create the new project, all without leaving your terminal. If you have access to that
-namespace, we will automatically create a new project under that GitLab namespace with its
+namespace, we will automatically create a new project under that GitLab namespace with its
visibility set to Private by default (you can later change it in the [project's settings](../public_access/public_access.md#how-to-change-project-visibility)).
This can be done by using either SSH or HTTP:
diff --git a/doc/install/installation.md b/doc/install/installation.md
index 8c7f80fd8e8..ea01d88d85f 100644
--- a/doc/install/installation.md
+++ b/doc/install/installation.md
@@ -12,7 +12,7 @@ Since installations from source don't have Runit, Sidekiq can't be terminated an
## Select Version to Install
-Make sure you view [this installation guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md) from the branch (version) of GitLab you would like to install (e.g., `11-1-stable`).
+Make sure you view [this installation guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md) from the branch (version) of GitLab you would like to install (e.g., `11-2-stable`).
You can select the branch in the version dropdown in the top left corner of GitLab (below the menu bar).
If the highest number stable branch is unclear please check the [GitLab Blog](https://about.gitlab.com/blog/) for installation guide links by version.
@@ -300,9 +300,9 @@ sudo usermod -aG redis git
### Clone the Source
# Clone GitLab repository
- sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 11-1-stable gitlab
+ sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 11-2-stable gitlab
-**Note:** You can change `11-1-stable` to `master` if you want the *bleeding edge* version, but never install master on a production server!
+**Note:** You can change `11-2-stable` to `master` if you want the *bleeding edge* version, but never install master on a production server!
### Configure It
diff --git a/doc/install/kubernetes/preparation/tiller.md b/doc/install/kubernetes/preparation/tiller.md
index c92f8258e41..016aac2abeb 100644
--- a/doc/install/kubernetes/preparation/tiller.md
+++ b/doc/install/kubernetes/preparation/tiller.md
@@ -4,7 +4,7 @@ To make use of Helm, you must have a [Kubernetes][k8s-io] cluster. Ensure you ca
Helm consists of two parts, the `helm` client and a `tiller` server inside Kubernetes.
-> **Note**: If you are not able to run tiller in your cluster, for example on OpenShift, it is possible to use [tiller locally](#local-tiller) and avoid deploying it into the cluster. This should only be used when Tiller cannot be normally deployed.
+> **Note**: If you are not able to run Tiller in your cluster, for example on OpenShift, it is possible to use [Tiller locally](https://gitlab.com/charts/gitlab/tree/master/doc/helm#local-tiller) and avoid deploying it into the cluster. This should only be used when Tiller cannot be normally deployed.
## Initialize Helm and Tiller
@@ -65,28 +65,32 @@ kubectl --username=admin --password=xxxxxxxxxxxxxx create -f rbac-config.yaml
For other clusters like Amazon EKS, you can directly upload the RBAC configuration.
+```
kubectl create -f rbac-config.yaml
+```
## Initialize Helm
-Deploy Helm Tiller with a service account
+Deploy Helm Tiller with a service account:
```
helm init --service-account tiller
```
-If your cluster
-previously had Helm/Tiller installed, run the following to ensure that the deployed version of Tiller matches the local Helm version:
+If your cluster previously had Helm/Tiller installed,
+run the following to ensure that the deployed version of Tiller matches the local Helm version:
```
helm init --upgrade --service-account tiller
```
-### Patching Helm Tiller for EKS
+### Patching Helm Tiller for Amazon EKS
-Helm Tiller requires a flag to be enabled to work properly on EKS:
+Helm Tiller requires a flag to be enabled to work properly on Amazon EKS:
-`kubectl -n kube-system patch deployment tiller-deploy -p '{"spec": {"template": {"spec": {"automountServiceAccountToken": true}}}}'`
+```
+kubectl -n kube-system patch deployment tiller-deploy -p '{"spec": {"template": {"spec": {"automountServiceAccountToken": true}}}}'
+```
[helm]: https://helm.sh
[helm-using]: https://docs.helm.sh/using_helm
diff --git a/doc/raketasks/cleanup.md b/doc/raketasks/cleanup.md
index cf891cd90ad..e2eb342361a 100644
--- a/doc/raketasks/cleanup.md
+++ b/doc/raketasks/cleanup.md
@@ -22,3 +22,34 @@ sudo gitlab-rake gitlab:cleanup:repos
# installation from source
bundle exec rake gitlab:cleanup:repos RAILS_ENV=production
```
+
+Clean up local project upload files if they don't exist in GitLab database. The
+task attempts to fix the file if it can find its project, otherwise it moves the
+file to a lost and found directory.
+
+```
+# omnibus-gitlab
+sudo gitlab-rake gitlab:cleanup:project_uploads
+
+# installation from source
+bundle exec rake gitlab:cleanup:project_uploads RAILS_ENV=production
+```
+
+Example output:
+
+```
+$ sudo gitlab-rake gitlab:cleanup:project_uploads
+I, [2018-07-27T12:08:27.671559 #89817] INFO -- : Looking for orphaned project uploads to clean up. Dry run...
+D, [2018-07-27T12:08:28.293568 #89817] DEBUG -- : Processing batch of 500 project upload file paths, starting with /opt/gitlab/embedded/service/gitlab-rails/public/uploads/test.out
+I, [2018-07-27T12:08:28.689869 #89817] INFO -- : Can move to lost and found /opt/gitlab/embedded/service/gitlab-rails/public/uploads/test.out -> /opt/gitlab/embedded/service/gitlab-rails/public/uploads/-/project-lost-found/test.out
+I, [2018-07-27T12:08:28.755624 #89817] INFO -- : Can fix /opt/gitlab/embedded/service/gitlab-rails/public/uploads/foo/bar/89a0f7b0b97008a4a18cedccfdcd93fb/foo.txt -> /opt/gitlab/embedded/service/gitlab-rails/public/uploads/qux/foo/bar/89a0f7b0b97008a4a18cedccfdcd93fb/foo.txt
+I, [2018-07-27T12:08:28.760257 #89817] INFO -- : Can move to lost and found /opt/gitlab/embedded/service/gitlab-rails/public/uploads/foo/bar/1dd6f0f7eefd2acc4c2233f89a0f7b0b/image.png -> /opt/gitlab/embedded/service/gitlab-rails/public/uploads/-/project-lost-found/foo/bar/1dd6f0f7eefd2acc4c2233f89a0f7b0b/image.png
+I, [2018-07-27T12:08:28.764470 #89817] INFO -- : To cleanup these files run this command with DRY_RUN=false
+
+$ sudo gitlab-rake gitlab:cleanup:project_uploads DRY_RUN=false
+I, [2018-07-27T12:08:32.944414 #89936] INFO -- : Looking for orphaned project uploads to clean up...
+D, [2018-07-27T12:08:33.293568 #89817] DEBUG -- : Processing batch of 500 project upload file paths, starting with /opt/gitlab/embedded/service/gitlab-rails/public/uploads/test.out
+I, [2018-07-27T12:08:33.689869 #89817] INFO -- : Did move to lost and found /opt/gitlab/embedded/service/gitlab-rails/public/uploads/test.out -> /opt/gitlab/embedded/service/gitlab-rails/public/uploads/-/project-lost-found/test.out
+I, [2018-07-27T12:08:33.755624 #89817] INFO -- : Did fix /opt/gitlab/embedded/service/gitlab-rails/public/uploads/foo/bar/89a0f7b0b97008a4a18cedccfdcd93fb/foo.txt -> /opt/gitlab/embedded/service/gitlab-rails/public/uploads/qux/foo/bar/89a0f7b0b97008a4a18cedccfdcd93fb/foo.txt
+I, [2018-07-27T12:08:33.760257 #89817] INFO -- : Did move to lost and found /opt/gitlab/embedded/service/gitlab-rails/public/uploads/foo/bar/1dd6f0f7eefd2acc4c2233f89a0f7b0b/image.png -> /opt/gitlab/embedded/service/gitlab-rails/public/uploads/-/project-lost-found/foo/bar/1dd6f0f7eefd2acc4c2233f89a0f7b0b/image.png
+``` \ No newline at end of file
diff --git a/doc/security/rack_attack.md b/doc/security/rack_attack.md
index c61729581e8..3efb19c1526 100644
--- a/doc/security/rack_attack.md
+++ b/doc/security/rack_attack.md
@@ -9,13 +9,17 @@ In case you find throttling is not enough to protect you against abusive clients
Rack Attack offers IP whitelisting, blacklisting, Fail2ban style filtering and
tracking.
+**Note:** Starting with 11.2, Rack Attack is disabled by default. To continue
+using this feature, please enable it in your `gitlab.rb` by setting
+`gitlab_rails['rack_attack_git_basic_auth'] = true`.
+
By default, user sign-in, user sign-up (if enabled), and user password reset is
limited to 6 requests per minute. After trying for 6 times, the client will
have to wait for the next minute to be able to try again.
If you installed or upgraded GitLab by following the [official guides](../install/README.md)
-this should be enabled by default. If your instance is not exposed to any incoming
-connections, it is recommended to disable Rack Attack.
+this should be disabled by default. If your instance is not exposed to any incoming
+connections, it is recommended to leave Rack Attack disabled.
For more information on how to use these options check out
[rack-attack README](https://github.com/kickstarter/rack-attack/blob/master/README.md).
@@ -45,7 +49,7 @@ For more information on how to use these options check out
The following settings can be configured:
-- `enabled`: By default this is set to `true`. Set this to `false` to disable Rack Attack.
+- `enabled`: By default this is set to `false`. Set this to `true` to enable Rack Attack.
- `ip_whitelist`: Whitelist any IPs from being blocked. They must be formatted as strings within a ruby array.
For example, `["127.0.0.1", "127.0.0.2", "127.0.0.3"]`.
- `maxretry`: The maximum amount of times a request can be made in the
diff --git a/doc/university/high-availability/aws/README.md b/doc/university/high-availability/aws/README.md
index dc045961ed7..8f7bb8636c5 100644
--- a/doc/university/high-availability/aws/README.md
+++ b/doc/university/high-availability/aws/README.md
@@ -2,10 +2,8 @@
comments: false
---
-DANGER: This guide exists for reference of how an AWS deployment could work.
-We are currently seeing very slow EFS access performance which causes GitLab to
-be 5-10x slower than using NFS or Local disk. We _do not_ recommend follow this
-guide at this time.
+> **Note**: We **do not** recommend using the AWS Elastic File System (EFS), as it can result
+in [significantly degraded performance](https://gitlab.com/gitlab-org/gitlab-ee/blob/master/doc/administration/high_availability/nfs.md#aws-elastic-file-system).
# High Availability on AWS
diff --git a/doc/update/11.1-to-11.2.md b/doc/update/11.1-to-11.2.md
new file mode 100644
index 00000000000..3edc7e6923e
--- /dev/null
+++ b/doc/update/11.1-to-11.2.md
@@ -0,0 +1,378 @@
+---
+comments: false
+---
+
+# From 11.1 to 11.2
+
+Make sure you view this update guide from the branch (version) of GitLab you would
+like to install (e.g., `11-2-stable`. You can select the branch in the version
+dropdown at the top left corner of GitLab (below the menu bar).
+
+If the highest number stable branch is unclear please check the
+[GitLab Blog](https://about.gitlab.com/blog/archives.html) for installation
+guide links by version.
+
+### 1. Stop server
+
+```bash
+sudo service gitlab stop
+```
+
+### 2. Backup
+
+NOTE: If you installed GitLab from source, make sure `rsync` is installed.
+
+```bash
+cd /home/git/gitlab
+
+sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production
+```
+
+### 3. Update Ruby
+
+NOTE: GitLab 11.0 and higher only support Ruby 2.4.x and dropped support for Ruby 2.3.x. Be
+sure to upgrade your interpreter if necessary.
+
+You can check which version you are running with `ruby -v`.
+
+Download Ruby and compile it:
+
+```bash
+mkdir /tmp/ruby && cd /tmp/ruby
+curl --remote-name --progress https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.4.tar.gz
+echo 'ec82b0d53bd0adad9b19e6b45e44d54e9ec3f10c ruby-2.4.4.tar.gz' | shasum -c - && tar xzf ruby-2.4.4.tar.gz
+cd ruby-2.4.4
+
+./configure --disable-install-rdoc
+make
+sudo make install
+```
+
+Install Bundler:
+
+```bash
+sudo gem install bundler --no-ri --no-rdoc
+```
+
+### 4. Update Node
+
+GitLab utilizes [webpack](http://webpack.js.org) to compile frontend assets.
+This requires a minimum version of node v6.0.0.
+
+You can check which version you are running with `node -v`. If you are running
+a version older than `v6.0.0` you will need to update to a newer version. You
+can find instructions to install from community maintained packages or compile
+from source at the nodejs.org website.
+
+<https://nodejs.org/en/download/>
+
+GitLab also requires the use of yarn `>= v1.2.0` to manage JavaScript
+dependencies.
+
+```bash
+curl --silent --show-error https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
+echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
+sudo apt-get update
+sudo apt-get install yarn
+```
+
+More information can be found on the [yarn website](https://yarnpkg.com/en/docs/install).
+
+### 5. Update Go
+
+NOTE: GitLab 11.0 and higher only supports Go 1.9.x and newer, and dropped support for Go
+1.5.x through 1.8.x. Be sure to upgrade your installation if necessary.
+
+You can check which version you are running with `go version`.
+
+Download and install Go:
+
+```bash
+# Remove former Go installation folder
+sudo rm -rf /usr/local/go
+
+curl --remote-name --progress https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
+echo 'fa1b0e45d3b647c252f51f5e1204aba049cde4af177ef9f2181f43004f901035 go1.10.3.linux-amd64.tar.gz' | shasum -a256 -c - && \
+ sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz
+sudo ln -sf /usr/local/go/bin/{go,godoc,gofmt} /usr/local/bin/
+rm go1.10.3.linux-amd64.tar.gz
+```
+
+### 6. Get latest code
+
+```bash
+cd /home/git/gitlab
+
+sudo -u git -H git fetch --all --prune
+sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically
+sudo -u git -H git checkout -- locale
+```
+
+For GitLab Community Edition:
+
+```bash
+cd /home/git/gitlab
+
+sudo -u git -H git checkout 11-2-stable
+```
+
+OR
+
+For GitLab Enterprise Edition:
+
+```bash
+cd /home/git/gitlab
+
+sudo -u git -H git checkout 11-2-stable-ee
+```
+
+### 7. Update gitlab-shell
+
+```bash
+cd /home/git/gitlab-shell
+
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_SHELL_VERSION)
+sudo -u git -H bin/compile
+```
+
+### 8. Update gitlab-workhorse
+
+Install and compile gitlab-workhorse. GitLab-Workhorse uses
+[GNU Make](https://www.gnu.org/software/make/).
+If you are not using Linux you may have to run `gmake` instead of
+`make` below.
+
+```bash
+cd /home/git/gitlab-workhorse
+
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_WORKHORSE_VERSION)
+sudo -u git -H make
+```
+
+### 9. Update Gitaly
+
+#### New Gitaly configuration options required
+
+In order to function Gitaly needs some additional configuration information. Below we assume you installed Gitaly in `/home/git/gitaly` and GitLab Shell in `/home/git/gitlab-shell`.
+
+```shell
+echo '
+[gitaly-ruby]
+dir = "/home/git/gitaly/ruby"
+
+[gitlab-shell]
+dir = "/home/git/gitlab-shell"
+' | sudo -u git tee -a /home/git/gitaly/config.toml
+```
+
+#### Check Gitaly configuration
+
+Due to a bug in the `rake gitlab:gitaly:install` script your Gitaly
+configuration file may contain syntax errors. The block name
+`[[storages]]`, which may occur more than once in your `config.toml`
+file, should be `[[storage]]` instead.
+
+```shell
+sudo -u git -H sed -i.pre-10.1 's/\[\[storages\]\]/[[storage]]/' /home/git/gitaly/config.toml
+```
+
+#### Compile Gitaly
+
+```shell
+cd /home/git/gitaly
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITALY_SERVER_VERSION)
+sudo -u git -H make
+```
+
+### 10. Update gitlab-pages
+
+#### Only needed if you use GitLab Pages.
+
+Install and compile gitlab-pages. GitLab-Pages uses
+[GNU Make](https://www.gnu.org/software/make/).
+If you are not using Linux you may have to run `gmake` instead of
+`make` below.
+
+```bash
+cd /home/git/gitlab-pages
+
+sudo -u git -H git fetch --all --tags --prune
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
+sudo -u git -H make
+```
+
+### 11. Update MySQL permissions
+
+If you are using MySQL you need to grant the GitLab user the necessary
+permissions on the database:
+
+```bash
+mysql -u root -p -e "GRANT TRIGGER ON \`gitlabhq_production\`.* TO 'git'@'localhost';"
+```
+
+If you use MySQL with replication, or just have MySQL configured with binary logging,
+you will need to also run the following on all of your MySQL servers:
+
+```bash
+mysql -u root -p -e "SET GLOBAL log_bin_trust_function_creators = 1;"
+```
+
+You can make this setting permanent by adding it to your `my.cnf`:
+
+```
+log_bin_trust_function_creators=1
+```
+
+### 12. Update configuration files
+
+#### New configuration options for `gitlab.yml`
+
+There might be configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`:
+
+```sh
+cd /home/git/gitlab
+
+git diff origin/11-1-stable:config/gitlab.yml.example origin/11-2-stable:config/gitlab.yml.example
+```
+
+#### Nginx configuration
+
+Ensure you're still up-to-date with the latest NGINX configuration changes:
+
+```sh
+cd /home/git/gitlab
+
+# For HTTPS configurations
+git diff origin/11-1-stable:lib/support/nginx/gitlab-ssl origin/11-2-stable:lib/support/nginx/gitlab-ssl
+
+# For HTTP configurations
+git diff origin/11-1-stable:lib/support/nginx/gitlab origin/11-2-stable:lib/support/nginx/gitlab
+```
+
+If you are using Strict-Transport-Security in your installation to continue using it you must enable it in your Nginx
+configuration as GitLab application no longer handles setting it.
+
+If you are using Apache instead of NGINX please see the updated [Apache templates].
+Also note that because Apache does not support upstreams behind Unix sockets you
+will need to let gitlab-workhorse listen on a TCP port. You can do this
+via [/etc/default/gitlab].
+
+[Apache templates]: https://gitlab.com/gitlab-org/gitlab-recipes/tree/master/web-server/apache
+[/etc/default/gitlab]: https://gitlab.com/gitlab-org/gitlab-ce/blob/11-2-stable/lib/support/init.d/gitlab.default.example#L38
+
+#### SMTP configuration
+
+If you're installing from source and use SMTP to deliver mail, you will need to add the following line
+to config/initializers/smtp_settings.rb:
+
+```ruby
+ActionMailer::Base.delivery_method = :smtp
+```
+
+See [smtp_settings.rb.sample] as an example.
+
+[smtp_settings.rb.sample]: https://gitlab.com/gitlab-org/gitlab-ce/blob/11-2-stable/config/initializers/smtp_settings.rb.sample#L13
+
+#### Init script
+
+There might be new configuration options available for [`gitlab.default.example`][gl-example]. View them with the command below and apply them manually to your current `/etc/default/gitlab`:
+
+```sh
+cd /home/git/gitlab
+
+git diff origin/11-1-stable:lib/support/init.d/gitlab.default.example origin/11-2-stable:lib/support/init.d/gitlab.default.example
+```
+
+Ensure you're still up-to-date with the latest init script changes:
+
+```bash
+cd /home/git/gitlab
+
+sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
+```
+
+For Ubuntu 16.04.1 LTS:
+
+```bash
+sudo systemctl daemon-reload
+```
+
+### 13. Install libs, migrations, etc.
+
+```bash
+cd /home/git/gitlab
+
+# MySQL installations (note: the line below states '--without postgres')
+sudo -u git -H bundle install --without postgres development test --deployment
+
+# PostgreSQL installations (note: the line below states '--without mysql')
+sudo -u git -H bundle install --without mysql development test --deployment
+
+# Optional: clean up old gems
+sudo -u git -H bundle clean
+
+# Run database migrations
+sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
+
+# Compile GetText PO files
+
+sudo -u git -H bundle exec rake gettext:compile RAILS_ENV=production
+
+# Update node dependencies and recompile assets
+sudo -u git -H bundle exec rake yarn:install gitlab:assets:clean gitlab:assets:compile RAILS_ENV=production NODE_ENV=production
+
+# Clean up cache
+sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production
+```
+
+**MySQL installations**: Run through the `MySQL strings limits` and `Tables and data conversion to utf8mb4` [tasks](../install/database_mysql.md).
+
+### 14. Start application
+
+```bash
+sudo service gitlab start
+sudo service nginx restart
+```
+
+### 15. Check application status
+
+Check if GitLab and its environment are configured correctly:
+
+```bash
+cd /home/git/gitlab
+
+sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
+```
+
+To make sure you didn't miss anything run a more thorough check:
+
+```bash
+cd /home/git/gitlab
+
+sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production
+```
+
+If all items are green, then congratulations, the upgrade is complete!
+
+## Things went south? Revert to previous version (11.1)
+
+### 1. Revert the code to the previous version
+
+Follow the [upgrade guide from 11.0 to 11.1](11.0-to-11.1.md), except for the
+database migration (the backup is already migrated to the previous version).
+
+### 2. Restore from the backup
+
+```bash
+cd /home/git/gitlab
+
+sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production
+```
+
+If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above.
+
+[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/11-2-stable/config/gitlab.yml.example
+[gl-example]: https://gitlab.com/gitlab-org/gitlab-ce/blob/11-2-stable/lib/support/init.d/gitlab.default.example
diff --git a/doc/update/patch_versions.md b/doc/update/patch_versions.md
index e1857ce99c6..a4f17746b69 100644
--- a/doc/update/patch_versions.md
+++ b/doc/update/patch_versions.md
@@ -92,18 +92,28 @@ sudo -u git -H bundle exec rake "gitlab:gitaly:install[/home/git/gitaly]" RAILS_
cd /home/git/gitlab-shell
sudo -u git -H git fetch --all --tags
-sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION` -b v`cat /home/git/gitlab/GITLAB_SHELL_VERSION`
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_SHELL_VERSION) -b v$(</home/git/gitlab/GITLAB_SHELL_VERSION)
sudo -u git -H sh -c 'if [ -x bin/compile ]; then bin/compile; fi'
```
-### 7. Start application
+### 7. Update gitlab-pages to the corresponding version (skip if not using pages)
+
+```bash
+cd /home/git/gitlab-pages
+
+sudo -u git -H git fetch --all --tags
+sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION)
+sudo -u git -H make
+```
+
+### 8. Start application
```bash
sudo service gitlab start
sudo service nginx restart
```
-### 8. Check application status
+### 9. Check application status
Check if GitLab and its environment are configured correctly:
diff --git a/doc/user/admin_area/monitoring/health_check.md b/doc/user/admin_area/monitoring/health_check.md
index 843fb4ce26b..1b676bfb383 100644
--- a/doc/user/admin_area/monitoring/health_check.md
+++ b/doc/user/admin_area/monitoring/health_check.md
@@ -20,14 +20,24 @@ To access monitoring resources, the client IP needs to be included in a whitelis
[Read how to add IPs to a whitelist for the monitoring endpoints][admin].
-## Using the endpoint
+## Using the endpoints
With default whitelist settings, the probes can be accessed from localhost:
+- `http://localhost/-/health`
- `http://localhost/-/readiness`
- `http://localhost/-/liveness`
-which will then provide a report of system health in JSON format.
+
+The first endpoint, `/-/health/`, only checks whether the application server is running. It does
+-not verify the database or other services are running. A successful response will return
+a 200 status code with the following message:
+
+```
+GitLab OK
+```
+
+The readiness and liveness probes will provide a report of system health in JSON format.
Readiness example output:
@@ -42,12 +52,6 @@ Readiness example output:
"shared_state_check" : {
"status" : "ok"
},
- "fs_shards_check" : {
- "labels" : {
- "shard" : "default"
- },
- "status" : "ok"
- },
"db_check" : {
"status" : "ok"
},
@@ -61,9 +65,6 @@ Liveness example output:
```
{
- "fs_shards_check" : {
- "status" : "ok"
- },
"cache_check" : {
"status" : "ok"
},
diff --git a/doc/user/profile/account/two_factor_authentication.md b/doc/user/profile/account/two_factor_authentication.md
index d3a2a7dcd14..e25e1e19b13 100644
--- a/doc/user/profile/account/two_factor_authentication.md
+++ b/doc/user/profile/account/two_factor_authentication.md
@@ -88,7 +88,7 @@ storage in a safe place. **Each code can be used only once** to log in to your
account.
If you lose the recovery codes or just want to generate new ones, you can do so
-from the **Profile settings âž” Account** page where you first enabled 2FA.
+[using SSH](#generate-new-recovery-codes-using-ssh).
## Logging in with 2FA Enabled
diff --git a/doc/user/profile/index.md b/doc/user/profile/index.md
index 91cdef8d1dd..96a08c04905 100644
--- a/doc/user/profile/index.md
+++ b/doc/user/profile/index.md
@@ -68,6 +68,28 @@ Alternatively, you can follow [this detailed procedure from the GitLab Team Hand
which also covers the case where you have projects hosted with
[GitLab Pages](../project/pages/index.md).
+## Private profile
+
+The following information will be hidden from the user profile page (https://gitlab.example.com/username) if this feature is enabled:
+
+- Atom feed
+- Date when account is created
+- Activity tab
+- Groups tab
+- Contributed projects tab
+- Personal projects tab
+- Snippets tab
+
+To enable private profile:
+
+1. Navigate to your personal [profile settings](#profile-settings).
+1. Check the "Private profile" option.
+1. Hit **Update profile settings**.
+
+
+NOTE: **Note:**
+You and GitLab admins can see your the abovementioned information on your profile even if it is private.
+
## Troubleshooting
### Why do I keep getting signed out?
diff --git a/doc/user/profile/personal_access_tokens.md b/doc/user/profile/personal_access_tokens.md
index 601db5f424d..25d6c34409c 100644
--- a/doc/user/profile/personal_access_tokens.md
+++ b/doc/user/profile/personal_access_tokens.md
@@ -48,7 +48,7 @@ the following table.
| `api` | Grants complete access to the API (read/write) ([introduced][ce-5951] in GitLab 8.15). Required for accessing Git repositories over HTTP when 2FA is enabled. |
| `read_registry` | Allows to read [container registry] images if a project is private and authorization is required ([introduced][ce-11845] in GitLab 9.3). |
| `sudo` | Allows performing API actions as any user in the system (if the authenticated user is an admin) ([introduced][ce-14838] in GitLab 10.2). |
-| `read_repository` | Allows read-access to the repository through git clone). |
+| `read_repository` | Allows read-access to the repository through git clone. |
[2fa]: ../account/two_factor_authentication.md
[api]: ../../api/README.md
diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md
index 860edb8e6f7..6dfdbe6c0d5 100644
--- a/doc/user/project/issue_board.md
+++ b/doc/user/project/issue_board.md
@@ -27,7 +27,7 @@ You create issues, host code, perform reviews, build, test,
and deploy from one single platform. Issue Boards help you to visualize
and manage the entire process _in_ GitLab.
-With [Multiple Issue Boards](#multiple-issue-boards), available
+With [Multiple Issue Boards](#use-cases-for-multiple-issue-boards), available
only in [GitLab Enterprise Edition](#features-per-tier),
you go even further, as you can not only keep yourself and your project
organized from a broader perspective with one Issue Board per project,
@@ -75,7 +75,7 @@ each team can have their own board to organize their workflow individually.
#### Scrum team
-With multiple Issue Boards, each team has one board. Now you can move issues through each
+With Multiple Issue Boards, each team has one board. Now you can move issues through each
part of the process. For instance: **To Do**, **Doing**, and **Done**.
#### Organization of topics
diff --git a/generator_templates/active_record/migration/create_table_migration.rb b/generator_templates/active_record/migration/create_table_migration.rb
index 59a9d37df0f..92e963911d0 100644
--- a/generator_templates/active_record/migration/create_table_migration.rb
+++ b/generator_templates/active_record/migration/create_table_migration.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
diff --git a/generator_templates/active_record/migration/migration.rb b/generator_templates/active_record/migration/migration.rb
index 08752b3af50..38edab82550 100644
--- a/generator_templates/active_record/migration/migration.rb
+++ b/generator_templates/active_record/migration/migration.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
diff --git a/generator_templates/rails/post_deployment_migration/migration.rb b/generator_templates/rails/post_deployment_migration/migration.rb
index f2dff84b618..353709f7c9c 100644
--- a/generator_templates/rails/post_deployment_migration/migration.rb
+++ b/generator_templates/rails/post_deployment_migration/migration.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index 464a31ee819..f858d9fa23d 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -30,7 +30,7 @@ module API
end
class User < UserBasic
- expose :created_at
+ expose :created_at, if: ->(user, opts) { Ability.allowed?(opts[:current_user], :read_user_profile, user) }
expose :bio, :location, :skype, :linkedin, :twitter, :website_url, :organization
end
@@ -55,12 +55,21 @@ module API
expose :can_create_project?, as: :can_create_project
expose :two_factor_enabled?, as: :two_factor_enabled
expose :external
+ expose :private_profile
end
class UserWithAdmin < UserPublic
expose :admin?, as: :is_admin
end
+ class UserStatus < Grape::Entity
+ expose :emoji
+ expose :message
+ expose :message_html do |entity|
+ MarkupHelper.markdown_field(entity, :message)
+ end
+ end
+
class Email < Grape::Entity
expose :id, :email
end
@@ -1235,7 +1244,13 @@ module API
end
class Artifacts < Grape::Entity
- expose :name, :untracked, :paths, :when, :expire_in
+ expose :name
+ expose :untracked
+ expose :paths
+ expose :when
+ expose :expire_in
+ expose :artifact_type
+ expose :artifact_format
end
class Cache < Grape::Entity
diff --git a/lib/api/helpers/headers_helpers.rb b/lib/api/helpers/headers_helpers.rb
index cde51fccc62..c9c44e3c218 100644
--- a/lib/api/helpers/headers_helpers.rb
+++ b/lib/api/helpers/headers_helpers.rb
@@ -3,7 +3,11 @@ module API
module HeadersHelpers
def set_http_headers(header_data)
header_data.each do |key, value|
- header "X-Gitlab-#{key.to_s.split('_').collect(&:capitalize).join('-')}", value
+ if value.is_a?(Enumerable)
+ raise ArgumentError.new("Header value should be a string")
+ end
+
+ header "X-Gitlab-#{key.to_s.split('_').collect(&:capitalize).join('-')}", value.to_s
end
end
end
diff --git a/lib/api/helpers/members_helpers.rb b/lib/api/helpers/members_helpers.rb
index a50ea0b52aa..fed8846e505 100644
--- a/lib/api/helpers/members_helpers.rb
+++ b/lib/api/helpers/members_helpers.rb
@@ -10,6 +10,31 @@ module API
def authorize_admin_source!(source_type, source)
authorize! :"admin_#{source_type}", source
end
+
+ def find_all_members(source_type, source)
+ members = source_type == 'project' ? find_all_members_for_project(source) : find_all_members_for_group(source)
+ members.non_invite
+ .non_request
+ end
+
+ def find_all_members_for_project(project)
+ shared_group_ids = project.project_group_links.pluck(:group_id)
+ project_group_ids = project.group&.self_and_ancestors&.pluck(:id)
+ source_ids = [project.id, project_group_ids, shared_group_ids]
+ .flatten
+ .compact
+ Member.includes(:user)
+ .joins(user: :project_authorizations)
+ .where(project_authorizations: { project_id: project.id })
+ .where(source_id: source_ids)
+ end
+
+ def find_all_members_for_group(group)
+ source_ids = group.self_and_ancestors.pluck(:id)
+ Member.includes(:user)
+ .where(source_id: source_ids)
+ .where(source_type: 'Namespace')
+ end
end
end
end
diff --git a/lib/api/internal.rb b/lib/api/internal.rb
index a9803be9f69..516f25db15b 100644
--- a/lib/api/internal.rb
+++ b/lib/api/internal.rb
@@ -11,7 +11,8 @@ module API
#
# Params:
# key_id - ssh key id for Git over SSH
- # user_id - user id for Git over HTTP
+ # user_id - user id for Git over HTTP or over SSH in keyless SSH CERT mode
+ # username - user name for Git over SSH in keyless SSH cert mode
# protocol - Git access protocol being used, e.g. HTTP or SSH
# project - project full_path (not path on disk)
# action - git action (git-upload-pack or git-receive-pack)
@@ -28,6 +29,8 @@ module API
Key.find_by(id: params[:key_id])
elsif params[:user_id]
User.find_by(id: params[:user_id])
+ elsif params[:username]
+ User.find_by_username(params[:username])
end
protocol = params[:protocol]
@@ -58,6 +61,7 @@ module API
{
status: true,
gl_repository: gl_repository,
+ gl_id: Gitlab::GlId.gl_id(user),
gl_username: user&.username,
# This repository_path is a bogus value but gitlab-shell still requires
@@ -71,10 +75,17 @@ module API
post "/lfs_authenticate" do
status 200
- key = Key.find(params[:key_id])
- key.update_last_used_at
+ if params[:key_id]
+ actor = Key.find(params[:key_id])
+ actor.update_last_used_at
+ elsif params[:user_id]
+ actor = User.find_by(id: params[:user_id])
+ raise ActiveRecord::RecordNotFound.new("No such user id!") unless actor
+ else
+ raise ActiveRecord::RecordNotFound.new("No key_id or user_id passed!")
+ end
- token_handler = Gitlab::LfsToken.new(key)
+ token_handler = Gitlab::LfsToken.new(actor)
{
username: token_handler.actor_name,
@@ -100,7 +111,7 @@ module API
end
#
- # Discover user by ssh key or user id
+ # Discover user by ssh key, user id or username
#
get "/discover" do
if params[:key_id]
@@ -108,6 +119,8 @@ module API
user = key.user
elsif params[:user_id]
user = User.find_by(id: params[:user_id])
+ elsif params[:username]
+ user = User.find_by(username: params[:username])
end
present user, with: Entities::UserSafe
@@ -141,22 +154,30 @@ module API
post '/two_factor_recovery_codes' do
status 200
- key = Key.find_by(id: params[:key_id])
+ if params[:key_id]
+ key = Key.find_by(id: params[:key_id])
- if key
- key.update_last_used_at
- else
- break { 'success' => false, 'message' => 'Could not find the given key' }
- end
+ if key
+ key.update_last_used_at
+ else
+ break { 'success' => false, 'message' => 'Could not find the given key' }
+ end
- if key.is_a?(DeployKey)
- break { success: false, message: 'Deploy keys cannot be used to retrieve recovery codes' }
- end
+ if key.is_a?(DeployKey)
+ break { success: false, message: 'Deploy keys cannot be used to retrieve recovery codes' }
+ end
+
+ user = key.user
- user = key.user
+ unless user
+ break { success: false, message: 'Could not find a user for the given key' }
+ end
+ elsif params[:user_id]
+ user = User.find_by(id: params[:user_id])
- unless user
- break { success: false, message: 'Could not find a user for the given key' }
+ unless user
+ break { success: false, message: 'Could not find the given user' }
+ end
end
unless user.two_factor_enabled?
diff --git a/lib/api/issues.rb b/lib/api/issues.rb
index 25185d6edc8..bda05d1795b 100644
--- a/lib/api/issues.rb
+++ b/lib/api/issues.rb
@@ -162,6 +162,9 @@ module API
desc: 'The IID of a merge request for which to resolve discussions'
optional :discussion_to_resolve, type: String,
desc: 'The ID of a discussion to resolve, also pass `merge_request_to_resolve_discussions_of`'
+ optional :iid, type: Integer,
+ desc: 'The internal ID of a project issue. Available only for admins and project owners.'
+
use :issue_params
end
post ':id/issues' do
@@ -169,9 +172,10 @@ module API
authorize! :create_issue, user_project
- # Setting created_at time only allowed for admins and project owners
+ # Setting created_at time or iid only allowed for admins and project owners
unless current_user.admin? || user_project.owner == current_user
params.delete(:created_at)
+ params.delete(:iid)
end
issue_params = declared_params(include_missing: false)
diff --git a/lib/api/keys.rb b/lib/api/keys.rb
index 767f27ef334..fd93f797f72 100644
--- a/lib/api/keys.rb
+++ b/lib/api/keys.rb
@@ -12,7 +12,7 @@ module API
key = Key.find(params[:id])
- present key, with: Entities::SSHKeyWithUser
+ present key, with: Entities::SSHKeyWithUser, current_user: current_user
end
end
end
diff --git a/lib/api/members.rb b/lib/api/members.rb
index 8b12986d09e..d23dd834c69 100644
--- a/lib/api/members.rb
+++ b/lib/api/members.rb
@@ -28,6 +28,23 @@ module API
present members, with: Entities::Member
end
+ desc 'Gets a list of group or project members viewable by the authenticated user, including those who gained membership through ancestor group.' do
+ success Entities::Member
+ end
+ params do
+ optional :query, type: String, desc: 'A query string to search for members'
+ use :pagination
+ end
+ get ":id/members/all" do
+ source = find_source(source_type, params[:id])
+
+ members = find_all_members(source_type, source)
+ members = members.includes(:user).references(:user).merge(User.search(params[:query])) if params[:query].present?
+ members = paginate(members)
+
+ present members, with: Entities::Member
+ end
+
desc 'Gets a member of a group or project.' do
success Entities::Member
end
@@ -58,7 +75,10 @@ module API
member = source.members.find_by(user_id: params[:user_id])
conflict!('Member already exists') if member
- member = source.add_user(params[:user_id], params[:access_level], current_user: current_user, expires_at: params[:expires_at])
+ user = User.find_by_id(params[:user_id])
+ not_found!('User') unless user
+
+ member = source.add_user(user, params[:access_level], current_user: current_user, expires_at: params[:expires_at])
if !member
not_allowed! # This currently can only be reached in EE
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index eadde7b17bb..7adde79d6c3 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -13,6 +13,10 @@ module API
# EE::API::Projects would override this helper
end
+ params :optional_update_params_ee do
+ # EE::API::Projects would override this helper
+ end
+
# EE::API::Projects would override this method
def apply_filters(projects)
projects = projects.with_issues_available_for_user(current_user) if params[:with_issues_enabled]
@@ -21,6 +25,37 @@ module API
projects
end
+
+ def verify_update_project_attrs!(project, attrs)
+ end
+ end
+
+ def self.update_params_at_least_one_of
+ [
+ :jobs_enabled,
+ :resolve_outdated_diff_discussions,
+ :ci_config_path,
+ :container_registry_enabled,
+ :default_branch,
+ :description,
+ :issues_enabled,
+ :lfs_enabled,
+ :merge_requests_enabled,
+ :merge_method,
+ :name,
+ :only_allow_merge_if_all_discussions_are_resolved,
+ :only_allow_merge_if_pipeline_succeeds,
+ :path,
+ :printing_merge_request_link_enabled,
+ :public_builds,
+ :request_access_enabled,
+ :shared_runners_enabled,
+ :snippets_enabled,
+ :tag_list,
+ :visibility,
+ :wiki_enabled,
+ :avatar
+ ]
end
helpers do
@@ -252,39 +287,13 @@ module API
success Entities::Project
end
params do
- # CE
- at_least_one_of_ce =
- [
- :jobs_enabled,
- :resolve_outdated_diff_discussions,
- :ci_config_path,
- :container_registry_enabled,
- :default_branch,
- :description,
- :issues_enabled,
- :lfs_enabled,
- :merge_requests_enabled,
- :merge_method,
- :name,
- :only_allow_merge_if_all_discussions_are_resolved,
- :only_allow_merge_if_pipeline_succeeds,
- :path,
- :printing_merge_request_link_enabled,
- :public_builds,
- :request_access_enabled,
- :shared_runners_enabled,
- :snippets_enabled,
- :tag_list,
- :visibility,
- :wiki_enabled,
- :avatar
- ]
optional :name, type: String, desc: 'The name of the project'
optional :default_branch, type: String, desc: 'The default branch of the project'
optional :path, type: String, desc: 'The path of the repository'
use :optional_project_params
- at_least_one_of(*at_least_one_of_ce)
+
+ at_least_one_of(*::API::Projects.update_params_at_least_one_of)
end
put ':id' do
authorize_admin_project
@@ -294,6 +303,8 @@ module API
attrs = translate_params_for_compatibility(attrs)
+ verify_update_project_attrs!(user_project, attrs)
+
result = ::Projects::UpdateService.new(user_project, current_user, attrs).execute
if result[:status] == :success
diff --git a/lib/api/runner.rb b/lib/api/runner.rb
index d0cc0945a5f..c9931c2d603 100644
--- a/lib/api/runner.rb
+++ b/lib/api/runner.rb
@@ -80,7 +80,15 @@ module API
params do
requires :token, type: String, desc: %q(Runner's authentication token)
optional :last_update, type: String, desc: %q(Runner's queue last_update token)
- optional :info, type: Hash, desc: %q(Runner's metadata)
+ optional :info, type: Hash, desc: %q(Runner's metadata) do
+ optional :name, type: String, desc: %q(Runner's name)
+ optional :version, type: String, desc: %q(Runner's version)
+ optional :revision, type: String, desc: %q(Runner's revision)
+ optional :platform, type: String, desc: %q(Runner's platform)
+ optional :architecture, type: String, desc: %q(Runner's architecture)
+ optional :executor, type: String, desc: %q(Runner's executor)
+ optional :features, type: Hash, desc: %q(Runner's features)
+ end
optional :session, type: Hash, desc: %q(Runner's session data) do
optional :url, type: String, desc: %q(Session's url)
optional :certificate, type: String, desc: %q(Session's certificate)
@@ -108,9 +116,8 @@ module API
if result.valid?
if result.build
- Gitlab::Metrics.add_event(:build_found,
- project: result.build.project.full_path)
- present result.build, with: Entities::JobRequest::Response
+ Gitlab::Metrics.add_event(:build_found)
+ present Ci::BuildRunnerPresenter.new(result.build), with: Entities::JobRequest::Response
else
Gitlab::Metrics.add_event(:build_not_found)
header 'X-GitLab-Last-Update', new_update
@@ -140,8 +147,7 @@ module API
job.trace.set(params[:trace]) if params[:trace]
- Gitlab::Metrics.add_event(:update_build,
- project: job.project.full_path)
+ Gitlab::Metrics.add_event(:update_build)
case params[:state].to_s
when 'running'
@@ -233,6 +239,10 @@ module API
requires :id, type: Integer, desc: %q(Job's ID)
optional :token, type: String, desc: %q(Job's authentication token)
optional :expire_in, type: String, desc: %q(Specify when artifacts should expire)
+ optional :artifact_type, type: String, desc: %q(The type of artifact),
+ default: 'archive', values: Ci::JobArtifact.file_types.keys
+ optional :artifact_format, type: String, desc: %q(The format of artifact),
+ default: 'zip', values: Ci::JobArtifact.file_formats.keys
optional 'file.path', type: String, desc: %q(path to locally stored body (generated by Workhorse))
optional 'file.name', type: String, desc: %q(real filename as send in Content-Disposition (generated by Workhorse))
optional 'file.type', type: String, desc: %q(real content type as send in Content-Type (generated by Workhorse))
@@ -256,29 +266,29 @@ module API
bad_request!('Missing artifacts file!') unless artifacts
file_to_large! unless artifacts.size < max_artifacts_size
- bad_request!("Already uploaded") if job.job_artifacts_archive
-
expire_in = params['expire_in'] ||
Gitlab::CurrentSettings.current_application_settings.default_artifacts_expire_in
- job.build_job_artifacts_archive(
+ job.job_artifacts.build(
project: job.project,
file: artifacts,
- file_type: :archive,
+ file_type: params['artifact_type'],
+ file_format: params['artifact_format'],
file_sha256: artifacts.sha256,
expire_in: expire_in)
if metadata
- job.build_job_artifacts_metadata(
+ job.job_artifacts.build(
project: job.project,
file: metadata,
file_type: :metadata,
+ file_format: :gzip,
file_sha256: metadata.sha256,
expire_in: expire_in)
end
if job.update(artifacts_expire_in: expire_in)
- present job, with: Entities::JobRequest::Response
+ present Ci::BuildRunnerPresenter.new(job), with: Entities::JobRequest::Response
else
render_validation_error!(job)
end
diff --git a/lib/api/settings.rb b/lib/api/settings.rb
index 1ca7d23203b..897010217dc 100644
--- a/lib/api/settings.rb
+++ b/lib/api/settings.rb
@@ -20,116 +20,114 @@ module API
success Entities::ApplicationSetting
end
params do
+ optional :admin_notification_email, type: String, desc: 'Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area.'
+ optional :after_sign_up_text, type: String, desc: 'Text shown after sign up'
+ optional :after_sign_out_path, type: String, desc: 'We will redirect users to this page after they sign out'
+ optional :akismet_enabled, type: Boolean, desc: 'Helps prevent bots from creating issues'
+ given akismet_enabled: ->(val) { val } do
+ requires :akismet_api_key, type: String, desc: 'Generate API key at http://www.akismet.com'
+ end
+ optional :clientside_sentry_enabled, type: Boolean, desc: 'Sentry can also be used for reporting and logging clientside exceptions. https://sentry.io/for/javascript/'
+ given clientside_sentry_enabled: ->(val) { val } do
+ requires :clientside_sentry_dsn, type: String, desc: 'Clientside Sentry Data Source Name'
+ end
+ optional :container_registry_token_expire_delay, type: Integer, desc: 'Authorization token duration (minutes)'
+ optional :default_artifacts_expire_in, type: String, desc: "Set the default expiration time for each job's artifacts"
optional :default_branch_protection, type: Integer, values: [0, 1, 2], desc: 'Determine if developers can push to master'
+ optional :default_group_visibility, type: String, values: Gitlab::VisibilityLevel.string_values, desc: 'The default group visibility'
optional :default_project_visibility, type: String, values: Gitlab::VisibilityLevel.string_values, desc: 'The default project visibility'
+ optional :default_projects_limit, type: Integer, desc: 'The maximum number of personal projects'
optional :default_snippet_visibility, type: String, values: Gitlab::VisibilityLevel.string_values, desc: 'The default snippet visibility'
- optional :default_group_visibility, type: String, values: Gitlab::VisibilityLevel.string_values, desc: 'The default group visibility'
- optional :restricted_visibility_levels, type: Array[String], desc: 'Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users.'
- optional :import_sources, type: Array[String], values: %w[github bitbucket gitlab google_code fogbugz git gitlab_project manifest],
- desc: 'Enabled sources for code import during project creation. OmniAuth must be configured for GitHub, Bitbucket, and GitLab.com'
optional :disabled_oauth_sign_in_sources, type: Array[String], desc: 'Disable certain OAuth sign-in sources'
- optional :enabled_git_access_protocol, type: String, values: %w[ssh http nil], desc: 'Allow only the selected protocols to be used for Git access.'
- optional :project_export_enabled, type: Boolean, desc: 'Enable project export'
- optional :gravatar_enabled, type: Boolean, desc: 'Flag indicating if the Gravatar service is enabled'
- optional :default_projects_limit, type: Integer, desc: 'The maximum number of personal projects'
- optional :max_attachment_size, type: Integer, desc: 'Maximum attachment size in MB'
- optional :session_expire_delay, type: Integer, desc: 'Session duration in minutes. GitLab restart is required to apply changes.'
- optional :user_oauth_applications, type: Boolean, desc: 'Allow users to register any application to use GitLab as an OAuth provider'
- optional :user_default_external, type: Boolean, desc: 'Newly registered users will by default be external'
- optional :signup_enabled, type: Boolean, desc: 'Flag indicating if sign up is enabled'
- optional :send_user_confirmation_email, type: Boolean, desc: 'Send confirmation email on sign-up'
- optional :domain_whitelist, type: String, desc: 'ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com'
optional :domain_blacklist_enabled, type: Boolean, desc: 'Enable domain blacklist for sign ups'
given domain_blacklist_enabled: ->(val) { val } do
requires :domain_blacklist, type: String, desc: 'Users with e-mail addresses that match these domain(s) will NOT be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com'
end
- optional :after_sign_up_text, type: String, desc: 'Text shown after sign up'
- optional :password_authentication_enabled_for_web, type: Boolean, desc: 'Flag indicating if password authentication is enabled for the web interface'
- optional :password_authentication_enabled, type: Boolean, desc: 'Flag indicating if password authentication is enabled for the web interface' # support legacy names, can be removed in v5
- optional :signin_enabled, type: Boolean, desc: 'Flag indicating if password authentication is enabled for the web interface' # support legacy names, can be removed in v5
- mutually_exclusive :password_authentication_enabled_for_web, :password_authentication_enabled, :signin_enabled
- optional :password_authentication_enabled_for_git, type: Boolean, desc: 'Flag indicating if password authentication is enabled for Git over HTTP(S)'
- optional :performance_bar_allowed_group_path, type: String, desc: 'Path of the group that is allowed to toggle the performance bar.'
- optional :performance_bar_allowed_group_id, type: String, desc: 'Depreated: Use :performance_bar_allowed_group_path instead. Path of the group that is allowed to toggle the performance bar.' # support legacy names, can be removed in v6
- optional :performance_bar_enabled, type: String, desc: 'Deprecated: Pass `performance_bar_allowed_group_path: nil` instead. Allow enabling the performance.' # support legacy names, can be removed in v6
- optional :require_two_factor_authentication, type: Boolean, desc: 'Require all users to setup Two-factor authentication'
- given require_two_factor_authentication: ->(val) { val } do
- requires :two_factor_grace_period, type: Integer, desc: 'Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication'
- end
- optional :home_page_url, type: String, desc: 'We will redirect non-logged in users to this page'
- optional :after_sign_out_path, type: String, desc: 'We will redirect users to this page after they sign out'
- optional :sign_in_text, type: String, desc: 'The sign in text of the GitLab application'
+ optional :domain_whitelist, type: String, desc: 'ONLY users with e-mail addresses that match these domain(s) will be able to sign-up. Wildcards allowed. Use separate lines for multiple entries. Ex: domain.com, *.domain.com'
+ optional :email_author_in_body, type: Boolean, desc: 'Some email servers do not support overriding the email sender name. Enable this option to include the name of the author of the issue, merge request or comment in the email body instead.'
+ optional :enabled_git_access_protocol, type: String, values: %w[ssh http nil], desc: 'Allow only the selected protocols to be used for Git access.'
+ optional :gitaly_timeout_default, type: Integer, desc: 'Default Gitaly timeout, in seconds. Set to 0 to disable timeouts.'
+ optional :gitaly_timeout_fast, type: Integer, desc: 'Gitaly fast operation timeout, in seconds. Set to 0 to disable timeouts.'
+ optional :gitaly_timeout_medium, type: Integer, desc: 'Medium Gitaly timeout, in seconds. Set to 0 to disable timeouts.'
+ optional :gravatar_enabled, type: Boolean, desc: 'Flag indicating if the Gravatar service is enabled'
optional :help_page_hide_commercial_content, type: Boolean, desc: 'Hide marketing-related entries from help'
- optional :help_page_text, type: String, desc: 'Custom text displayed on the help page'
optional :help_page_support_url, type: String, desc: 'Alternate support URL for help page'
- optional :shared_runners_enabled, type: Boolean, desc: 'Enable shared runners for new projects'
- given shared_runners_enabled: ->(val) { val } do
- requires :shared_runners_text, type: String, desc: 'Shared runners text '
+ optional :help_page_text, type: String, desc: 'Custom text displayed on the help page'
+ optional :home_page_url, type: String, desc: 'We will redirect non-logged in users to this page'
+ optional :housekeeping_enabled, type: Boolean, desc: 'Enable automatic repository housekeeping (git repack, git gc)'
+ given housekeeping_enabled: ->(val) { val } do
+ requires :housekeeping_bitmaps_enabled, type: Boolean, desc: "Creating pack file bitmaps makes housekeeping take a little longer but bitmaps should accelerate 'git clone' performance."
+ requires :housekeeping_full_repack_period, type: Integer, desc: "Number of Git pushes after which a full 'git repack' is run."
+ requires :housekeeping_gc_period, type: Integer, desc: "Number of Git pushes after which 'git gc' is run."
+ requires :housekeeping_incremental_repack_period, type: Integer, desc: "Number of Git pushes after which an incremental 'git repack' is run."
+ end
+ optional :html_emails_enabled, type: Boolean, desc: 'By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format.'
+ optional :import_sources, type: Array[String], values: %w[github bitbucket gitlab google_code fogbugz git gitlab_project manifest],
+ desc: 'Enabled sources for code import during project creation. OmniAuth must be configured for GitHub, Bitbucket, and GitLab.com'
+ optional :koding_enabled, type: Boolean, desc: 'Enable Koding'
+ given koding_enabled: ->(val) { val } do
+ requires :koding_url, type: String, desc: 'The Koding team URL'
end
optional :max_artifacts_size, type: Integer, desc: "Set the maximum file size for each job's artifacts"
- optional :default_artifacts_expire_in, type: String, desc: "Set the default expiration time for each job's artifacts"
+ optional :max_attachment_size, type: Integer, desc: 'Maximum attachment size in MB'
optional :max_pages_size, type: Integer, desc: 'Maximum size of pages in MB'
- optional :container_registry_token_expire_delay, type: Integer, desc: 'Authorization token duration (minutes)'
- optional :prometheus_metrics_enabled, type: Boolean, desc: 'Enable Prometheus metrics'
optional :metrics_enabled, type: Boolean, desc: 'Enable the InfluxDB metrics'
given metrics_enabled: ->(val) { val } do
requires :metrics_host, type: String, desc: 'The InfluxDB host'
- requires :metrics_port, type: Integer, desc: 'The UDP port to use for connecting to InfluxDB'
- requires :metrics_pool_size, type: Integer, desc: 'The amount of InfluxDB connections to open'
- requires :metrics_timeout, type: Integer, desc: 'The amount of seconds after which an InfluxDB connection will time out'
requires :metrics_method_call_threshold, type: Integer, desc: 'A method call is only tracked when it takes longer to complete than the given amount of milliseconds.'
- requires :metrics_sample_interval, type: Integer, desc: 'The sampling interval in seconds'
requires :metrics_packet_size, type: Integer, desc: 'The amount of points to store in a single UDP packet'
+ requires :metrics_pool_size, type: Integer, desc: 'The amount of InfluxDB connections to open'
+ requires :metrics_port, type: Integer, desc: 'The UDP port to use for connecting to InfluxDB'
+ requires :metrics_sample_interval, type: Integer, desc: 'The sampling interval in seconds'
+ requires :metrics_timeout, type: Integer, desc: 'The amount of seconds after which an InfluxDB connection will time out'
end
- optional :sidekiq_throttling_enabled, type: Boolean, desc: 'Enable Sidekiq Job Throttling'
- given sidekiq_throttling_enabled: ->(val) { val } do
- requires :sidekiq_throttling_queus, type: Array[String], desc: 'Choose which queues you wish to throttle'
- requires :sidekiq_throttling_factor, type: Float, desc: 'The factor by which the queues should be throttled. A value between 0.0 and 1.0, exclusive.'
+ optional :password_authentication_enabled, type: Boolean, desc: 'Flag indicating if password authentication is enabled for the web interface' # support legacy names, can be removed in v5
+ optional :password_authentication_enabled_for_web, type: Boolean, desc: 'Flag indicating if password authentication is enabled for the web interface'
+ mutually_exclusive :password_authentication_enabled_for_web, :password_authentication_enabled, :signin_enabled
+ optional :password_authentication_enabled_for_git, type: Boolean, desc: 'Flag indicating if password authentication is enabled for Git over HTTP(S)'
+ optional :performance_bar_allowed_group_id, type: String, desc: 'Deprecated: Use :performance_bar_allowed_group_path instead. Path of the group that is allowed to toggle the performance bar.' # support legacy names, can be removed in v6
+ optional :performance_bar_allowed_group_path, type: String, desc: 'Path of the group that is allowed to toggle the performance bar.'
+ optional :performance_bar_enabled, type: String, desc: 'Deprecated: Pass `performance_bar_allowed_group_path: nil` instead. Allow enabling the performance.' # support legacy names, can be removed in v6
+ optional :plantuml_enabled, type: Boolean, desc: 'Enable PlantUML'
+ given plantuml_enabled: ->(val) { val } do
+ requires :plantuml_url, type: String, desc: 'The PlantUML server URL'
end
+ optional :polling_interval_multiplier, type: BigDecimal, desc: 'Interval multiplier used by endpoints that perform polling. Set to 0 to disable polling.'
+ optional :project_export_enabled, type: Boolean, desc: 'Enable project export'
+ optional :prometheus_metrics_enabled, type: Boolean, desc: 'Enable Prometheus metrics'
optional :recaptcha_enabled, type: Boolean, desc: 'Helps prevent bots from creating accounts'
given recaptcha_enabled: ->(val) { val } do
requires :recaptcha_site_key, type: String, desc: 'Generate site key at http://www.google.com/recaptcha'
requires :recaptcha_private_key, type: String, desc: 'Generate private key at http://www.google.com/recaptcha'
end
- optional :akismet_enabled, type: Boolean, desc: 'Helps prevent bots from creating issues'
- given akismet_enabled: ->(val) { val } do
- requires :akismet_api_key, type: String, desc: 'Generate API key at http://www.akismet.com'
+ optional :repository_checks_enabled, type: Boolean, desc: "GitLab will periodically run 'git fsck' in all project and wiki repositories to look for silent disk corruption issues."
+ optional :repository_storages, type: Array[String], desc: 'Storage paths for new projects'
+ optional :require_two_factor_authentication, type: Boolean, desc: 'Require all users to setup Two-factor authentication'
+ given require_two_factor_authentication: ->(val) { val } do
+ requires :two_factor_grace_period, type: Integer, desc: 'Amount of time (in hours) that users are allowed to skip forced configuration of two-factor authentication'
end
- optional :admin_notification_email, type: String, desc: 'Abuse reports will be sent to this address if it is set. Abuse reports are always available in the admin area.'
+ optional :restricted_visibility_levels, type: Array[String], desc: 'Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users.'
+ optional :send_user_confirmation_email, type: Boolean, desc: 'Send confirmation email on sign-up'
optional :sentry_enabled, type: Boolean, desc: 'Sentry is an error reporting and logging tool which is currently not shipped with GitLab, get it here: https://getsentry.com'
given sentry_enabled: ->(val) { val } do
requires :sentry_dsn, type: String, desc: 'Sentry Data Source Name'
end
- optional :clientside_sentry_enabled, type: Boolean, desc: 'Sentry can also be used for reporting and logging clientside exceptions. https://sentry.io/for/javascript/'
- given clientside_sentry_enabled: ->(val) { val } do
- requires :clientside_sentry_dsn, type: String, desc: 'Clientside Sentry Data Source Name'
- end
- optional :repository_storages, type: Array[String], desc: 'Storage paths for new projects'
- optional :repository_checks_enabled, type: Boolean, desc: "GitLab will periodically run 'git fsck' in all project and wiki repositories to look for silent disk corruption issues."
- optional :koding_enabled, type: Boolean, desc: 'Enable Koding'
- given koding_enabled: ->(val) { val } do
- requires :koding_url, type: String, desc: 'The Koding team URL'
- end
- optional :plantuml_enabled, type: Boolean, desc: 'Enable PlantUML'
- given plantuml_enabled: ->(val) { val } do
- requires :plantuml_url, type: String, desc: 'The PlantUML server URL'
+ optional :session_expire_delay, type: Integer, desc: 'Session duration in minutes. GitLab restart is required to apply changes.'
+ optional :shared_runners_enabled, type: Boolean, desc: 'Enable shared runners for new projects'
+ given shared_runners_enabled: ->(val) { val } do
+ requires :shared_runners_text, type: String, desc: 'Shared runners text '
end
- optional :version_check_enabled, type: Boolean, desc: 'Let GitLab inform you when an update is available.'
- optional :email_author_in_body, type: Boolean, desc: 'Some email servers do not support overriding the email sender name. Enable this option to include the name of the author of the issue, merge request or comment in the email body instead.'
- optional :html_emails_enabled, type: Boolean, desc: 'By default GitLab sends emails in HTML and plain text formats so mail clients can choose what format to use. Disable this option if you only want to send emails in plain text format.'
- optional :housekeeping_enabled, type: Boolean, desc: 'Enable automatic repository housekeeping (git repack, git gc)'
- given housekeeping_enabled: ->(val) { val } do
- requires :housekeeping_bitmaps_enabled, type: Boolean, desc: "Creating pack file bitmaps makes housekeeping take a little longer but bitmaps should accelerate 'git clone' performance."
- requires :housekeeping_incremental_repack_period, type: Integer, desc: "Number of Git pushes after which an incremental 'git repack' is run."
- requires :housekeeping_full_repack_period, type: Integer, desc: "Number of Git pushes after which a full 'git repack' is run."
- requires :housekeeping_gc_period, type: Integer, desc: "Number of Git pushes after which 'git gc' is run."
+ optional :sidekiq_throttling_enabled, type: Boolean, desc: 'Enable Sidekiq Job Throttling'
+ given sidekiq_throttling_enabled: ->(val) { val } do
+ requires :sidekiq_throttling_factor, type: Float, desc: 'The factor by which the queues should be throttled. A value between 0.0 and 1.0, exclusive.'
+ requires :sidekiq_throttling_queues, type: Array[String], desc: 'Choose which queues you wish to throttle'
end
+ optional :sign_in_text, type: String, desc: 'The sign in text of the GitLab application'
+ optional :signin_enabled, type: Boolean, desc: 'Flag indicating if password authentication is enabled for the web interface' # support legacy names, can be removed in v5
+ optional :signup_enabled, type: Boolean, desc: 'Flag indicating if sign up is enabled'
optional :terminal_max_session_time, type: Integer, desc: 'Maximum time for web terminal websocket connection (in seconds). Set to 0 for unlimited time.'
- optional :polling_interval_multiplier, type: BigDecimal, desc: 'Interval multiplier used by endpoints that perform polling. Set to 0 to disable polling.'
- optional :gitaly_timeout_default, type: Integer, desc: 'Default Gitaly timeout, in seconds. Set to 0 to disable timeouts.'
- optional :gitaly_timeout_medium, type: Integer, desc: 'Medium Gitaly timeout, in seconds. Set to 0 to disable timeouts.'
- optional :gitaly_timeout_fast, type: Integer, desc: 'Gitaly fast operation timeout, in seconds. Set to 0 to disable timeouts.'
optional :usage_ping_enabled, type: Boolean, desc: 'Every week GitLab will report license usage back to GitLab, Inc.'
+ optional :instance_statistics_visibility_private, type: Boolean, desc: 'When set to `true` Instance statistics will only be available to admins'
ApplicationSetting::SUPPORTED_KEY_TYPES.each do |type|
optional :"#{type}_key_restriction",
diff --git a/lib/api/users.rb b/lib/api/users.rb
index 6da6c2b43de..b0811bb4aad 100644
--- a/lib/api/users.rb
+++ b/lib/api/users.rb
@@ -42,6 +42,7 @@ module API
optional :can_create_group, type: Boolean, desc: 'Flag indicating the user can create groups'
optional :external, type: Boolean, desc: 'Flag indicating the user is an external user'
optional :avatar, type: File, desc: 'Avatar image for user'
+ optional :private_profile, type: Boolean, desc: 'Flag indicating the user has a private profile'
optional :min_access_level, type: Integer, values: Gitlab::Access.all_values, desc: 'Limit by minimum access level of authenticated user'
all_or_none_of :extern_uid, :provider
end
@@ -97,7 +98,7 @@ module API
entity = current_user&.admin? ? Entities::UserWithAdmin : Entities::UserBasic
users = users.preload(:identities, :u2f_registrations) if entity == Entities::UserWithAdmin
- users, options = with_custom_attributes(users, with: entity)
+ users, options = with_custom_attributes(users, { with: entity, current_user: current_user })
present paginate(users), options
end
@@ -114,12 +115,23 @@ module API
user = User.find_by(id: params[:id])
not_found!('User') unless user && can?(current_user, :read_user, user)
- opts = current_user&.admin? ? { with: Entities::UserWithAdmin } : { with: Entities::User }
+ opts = { with: current_user&.admin? ? Entities::UserWithAdmin : Entities::User, current_user: current_user }
user, opts = with_custom_attributes(user, opts)
present user, opts
end
+ desc "Get the status of a user"
+ params do
+ requires :id_or_username, type: String, desc: 'The ID or username of the user'
+ end
+ get ":id_or_username/status" do
+ user = find_user(params[:id_or_username])
+ not_found!('User') unless user && can?(current_user, :read_user, user)
+
+ present user.status || {}, with: Entities::UserStatus
+ end
+
desc 'Create a user. Available only for admins.' do
success Entities::UserPublic
end
@@ -140,7 +152,7 @@ module API
user = ::Users::CreateService.new(current_user, params).execute(skip_authorization: true)
if user.persisted?
- present user, with: Entities::UserPublic
+ present user, with: Entities::UserPublic, current_user: current_user
else
conflict!('Email has already been taken') if User
.where(email: user.email)
@@ -199,7 +211,7 @@ module API
result = ::Users::UpdateService.new(current_user, user_params.except(:extern_uid, :provider).merge(user: user)).execute
if result[:status] == :success
- present user, with: Entities::UserPublic
+ present user, with: Entities::UserPublic, current_user: current_user
else
render_validation_error!(user)
end
@@ -546,7 +558,7 @@ module API
Entities::UserPublic
end
- present current_user, with: entity
+ present current_user, with: entity, current_user: current_user
end
end
@@ -739,6 +751,30 @@ module API
present paginate(activities), with: Entities::UserActivity
end
+
+ desc 'Set the status of the current user' do
+ success Entities::UserStatus
+ end
+ params do
+ optional :emoji, type: String, desc: "The emoji to set on the status"
+ optional :message, type: String, desc: "The status message to set"
+ end
+ put "status" do
+ forbidden! unless can?(current_user, :update_user_status, current_user)
+
+ if ::Users::SetStatusService.new(current_user, declared_params).execute
+ present current_user.status, with: Entities::UserStatus
+ else
+ render_validation_error!(current_user.status)
+ end
+ end
+
+ desc 'get the status of the current user' do
+ success Entities::UserStatus
+ end
+ get 'status' do
+ present current_user.status || {}, with: Entities::UserStatus
+ end
end
end
end
diff --git a/lib/backup/repository.rb b/lib/backup/repository.rb
index af762db517c..906ed498026 100644
--- a/lib/backup/repository.rb
+++ b/lib/backup/repository.rb
@@ -1,10 +1,7 @@
require 'yaml'
-require_relative 'helper'
module Backup
class Repository
- include Backup::Helper
-
attr_reader :progress
def initialize(progress)
@@ -42,131 +39,36 @@ module Backup
end
def prepare_directories
- Gitlab.config.repositories.storages.each do |name, repository_storage|
- delete_all_repositories(name, repository_storage)
+ Gitlab.config.repositories.storages.each do |name, _repository_storage|
+ Gitlab::GitalyClient::StorageService.new(name).delete_all_repositories
end
end
def backup_project(project)
- gitaly_migrate(:repository_backup, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
- if is_enabled
- backup_project_gitaly(project)
- else
- backup_project_local(project)
- end
- end
-
- backup_custom_hooks(project)
- rescue => e
- progress_warn(project, e, 'Failed to backup repo')
- end
-
- def backup_project_gitaly(project)
path_to_project_bundle = path_to_bundle(project)
Gitlab::GitalyClient::RepositoryService.new(project.repository)
.create_bundle(path_to_project_bundle)
- end
-
- def backup_project_local(project)
- path_to_project_repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- path_to_repo(project)
- end
-
- path_to_project_bundle = path_to_bundle(project)
-
- cmd = %W(#{Gitlab.config.git.bin_path} --git-dir=#{path_to_project_repo} bundle create #{path_to_project_bundle} --all)
- output, status = Gitlab::Popen.popen(cmd)
- progress_warn(project, cmd.join(' '), output) unless status.zero?
- end
-
- def delete_all_repositories(name, repository_storage)
- gitaly_migrate(:delete_all_repositories, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
- if is_enabled
- Gitlab::GitalyClient::StorageService.new(name).delete_all_repositories
- else
- local_delete_all_repositories(name, repository_storage)
- end
- end
- end
-
- def local_delete_all_repositories(name, repository_storage)
- path = repository_storage.legacy_disk_path
- return unless File.exist?(path)
-
- bk_repos_path = File.join(Gitlab.config.backup.path, "tmp", "#{name}-repositories.old." + Time.now.to_i.to_s)
- FileUtils.mkdir_p(bk_repos_path, mode: 0700)
- files = Dir.glob(File.join(path, "*"), File::FNM_DOTMATCH) - [File.join(path, "."), File.join(path, "..")]
-
- begin
- FileUtils.mv(files, bk_repos_path)
- rescue Errno::EACCES
- access_denied_error(path)
- rescue Errno::EBUSY
- resource_busy_error(path)
- end
- end
- def local_restore_custom_hooks(project, dir)
- path_to_project_repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- path_to_repo(project)
- end
- cmd = %W(tar -xf #{path_to_tars(project, dir)} -C #{path_to_project_repo} #{dir})
- output, status = Gitlab::Popen.popen(cmd)
- unless status.zero?
- progress_warn(project, cmd.join(' '), output)
- end
- end
-
- def gitaly_restore_custom_hooks(project, dir)
- custom_hooks_path = path_to_tars(project, dir)
- Gitlab::GitalyClient::RepositoryService.new(project.repository)
- .restore_custom_hooks(custom_hooks_path)
+ backup_custom_hooks(project)
+ rescue => e
+ progress_warn(project, e, 'Failed to backup repo')
end
- def local_backup_custom_hooks(project)
- in_path(path_to_tars(project)) do |dir|
- path_to_project_repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- path_to_repo(project)
- end
- break unless File.exist?(File.join(path_to_project_repo, dir))
-
- FileUtils.mkdir_p(path_to_tars(project))
- cmd = %W(tar -cf #{path_to_tars(project, dir)} -c #{path_to_project_repo} #{dir})
- output, status = Gitlab::Popen.popen(cmd)
-
- unless status.zero?
- progress_warn(project, cmd.join(' '), output)
- end
- end
- end
+ def backup_custom_hooks(project)
+ FileUtils.mkdir_p(project_backup_path(project))
- def gitaly_backup_custom_hooks(project)
- FileUtils.mkdir_p(path_to_tars(project))
- custom_hooks_path = path_to_tars(project, 'custom_hooks')
+ custom_hooks_path = custom_hooks_tar(project)
Gitlab::GitalyClient::RepositoryService.new(project.repository)
.backup_custom_hooks(custom_hooks_path)
end
- def backup_custom_hooks(project)
- gitaly_migrate(:backup_custom_hooks, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
- if is_enabled
- gitaly_backup_custom_hooks(project)
- else
- local_backup_custom_hooks(project)
- end
- end
- end
-
def restore_custom_hooks(project)
- in_path(path_to_tars(project)) do |dir|
- gitaly_migrate(:restore_custom_hooks, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
- if is_enabled
- gitaly_restore_custom_hooks(project, dir)
- else
- local_restore_custom_hooks(project, dir)
- end
- end
- end
+ return unless Dir.exist?(project_backup_path(project))
+ return if Dir.glob("#{project_backup_path(project)}/custom_hooks*").none?
+
+ custom_hooks_path = custom_hooks_tar(project)
+ Gitlab::GitalyClient::RepositoryService.new(project.repository)
+ .restore_custom_hooks(custom_hooks_path)
end
def restore
@@ -181,7 +83,8 @@ module Backup
restore_repo_success = nil
if File.exist?(path_to_project_bundle)
begin
- project.repository.create_from_bundle path_to_project_bundle
+ project.repository.create_from_bundle(path_to_project_bundle)
+ restore_custom_hooks(project)
restore_repo_success = true
rescue => e
restore_repo_success = false
@@ -197,8 +100,6 @@ module Backup
progress.puts "[Failed] restoring #{project.full_path} repository".color(:red)
end
- restore_custom_hooks(project)
-
wiki = ProjectWiki.new(project)
path_to_wiki_bundle = path_to_bundle(wiki)
@@ -219,48 +120,28 @@ module Backup
protected
- def path_to_repo(project)
- project.repository.path_to_repo
- end
-
def path_to_bundle(project)
File.join(backup_repos_path, project.disk_path + '.bundle')
end
- def path_to_tars(project, dir = nil)
- path = File.join(backup_repos_path, project.disk_path)
+ def project_backup_path(project)
+ File.join(backup_repos_path, project.disk_path)
+ end
- if dir
- File.join(path, "#{dir}.tar")
- else
- path
- end
+ def custom_hooks_tar(project)
+ File.join(project_backup_path(project), "custom_hooks.tar")
end
def backup_repos_path
File.join(Gitlab.config.backup.path, 'repositories')
end
- def in_path(path)
- return unless Dir.exist?(path)
-
- dir_entries = Dir.entries(path)
-
- if dir_entries.include?('custom_hooks') || dir_entries.include?('custom_hooks.tar')
- yield('custom_hooks')
- end
- end
-
def prepare
FileUtils.rm_rf(backup_repos_path)
FileUtils.mkdir_p(Gitlab.config.backup.path)
FileUtils.mkdir(backup_repos_path, mode: 0700)
end
- def silent
- { err: '/dev/null', out: '/dev/null' }
- end
-
private
def progress_warn(project, cmd, output)
@@ -273,18 +154,8 @@ module Backup
project_or_wiki.repository.empty?
end
- def repository_storage_paths_args
- Gitlab.config.repositories.storages.values.map { |rs| rs.legacy_disk_path }
- end
-
def display_repo_path(project)
project.hashed_storage?(:repository) ? "#{project.full_path} (#{project.disk_path})" : project.full_path
end
-
- def gitaly_migrate(method, status: Gitlab::GitalyClient::MigrationStatus::OPT_IN, &block)
- Gitlab::GitalyClient.migrate(method, status: status, &block)
- rescue GRPC::NotFound, GRPC::BadStatus => e
- raise Error, e
- end
end
end
diff --git a/lib/banzai/filter/sanitization_filter.rb b/lib/banzai/filter/sanitization_filter.rb
index 80b9d3d045f..8ba09290e6d 100644
--- a/lib/banzai/filter/sanitization_filter.rb
+++ b/lib/banzai/filter/sanitization_filter.rb
@@ -13,7 +13,7 @@ module Banzai
def whitelist
strong_memoize(:whitelist) do
- customize_whitelist(super.dup)
+ customize_whitelist(super.deep_dup)
end
end
diff --git a/lib/banzai/pipeline/emoji_pipeline.rb b/lib/banzai/pipeline/emoji_pipeline.rb
new file mode 100644
index 00000000000..a1b522f4303
--- /dev/null
+++ b/lib/banzai/pipeline/emoji_pipeline.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Banzai
+ module Pipeline
+ class EmojiPipeline < BasePipeline
+ # These filters will only perform sanitization of the content, preventing
+ # XSS, and replace emoji.
+ def self.filters
+ @filters ||= FilterArray[
+ Filter::HtmlEntityFilter,
+ Filter::SanitizationFilter,
+ Filter::EmojiFilter
+ ]
+ end
+ end
+ end
+end
diff --git a/lib/feature.rb b/lib/feature.rb
index d27b2b0e72f..09c5ef3ad94 100644
--- a/lib/feature.rb
+++ b/lib/feature.rb
@@ -46,6 +46,10 @@ class Feature
get(key).enabled?(thing)
end
+ def disabled?(key, thing = nil)
+ !enabled?(key, thing)
+ end
+
def enable(key, thing = true)
get(key).enable(thing)
end
diff --git a/lib/gitlab/auth/activity.rb b/lib/gitlab/auth/activity.rb
new file mode 100644
index 00000000000..761f0819c60
--- /dev/null
+++ b/lib/gitlab/auth/activity.rb
@@ -0,0 +1,78 @@
+module Gitlab
+ module Auth
+ ##
+ # Metrics and logging for user authentication activity.
+ #
+ class Activity
+ extend Gitlab::Utils::StrongMemoize
+
+ COUNTERS = {
+ user_authenticated: 'Counter of successful authentication events',
+ user_unauthenticated: 'Counter of authentication failures',
+ user_not_found: 'Counter of failed log-ins when user is unknown',
+ user_password_invalid: 'Counter of failed log-ins with invalid password',
+ user_session_override: 'Counter of manual log-ins and sessions overrides',
+ user_session_destroyed: 'Counter of user sessions being destroyed',
+ user_two_factor_authenticated: 'Counter of two factor authentications',
+ user_sessionless_authentication: 'Counter of sessionless authentications',
+ user_blocked: 'Counter of sign in attempts when user is blocked'
+ }.freeze
+
+ def initialize(opts)
+ @opts = opts
+ end
+
+ def user_authentication_failed!
+ self.class.user_unauthenticated_counter_increment!
+
+ case @opts[:message]
+ when :not_found_in_database
+ self.class.user_not_found_counter_increment!
+ when :invalid
+ self.class.user_password_invalid_counter_increment!
+ end
+ end
+
+ def user_authenticated!
+ self.class.user_authenticated_counter_increment!
+ end
+
+ def user_session_override!
+ self.class.user_session_override_counter_increment!
+
+ case @opts[:message]
+ when :two_factor_authenticated
+ self.class.user_two_factor_authenticated_counter_increment!
+ when :sessionless_sign_in
+ self.class.user_sessionless_authentication_counter_increment!
+ end
+ end
+
+ def user_blocked!
+ self.class.user_blocked_counter_increment!
+ end
+
+ def user_session_destroyed!
+ self.class.user_session_destroyed_counter_increment!
+ end
+
+ def self.each_counter
+ COUNTERS.each_pair do |metric, description|
+ yield "#{metric}_counter", metric, description
+ end
+ end
+
+ each_counter do |counter, metric, description|
+ define_singleton_method(counter) do
+ strong_memoize(counter) do
+ Gitlab::Metrics.counter("gitlab_auth_#{metric}_total".to_sym, description)
+ end
+ end
+
+ define_singleton_method("#{counter}_increment!") do
+ public_send(counter).increment # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/auth/blocked_user_tracker.rb b/lib/gitlab/auth/blocked_user_tracker.rb
index 7609a7b04f6..50712d7eac2 100644
--- a/lib/gitlab/auth/blocked_user_tracker.rb
+++ b/lib/gitlab/auth/blocked_user_tracker.rb
@@ -2,35 +2,19 @@
module Gitlab
module Auth
class BlockedUserTracker
- ACTIVE_RECORD_REQUEST_PARAMS = 'action_dispatch.request.request_parameters'
-
- def self.log_if_user_blocked(env)
- message = env.dig('warden.options', :message)
-
- # Devise calls User#active_for_authentication? on the User model and then
- # throws an exception to Warden with User#inactive_message:
- # https://github.com/plataformatec/devise/blob/v4.2.1/lib/devise/hooks/activatable.rb#L8
- #
- # Since Warden doesn't pass the user record to the failure handler, we
- # need to do a database lookup with the username. We can limit the
- # lookups to happen when the user was blocked by checking the inactive
- # message passed along by Warden.
- return unless message == User::BLOCKED_MESSAGE
-
- # Check for either LDAP or regular GitLab account logins
- login = env.dig(ACTIVE_RECORD_REQUEST_PARAMS, 'username') ||
- env.dig(ACTIVE_RECORD_REQUEST_PARAMS, 'user', 'login')
-
- return unless login.present?
-
- user = User.by_login(login)
+ def initialize(user, auth)
+ @user = user
+ @auth = auth
+ end
- return unless user&.blocked?
+ def log_activity!
+ return unless @user.blocked?
- Gitlab::AppLogger.info("Failed login for blocked user: user=#{user.username} ip=#{env['REMOTE_ADDR']}")
- SystemHooksService.new.execute_hooks_for(user, :failed_login)
+ Gitlab::AppLogger.info <<~INFO
+ "Failed login for blocked user: user=#{@user.username} ip=#{@auth.request.ip}")
+ INFO
- true
+ SystemHooksService.new.execute_hooks_for(@user, :failed_login)
rescue TypeError
end
end
diff --git a/lib/gitlab/bare_repository_import/importer.rb b/lib/gitlab/bare_repository_import/importer.rb
index 4ca5a78e068..04aa6aab771 100644
--- a/lib/gitlab/bare_repository_import/importer.rb
+++ b/lib/gitlab/bare_repository_import/importer.rb
@@ -26,6 +26,12 @@ module Gitlab
end
end
+ # This is called from within a rake task only used by Admins, so allow writing
+ # to STDOUT
+ def self.log(message)
+ puts message # rubocop:disable Rails/Output
+ end
+
attr_reader :user, :project_name, :bare_repo
delegate :log, to: :class
@@ -59,11 +65,10 @@ module Gitlab
import_type: 'bare_repository',
namespace_id: group&.id).execute
- if project.persisted? && mv_repo(project)
+ if project.persisted? && mv_repositories(project)
log " * Created #{project.name} (#{project_full_path})".color(:green)
project.write_repository_config
- Gitlab::Git::Repository.create_hooks(project.repository.path_to_repo, Gitlab.config.gitlab_shell.hooks_path)
ProjectCacheWorker.perform_async(project.id)
else
@@ -74,12 +79,11 @@ module Gitlab
project
end
- def mv_repo(project)
- storage_path = storage_path_for_shard(project.repository_storage)
- FileUtils.mv(repo_path, project.repository.path_to_repo)
+ def mv_repositories(project)
+ mv_repo(bare_repo.repo_path, project.repository)
if bare_repo.wiki_exists?
- FileUtils.mv(wiki_path, File.join(storage_path, project.disk_path + '.wiki.git'))
+ mv_repo(bare_repo.wiki_path, project.wiki.repository)
end
true
@@ -89,6 +93,11 @@ module Gitlab
false
end
+ def mv_repo(path, repository)
+ repository.create_from_bundle(bundle(path))
+ FileUtils.rm_rf(path)
+ end
+
def storage_path_for_shard(shard)
Gitlab.config.repositories.storages[shard].legacy_disk_path
end
@@ -101,10 +110,17 @@ module Gitlab
Groups::NestedCreateService.new(user, group_path: group_path).execute
end
- # This is called from within a rake task only used by Admins, so allow writing
- # to STDOUT
- def self.log(message)
- puts message # rubocop:disable Rails/Output
+ def bundle(repo_path)
+ # TODO: we could save some time and disk space by using
+ # `git bundle create - --all` and streaming the bundle directly to
+ # Gitaly, rather than writing it on disk first
+ bundle_path = "#{repo_path}.bundle"
+ cmd = %W(#{Gitlab.config.git.bin_path} --git-dir=#{repo_path} bundle create #{bundle_path} --all)
+ output, status = Gitlab::Popen.popen(cmd)
+
+ raise output unless status.zero?
+
+ bundle_path
end
end
end
diff --git a/lib/gitlab/bare_repository_import/repository.rb b/lib/gitlab/bare_repository_import/repository.rb
index fe267248275..c0c666dfb7b 100644
--- a/lib/gitlab/bare_repository_import/repository.rb
+++ b/lib/gitlab/bare_repository_import/repository.rb
@@ -1,5 +1,3 @@
-# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/953
-#
module Gitlab
module BareRepositoryImport
class Repository
diff --git a/lib/gitlab/ci/build/artifacts/gzip_file_adapter.rb b/lib/gitlab/ci/build/artifacts/gzip_file_adapter.rb
new file mode 100644
index 00000000000..65f65cdce08
--- /dev/null
+++ b/lib/gitlab/ci/build/artifacts/gzip_file_adapter.rb
@@ -0,0 +1,46 @@
+module Gitlab
+ module Ci
+ module Build
+ module Artifacts
+ class GzipFileAdapter
+ attr_reader :stream
+
+ InvalidStreamError = Class.new(StandardError)
+
+ def initialize(stream)
+ raise InvalidStreamError, "Stream is required" unless stream
+
+ @stream = stream
+ end
+
+ def each_blob
+ stream.seek(0)
+
+ until stream.eof?
+ gzip(stream) do |gz|
+ yield gz.read, gz.orig_name
+ unused = gz.unused&.length.to_i
+ # pos has already reached to EOF at the moment
+ # We rewind the pos to the top of unused files
+ # to read next gzip stream, to support multistream archives
+ # https://golang.org/src/compress/gzip/gunzip.go#L117
+ stream.seek(-unused, IO::SEEK_CUR)
+ end
+ end
+ end
+
+ private
+
+ def gzip(stream, &block)
+ gz = Zlib::GzipReader.new(stream)
+ yield(gz)
+ rescue Zlib::Error => e
+ raise InvalidStreamError, e.message
+ ensure
+ gz&.finish
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/config/entry/artifacts.rb b/lib/gitlab/ci/config/entry/artifacts.rb
index 8275aacee9b..e80f9d2e452 100644
--- a/lib/gitlab/ci/config/entry/artifacts.rb
+++ b/lib/gitlab/ci/config/entry/artifacts.rb
@@ -6,13 +6,16 @@ module Gitlab
# Entry that represents a configuration of job artifacts.
#
class Artifacts < Node
+ include Configurable
include Validatable
include Attributable
- ALLOWED_KEYS = %i[name untracked paths when expire_in].freeze
+ ALLOWED_KEYS = %i[name untracked paths reports when expire_in].freeze
attributes ALLOWED_KEYS
+ entry :reports, Entry::Reports, description: 'Report-type artifacts.'
+
validations do
validates :config, type: Hash
validates :config, allowed_keys: ALLOWED_KEYS
@@ -21,6 +24,7 @@ module Gitlab
validates :name, type: String
validates :untracked, boolean: true
validates :paths, array_of_strings: true
+ validates :reports, type: Hash
validates :when,
inclusion: { in: %w[on_success on_failure always],
message: 'should be on_success, on_failure ' \
@@ -28,6 +32,13 @@ module Gitlab
validates :expire_in, duration: true
end
end
+
+ helpers :reports
+
+ def value
+ @config[:reports] = reports_value if @config.key?(:reports)
+ @config
+ end
end
end
end
diff --git a/lib/gitlab/ci/config/entry/commands.rb b/lib/gitlab/ci/config/entry/commands.rb
index 65d19db249c..9f66f11be9b 100644
--- a/lib/gitlab/ci/config/entry/commands.rb
+++ b/lib/gitlab/ci/config/entry/commands.rb
@@ -9,18 +9,7 @@ module Gitlab
include Validatable
validations do
- include LegacyValidationHelpers
-
- validate do
- unless string_or_array_of_strings?(config)
- errors.add(:config,
- 'should be a string or an array of strings')
- end
- end
-
- def string_or_array_of_strings?(field)
- validate_string(field) || validate_array_of_strings(field)
- end
+ validates :config, array_of_strings_or_string: true
end
def value
diff --git a/lib/gitlab/ci/config/entry/reports.rb b/lib/gitlab/ci/config/entry/reports.rb
new file mode 100644
index 00000000000..5963f3eb90c
--- /dev/null
+++ b/lib/gitlab/ci/config/entry/reports.rb
@@ -0,0 +1,32 @@
+module Gitlab
+ module Ci
+ class Config
+ module Entry
+ ##
+ # Entry that represents a configuration of job artifacts.
+ #
+ class Reports < Node
+ include Validatable
+ include Attributable
+
+ ALLOWED_KEYS = %i[junit].freeze
+
+ attributes ALLOWED_KEYS
+
+ validations do
+ validates :config, type: Hash
+ validates :config, allowed_keys: ALLOWED_KEYS
+
+ with_options allow_nil: true do
+ validates :junit, array_of_strings_or_string: true
+ end
+ end
+
+ def value
+ @config.transform_values { |v| Array(v) }
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/config/entry/validators.rb b/lib/gitlab/ci/config/entry/validators.rb
index 55658900628..b3c889ee92f 100644
--- a/lib/gitlab/ci/config/entry/validators.rb
+++ b/lib/gitlab/ci/config/entry/validators.rb
@@ -130,6 +130,20 @@ module Gitlab
end
end
+ class ArrayOfStringsOrStringValidator < RegexpValidator
+ def validate_each(record, attribute, value)
+ unless validate_array_of_strings_or_string(value)
+ record.errors.add(attribute, 'should be an array of strings or a string')
+ end
+ end
+
+ private
+
+ def validate_array_of_strings_or_string(values)
+ validate_array_of_strings(values) || validate_string(values)
+ end
+ end
+
class TypeValidator < ActiveModel::EachValidator
def validate_each(record, attribute, value)
type = options[:with]
diff --git a/lib/gitlab/ci/parsers.rb b/lib/gitlab/ci/parsers.rb
new file mode 100644
index 00000000000..a4eccc08dfc
--- /dev/null
+++ b/lib/gitlab/ci/parsers.rb
@@ -0,0 +1,9 @@
+module Gitlab
+ module Ci
+ module Parsers
+ def self.fabricate!(file_type)
+ "Gitlab::Ci::Parsers::#{file_type.classify}".constantize.new
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/parsers/junit.rb b/lib/gitlab/ci/parsers/junit.rb
new file mode 100644
index 00000000000..3c4668ec13b
--- /dev/null
+++ b/lib/gitlab/ci/parsers/junit.rb
@@ -0,0 +1,69 @@
+module Gitlab
+ module Ci
+ module Parsers
+ class Junit
+ attr_reader :data
+
+ JunitParserError = Class.new(StandardError)
+
+ def parse!(xml_data, test_suite)
+ @data = Hash.from_xml(xml_data)
+
+ each_suite do |testcases|
+ testcases.each do |testcase|
+ test_case = create_test_case(testcase)
+ test_suite.add_test_case(test_case)
+ end
+ end
+ rescue REXML::ParseException => e
+ raise JunitParserError, "XML parsing failed: #{e.message}"
+ rescue => e
+ raise JunitParserError, "JUnit parsing failed: #{e.message}"
+ end
+
+ private
+
+ def each_suite
+ testsuites.each do |testsuite|
+ yield testcases(testsuite)
+ end
+ end
+
+ def testsuites
+ if data['testsuites']
+ data['testsuites']['testsuite']
+ else
+ [data['testsuite']]
+ end
+ end
+
+ def testcases(testsuite)
+ if testsuite['testcase'].is_a?(Array)
+ testsuite['testcase']
+ else
+ [testsuite['testcase']]
+ end
+ end
+
+ def create_test_case(data)
+ if data['failure']
+ status = ::Gitlab::Ci::Reports::TestCase::STATUS_FAILED
+ system_output = data['failure']
+ else
+ status = ::Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS
+ system_output = nil
+ end
+
+ ::Gitlab::Ci::Reports::TestCase.new(
+ classname: data['classname'],
+ name: data['name'],
+ file: data['file'],
+ execution_time: data['time'],
+ status: status,
+ system_output: system_output
+ )
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/test_case.rb b/lib/gitlab/ci/reports/test_case.rb
new file mode 100644
index 00000000000..b4d08ed257f
--- /dev/null
+++ b/lib/gitlab/ci/reports/test_case.rb
@@ -0,0 +1,32 @@
+module Gitlab
+ module Ci
+ module Reports
+ class TestCase
+ STATUS_SUCCESS = 'success'.freeze
+ STATUS_FAILED = 'failed'.freeze
+ STATUS_SKIPPED = 'skipped'.freeze
+ STATUS_ERROR = 'error'.freeze
+ STATUS_TYPES = [STATUS_SUCCESS, STATUS_FAILED, STATUS_SKIPPED, STATUS_ERROR].freeze
+
+ attr_reader :name, :classname, :execution_time, :status, :file, :system_output, :stack_trace, :key
+
+ def initialize(name:, classname:, execution_time:, status:, file: nil, system_output: nil, stack_trace: nil)
+ @name = name
+ @classname = classname
+ @file = file
+ @execution_time = execution_time.to_f
+ @status = status
+ @system_output = system_output
+ @stack_trace = stack_trace
+ @key = sanitize_key_name("#{classname}_#{name}")
+ end
+
+ private
+
+ def sanitize_key_name(key)
+ key.gsub(/[^0-9A-Za-z]/, '-')
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/test_reports.rb b/lib/gitlab/ci/reports/test_reports.rb
new file mode 100644
index 00000000000..c6e732e68eb
--- /dev/null
+++ b/lib/gitlab/ci/reports/test_reports.rb
@@ -0,0 +1,39 @@
+module Gitlab
+ module Ci
+ module Reports
+ class TestReports
+ attr_reader :test_suites
+
+ def initialize
+ @test_suites = {}
+ end
+
+ def get_suite(suite_name)
+ test_suites[suite_name] ||= TestSuite.new(suite_name)
+ end
+
+ def total_time
+ test_suites.values.sum(&:total_time)
+ end
+
+ def total_count
+ test_suites.values.sum(&:total_count)
+ end
+
+ def total_status
+ if failed_count > 0 || error_count > 0
+ TestCase::STATUS_FAILED
+ else
+ TestCase::STATUS_SUCCESS
+ end
+ end
+
+ TestCase::STATUS_TYPES.each do |status_type|
+ define_method("#{status_type}_count") do
+ test_suites.values.sum { |suite| suite.public_send("#{status_type}_count") } # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/test_reports_comparer.rb b/lib/gitlab/ci/reports/test_reports_comparer.rb
new file mode 100644
index 00000000000..c0943f5a51a
--- /dev/null
+++ b/lib/gitlab/ci/reports/test_reports_comparer.rb
@@ -0,0 +1,38 @@
+module Gitlab
+ module Ci
+ module Reports
+ class TestReportsComparer
+ include Gitlab::Utils::StrongMemoize
+
+ attr_reader :base_reports, :head_reports
+
+ def initialize(base_reports, head_reports)
+ @base_reports = base_reports || TestReports.new
+ @head_reports = head_reports
+ end
+
+ def suite_comparers
+ strong_memoize(:suite_comparers) do
+ head_reports.test_suites.map do |name, test_suite|
+ TestSuiteComparer.new(name, base_reports.get_suite(name), test_suite)
+ end
+ end
+ end
+
+ def total_status
+ if suite_comparers.any? { |suite| suite.total_status == TestCase::STATUS_FAILED }
+ TestCase::STATUS_FAILED
+ else
+ TestCase::STATUS_SUCCESS
+ end
+ end
+
+ %w(total_count resolved_count failed_count).each do |method|
+ define_method(method) do
+ suite_comparers.sum { |suite| suite.public_send(method) } # rubocop:disable GitlabSecurity/PublicSend
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/test_suite.rb b/lib/gitlab/ci/reports/test_suite.rb
new file mode 100644
index 00000000000..b722d0ba735
--- /dev/null
+++ b/lib/gitlab/ci/reports/test_suite.rb
@@ -0,0 +1,54 @@
+module Gitlab
+ module Ci
+ module Reports
+ class TestSuite
+ attr_reader :name
+ attr_reader :test_cases
+ attr_reader :total_time
+
+ def initialize(name = nil)
+ @name = name
+ @test_cases = {}
+ @total_time = 0.0
+ @duplicate_cases = []
+ end
+
+ def add_test_case(test_case)
+ @duplicate_cases << test_case if existing_key?(test_case)
+
+ @test_cases[test_case.status] ||= {}
+ @test_cases[test_case.status][test_case.key] = test_case
+ @total_time += test_case.execution_time
+ end
+
+ def total_count
+ test_cases.values.sum(&:count)
+ end
+
+ def total_status
+ if failed_count > 0 || error_count > 0
+ TestCase::STATUS_FAILED
+ else
+ TestCase::STATUS_SUCCESS
+ end
+ end
+
+ TestCase::STATUS_TYPES.each do |status_type|
+ define_method("#{status_type}") do
+ test_cases[status_type] || {}
+ end
+
+ define_method("#{status_type}_count") do
+ test_cases[status_type]&.length.to_i
+ end
+ end
+
+ private
+
+ def existing_key?(test_case)
+ @test_cases[test_case.status]&.key?(test_case.key)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/reports/test_suite_comparer.rb b/lib/gitlab/ci/reports/test_suite_comparer.rb
new file mode 100644
index 00000000000..642aa593092
--- /dev/null
+++ b/lib/gitlab/ci/reports/test_suite_comparer.rb
@@ -0,0 +1,57 @@
+module Gitlab
+ module Ci
+ module Reports
+ class TestSuiteComparer
+ include Gitlab::Utils::StrongMemoize
+
+ attr_reader :name, :base_suite, :head_suite
+
+ def initialize(name, base_suite, head_suite)
+ @name = name
+ @base_suite = base_suite || TestSuite.new
+ @head_suite = head_suite
+ end
+
+ def new_failures
+ strong_memoize(:new_failures) do
+ head_suite.failed.reject do |key, _|
+ base_suite.failed.include?(key)
+ end.values
+ end
+ end
+
+ def existing_failures
+ strong_memoize(:existing_failures) do
+ head_suite.failed.select do |key, _|
+ base_suite.failed.include?(key)
+ end.values
+ end
+ end
+
+ def resolved_failures
+ strong_memoize(:resolved_failures) do
+ head_suite.success.select do |key, _|
+ base_suite.failed.include?(key)
+ end.values
+ end
+ end
+
+ def total_count
+ head_suite.total_count
+ end
+
+ def total_status
+ head_suite.total_status
+ end
+
+ def resolved_count
+ resolved_failures.count
+ end
+
+ def failed_count
+ new_failures.count + existing_failures.count
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/build/failed.rb b/lib/gitlab/ci/status/build/failed.rb
index 155f4fc1343..703f0b9217b 100644
--- a/lib/gitlab/ci/status/build/failed.rb
+++ b/lib/gitlab/ci/status/build/failed.rb
@@ -4,12 +4,13 @@ module Gitlab
module Build
class Failed < Status::Extended
REASONS = {
- 'unknown_failure' => 'unknown failure',
- 'script_failure' => 'script failure',
- 'api_failure' => 'API failure',
- 'stuck_or_timeout_failure' => 'stuck or timeout failure',
- 'runner_system_failure' => 'runner system failure',
- 'missing_dependency_failure' => 'missing dependency failure'
+ unknown_failure: 'unknown failure',
+ script_failure: 'script failure',
+ api_failure: 'API failure',
+ stuck_or_timeout_failure: 'stuck or timeout failure',
+ runner_system_failure: 'runner system failure',
+ missing_dependency_failure: 'missing dependency failure',
+ runner_unsupported: 'unsupported runner'
}.freeze
def status_tooltip
@@ -31,7 +32,11 @@ module Gitlab
end
def description
- "<br> (#{REASONS[subject.failure_reason]})"
+ "<br> (#{failure_reason_message})"
+ end
+
+ def failure_reason_message
+ REASONS.fetch(subject.failure_reason.to_sym)
end
end
end
diff --git a/lib/gitlab/ci/trace.rb b/lib/gitlab/ci/trace.rb
index ee54b893598..93e219a21f9 100644
--- a/lib/gitlab/ci/trace.rb
+++ b/lib/gitlab/ci/trace.rb
@@ -164,6 +164,8 @@ module Gitlab
def create_build_trace!(job, path)
File.open(path) do |stream|
+ # TODO: Set `file_format: :raw` after we've cleaned up legacy traces migration
+ # https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/20307
job.create_job_artifacts_trace!(
project: job.project,
file_type: :trace,
diff --git a/lib/gitlab/cleanup/project_upload_file_finder.rb b/lib/gitlab/cleanup/project_upload_file_finder.rb
new file mode 100644
index 00000000000..2ee8b60e76a
--- /dev/null
+++ b/lib/gitlab/cleanup/project_upload_file_finder.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Cleanup
+ class ProjectUploadFileFinder
+ FIND_BATCH_SIZE = 500
+ ABSOLUTE_UPLOAD_DIR = FileUploader.root.freeze
+ EXCLUDED_SYSTEM_UPLOADS_PATH = "#{ABSOLUTE_UPLOAD_DIR}/-/*".freeze
+ EXCLUDED_HASHED_UPLOADS_PATH = "#{ABSOLUTE_UPLOAD_DIR}/@hashed/*".freeze
+ EXCLUDED_TMP_UPLOADS_PATH = "#{ABSOLUTE_UPLOAD_DIR}/tmp/*".freeze
+
+ # Paths are relative to the upload directory
+ def each_file_batch(batch_size: FIND_BATCH_SIZE, &block)
+ cmd = build_find_command(ABSOLUTE_UPLOAD_DIR)
+
+ Open3.popen2(*cmd) do |stdin, stdout, status_thread|
+ yield_paths_in_batches(stdout, batch_size, &block)
+
+ raise "Find command failed" unless status_thread.value.success?
+ end
+ end
+
+ private
+
+ def yield_paths_in_batches(stdout, batch_size, &block)
+ paths = []
+
+ stdout.each_line("\0") do |line|
+ paths << line.chomp("\0")
+
+ if paths.size >= batch_size
+ yield(paths)
+ paths = []
+ end
+ end
+
+ yield(paths) if paths.any?
+ end
+
+ def build_find_command(search_dir)
+ cmd = %W[find -L #{search_dir}
+ -type f
+ ! ( -path #{EXCLUDED_SYSTEM_UPLOADS_PATH} -prune )
+ ! ( -path #{EXCLUDED_HASHED_UPLOADS_PATH} -prune )
+ ! ( -path #{EXCLUDED_TMP_UPLOADS_PATH} -prune )
+ -print0]
+
+ ionice = which_ionice
+ cmd = %W[#{ionice} -c Idle] + cmd if ionice
+
+ log_msg = "find command: \"#{cmd.join(' ')}\""
+ Rails.logger.info log_msg
+
+ cmd
+ end
+
+ def which_ionice
+ Gitlab::Utils.which('ionice')
+ rescue StandardError
+ # In this case, returning false is relatively safe,
+ # even though it isn't very nice
+ false
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/cleanup/project_uploads.rb b/lib/gitlab/cleanup/project_uploads.rb
new file mode 100644
index 00000000000..f55ab535efe
--- /dev/null
+++ b/lib/gitlab/cleanup/project_uploads.rb
@@ -0,0 +1,125 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Cleanup
+ class ProjectUploads
+ LOST_AND_FOUND = File.join(ProjectUploadFileFinder::ABSOLUTE_UPLOAD_DIR, '-', 'project-lost-found')
+
+ attr_reader :logger
+
+ def initialize(logger: nil)
+ @logger = logger || Rails.logger
+ end
+
+ def run!(dry_run: true)
+ logger.info "Looking for orphaned project uploads to clean up#{'. Dry run' if dry_run}..."
+
+ each_orphan_file do |path, upload_path|
+ result = cleanup(path, upload_path, dry_run)
+
+ logger.info result
+ end
+ end
+
+ private
+
+ def cleanup(path, upload_path, dry_run)
+ # This happened in staging:
+ # `find` returned a path on which `File.delete` raised `Errno::ENOENT`
+ return "Cannot find file: #{path}" unless File.exist?(path)
+
+ correct_path = upload_path && find_correct_path(upload_path)
+
+ if correct_path
+ move(path, correct_path, 'fix', dry_run)
+ else
+ move_to_lost_and_found(path, dry_run)
+ end
+ end
+
+ # Accepts a path in the form of "#{hex_secret}/#{filename}"
+ def find_correct_path(upload_path)
+ upload = Upload.find_by(uploader: 'FileUploader', path: upload_path)
+ return unless upload && upload.local? && upload.model
+
+ upload.absolute_path
+ rescue => e
+ logger.error e.message
+
+ # absolute_path depends on a lot of code. If it doesn't work, then it
+ # it doesn't matter if the upload file is in the right place. Treat it
+ # as uncorrectable.
+ # I.e. the project record might be missing, which raises an exception.
+ nil
+ end
+
+ def move_to_lost_and_found(path, dry_run)
+ new_path = path.sub(/\A#{ProjectUploadFileFinder::ABSOLUTE_UPLOAD_DIR}/, LOST_AND_FOUND)
+
+ move(path, new_path, 'move to lost and found', dry_run)
+ end
+
+ def move(path, new_path, prefix, dry_run)
+ action = "#{prefix} #{path} -> #{new_path}"
+
+ if dry_run
+ "Can #{action}"
+ else
+ begin
+ FileUtils.mkdir_p(File.dirname(new_path))
+ FileUtils.mv(path, new_path)
+
+ "Did #{action}"
+ rescue => e
+ "Error during #{action}: #{e.inspect}"
+ end
+ end
+ end
+
+ # Yields absolute paths of project upload files that are not in the
+ # uploads table
+ def each_orphan_file
+ ProjectUploadFileFinder.new.each_file_batch do |file_paths|
+ logger.debug "Processing batch of #{file_paths.size} project upload file paths, starting with #{file_paths.first}"
+
+ file_paths.each do |path|
+ pup = ProjectUploadPath.from_path(path)
+
+ yield(path, pup.upload_path) if pup.orphan?
+ end
+ end
+ end
+
+ class ProjectUploadPath
+ PROJECT_FULL_PATH_REGEX = %r{\A#{FileUploader.root}/(.+)/(\h+/[^/]+)\z}.freeze
+
+ attr_reader :full_path, :upload_path
+
+ def initialize(full_path, upload_path)
+ @full_path = full_path
+ @upload_path = upload_path
+ end
+
+ def self.from_path(path)
+ path_matched = path.match(PROJECT_FULL_PATH_REGEX)
+ return new(nil, nil) unless path_matched
+
+ new(path_matched[1], path_matched[2])
+ end
+
+ def orphan?
+ return true if full_path.nil? || upload_path.nil?
+
+ # It's possible to reduce to one query, but `where_full_path_in` is complex
+ !Upload.exists?(path: upload_path, model_id: project_id, model_type: 'Project', uploader: 'FileUploader')
+ end
+
+ private
+
+ def project_id
+ @project_id ||= Project.where_full_path_in([full_path]).pluck(:id)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb
index 872e70f9a5d..8eacad078c8 100644
--- a/lib/gitlab/database.rb
+++ b/lib/gitlab/database.rb
@@ -61,6 +61,10 @@ module Gitlab
@version ||= database_version.match(/\A(?:PostgreSQL |)([^\s]+).*\z/)[1]
end
+ def self.postgresql_9_or_less?
+ postgresql? && version.to_f < 10
+ end
+
def self.join_lateral_supported?
postgresql? && version.to_f >= 9.3
end
@@ -69,6 +73,28 @@ module Gitlab
postgresql? && version.to_f >= 9.4
end
+ def self.pg_stat_wal_receiver_supported?
+ postgresql? && version.to_f >= 9.6
+ end
+
+ # map some of the function names that changed between PostgreSQL 9 and 10
+ # https://wiki.postgresql.org/wiki/New_in_postgres_10
+ def self.pg_wal_lsn_diff
+ Gitlab::Database.postgresql_9_or_less? ? 'pg_xlog_location_diff' : 'pg_wal_lsn_diff'
+ end
+
+ def self.pg_current_wal_insert_lsn
+ Gitlab::Database.postgresql_9_or_less? ? 'pg_current_xlog_insert_location' : 'pg_current_wal_insert_lsn'
+ end
+
+ def self.pg_last_wal_receive_lsn
+ Gitlab::Database.postgresql_9_or_less? ? 'pg_last_xlog_receive_location' : 'pg_last_wal_receive_lsn'
+ end
+
+ def self.pg_last_wal_replay_lsn
+ Gitlab::Database.postgresql_9_or_less? ? 'pg_last_xlog_replay_location' : 'pg_last_wal_replay_lsn'
+ end
+
def self.nulls_last_order(field, direction = 'ASC')
order = "#{field} #{direction}"
diff --git a/lib/gitlab/email/handler/create_issue_handler.rb b/lib/gitlab/email/handler/create_issue_handler.rb
index 764f93f6d3d..fc8615afcae 100644
--- a/lib/gitlab/email/handler/create_issue_handler.rb
+++ b/lib/gitlab/email/handler/create_issue_handler.rb
@@ -36,10 +36,6 @@ module Gitlab
@project ||= Project.find_by_full_path(project_path)
end
- def metrics_params
- super.merge(project: project&.full_path)
- end
-
private
def create_issue
diff --git a/lib/gitlab/email/handler/create_merge_request_handler.rb b/lib/gitlab/email/handler/create_merge_request_handler.rb
index 2f864f2082b..2316e58c3fc 100644
--- a/lib/gitlab/email/handler/create_merge_request_handler.rb
+++ b/lib/gitlab/email/handler/create_merge_request_handler.rb
@@ -40,10 +40,6 @@ module Gitlab
@project ||= Project.find_by_full_path(project_path)
end
- def metrics_params
- super.merge(project: project&.full_path)
- end
-
private
def create_merge_request
diff --git a/lib/gitlab/email/handler/create_note_handler.rb b/lib/gitlab/email/handler/create_note_handler.rb
index 5791dbd0484..379b114e957 100644
--- a/lib/gitlab/email/handler/create_note_handler.rb
+++ b/lib/gitlab/email/handler/create_note_handler.rb
@@ -28,10 +28,6 @@ module Gitlab
record_name: 'comment')
end
- def metrics_params
- super.merge(project: project&.full_path)
- end
-
private
def author
diff --git a/lib/gitlab/email/handler/unsubscribe_handler.rb b/lib/gitlab/email/handler/unsubscribe_handler.rb
index ea80e21532e..56751e4e41e 100644
--- a/lib/gitlab/email/handler/unsubscribe_handler.rb
+++ b/lib/gitlab/email/handler/unsubscribe_handler.rb
@@ -20,10 +20,6 @@ module Gitlab
noteable.unsubscribe(sent_notification.recipient)
end
- def metrics_params
- super.merge(project: project&.full_path)
- end
-
private
def sent_notification
diff --git a/lib/gitlab/git/conflict/resolver.rb b/lib/gitlab/git/conflict/resolver.rb
index 0e4a973301f..6dc792c16b8 100644
--- a/lib/gitlab/git/conflict/resolver.rb
+++ b/lib/gitlab/git/conflict/resolver.rb
@@ -17,7 +17,7 @@ module Gitlab
end
rescue GRPC::FailedPrecondition => e
raise Gitlab::Git::Conflict::Resolver::ConflictSideMissing.new(e.message)
- rescue Rugged::ReferenceError, Rugged::OdbError, GRPC::BadStatus => e
+ rescue GRPC::BadStatus => e
raise Gitlab::Git::CommandError.new(e)
end
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index 7bd5927d15e..73151e4a4c5 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -39,19 +39,6 @@ module Gitlab
ChecksumError = Class.new(StandardError)
class << self
- # Unlike `new`, `create` takes the repository path
- def create(repo_path, bare: true, symlink_hooks_to: nil)
- FileUtils.mkdir_p(repo_path, mode: 0770)
-
- # Equivalent to `git --git-path=#{repo_path} init [--bare]`
- repo = Rugged::Repository.init_at(repo_path, bare)
- repo.close
-
- create_hooks(repo_path, symlink_hooks_to) if symlink_hooks_to.present?
-
- true
- end
-
def create_hooks(repo_path, global_hooks_path)
local_hooks_path = File.join(repo_path, 'hooks')
real_local_hooks_path = :not_found
@@ -353,8 +340,6 @@ module Gitlab
# offset: 5,
# after: Time.new(2016, 4, 21, 14, 32, 10)
# )
- #
- # Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/446
def log(options)
default_options = {
limit: 10,
@@ -560,7 +545,9 @@ module Gitlab
if is_enabled
gitaly_operation_client.user_update_branch(branch_name, user, newrev, oldrev)
else
- OperationService.new(user, self).update_branch(branch_name, newrev, oldrev)
+ Gitlab::GitalyClient::StorageSettings.allow_disk_access do
+ OperationService.new(user, self).update_branch(branch_name, newrev, oldrev)
+ end
end
end
end
@@ -834,18 +821,9 @@ module Gitlab
Gitlab::Git.check_namespace!(source_repository)
source_repository = RemoteRepository.new(source_repository) unless source_repository.is_a?(RemoteRepository)
- message, status = GitalyClient.migrate(:fetch_ref) do |is_enabled|
- if is_enabled
- gitaly_fetch_ref(source_repository, source_ref: source_ref, target_ref: target_ref)
- else
- # When removing this code, also remove source_repository#path
- # to remove deprecated method calls
- local_fetch_ref(source_repository.path, source_ref: source_ref, target_ref: target_ref)
- end
- end
-
- # Make sure ref was created, and raise Rugged::ReferenceError when not
- raise Rugged::ReferenceError, message if status != 0
+ args = %W(fetch --no-tags -f #{GITALY_INTERNAL_URL} #{source_ref}:#{target_ref})
+ message, status = run_git(args, env: source_repository.fetch_env)
+ raise Gitlab::Git::CommandError, message if status != 0
target_ref
end
@@ -1029,8 +1007,8 @@ module Gitlab
end
def clean_stale_repository_files
- gitaly_migrate(:repository_cleanup, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
- gitaly_repository_client.cleanup if is_enabled && exists?
+ wrapped_gitaly_errors do
+ gitaly_repository_client.cleanup if exists?
end
rescue Gitlab::Git::CommandError => e # Don't fail if we can't cleanup
Rails.logger.error("Unable to clean repository on storage #{storage} with relative path #{relative_path}: #{e.message}")
@@ -1246,17 +1224,6 @@ module Gitlab
gitaly_repository_client.apply_gitattributes(revision)
end
- def local_fetch_ref(source_path, source_ref:, target_ref:)
- args = %W(fetch --no-tags -f #{source_path} #{source_ref}:#{target_ref})
- run_git(args)
- end
-
- def gitaly_fetch_ref(source_repository, source_ref:, target_ref:)
- args = %W(fetch --no-tags -f #{GITALY_INTERNAL_URL} #{source_ref}:#{target_ref})
-
- run_git(args, env: source_repository.fetch_env)
- end
-
def gitaly_delete_refs(*ref_names)
gitaly_ref_client.delete_refs(refs: ref_names) if ref_names.any?
end
diff --git a/lib/gitlab/git/repository_mirroring.rb b/lib/gitlab/git/repository_mirroring.rb
index 8835bfb2481..65eb5cc18cf 100644
--- a/lib/gitlab/git/repository_mirroring.rb
+++ b/lib/gitlab/git/repository_mirroring.rb
@@ -6,7 +6,9 @@ module Gitlab
if is_enabled
gitaly_ref_client.remote_branches(remote_name)
else
- rugged_remote_branches(remote_name)
+ Gitlab::GitalyClient::StorageSettings.allow_disk_access do
+ rugged_remote_branches(remote_name)
+ end
end
end
end
diff --git a/lib/gitlab/git/wiki.rb b/lib/gitlab/git/wiki.rb
index 8ee46b59830..9d992be66eb 100644
--- a/lib/gitlab/git/wiki.rb
+++ b/lib/gitlab/git/wiki.rb
@@ -44,9 +44,9 @@ module Gitlab
end
end
- def pages(limit: nil)
+ def pages(limit: 0)
@repository.wrapped_gitaly_errors do
- gitaly_get_all_pages
+ gitaly_get_all_pages(limit: limit)
end
end
@@ -158,8 +158,8 @@ module Gitlab
Gitlab::Git::WikiFile.new(wiki_file)
end
- def gitaly_get_all_pages
- gitaly_wiki_client.get_all_pages.map do |wiki_page, version|
+ def gitaly_get_all_pages(limit: 0)
+ gitaly_wiki_client.get_all_pages(limit: limit).map do |wiki_page, version|
Gitlab::Git::WikiPage.new(wiki_page, version)
end
end
diff --git a/lib/gitlab/git_post_receive.rb b/lib/gitlab/git_post_receive.rb
index 742118b76a8..e731e654f3c 100644
--- a/lib/gitlab/git_post_receive.rb
+++ b/lib/gitlab/git_post_receive.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
module Gitlab
class GitPostReceive
include Gitlab::Identifier
@@ -14,10 +16,11 @@ module Gitlab
end
def changes_refs
- return enum_for(:changes_refs) unless block_given?
+ return changes unless block_given?
changes.each do |change|
- oldrev, newrev, ref = change.strip.split(' ')
+ change.strip!
+ oldrev, newrev, ref = change.split(' ')
yield oldrev, newrev, ref
end
@@ -26,13 +29,10 @@ module Gitlab
private
def deserialize_changes(changes)
- changes = utf8_encode_changes(changes)
- changes.lines
+ utf8_encode_changes(changes).each_line
end
def utf8_encode_changes(changes)
- changes = changes.dup
-
changes.force_encoding('UTF-8')
return changes if changes.valid_encoding?
diff --git a/lib/gitlab/gitaly_client.rb b/lib/gitlab/gitaly_client.rb
index 58a4060cc96..c27972a84a4 100644
--- a/lib/gitlab/gitaly_client.rb
+++ b/lib/gitlab/gitaly_client.rb
@@ -407,7 +407,7 @@ module Gitlab
# The default timeout on all Gitaly calls
def self.default_timeout
- return 0 if Sidekiq.server?
+ return no_timeout if Sidekiq.server?
timeout(:gitaly_timeout_default)
end
@@ -420,6 +420,10 @@ module Gitlab
timeout(:gitaly_timeout_medium)
end
+ def self.no_timeout
+ 0
+ end
+
def self.timeout(timeout_name)
Gitlab::CurrentSettings.current_application_settings[timeout_name]
end
diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb
index fbe7d4ba1ae..41d58192818 100644
--- a/lib/gitlab/gitaly_client/ref_service.rb
+++ b/lib/gitlab/gitaly_client/ref_service.rb
@@ -166,7 +166,7 @@ module Gitlab
except_with_prefix: except_with_prefixes.map { |r| encode_binary(r) }
)
- response = GitalyClient.call(@repository.storage, :ref_service, :delete_refs, request, timeout: GitalyClient.fast_timeout)
+ response = GitalyClient.call(@repository.storage, :ref_service, :delete_refs, request, timeout: GitalyClient.default_timeout)
raise Gitlab::Git::Repository::GitError, response.git_error if response.git_error.present?
end
diff --git a/lib/gitlab/gitaly_client/repository_service.rb b/lib/gitlab/gitaly_client/repository_service.rb
index 64b9af4d70c..2956ed4b911 100644
--- a/lib/gitlab/gitaly_client/repository_service.rb
+++ b/lib/gitlab/gitaly_client/repository_service.rb
@@ -202,7 +202,7 @@ module Gitlab
save_path,
:create_bundle,
Gitaly::CreateBundleRequest,
- GitalyClient.default_timeout
+ GitalyClient.no_timeout
)
end
@@ -220,7 +220,7 @@ module Gitlab
bundle_path,
:create_repository_from_bundle,
Gitaly::CreateRepositoryFromBundleRequest,
- GitalyClient.default_timeout
+ GitalyClient.no_timeout
)
end
@@ -245,7 +245,7 @@ module Gitlab
:repository_service,
:create_repository_from_snapshot,
request,
- timeout: GitalyClient.default_timeout
+ timeout: GitalyClient.no_timeout
)
end
diff --git a/lib/gitlab/gitaly_client/wiki_service.rb b/lib/gitlab/gitaly_client/wiki_service.rb
index 6cb049c1f68..75be7d1f5a0 100644
--- a/lib/gitlab/gitaly_client/wiki_service.rb
+++ b/lib/gitlab/gitaly_client/wiki_service.rb
@@ -85,8 +85,8 @@ module Gitlab
wiki_page_from_iterator(response)
end
- def get_all_pages
- request = Gitaly::WikiGetAllPagesRequest.new(repository: @gitaly_repo)
+ def get_all_pages(limit: 0)
+ request = Gitaly::WikiGetAllPagesRequest.new(repository: @gitaly_repo, limit: limit)
response = GitalyClient.call(@repository.storage, :wiki_service, :wiki_get_all_pages, request, timeout: GitalyClient.medium_timeout)
pages = []
diff --git a/lib/gitlab/github_import/importer/pull_requests_importer.rb b/lib/gitlab/github_import/importer/pull_requests_importer.rb
index e70361c163b..a52866c4b08 100644
--- a/lib/gitlab/github_import/importer/pull_requests_importer.rb
+++ b/lib/gitlab/github_import/importer/pull_requests_importer.rb
@@ -43,7 +43,7 @@ module Gitlab
Rails.logger
.info("GitHub importer finished updating repository for #{pname}")
- repository_updates_counter.increment(project: pname)
+ repository_updates_counter.increment
end
def update_repository?(pr)
diff --git a/lib/gitlab/gpg.rb b/lib/gitlab/gpg.rb
index a4263369269..8a91e034377 100644
--- a/lib/gitlab/gpg.rb
+++ b/lib/gitlab/gpg.rb
@@ -71,8 +71,16 @@ module Gitlab
if MUTEX.locked? && MUTEX.owned?
optimistic_using_tmp_keychain(&block)
else
- MUTEX.synchronize do
- optimistic_using_tmp_keychain(&block)
+ if Gitlab.rails5?
+ ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
+ MUTEX.synchronize do
+ optimistic_using_tmp_keychain(&block)
+ end
+ end
+ else
+ MUTEX.synchronize do
+ optimistic_using_tmp_keychain(&block)
+ end
end
end
end
diff --git a/lib/gitlab/graphql/authorize.rb b/lib/gitlab/graphql/authorize.rb
index 04f25c53e49..93a903915b0 100644
--- a/lib/gitlab/graphql/authorize.rb
+++ b/lib/gitlab/graphql/authorize.rb
@@ -10,7 +10,14 @@ module Gitlab
end
def required_permissions
- @required_permissions ||= []
+ # If the `#authorize` call is used on multiple classes, we add the
+ # permissions specified on a subclass, to the ones that were specified
+ # on it's superclass.
+ @required_permissions ||= if self.respond_to?(:superclass) && superclass.respond_to?(:required_permissions)
+ superclass.required_permissions.dup
+ else
+ []
+ end
end
def authorize(*permissions)
diff --git a/lib/gitlab/graphql/authorize/authorize_resource.rb b/lib/gitlab/graphql/authorize/authorize_resource.rb
new file mode 100644
index 00000000000..40895686a8a
--- /dev/null
+++ b/lib/gitlab/graphql/authorize/authorize_resource.rb
@@ -0,0 +1,46 @@
+module Gitlab
+ module Graphql
+ module Authorize
+ module AuthorizeResource
+ extend ActiveSupport::Concern
+
+ included do
+ extend Gitlab::Graphql::Authorize
+ end
+
+ def find_object(*args)
+ raise NotImplementedError, "Implement #find_object in #{self.class.name}"
+ end
+
+ def authorized_find(*args)
+ object = find_object(*args)
+
+ object if authorized?(object)
+ end
+
+ def authorized_find!(*args)
+ object = find_object(*args)
+ authorize!(object)
+
+ object
+ end
+
+ def authorize!(object)
+ unless authorized?(object)
+ raise Gitlab::Graphql::Errors::ResourceNotAvailable,
+ "The resource that you are attempting to access does not exist or you don't have permission to perform this action"
+ end
+ end
+
+ def authorized?(object)
+ self.class.required_permissions.all? do |ability|
+ # The actions could be performed across multiple objects. In which
+ # case the current user is common, and we could benefit from the
+ # caching in `DeclarativePolicy`.
+ Ability.allowed?(current_user, ability, object, scope: :user)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphql/errors.rb b/lib/gitlab/graphql/errors.rb
index 1d8e8307ab9..f8c7ec24be1 100644
--- a/lib/gitlab/graphql/errors.rb
+++ b/lib/gitlab/graphql/errors.rb
@@ -3,6 +3,7 @@ module Gitlab
module Errors
BaseError = Class.new(GraphQL::ExecutionError)
ArgumentError = Class.new(BaseError)
+ ResourceNotAvailable = Class.new(BaseError)
end
end
end
diff --git a/lib/gitlab/graphql/mount_mutation.rb b/lib/gitlab/graphql/mount_mutation.rb
new file mode 100644
index 00000000000..8cab84d7a5f
--- /dev/null
+++ b/lib/gitlab/graphql/mount_mutation.rb
@@ -0,0 +1,18 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Graphql
+ module MountMutation
+ extend ActiveSupport::Concern
+
+ module ClassMethods
+ def mount_mutation(mutation_class)
+ # Using an underscored field name symbol will make `graphql-ruby`
+ # standardize the field name
+ field mutation_class.graphql_name.underscore.to_sym,
+ mutation: mutation_class
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/graphs/commits.rb b/lib/gitlab/graphs/commits.rb
index 3caf9036459..c4ffc19df09 100644
--- a/lib/gitlab/graphs/commits.rb
+++ b/lib/gitlab/graphs/commits.rb
@@ -18,7 +18,7 @@ module Gitlab
end
def commit_per_day
- @commit_per_day ||= @commits.size / (@duration + 1)
+ @commit_per_day ||= (@commits.size.to_f / (@duration + 1)).round(1)
end
def collect_data
diff --git a/lib/gitlab/hashed_storage/migrator.rb b/lib/gitlab/hashed_storage/migrator.rb
index 9251ed654cd..d11fcc6a3e3 100644
--- a/lib/gitlab/hashed_storage/migrator.rb
+++ b/lib/gitlab/hashed_storage/migrator.rb
@@ -30,7 +30,7 @@ module Gitlab
end
end
- # Flag a project to me migrated
+ # Flag a project to be migrated
#
# @param [Object] project that will be migrated
def migrate(project)
diff --git a/lib/gitlab/import_export/command_line_util.rb b/lib/gitlab/import_export/command_line_util.rb
index 2f163db936b..3adc44f8044 100644
--- a/lib/gitlab/import_export/command_line_util.rb
+++ b/lib/gitlab/import_export/command_line_util.rb
@@ -18,6 +18,21 @@ module Gitlab
private
+ def download_or_copy_upload(uploader, upload_path)
+ if uploader.upload.local?
+ copy_files(uploader.path, upload_path)
+ else
+ download(uploader.url, upload_path)
+ end
+ end
+
+ def download(url, upload_path)
+ File.open(upload_path, 'w') do |file|
+ # Download (stream) file from the uploader's location
+ IO.copy_stream(URI.parse(url).open, file)
+ end
+ end
+
def tar_with_options(archive:, dir:, options:)
execute(%W(tar -#{options} #{archive} -C #{dir} .))
end
diff --git a/lib/gitlab/import_export/file_importer.rb b/lib/gitlab/import_export/file_importer.rb
index 4c411f4847e..7fd66b4e244 100644
--- a/lib/gitlab/import_export/file_importer.rb
+++ b/lib/gitlab/import_export/file_importer.rb
@@ -10,15 +10,18 @@ module Gitlab
new(*args).import
end
- def initialize(archive_file:, shared:)
+ def initialize(project:, archive_file:, shared:)
+ @project = project
@archive_file = archive_file
@shared = shared
end
def import
mkdir_p(@shared.export_path)
+ mkdir_p(@shared.archive_path)
- remove_symlinks!
+ remove_symlinks
+ copy_archive
wait_for_archived_file do
decompress_archive
@@ -27,7 +30,8 @@ module Gitlab
@shared.error(e)
false
ensure
- remove_symlinks!
+ remove_import_file
+ remove_symlinks
end
private
@@ -51,7 +55,15 @@ module Gitlab
result
end
- def remove_symlinks!
+ def copy_archive
+ return if @archive_file
+
+ @archive_file = File.join(@shared.archive_path, Gitlab::ImportExport.export_filename(project: @project))
+
+ download_or_copy_upload(@project.import_export_upload.import_file, @archive_file)
+ end
+
+ def remove_symlinks
extracted_files.each do |path|
FileUtils.rm(path) if File.lstat(path).symlink?
end
@@ -59,6 +71,10 @@ module Gitlab
true
end
+ def remove_import_file
+ FileUtils.rm_rf(@archive_file)
+ end
+
def extracted_files
Dir.glob("#{@shared.export_path}/**/*", File::FNM_DOTMATCH).reject { |f| IGNORED_FILENAMES.include?(File.basename(f)) }
end
diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml
index da3667faf7a..f69f98a78a3 100644
--- a/lib/gitlab/import_export/import_export.yml
+++ b/lib/gitlab/import_export/import_export.yml
@@ -107,6 +107,7 @@ excluded_attributes:
- :storage_version
- :remote_mirror_available_overridden
- :description_html
+ - :repository_languages
snippets:
- :expired_at
merge_request_diff:
diff --git a/lib/gitlab/import_export/importer.rb b/lib/gitlab/import_export/importer.rb
index 63cab07324a..4e179f63d8c 100644
--- a/lib/gitlab/import_export/importer.rb
+++ b/lib/gitlab/import_export/importer.rb
@@ -35,7 +35,8 @@ module Gitlab
end
def import_file
- Gitlab::ImportExport::FileImporter.import(archive_file: @archive_file,
+ Gitlab::ImportExport::FileImporter.import(project: @project,
+ archive_file: @archive_file,
shared: @shared)
end
@@ -91,7 +92,14 @@ module Gitlab
end
def remove_import_file
- FileUtils.rm_rf(@archive_file)
+ return unless Gitlab::ImportExport.object_storage?
+
+ upload = @project.import_export_upload
+
+ return unless upload&.import_file&.file
+
+ upload.remove_import_file!
+ upload.save!
end
def overwrite_project
diff --git a/lib/gitlab/import_export/merge_request_parser.rb b/lib/gitlab/import_export/merge_request_parser.rb
index d0527f014a7..62a1833b39c 100644
--- a/lib/gitlab/import_export/merge_request_parser.rb
+++ b/lib/gitlab/import_export/merge_request_parser.rb
@@ -27,7 +27,11 @@ module Gitlab
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/1295
def fetch_ref
- @project.repository.fetch_ref(@project.repository, source_ref: @diff_head_sha, target_ref: @merge_request.source_branch)
+ target_ref = Gitlab::Git::BRANCH_REF_PREFIX + @merge_request.source_branch
+
+ unless @project.repository.fetch_source_branch!(@project.repository, @diff_head_sha, target_ref)
+ Rails.logger.warn("Import/Export warning: Failed to create #{target_ref} for MR: #{@merge_request.iid}")
+ end
end
def branch_exists?(branch_name)
diff --git a/lib/gitlab/import_export/uploads_manager.rb b/lib/gitlab/import_export/uploads_manager.rb
index 1110149712d..07875ebb56a 100644
--- a/lib/gitlab/import_export/uploads_manager.rb
+++ b/lib/gitlab/import_export/uploads_manager.rb
@@ -91,10 +91,7 @@ module Gitlab
mkdir_p(File.join(uploads_export_path, secret))
- File.open(upload_path, 'w') do |file|
- # Download (stream) file from the uploader's location
- IO.copy_stream(URI.parse(upload.file.url).open, file)
- end
+ download_or_copy_upload(upload, upload_path)
end
end
end
diff --git a/lib/gitlab/import_sources.rb b/lib/gitlab/import_sources.rb
index af9b880ef9e..45816bee176 100644
--- a/lib/gitlab/import_sources.rb
+++ b/lib/gitlab/import_sources.rb
@@ -22,24 +22,28 @@ module Gitlab
class << self
def options
- @options ||= Hash[ImportTable.map { |importer| [importer.title, importer.name] }]
+ Hash[import_table.map { |importer| [importer.title, importer.name] }]
end
def values
- @values ||= ImportTable.map(&:name)
+ import_table.map(&:name)
end
def importer_names
- @importer_names ||= ImportTable.select(&:importer).map(&:name)
+ import_table.select(&:importer).map(&:name)
end
def importer(name)
- ImportTable.find { |import_source| import_source.name == name }.importer
+ import_table.find { |import_source| import_source.name == name }.importer
end
def title(name)
options.key(name)
end
+
+ def import_table
+ ImportTable
+ end
end
end
end
diff --git a/lib/gitlab/kubernetes/config_map.rb b/lib/gitlab/kubernetes/config_map.rb
index 95e1054919d..8a8a59a9cd4 100644
--- a/lib/gitlab/kubernetes/config_map.rb
+++ b/lib/gitlab/kubernetes/config_map.rb
@@ -1,7 +1,7 @@
module Gitlab
module Kubernetes
class ConfigMap
- def initialize(name, values)
+ def initialize(name, values = "")
@name = name
@values = values
end
@@ -13,6 +13,10 @@ module Gitlab
resource
end
+ def config_map_name
+ "values-content-configuration-#{name}"
+ end
+
private
attr_reader :name, :values
@@ -25,10 +29,6 @@ module Gitlab
}
end
- def config_map_name
- "values-content-configuration-#{name}"
- end
-
def namespace
Gitlab::Kubernetes::Helm::NAMESPACE
end
diff --git a/lib/gitlab/kubernetes/helm.rb b/lib/gitlab/kubernetes/helm.rb
index 0f0588b8b23..530ccf88053 100644
--- a/lib/gitlab/kubernetes/helm.rb
+++ b/lib/gitlab/kubernetes/helm.rb
@@ -1,7 +1,7 @@
module Gitlab
module Kubernetes
module Helm
- HELM_VERSION = '2.7.0'.freeze
+ HELM_VERSION = '2.7.2'.freeze
NAMESPACE = 'gitlab-managed-apps'.freeze
end
end
diff --git a/lib/gitlab/kubernetes/helm/api.rb b/lib/gitlab/kubernetes/helm/api.rb
index 2edd34109ba..c4de9a398cc 100644
--- a/lib/gitlab/kubernetes/helm/api.rb
+++ b/lib/gitlab/kubernetes/helm/api.rb
@@ -8,9 +8,9 @@ module Gitlab
end
def install(command)
- @namespace.ensure_exists!
+ namespace.ensure_exists!
create_config_map(command) if command.config_map?
- @kubeclient.create_pod(command.pod_resource)
+ kubeclient.create_pod(command.pod_resource)
end
##
@@ -20,23 +20,25 @@ module Gitlab
#
# values: "Pending", "Running", "Succeeded", "Failed", "Unknown"
#
- def installation_status(pod_name)
- @kubeclient.get_pod(pod_name, @namespace.name).status.phase
+ def status(pod_name)
+ kubeclient.get_pod(pod_name, namespace.name).status.phase
end
- def installation_log(pod_name)
- @kubeclient.get_pod_log(pod_name, @namespace.name).body
+ def log(pod_name)
+ kubeclient.get_pod_log(pod_name, namespace.name).body
end
- def delete_installation_pod!(pod_name)
- @kubeclient.delete_pod(pod_name, @namespace.name)
+ def delete_pod!(pod_name)
+ kubeclient.delete_pod(pod_name, namespace.name)
end
private
+ attr_reader :kubeclient, :namespace
+
def create_config_map(command)
command.config_map_resource.tap do |config_map_resource|
- @kubeclient.create_config_map(config_map_resource)
+ kubeclient.create_config_map(config_map_resource)
end
end
end
diff --git a/lib/gitlab/language_detection.rb b/lib/gitlab/language_detection.rb
new file mode 100644
index 00000000000..a41435fdb79
--- /dev/null
+++ b/lib/gitlab/language_detection.rb
@@ -0,0 +1,68 @@
+module Gitlab
+ class LanguageDetection
+ MAX_LANGUAGES = 5
+
+ def initialize(repository, repository_languages)
+ @repository = repository
+ @repository_languages = repository_languages
+ end
+
+ def languages
+ detection.keys
+ end
+
+ def language_color(name)
+ detection.dig(name, :color)
+ end
+
+ # Newly detected languages, returned in a structure accepted by
+ # Gitlab::Database.bulk_insert
+ def insertions(programming_languages)
+ lang_to_id = programming_languages.map { |p| [p.name, p.id] }.to_h
+
+ (languages - previous_language_names).map do |new_lang|
+ {
+ project_id: @repository.project.id,
+ share: detection[new_lang][:value],
+ programming_language_id: lang_to_id[new_lang]
+ }
+ end
+ end
+
+ # updates analyses which records only require updating of their share
+ def updates
+ to_update = @repository_languages.select do |lang|
+ detection.key?(lang.name) && detection[lang.name][:value] != lang.share
+ end
+
+ to_update.map do |lang|
+ { programming_language_id: lang.programming_language_id, share: detection[lang.name][:value] }
+ end
+ end
+
+ # Returns the ids of the programming languages that do not occur in the detection
+ # as current repository languages
+ def deletions
+ @repository_languages.map do |repo_lang|
+ next if detection.key?(repo_lang.name)
+
+ repo_lang.programming_language_id
+ end.compact
+ end
+
+ private
+
+ def previous_language_names
+ @previous_language_names ||= @repository_languages.map(&:name)
+ end
+
+ def detection
+ @detection ||=
+ @repository
+ .languages
+ .first(MAX_LANGUAGES)
+ .map { |l| [l[:label], l] }
+ .to_h
+ end
+ end
+end
diff --git a/lib/gitlab/middleware/basic_health_check.rb b/lib/gitlab/middleware/basic_health_check.rb
new file mode 100644
index 00000000000..f2a03217098
--- /dev/null
+++ b/lib/gitlab/middleware/basic_health_check.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+# This middleware provides a health check that does not hit the database. Its purpose
+# is to notify the prober that the application server is handling requests, but a 200
+# response does not signify that the database or other services are ready.
+#
+# See https://thisdata.com/blog/making-a-rails-health-check-that-doesnt-hit-the-database/ for
+# more details.
+
+module Gitlab
+ module Middleware
+ class BasicHealthCheck
+ # This can't be frozen because Rails::Rack::Logger wraps the body
+ # rubocop:disable Style/MutableConstant
+ OK_RESPONSE = [200, { 'Content-Type' => 'text/plain' }, ["GitLab OK"]]
+ EMPTY_RESPONSE = [404, { 'Content-Type' => 'text/plain' }, [""]]
+ # rubocop:enable Style/MutableConstant
+ HEALTH_PATH = '/-/health'
+
+ def initialize(app)
+ @app = app
+ end
+
+ def call(env)
+ return @app.call(env) unless env['PATH_INFO'] == HEALTH_PATH
+
+ request = Rack::Request.new(env)
+
+ return OK_RESPONSE if client_ip_whitelisted?(request)
+
+ EMPTY_RESPONSE
+ end
+
+ def client_ip_whitelisted?(request)
+ ip_whitelist.any? { |e| e.include?(request.ip) }
+ end
+
+ def ip_whitelist
+ @ip_whitelist ||= Settings.monitoring.ip_whitelist.map(&IPAddr.method(:new))
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/prometheus/metric.rb b/lib/gitlab/prometheus/metric.rb
index f54b2c6aaff..13cc59df795 100644
--- a/lib/gitlab/prometheus/metric.rb
+++ b/lib/gitlab/prometheus/metric.rb
@@ -3,7 +3,7 @@ module Gitlab
class Metric
include ActiveModel::Model
- attr_accessor :title, :required_metrics, :weight, :y_label, :queries
+ attr_accessor :id, :title, :required_metrics, :weight, :y_label, :queries
validates :title, :required_metrics, :weight, :y_label, :queries, presence: true
diff --git a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb
index e677ec84cd4..8534afcc849 100644
--- a/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb
+++ b/lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb
@@ -8,6 +8,7 @@ module Gitlab
Deployment.find_by(id: deployment_id).try do |deployment|
query_metrics(
deployment.project,
+ deployment.environment,
common_query_context(
deployment.environment,
timeframe_start: (deployment.created_at - 30.minutes).to_f,
diff --git a/lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb b/lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb
index 9273e69e158..e3af217b202 100644
--- a/lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb
+++ b/lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb
@@ -8,6 +8,7 @@ module Gitlab
::Environment.find_by(id: environment_id).try do |environment|
query_metrics(
environment.project,
+ environment,
common_query_context(environment, timeframe_start: 8.hours.ago.to_f, timeframe_end: Time.now.to_f)
)
end
diff --git a/lib/gitlab/prometheus/queries/query_additional_metrics.rb b/lib/gitlab/prometheus/queries/query_additional_metrics.rb
index f5879de1e94..3be35f189d0 100644
--- a/lib/gitlab/prometheus/queries/query_additional_metrics.rb
+++ b/lib/gitlab/prometheus/queries/query_additional_metrics.rb
@@ -2,7 +2,7 @@ module Gitlab
module Prometheus
module Queries
module QueryAdditionalMetrics
- def query_metrics(project, query_context)
+ def query_metrics(project, environment, query_context)
matched_metrics(project).map(&query_group(query_context))
.select(&method(:group_with_any_metrics))
end
@@ -14,12 +14,16 @@ module Gitlab
lambda do |group|
metrics = group.metrics.map do |metric|
- {
+ metric_hsh = {
title: metric.title,
weight: metric.weight,
y_label: metric.y_label,
queries: metric.queries.map(&query_processor).select(&method(:query_with_result))
}
+
+ metric_hsh[:id] = metric.id if metric.id
+
+ metric_hsh
end
{
diff --git a/lib/gitlab/template_helper.rb b/lib/gitlab/template_helper.rb
new file mode 100644
index 00000000000..f24a01e6cf5
--- /dev/null
+++ b/lib/gitlab/template_helper.rb
@@ -0,0 +1,28 @@
+module Gitlab
+ module TemplateHelper
+ include Gitlab::Utils::StrongMemoize
+
+ def prepare_template_environment(file)
+ return unless file
+
+ if Gitlab::ImportExport.object_storage?
+ params[:import_export_upload] = ImportExportUpload.new(import_file: file)
+ else
+ FileUtils.mkdir_p(File.dirname(import_upload_path))
+ FileUtils.copy_entry(file.path, import_upload_path)
+
+ params[:import_source] = import_upload_path
+ end
+ end
+
+ def import_upload_path
+ strong_memoize(:import_upload_path) do
+ Gitlab::ImportExport.import_upload_path(filename: tmp_filename)
+ end
+ end
+
+ def tmp_filename
+ SecureRandom.hex
+ end
+ end
+end
diff --git a/lib/support/nginx/registry-ssl b/lib/support/nginx/registry-ssl
index 92511e26861..908d26a0da2 100644
--- a/lib/support/nginx/registry-ssl
+++ b/lib/support/nginx/registry-ssl
@@ -10,7 +10,7 @@ server {
listen *:80;
server_name registry.gitlab.example.com;
server_tokens off; ## Don't show the nginx version number, a security best practice
- return 301 https://$http_host:$request_uri;
+ return 301 https://$http_host$request_uri;
access_log /var/log/nginx/gitlab_registry_access.log gitlab_access;
error_log /var/log/nginx/gitlab_registry_error.log;
}
diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index a8acafa9cd9..e5b5f3548e4 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -385,14 +385,6 @@ namespace :gitlab do
end
end
- namespace :repo do
- desc "GitLab | Check the integrity of the repositories managed by GitLab"
- task check: :gitlab_environment do
- puts "This task is deprecated. Please use gitlab:git:fsck instead".color(:red)
- Rake::Task["gitlab:git:fsck"].execute
- end
- end
-
namespace :orphans do
desc 'Gitlab | Check for orphaned namespaces and repositories'
task check: :gitlab_environment do
@@ -422,23 +414,6 @@ namespace :gitlab do
end
end
- namespace :user do
- desc "GitLab | Check the integrity of a specific user's repositories"
- task :check_repos, [:username] => :gitlab_environment do |t, args|
- username = args[:username] || prompt("Check repository integrity for username? ".color(:blue))
- user = User.find_by(username: username)
- if user
- repo_dirs = user.authorized_projects.map do |p|
- p.repository.path_to_repo
- end
-
- repo_dirs.each { |repo_dir| check_repo_integrity(repo_dir) }
- else
- puts "\nUser '#{username}' not found".color(:red)
- end
- end
- end
-
# Helper methods
##########################
diff --git a/lib/tasks/gitlab/cleanup.rake b/lib/tasks/gitlab/cleanup.rake
index 5e07b12ee1c..a2feb074b1d 100644
--- a/lib/tasks/gitlab/cleanup.rake
+++ b/lib/tasks/gitlab/cleanup.rake
@@ -7,9 +7,8 @@ namespace :gitlab do
desc "GitLab | Cleanup | Clean namespaces"
task dirs: :gitlab_environment do
warn_user_is_not_gitlab
- remove_flag = ENV['REMOVE']
- namespaces = Namespace.pluck(:path)
+ namespaces = Namespace.pluck(:path)
namespaces << HASHED_REPOSITORY_NAME # add so that it will be ignored
Gitlab.config.repositories.storages.each do |name, repository_storage|
git_base_path = Gitlab::GitalyClient::StorageSettings.allow_disk_access { repository_storage.legacy_disk_path }
@@ -31,7 +30,7 @@ namespace :gitlab do
end
all_dirs.each do |dir_path|
- if remove_flag
+ if remove?
if FileUtils.rm_rf dir_path
puts "Removed...#{dir_path}".color(:red)
else
@@ -43,7 +42,7 @@ namespace :gitlab do
end
end
- unless remove_flag
+ unless remove?
puts "To cleanup this directories run this command with REMOVE=true".color(:yellow)
end
end
@@ -104,5 +103,37 @@ namespace :gitlab do
puts "To block these users run this command with BLOCK=true".color(:yellow)
end
end
+
+ desc "GitLab | Cleanup | Clean orphaned project uploads"
+ task project_uploads: :gitlab_environment do
+ warn_user_is_not_gitlab
+
+ cleaner = Gitlab::Cleanup::ProjectUploads.new(logger: logger)
+ cleaner.run!(dry_run: dry_run?)
+
+ if dry_run?
+ logger.info "To clean up these files run this command with DRY_RUN=false".color(:yellow)
+ end
+ end
+
+ def remove?
+ ENV['REMOVE'] == 'true'
+ end
+
+ def dry_run?
+ ENV['DRY_RUN'] != 'false'
+ end
+
+ def logger
+ return @logger if defined?(@logger)
+
+ @logger = if Rails.env.development? || Rails.env.production?
+ Logger.new(STDOUT).tap do |stdout_logger|
+ stdout_logger.extend(ActiveSupport::Logger.broadcast(Rails.logger))
+ end
+ else
+ Rails.logger
+ end
+ end
end
end
diff --git a/lib/tasks/gitlab/git.rake b/lib/tasks/gitlab/git.rake
index cb4f7e5c8a8..8a53b51d4fe 100644
--- a/lib/tasks/gitlab/git.rake
+++ b/lib/tasks/gitlab/git.rake
@@ -1,87 +1,24 @@
namespace :gitlab do
namespace :git do
- desc "GitLab | Git | Repack"
- task repack: :gitlab_environment do
- failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} repack -a --quiet), "Repacking repo")
- if failures.empty?
- puts "Done".color(:green)
- else
- output_failures(failures)
- end
- end
-
- desc "GitLab | Git | Run garbage collection on all repos"
- task gc: :gitlab_environment do
- failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} gc --auto --quiet), "Garbage Collecting")
- if failures.empty?
- puts "Done".color(:green)
- else
- output_failures(failures)
- end
- end
-
- desc "GitLab | Git | Prune all repos"
- task prune: :gitlab_environment do
- failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} prune), "Git Prune")
- if failures.empty?
- puts "Done".color(:green)
- else
- output_failures(failures)
- end
- end
-
desc 'GitLab | Git | Check all repos integrity'
task fsck: :gitlab_environment do
- failures = perform_git_cmd(%W(#{Gitlab.config.git.bin_path} fsck --name-objects --no-progress), "Checking integrity") do |repo|
- check_config_lock(repo)
- check_ref_locks(repo)
- end
-
- if failures.empty?
- puts "Done".color(:green)
- else
- output_failures(failures)
- end
- end
-
- def perform_git_cmd(cmd, message)
- puts "Starting #{message} on all repositories"
-
failures = []
- all_repos do |repo|
- if system(*cmd, chdir: repo)
- puts "Performed #{message} at #{repo}"
- else
- failures << repo
+ Project.find_each(batch_size: 100) do |project|
+ begin
+ project.repository.fsck
+
+ rescue => e
+ failures << "#{project.full_path} on #{project.repository_storage}: #{e}"
end
- yield(repo) if block_given?
+ puts "Performed integrity check for #{project.repository.full_path}"
end
- failures
- end
-
- def output_failures(failures)
- puts "The following repositories reported errors:".color(:red)
- failures.each { |f| puts "- #{f}" }
- end
-
- def check_config_lock(repo_dir)
- config_exists = File.exist?(File.join(repo_dir, 'config.lock'))
- config_output = config_exists ? 'yes'.color(:red) : 'no'.color(:green)
-
- puts "'config.lock' file exists?".color(:yellow) + " ... #{config_output}"
- end
-
- def check_ref_locks(repo_dir)
- lock_files = Dir.glob(File.join(repo_dir, 'refs/heads/*.lock'))
-
- if lock_files.present?
- puts "Ref lock files exist:".color(:red)
-
- lock_files.each { |lock_file| puts " #{lock_file}" }
+ if failures.empty?
+ puts "Done".color(:green)
else
- puts "No ref lock files exist".color(:green)
+ puts "The following repositories reported errors:".color(:red)
+ failures.each { |f| puts "- #{f}" }
end
end
end
diff --git a/locale/bg/gitlab.po b/locale/bg/gitlab.po
index e257da6e1a3..fe79729d6dd 100644
--- a/locale/bg/gitlab.po
+++ b/locale/bg/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:01\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Bulgarian\n"
"Language: bg_BG\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:39\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s подаване беше пропуÑнато, за да не Ñе натоварва ÑиÑтемата."
@@ -77,6 +99,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -94,6 +119,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -117,16 +145,23 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] ""
msgstr[1] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
-msgid "(checkout the %{link} for information on how to install it)."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
msgid "+ %{moreCount} more"
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "ОтноÑно автоматичното внедрÑване"
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr "ДейноÑÑ‚"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "ДобавÑне на ÑпиÑък Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ½Ð¸"
msgid "Add Contribution guide"
msgstr "ДобавÑне на ръководÑтво за ÑътрудничеÑтво"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr "ДобавÑне на лиценз"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "ДобавÑне на нова папка"
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr ""
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "ÐаиÑтина ли иÑкате да изтриете този план за Ñхема?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Прикачете файл чрез влачене и пуÑкане или %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -529,12 +735,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -804,9 +1118,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -828,6 +1148,9 @@ msgstr "Преглед на файловете"
msgid "Browse files"
msgstr "Разглеждане на файловете"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "от"
@@ -837,9 +1160,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr "Подбиране на това подаване"
msgid "Cherry-pick this merge request"
msgstr "Подбиране на тази заÑвка за Ñливане"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "отказано"
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,16 +1529,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1185,6 +1568,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1218,6 +1613,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1275,6 +1673,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr "РъководÑтво за ÑътрудничеÑтво"
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr "Сътрудници"
@@ -1648,6 +2064,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr "Копиране на адреÑа в буфера за обмен"
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr "Копиране на идентификатора на подаването в буфера за обмен"
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Създайте Ñи личен жетон за доÑтъп в акаунта Ñи, за да можете да изтеглÑте и изпращате промени чрез %{protocol}."
@@ -1699,12 +2139,21 @@ msgstr "Създаване на папка"
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1744,15 +2196,27 @@ msgstr "Ñи Ñъздадете личен жетон за доÑтъп"
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr "ЧаÑова зона за „Cron“"
msgid "Cron syntax"
msgstr "СинтакÑÐ¸Ñ Ð½Ð° „Cron“"
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr "ПерÑонализирани ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° извеÑÑ‚ÑванÐ
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "ПерÑонализираните нива на извеÑÑ‚Ñване Ñа Ñъщите като нивата за учаÑтие. С перÑонализираните нива на извеÑÑ‚Ñване ще можете да получавате и извеÑÑ‚Ð¸Ñ Ð·Ð° избрани ÑъбитиÑ. За да научите повече, прегледайте %{notification_link}."
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "Ðнализ на циклите"
@@ -1792,6 +2265,9 @@ msgstr "Подготовка за издаване"
msgid "CycleAnalyticsStage|Test"
msgstr "ТеÑтване"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1807,15 +2283,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "Задайте потребителÑки шаблон, използвайки ÑинтакÑиÑа на „Cron“"
msgid "Delete"
msgstr "Изтриване"
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "ВнедрÑване"
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr "ОпиÑание"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr "Редактиране на плана %{id} за Ñхема"
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2112,43 +2678,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr "Ð’Ñеки меÑец (на 1-во чиÑло, в 4 ч. Ñутринта
msgid "Every week (Sundays at 4:00am)"
msgstr "Ð’ÑÑка Ñедмица (в неделÑ, в 4 ч. Ñутринта)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr "Файлове"
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Филтриране по Ñъобщение"
@@ -2283,6 +2927,12 @@ msgstr "ТърÑене по път"
msgid "Find file"
msgstr "ТърÑене на файл"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr "Първо"
msgid "FirstPushedBy|pushed by"
msgstr "изпращане на промени от"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "От Ñъздаването на проблема до внедрÑването в крайната верÑиÑ"
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,10 +3247,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Към Вашето разклонение"
msgid "GoToYourFork|Fork"
msgstr "Разклонение"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,30 +3582,83 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr "ВнаÑÑне на хранилище"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr "Шаблон за интервала"
msgid "Introducing Cycle Analytics"
msgstr "ПредÑтавÑме Ви анализа на циклите"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2668,6 +3737,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr "ÐапуÑкане на групата"
msgid "Leave project"
msgstr "ÐапуÑкане на проекта"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2856,18 +3997,30 @@ msgstr "Медиана"
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "добавите SSH ключ"
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,18 +4272,18 @@ msgid_plural "New Issues"
msgstr[0] "Ðов проблем"
msgstr[1] "Ðови проблема"
-msgid "New Kubernetes Cluster"
-msgstr ""
-
-msgid "New Kubernetes cluster"
-msgstr ""
-
msgid "New Label"
msgstr ""
msgid "New Pipeline Schedule"
msgstr "Ðов план за Ñхема"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "Ðов клон"
@@ -3005,6 +4293,9 @@ msgstr ""
msgid "New directory"
msgstr "Ðова папка"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "Ðов файл"
@@ -3041,9 +4332,15 @@ msgstr ""
msgid "New tag"
msgstr "Ðов етикет"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "ÐÑма хранилище"
msgid "No schedules"
msgstr "ÐÑма планове"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3104,12 +4425,21 @@ msgstr "ÐÑма доÑтатъчно данни"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "Ð¡ÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð·Ð° извеÑÑ‚Ñване"
@@ -3182,6 +4512,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3191,6 +4524,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr "Филтър"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Отворен"
@@ -3212,6 +4575,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "Опции"
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr "План за Ñхема"
msgid "Pipeline Schedules"
msgstr "Планове за Ñхема"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr "Ñ ÐµÑ‚Ð°Ð¿Ð¸"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3590,9 +5004,27 @@ msgstr "Връзката към изнеÑените данни на проекÑ
msgid "Project export started. A download link will be sent by email."
msgstr "ИзнаÑÑнето на проекта започна. Ще получите връзка към данните по е-поща."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Име"
@@ -3602,9 +5034,39 @@ msgstr "Ðикога"
msgid "ProjectLifecycle|Stage"
msgstr "Етап"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3623,7 +5085,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3650,9 +5139,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3719,6 +5235,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr "Прочетете повече"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "ПрочетиМе"
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr "Премахване на проекта"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "ЗаÑвка за доÑтъп"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr "ОтмÑна на тази заÑвка за Ñливане"
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr "Планиране на Ñхемите"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr "Изберете целеви клон"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr "ÐаÑтройка на „Koding“"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "зададете парола"
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] "Показване на %d ÑъбитиÑ"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "Преминаване към клон/етикет"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Етапът на програмиране показва времето от първото подаване до Ñъздаването на заÑвката за Ñливане. Данните ще бъдат добавени тук автоматично Ñлед като бъде Ñъздадена първата заÑвка за Ñливане."
msgid "The collection of events added to the data gathered for that stage."
msgstr "СъвкупноÑтта от ÑÑŠÐ±Ð¸Ñ‚Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²ÐµÐ½Ð¸ към данните Ñъбрани за този етап."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "Връзката на разклонение беше премахната."
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr "Етапът от цикъла на разработка"
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "Етапът на планиране показва колко е времето от преходната Ñтъпка до изпращането на първото подаване. Това време ще бъде добавено автоматично Ñлед като изпратите първото Ñи подаване."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "Етапът на издаване показва общото време, което е нужно от Ñъздаването на проблем до внедрÑването на кода в крайната верÑиÑ. Данните ще бъдат добавени автоматично Ñлед като завършите един пълен цикъл и превърнете първата Ñи Ð¸Ð´ÐµÑ Ð² реалноÑÑ‚."
@@ -4460,6 +6192,9 @@ msgstr "Ð’Ñеки впиÑан потребител има доÑтъп до п
msgid "The project can be accessed without any authentication."
msgstr "Ð’Ñеки може да има доÑтъп до проекта, без нужда от удоÑтоверÑване."
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "Хранилището за този проект не ÑъщеÑтвува."
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "Етапът на преглед и одобрение показва времето от Ñъздаването на заÑвката за Ñливане до прилагането Ñ. Данните ще бъдат добавени автоматично Ñлед като приложите първата Ñи заÑвка за Ñливане."
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "Времето, което отнема вÑеки Ð·Ð°Ð¿Ð¸Ñ Ð¾Ñ‚ данни за ÑÑŠÐ¾Ñ‚Ð²ÐµÑ‚Ð½Ð¸Ñ ÐµÑ‚Ð°Ð¿."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "СтойноÑтта, коÑто Ñе намира в Ñредата на поÑледователноÑтта от наблюдавани данни. Ðапример: медианата на 3, 5 и 9 е 5, а медианата на 3, 5, 7 и 8 е (5+7)/2 = 6."
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "Време преди един проблем да бъде планиран за работа"
@@ -4628,6 +6390,9 @@ msgstr "Време преди работата по проблем да запо
msgid "Time between merge request creation and merge/close"
msgstr "Време между Ñъздаване на заÑвка за Ñливане и прилагането/отхвърлÑнето Ñ"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr "Ñек"
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "Общо време"
@@ -4845,9 +6655,18 @@ msgstr "Общо време за теÑтване на вÑички подава
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "Качване на нов файл"
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr "Използване на глобалната Ви наÑтройка за извеÑтиÑта"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Вътрешен"
@@ -5003,6 +6886,9 @@ msgstr "ÐеизвеÑтно"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "ИÑкате ли да видите данните? Помолете админиÑтратор за доÑтъп."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "ÐÑма доÑтатъчно данни за този етап."
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "ОттеглÑне на заÑвката за доÑтъп"
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Ðа път Ñте да премахнете „%{group_name}“. Ðко Ñ Ð¿Ñ€ÐµÐ¼Ð°Ñ…Ð½ÐµÑ‚Ðµ, групата ÐЕ може да бъде възÑтановена! ÐÐИСТИÐРли иÑкате това?"
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "ТрÑбва да Ñе впишете, за да отбележите проект ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð°"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "Ðуждаете Ñе от разрешение."
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "ден"
@@ -5320,9 +7493,25 @@ msgstr[1] "дни"
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/cs_CZ/gitlab.po b/locale/cs_CZ/gitlab.po
index 5fdd7ce8a1a..5e433cec164 100644
--- a/locale/cs_CZ/gitlab.po
+++ b/locale/cs_CZ/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:01\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -15,6 +13,24 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -72,6 +88,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -86,6 +109,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] ""
@@ -99,6 +129,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -118,6 +151,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -143,16 +179,27 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
-msgid "(checkout the %{link} for information on how to install it)."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
msgid "+ %{moreCount} more"
@@ -244,6 +291,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -265,9 +336,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr ""
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -277,9 +357,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -301,12 +390,18 @@ msgstr ""
msgid "Activity"
msgstr ""
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr ""
msgid "Add Contribution guide"
msgstr ""
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -316,6 +411,12 @@ msgstr ""
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr ""
@@ -325,6 +426,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -406,12 +525,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -430,12 +576,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -457,7 +615,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -472,6 +633,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -484,18 +648,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr ""
@@ -511,6 +705,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -520,15 +720,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -556,12 +765,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr ""
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -571,12 +789,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -634,6 +876,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -715,6 +963,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -836,6 +1159,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -848,9 +1174,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -872,6 +1204,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr ""
@@ -881,9 +1216,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -911,6 +1252,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -932,6 +1276,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -947,6 +1297,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -992,6 +1348,12 @@ msgstr ""
msgid "Cherry-pick this merge request"
msgstr ""
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -1007,9 +1369,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -1079,12 +1453,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1094,15 +1477,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1112,12 +1504,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1127,9 +1537,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1151,9 +1558,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1181,16 +1585,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1229,6 +1624,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1238,6 +1642,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1262,6 +1669,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1319,6 +1729,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1355,9 +1768,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1472,6 +1882,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1603,7 +2016,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1615,9 +2028,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1669,6 +2091,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1681,6 +2106,9 @@ msgstr ""
msgid "Contribution guide"
msgstr ""
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr ""
@@ -1696,6 +2124,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr ""
@@ -1708,10 +2154,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr ""
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1720,6 +2166,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1732,6 +2181,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
@@ -1747,12 +2199,21 @@ msgstr ""
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1771,6 +2232,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1792,15 +2256,27 @@ msgstr ""
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr ""
msgid "Cron syntax"
msgstr ""
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1816,6 +2292,15 @@ msgstr ""
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr ""
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr ""
@@ -1840,6 +2325,9 @@ msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1855,15 +2343,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] ""
@@ -1997,9 +2503,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr ""
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -2027,9 +2545,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2072,6 +2608,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2084,12 +2623,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr ""
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2108,6 +2662,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2117,6 +2677,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2126,6 +2689,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2135,6 +2701,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2147,9 +2716,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2162,43 +2740,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
+msgstr ""
+
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2219,6 +2827,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2267,6 +2878,9 @@ msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2276,12 +2890,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2324,6 +2974,12 @@ msgstr ""
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr ""
@@ -2333,6 +2989,12 @@ msgstr ""
msgid "Find file"
msgstr ""
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2342,6 +3004,30 @@ msgstr ""
msgid "FirstPushedBy|pushed by"
msgstr ""
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2376,6 +3062,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -2397,6 +3095,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2418,10 +3311,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2433,18 +3344,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr ""
msgid "GoToYourFork|Fork"
msgstr ""
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2454,18 +3380,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2490,9 +3470,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2532,6 +3536,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2605,12 +3615,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2629,30 +3648,85 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr ""
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2677,7 +3751,10 @@ msgstr ""
msgid "Introducing Cycle Analytics"
msgstr ""
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2686,12 +3763,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2722,6 +3805,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2761,12 +3847,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2843,12 +3935,30 @@ msgstr ""
msgid "Leave project"
msgstr ""
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2870,15 +3980,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2888,6 +4022,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2912,18 +4067,30 @@ msgstr ""
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2954,12 +4121,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2984,6 +4253,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
@@ -2996,21 +4268,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -3020,6 +4307,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -3032,6 +4322,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -3042,16 +4344,16 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "New Kubernetes Cluster"
+msgid "New Label"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Label"
+msgid "New Snippet"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Snippets"
msgstr ""
msgid "New branch"
@@ -3063,6 +4365,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr ""
@@ -3099,9 +4404,15 @@ msgstr ""
msgid "New tag"
msgstr ""
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3126,18 +4437,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr ""
msgid "No schedules"
msgstr ""
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3162,12 +4497,21 @@ msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr ""
@@ -3240,6 +4584,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3249,6 +4596,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr ""
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3258,9 +4614,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr ""
@@ -3270,6 +4647,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr ""
@@ -3279,6 +4662,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3315,6 +4701,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3348,6 +4737,9 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3492,6 +4884,12 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3501,6 +4899,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3510,6 +4917,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3519,6 +4929,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3543,9 +4956,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3573,9 +4992,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3594,6 +5019,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3648,9 +5076,27 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -3660,9 +5106,39 @@ msgstr ""
msgid "ProjectLifecycle|Stage"
msgstr ""
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3681,7 +5157,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3708,9 +5211,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3723,21 +5235,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3762,12 +5277,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3777,6 +5307,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3786,15 +5319,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
msgstr ""
-msgid "Re-deploy"
+msgid "Quarters"
+msgstr ""
+
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr ""
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr ""
@@ -3804,6 +5349,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3855,12 +5403,27 @@ msgstr ""
msgid "Remove project"
msgstr ""
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3870,9 +5433,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr ""
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3894,6 +5463,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3922,13 +5494,22 @@ msgstr ""
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3946,6 +5527,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3955,6 +5551,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3976,6 +5575,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr ""
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -4015,6 +5623,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -4045,12 +5668,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4063,9 +5695,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4090,6 +5728,9 @@ msgstr ""
msgid "Set up Koding"
msgstr ""
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr ""
@@ -4102,9 +5743,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4136,6 +5792,30 @@ msgstr[3] ""
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4148,6 +5828,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4169,6 +5852,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4184,6 +5873,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4226,6 +5918,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4235,6 +5930,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4274,6 +5972,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4346,9 +6047,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4358,9 +6065,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4373,9 +6089,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr ""
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4476,18 +6204,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -4503,7 +6243,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4515,6 +6258,9 @@ msgstr ""
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr ""
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr ""
@@ -4524,6 +6270,9 @@ msgstr ""
msgid "The project can be accessed without any authentication."
msgstr ""
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr ""
@@ -4536,6 +6285,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr ""
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4551,12 +6303,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr ""
@@ -4572,12 +6330,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4599,15 +6351,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4683,6 +6453,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr ""
@@ -4692,6 +6468,9 @@ msgstr ""
msgid "Time between merge request creation and merge/close"
msgstr ""
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4862,12 +6641,30 @@ msgstr ""
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4877,21 +6674,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4904,6 +6725,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr ""
@@ -4913,9 +6737,18 @@ msgstr ""
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4925,9 +6758,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4970,16 +6815,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr ""
@@ -4998,18 +6857,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -5028,15 +6905,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -5058,6 +6947,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr ""
@@ -5073,6 +6968,9 @@ msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr ""
@@ -5085,12 +6983,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5226,12 +7139,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr ""
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
@@ -5247,6 +7172,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5259,6 +7187,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5274,12 +7205,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5298,6 +7241,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr ""
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr ""
@@ -5328,9 +7277,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5346,6 +7304,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5370,18 +7334,241 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] ""
@@ -5392,9 +7579,29 @@ msgstr[3] ""
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5404,12 +7611,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5429,9 +7654,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5492,9 +7732,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5513,6 +7768,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5564,9 +7822,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5607,27 +7862,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/de/gitlab.po b/locale/de/gitlab.po
index c6487a3a77d..53335658c82 100644
--- a/locale/de/gitlab.po
+++ b/locale/de/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: German\n"
"Language: de_DE\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s zusätzlicher Commit wurde ausgelassen um Leistungsprobleme zu verhindern."
@@ -77,6 +99,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -94,6 +119,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -117,18 +145,25 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] "%{storage_name}: fehlgeschlagener Speicherzugriff auf Host:"
msgstr[1] "%{storage_name}: %{failed_attempts} fehlgeschlagene Speicherzugriffe:"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(beachte die Informationen zur Installation auf %{link})."
-
msgid "+ %{moreCount} more"
msgstr ""
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "Ãœber automatische Bereitstellung "
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "Zugriff auf fehlerhafte Speicher wurde vorübergehend deaktiviert, um die Wiederherstellung zu ermöglichen. Für den zukünftigen Zugriff, behebe bitte das Problem und setze danach die Speicherinformationen zurück."
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr "Aktivität"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "Änderungsliste hinzufügen "
msgid "Add Contribution guide"
msgstr "Mitarbeitsanleitung hinzufügen"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr "Lizenz hinzufügen"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Erstelle eine neues Verzeichnis"
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "Anwendungen"
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Bist Du sicher, dass Du diesen Pipeline-Zeitplan löschen möchtest?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr "Bist Du sicher, dass Du den Registrierungstoken zurücksetzen willst?"
msgid "Are you sure you want to reset the health check token?"
msgstr "Bist Du sicher, dass Du den Systemüberwachungstoken zurücksetzen willst?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr "Bist Du sicher?"
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Datei mittels Drag &amp; Drop oder %{upload_link} hinzufügen"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -529,12 +735,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -804,9 +1118,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -828,6 +1148,9 @@ msgstr "Dateien durchsuchen"
msgid "Browse files"
msgstr "Dateien durchsuchen"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "von"
@@ -837,9 +1160,15 @@ msgstr "CI / CD"
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr "Diesen Commit herauspicken "
msgid "Cherry-pick this merge request"
msgstr "Diesen Merge Request herauspicken"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "abgebrochen"
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,16 +1529,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1185,6 +1568,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1218,6 +1613,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1275,6 +1673,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr "Mitarbeitsanleitung"
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr "Mitarbeiter"
@@ -1648,6 +2064,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr "Kopiere URL in die Zwischenablage"
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr "Kopiere Commit SHA in die Zwischenablage"
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Erstelle einen persönlichen Zugriffstoken in Deinem Konto um mittels %{protocol} zu übertragen (push) oder abzurufen (pull)."
@@ -1699,12 +2139,21 @@ msgstr "Erstelle Verzeichnis"
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1744,15 +2196,27 @@ msgstr "Erstelle einen persönlichen Zugriffstoken"
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr "Cron Zeitzone"
msgid "Cron syntax"
msgstr "Cron Syntax"
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr "Individuelle Benachrichtigungsereignisse"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "Individuelle Benachrichtigungsstufen sind identisch mit den Beteiligungsstufen. Mit individuellen Benachrichtigungsstufen erhältst Du ebenfalls Mitteilungen für ausgewählte Ereignisse. Für weitere Informationen lies %{notification_link}. "
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "Arbeitsablaufsanalysen"
@@ -1792,6 +2265,9 @@ msgstr "Staging"
msgid "CycleAnalyticsStage|Test"
msgstr "Test"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1807,15 +2283,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "Erstelle ein individuelles Muster mittels Cron Syntax"
msgid "Delete"
msgstr "Löschen"
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "Bereitstellung"
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr "Beschreibung"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "Details"
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr "Pipeline Zeitplan bearbeiten %{id}"
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2112,43 +2678,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr "Monatlich (am Ersten um 4:00 Uhr)"
msgid "Every week (Sundays at 4:00am)"
msgstr "Wöchentlich (Sonntags um 4:00 Uhr)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr "Dateien"
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Filter nach Commit Nachricht"
@@ -2283,6 +2927,12 @@ msgstr "Finde über den Pfad"
msgid "Find file"
msgstr "Finde Datei"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr "Erster"
msgid "FirstPushedBy|pushed by"
msgstr "übertragen von"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Von der Ticketbeschreibung bis zur Bereitstellung"
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,11 +3247,29 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
-msgstr "GitLab Runner Bereich"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr ""
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Gehe zu Deinem Ableger"
msgid "GoToYourFork|Fork"
msgstr "Ableger"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr "Systemzustand"
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,29 +3582,82 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr "Repository importieren"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
+msgid "Install GitLab Runner"
+msgstr ""
+
msgid "Install Runner on Kubernetes"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "Installiere einen Runner der mit GitLab CI kompatibel ist"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr "Intervallmuster"
msgid "Introducing Cycle Analytics"
msgstr "Arbeitsablaufsanalysen vorgestellt"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr "Ticketereignisse"
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2668,6 +3737,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr "Verlasse die Gruppe"
msgid "Leave project"
msgstr "Verlasse das Projekt"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2856,18 +3997,30 @@ msgstr "Median"
msgid "Members"
msgstr "Mitglieder"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr "Ereignisse zusammenführen"
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr "Nachrichten"
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "einen SSH Schlüssel hinzufügst"
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr "Ãœberwachung"
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr "hier"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,18 +4272,18 @@ msgid_plural "New Issues"
msgstr[0] "Neues Ticket"
msgstr[1] "Neue Tickets"
-msgid "New Kubernetes Cluster"
-msgstr ""
-
-msgid "New Kubernetes cluster"
-msgstr ""
-
msgid "New Label"
msgstr ""
msgid "New Pipeline Schedule"
msgstr "Neuer Pipeline Zeitplan"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "Neuer Branch"
@@ -3005,6 +4293,9 @@ msgstr ""
msgid "New directory"
msgstr "Neues Verzeichnis"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "Neue Datei"
@@ -3041,9 +4332,15 @@ msgstr ""
msgid "New tag"
msgstr "Neuer Tag"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "Kein Repository"
msgid "No schedules"
msgstr "Keine Zeitpläne"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3104,12 +4425,21 @@ msgstr "Nicht genügend Daten"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "Benachrichtigungsereignisse"
@@ -3182,6 +4512,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3191,6 +4524,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr "Filter"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Ungelöst"
@@ -3212,6 +4575,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "Optionen"
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr "Passwort"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr "Zeitplan der Pipeline"
msgid "Pipeline Schedules"
msgstr "Zustände der Pipeline"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr "mit Stages"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr "Profil"
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3590,9 +5004,27 @@ msgstr "Der Link für den Export des Projektes ist abgelaufen. Bitte generiere e
msgid "Project export started. A download link will be sent by email."
msgstr "Export des Projektes gestartet. Ein Link zum herunterladen wir Dir per E-Mail zugesandt."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "Abonnieren"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Name"
@@ -3602,9 +5034,39 @@ msgstr "Niemals"
msgid "ProjectLifecycle|Stage"
msgstr "Stage"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3623,7 +5085,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3650,9 +5139,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3719,6 +5235,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr "Ãœbertragungsereignisse"
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr "Mehr lesen"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "Lies mich"
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr "Projekt entfernen"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "Anfrage auf Zugriff"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr "Merge Request zurücksetzen"
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr "SSH-Schlüssel"
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr "Pipelines planen"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr "Zielbranch auswählen"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr "Koding einrichten"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "ein Passwort festlegst"
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] "Zeige %d Ereignisse"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "Zu Branch/Tag wechseln"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Die Entwicklungsphase stellt die Zeit vom ersten Commit bis zum Erstellen eines Merge Requests dar. Sobald Du Deinen ersten Merge Request anlegst, werden dessen Daten automatisch ergänzt."
msgid "The collection of events added to the data gathered for that stage."
msgstr "Ereignisse, die für diese Phase ausgewertet wurden."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "Die Beziehung des Ablegers wurde entfernt."
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr "Die Phase des Entwicklungslebenszyklus."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "Die Planungsphase stellt die Zeit von der vorherigen Phase bis zum Übertragen des ersten Commits dar. Sobald Du den ersten Commit überträgst, werden dessen Daten hier erscheinen."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "Die Produktionsphase stellt die Gesamtzeit vom Anlegen eines Tickets bis zur Bereitstellung des Codes auf dem Produktivsystem dar. Sobald Du den vollständigen Entwicklungszyklus, von einer Idee bis zur Fertigstellung, durchlaufen hast, erscheinen die zugehörigen Daten hier."
@@ -4460,6 +6192,9 @@ msgstr "Auf das Projekt kann jeder angemeldete Nutzer zugreifen."
msgid "The project can be accessed without any authentication."
msgstr "Auf das Projekt kann ohne Authentifizierung zugegriffen werden."
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "Das Repository für das Projekt existiert nicht."
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "Die Überprüfungsphase stellt die Zeit vom Anlegen eines Merge Requests bis dessen Umsetzung dar. Sobald Du Deinen ersten Merge Request abschließt, werden dessen Daten hier automatisch angezeigt."
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "Zeit, die für das jeweilige Ereignis in der Phase ermittelt wurde."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "Der mittlere aller erfassten Werte. Zum Beispiel ist für 3, 5, 9 der Median 5. Bei 3, 5, 7, 8 ist der Median (5+7)/2 = 6."
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr "Es gibt ein Problem beim Zugriff auf den Gitspeicher:"
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "Zeit bis ein Ticket geplant wird"
@@ -4628,6 +6390,9 @@ msgstr "Zeit bis die Implementierung für ein Ticket beginnt"
msgid "Time between merge request creation and merge/close"
msgstr "Zeit zwischen einem Merge Request und dessen Umsetzung / Schließung"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr "Sek."
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "Gesamtzeit"
@@ -4845,9 +6655,18 @@ msgstr "Gesamte Testzeit für alle Commits/Merges"
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "Eine Neue Datei hochladen"
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "Benutze den folgenden Registrierungstoken während des Setups:"
msgid "Use your global notification setting"
msgstr "Benutze Deine globalen Benachrichtigungseinstellungen"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Intern"
@@ -5003,6 +6886,9 @@ msgstr "Unbekannt"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Du möchtest diese Daten sehen? Bitte frage einen Administrator nach dem Zugang."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "Es liegen nicht genügend Daten vor, um diese Phase anzuzeigen."
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr "Wiki"
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "Zugriffsanfrage widerrufen"
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Du bist dabei %{group_name} zu entfernen. Entfernte Gruppen können NICHT wiederhergestellt werden! Bist Du dir WIRKLICH sicher?"
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "Du musst angemeldet sein, um ein Projekt zu favorisieren."
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "Du brauchst eine Genehmigung."
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "Tag"
@@ -5320,9 +7493,25 @@ msgstr[1] "Tage"
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/eo/gitlab.po b/locale/eo/gitlab.po
index 39e985b244c..1da61800729 100644
--- a/locale/eo/gitlab.po
+++ b/locale/eo/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Esperanto\n"
"Language: eo_UY\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s enmetado estis transsaltita, por ne troÅarÄi la sistemon."
@@ -77,6 +99,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -94,6 +119,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -117,16 +145,23 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] ""
msgstr[1] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
-msgid "(checkout the %{link} for information on how to install it)."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
msgid "+ %{moreCount} more"
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "Pri la aÅ­tomata disponigado"
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr "Aktiveco"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "Aldoni liston de ÅanÄoj"
msgid "Add Contribution guide"
msgstr "Aldoni gvidliniojn por kontribuado"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr "Aldoni rajtigilon"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Aldoni novan dosierujon"
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr ""
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Ĉu vi certe volas forigi ĉi tiun ĉenstablan planon?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Alkroĉu dosieron per Åovmetado aÅ­ %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -529,12 +735,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -804,9 +1118,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -828,6 +1148,9 @@ msgstr "Foliumi dosierojn"
msgid "Browse files"
msgstr "Elekti dosierojn"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "de"
@@ -837,9 +1160,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr "Precize elekti ĉi tiun kunmetadon"
msgid "Cherry-pick this merge request"
msgstr "Precize elekti ĉi tiun peton pri kunfando"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "nuligita"
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,16 +1529,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1185,6 +1568,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1218,6 +1613,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1275,6 +1673,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr "Gvidlinioj por kontribuado"
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr "Kontribuantoj"
@@ -1648,6 +2064,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr "Kopii la adreson en la kopibufron"
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr "Kopii la identigilon de la enmetado"
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Kreu propran atingoĵetonon en via konto por ebligi al vi eltiri kaj alpuÅi per %{protocol}."
@@ -1699,12 +2139,21 @@ msgstr "Krei dosierujon"
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1744,15 +2196,27 @@ msgstr "kreos propran atingoĵetonon"
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr "Horzono por Cron"
msgid "Cron syntax"
msgstr "La sintakso de Cron"
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr "Propraj sciigaj eventoj"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "La propraj sciigaj niveloj estas la samaj kiel la niveloj de partoprenado. Uzante la proprajn sciigajn nivelojn, vi ricevos ankaÅ­ sciigojn por elektitaj de vi eventoj. Por lerni pli, bonvolu vidi %{notification_link}."
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "Cikla analizo"
@@ -1792,6 +2265,9 @@ msgstr "Preparo por eldono"
msgid "CycleAnalyticsStage|Test"
msgstr "Testado"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1807,15 +2283,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "Difini propran Åablonon, uzante la sintakson de Cron"
msgid "Delete"
msgstr "Forigi"
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "Disponigado"
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr "Priskribo"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr "Redakti ĉenstablan planon %{id}"
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2112,43 +2678,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr "Ĉiumonate (en la 1a de la monato, je 4:00)"
msgid "Every week (Sundays at 4:00am)"
msgstr "Ĉiusemajne (en dimanĉo, je 4:00)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr "Dosieroj"
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Filtri per mesaÄo"
@@ -2283,6 +2927,12 @@ msgstr "Trovi per dosierindiko"
msgid "Find file"
msgstr "Trovi dosieron"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr "Unue"
msgid "FirstPushedBy|pushed by"
msgstr "alpuÅita de"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "De la kreado de la problemo Äis la disponigado en la publika versio"
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,10 +3247,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Al via disbranĉigo"
msgid "GoToYourFork|Fork"
msgstr "Disbranĉigo"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,30 +3582,83 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr "Enporti deponejon"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr "Intervala Åablono"
msgid "Introducing Cycle Analytics"
msgstr "Ni prezentas al vi la ciklan analizon"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2668,6 +3737,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr "Forlasi la grupon"
msgid "Leave project"
msgstr "Forlasi la projekton"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2856,18 +3997,30 @@ msgstr "Mediano"
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "aldonos SSH-Ålosilon"
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,18 +4272,18 @@ msgid_plural "New Issues"
msgstr[0] "Nova problemo"
msgstr[1] "Novaj problemoj"
-msgid "New Kubernetes Cluster"
-msgstr ""
-
-msgid "New Kubernetes cluster"
-msgstr ""
-
msgid "New Label"
msgstr ""
msgid "New Pipeline Schedule"
msgstr "Nova ĉenstabla plano"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "Nova branĉo"
@@ -3005,6 +4293,9 @@ msgstr ""
msgid "New directory"
msgstr "Nova dosierujo"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "Nova dosiero"
@@ -3041,9 +4332,15 @@ msgstr ""
msgid "New tag"
msgstr "Nova etikedo"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "Ne estas deponejo"
msgid "No schedules"
msgstr "Ne estas planoj"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3104,12 +4425,21 @@ msgstr "Ne estas sufiĉe da datenoj"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "Sciigaj eventoj"
@@ -3182,6 +4512,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3191,6 +4524,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr "Filtrilo"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Malfermita"
@@ -3212,6 +4575,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "Opcioj"
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr "Ĉenstabla plano"
msgid "Pipeline Schedules"
msgstr "Ĉenstablaj planoj"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr "kun etapoj"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3590,9 +5004,27 @@ msgstr "La ligilo por la projekta elporto eksvalidiÄis. Bonvolu krei novan elpo
msgid "Project export started. A download link will be sent by email."
msgstr "La elporto de la projekto komenciÄis. Vi ricevos ligilon per retpoÅto por elÅuti la datenoj."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Nomo"
@@ -3602,9 +5034,39 @@ msgstr "Neniam"
msgid "ProjectLifecycle|Stage"
msgstr "Etapo"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3623,7 +5085,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3650,9 +5139,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3719,6 +5235,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr "Legu pli"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "LeguMin"
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr "Forigi la projekton"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "Peti atingeblon"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr "Malfari ĉi tiun peton pri kunfando"
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr "Planado de la ĉenstabloj"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr "Elektu celan branĉon"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr "Agordi „Koding“"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "kreos pasvorton"
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] "Estas montrataj %d eventoj"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "Iri al branĉo/etikedo"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "La etapo de programado montras la tempon de la unua enmetado Äis la kreado de la peto pri kunfando. La datenoj aldoniÄos aÅ­tomate ĉi tie post kiam vi kreas la unuan peton pri kunfando."
msgid "The collection of events added to the data gathered for that stage."
msgstr "La aro da eventoj, kiuj estas aldonitaj al la datenoj kolektitaj por la etapo."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "La rilato de disbranĉigo estis forigita."
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr "La etapo de la disvolva ciklo."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "La etapo de la plano montras la tempon de la antaÅ­a Åtupo Äis la alpuÅado de via unua enmetado. Ĉi tiu tempo aldoniÄos aÅ­tomate post kiam vi alpuÅas la unuan enmetadon."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "La etapo de eldonado montras la tutan tempon de la kreado de problemo Äis la disponigado en la publika versio. La datenoj aldoniÄos aÅ­tomate post kiam vi kompletigos plenan ciklon de ideo Äis realaĵo."
@@ -4460,6 +6192,9 @@ msgstr "Ĉiu ensalutita uzanto havas atingon al la projekto"
msgid "The project can be accessed without any authentication."
msgstr "Ĉiu povas havi atingon al la projekto, sen ensaluti"
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "La deponejo por ĉi tiu projekto ne ekzistas."
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "La etapo de la kontrolo montras la tempon de la kreado de la peto pri kunfando Äis Äia aplikado. La datenoj aldoniÄos aÅ­tomate post kiam vi aplikos la unuan peton pri kunfando."
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "La tempo, kiu estas necesa por ĉiu dateno kolektita de la etapo."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "La valoro, kiu troviÄas en la mezo de aro da rigardataj valoroj. Ekzemple: inter 3, 5 kaj 9, la mediano estas 5. Inter 3, 5, 7 kaj 8, la mediano estas (5+7)/2 = 6."
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "Tempo antaÅ­ problemo estas planita por ellabori"
@@ -4628,6 +6390,9 @@ msgstr "Tempo antaÅ­ la komenco de laboro super problemo"
msgid "Time between merge request creation and merge/close"
msgstr "Tempo inter la kreado de poeto pri kunfando kaj Äia aplikado/fermado"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr "s"
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "Totala tempo"
@@ -4845,9 +6655,18 @@ msgstr "Totala tempo por la testado de ĉiuj enmetadoj/kunfandoj"
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "AlÅuti novan dosieron"
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr "Uzi vian Äeneralan agordon pri la sciigoj"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Interna"
@@ -5003,6 +6886,9 @@ msgstr "Nekonata"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Ĉu vi volas vidi la datenojn? Bonvolu peti atingeblon de administranto."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "Ne estas sufiĉe da datenoj por montri ĉi tiun etapon."
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "Nuligi la peton pri atingeblo"
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Vi forigos „%{group_name}“. Oni NE POVAS malfari la forigon de grupo! Ĉu vi estas ABSOLUTE certa?"
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "Oni devas ensaluti por steligi projekton"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "VI bezonas permeson."
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "tago"
@@ -5320,9 +7493,25 @@ msgstr[1] "tagoj"
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/es/gitlab.po b/locale/es/gitlab.po
index 1df233173a1..cbcfb392d0c 100644
--- a/locale/es/gitlab.po
+++ b/locale/es/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:39\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s cambio adicional ha sido omitido para evitar problemas de rendimiento."
@@ -77,6 +99,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} participante"
@@ -94,6 +119,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -117,18 +145,25 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] "%{storage_name}: intento de acceso fallido al almacenamiento en host:"
msgstr[1] "%{storage_name}: %{failed_attempts} intentos de acceso fallido al almacenamiento:"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr "%{text} esta disponible"
msgid "%{title} changes"
msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(para obtener información sobre cómo instalarlo visite %{link})."
-
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} más"
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "Acerca del auto despliegue"
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Reportes de abuso"
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Tokens de acceso"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr "Actividad"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "Agregar Changelog"
msgid "Add Contribution guide"
msgstr "Agregar guía de contribución"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr "Agregar Licencia"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Agregar nuevo directorio"
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Detener todos los trabajos"
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr "Ha ocurrido un error visualizando el blob"
msgid "An error occurred when toggling the notification subscription"
msgstr "Se produjo un error al activar/desactivar la suscripción de notificación"
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr "Se produjo un error. Por favor inténtelo de nuevo."
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr "Apariencia"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "Aplicaciones"
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "¿Estás seguro que deseas eliminar esta programación del pipeline?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr "¿Está seguro que desea reinicializar el token de registro?"
msgid "Are you sure you want to reset the health check token?"
msgstr "¿Está seguro que desea reinicializar el token de Verificación de Estado?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr "¿Estás seguro?"
msgid "Artifacts"
msgstr "Artefactos"
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr "Asignado a"
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Adjunte un archivo arrastrando &amp; soltando o %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -529,12 +735,36 @@ msgstr "Agosto"
msgid "Authentication Log"
msgstr "Registro de Autenticación"
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr "Autores: %{authors}"
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr "Promedio por día: %{average}"
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr "Iniciar con el commit seleccionado"
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -804,9 +1118,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -828,6 +1148,9 @@ msgstr "Examinar archivos"
msgid "Browse files"
msgstr "Examinar archivos"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "por"
@@ -837,9 +1160,15 @@ msgstr "CI / CD"
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr "Configuración de CI/CD"
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr "Escoger este cambio"
msgid "Cherry-pick this merge request"
msgstr "Escoger esta solicitud de fusión"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr "Elegir archivo..."
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "cancelado"
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr "Haga clic para expandir el texto"
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr "Cerrar"
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,18 +1529,9 @@ msgstr "Copiar Token"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Crear cluster de Kubernetes"
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
-msgstr "Ingrese los detalles para un cluster Kubernetes existente"
-
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
@@ -1185,6 +1568,15 @@ msgstr "Proyecto Google Kubernetes Engine"
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr "Instalar"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr "Instalado"
@@ -1218,6 +1613,9 @@ msgstr "cluster de Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Detalles del cluster de Kubernetes"
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr "Integración de cluster de Kubernetes"
@@ -1275,6 +1673,9 @@ msgstr "Administre su cluster de Kubernetes visitando %{link_gke}"
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr "Contraer"
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr "Guía de contribución"
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr "Contribuidores"
@@ -1648,6 +2064,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr "Copiar URL al portapapeles"
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr "Copiar SHA del cambio al portapapeles"
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr "Crear"
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Crear un token de acceso personal en tu cuenta para actualizar o enviar a través de %{protocol}."
@@ -1699,12 +2139,21 @@ msgstr "Crear directorio"
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr "Crear archivo"
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr "Crear nuevo directorio"
msgid "Create new file"
msgstr "Crear nuevo archivo"
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr "Crear nueva etiqueta"
@@ -1744,15 +2196,27 @@ msgstr "crear un token de acceso personal"
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr "Zona horaria del Cron"
msgid "Cron syntax"
msgstr "Sintaxis de Cron"
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr "Eventos de notificaciones personalizadas"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "Los niveles de notificación personalizados son los mismos que los niveles participantes. Con los niveles de notificación personalizados, también recibirá notificaciones para eventos seleccionados. Para obtener más información, consulte %{notification_link}."
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr ""
@@ -1792,6 +2265,9 @@ msgstr "Puesta en escena"
msgid "CycleAnalyticsStage|Test"
msgstr "Pruebas"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr "Todos"
@@ -1807,15 +2283,33 @@ msgstr "Diciembre"
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "Definir un patrón personalizado con la sintaxis de cron"
msgid "Delete"
msgstr "Eliminar"
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "Despliegue"
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr "Descripción"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "Detalles"
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr "Editar Programación del Pipeline %{id}"
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr "Habilitar"
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2112,43 +2678,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr "Actualizado"
msgid "Environments|You don't have any environments right now."
msgstr "No tiene ningún entorno en este momento."
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr "Todos los meses (el día 1 a las 4:00 am)"
msgid "Every week (Sundays at 4:00am)"
msgstr "Todas las semanas (domingos a las 4:00 am)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr "Expandir"
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr "Explorar proyectos"
msgid "Explore public groups"
msgstr "Explorar grupos públicos"
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr "Archivos"
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Filtrar por mensaje del cambio"
@@ -2283,6 +2927,12 @@ msgstr "Buscar por ruta"
msgid "Find file"
msgstr "Buscar archivo"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr "Primer"
msgid "FirstPushedBy|pushed by"
msgstr "enviado por"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Desde la creación de la incidencia hasta el despliegue a producción"
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,11 +3247,29 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
-msgstr "Sección GitLab Runner"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr ""
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Ir a tu bifurcación"
msgid "GoToYourFork|Fork"
msgstr "Bifurcación"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "La autenticación de Google no se encuentra %{link_to_documentation}. Pregúntale a tu administrador de GitLab si quieres usar este servicio."
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Prevenir que se comparta un proyecto de %{group} con otros grupos"
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr "Lo sentimos, no existen grupos que coincidan con su búsqueda"
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr "Lo sentimos, no existen grupos ni proyectos que coincidan con su búsqueda"
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,29 +3582,82 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr "Importar repositorio"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
+msgid "Install GitLab Runner"
+msgstr ""
+
msgid "Install Runner on Kubernetes"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "Instala un Runner compatible con GitLab CI"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr "Patrón de intervalo"
msgid "Introducing Cycle Analytics"
msgstr "Introducción a Cycle Analytics"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr "Eventos de incidencia"
msgid "IssueBoards|Board"
msgstr "Tablero"
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2668,6 +3737,9 @@ msgstr "Junio"
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr "Abandonar grupo"
msgid "Leave project"
msgstr "Abandonar proyecto"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr "Bloqueado"
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
-msgstr "Iniciar sesión"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2856,18 +3997,30 @@ msgstr "Mediana"
msgid "Members"
msgstr "Miembros"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr "Mensajes"
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "agregar una clave SSH"
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,18 +4272,18 @@ msgid_plural "New Issues"
msgstr[0] "Nueva incidencia"
msgstr[1] "Nuevas incidencias"
-msgid "New Kubernetes Cluster"
-msgstr ""
-
-msgid "New Kubernetes cluster"
-msgstr ""
-
msgid "New Label"
msgstr ""
msgid "New Pipeline Schedule"
msgstr "Nueva Programación del Pipeline"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "Nueva rama"
@@ -3005,6 +4293,9 @@ msgstr "Nueva rama no disponible"
msgid "New directory"
msgstr "Nuevo directorio"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "Nuevo archivo"
@@ -3041,9 +4332,15 @@ msgstr "Nuevo sub-grupo"
msgid "New tag"
msgstr "Nueva etiqueta"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "No hay repositorio"
msgid "No schedules"
msgstr "No hay programaciones"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "Ninguno"
@@ -3104,12 +4425,21 @@ msgstr "No hay suficientes datos"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "Eventos de notificación"
@@ -3182,6 +4512,9 @@ msgstr "Noviembre"
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3191,6 +4524,15 @@ msgstr "Octubre"
msgid "OfSearchInADropdown|Filter"
msgstr "Filtrar"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Sólo los miembros de proyecto pueden comentar."
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Abierto"
@@ -3212,6 +4575,12 @@ msgstr "Abre en una nueva ventana"
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "Opciones"
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr "Contraseña"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr "Programación del Pipeline"
msgid "Pipeline Schedules"
msgstr "Programaciones de los Pipelines"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr "con etapas"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr "Preferencias"
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr "Perfil"
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr "Nombre de usuario inválido"
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Escribe tu %{confirmationValue} para confirmar:"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr "Debes transferir o eliminar estos grupos antes de que puedas eliminar tu
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "Actualmente su cuenta es propietaria de estos grupos:"
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr "tu cuenta"
@@ -3590,9 +5004,27 @@ msgstr "El enlace de exportación del proyecto ha caducado. Por favor, genera un
msgid "Project export started. A download link will be sent by email."
msgstr "Se inició la exportación del proyecto. Se enviará un enlace de descarga por correo electrónico."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "Suscribirse"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Nombre"
@@ -3602,9 +5034,39 @@ msgstr "Nunca"
msgid "ProjectLifecycle|Stage"
msgstr "Etapa"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr "Proyectos"
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3623,8 +5085,35 @@ msgstr "Algo salió mal por nuestra parte."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "Lo sentimos, no hay proyectos que coincidan con su búsqueda"
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr "Esta función requiere que el navegador soporte localStorage"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
+msgstr ""
msgid "PrometheusDashboard|Time"
msgstr ""
@@ -3650,9 +5139,18 @@ msgstr "De manera predeterminada, Prometheus escucha en 'http://localhost:9090'.
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "Encontrar y configurar métricas..."
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr "Métricas"
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr "Falta la variable de entorno"
msgid "PrometheusService|More information"
msgstr "Más información"
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr "URL Base de Prometheus, como http://prometheus.example.com/"
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "Público - El grupo y cualquier proyecto público puede ser visto sin autenticación."
@@ -3719,6 +5235,9 @@ msgstr "Público - El proyecto puede ser accedido sin ninguna autenticación."
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr "Eventos Push"
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr "Leer más"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "Léeme"
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr "Eliminar proyecto"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr "Repositorio"
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "Solicitar acceso"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr "Revertir esta solicitud de fusión"
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr "Llaves SSH"
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr "Guardar los cambios"
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr "Programación de Pipelines"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr "Segundos antes de reinicializar información de fallas"
msgid "Seconds to wait for a storage access attempt"
msgstr "Segundos a esperar para intentar acceder al almacenamiento"
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr "Selecciona una rama de destino"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr "Septiembre"
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr "Plantillas de Servicio"
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr "Configurar Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "establecer una contraseña"
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] "Mostrando %d eventos"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr "Ordenar por"
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr "Fuente"
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr "Detenido"
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr "Sub-grupos"
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "Cambiar rama/etiqueta"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr "Hooks de sistema"
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "La etapa de desarrollo muestra el tiempo desde el primer cambio hasta la creación de la solicitud de fusión. Los datos serán automáticamente incorporados aquí una vez creada tu primera solicitud de fusión."
msgid "The collection of events added to the data gathered for that stage."
msgstr "La colección de eventos agregados a los datos recopilados para esa etapa."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "La relación con la bifurcación se ha eliminado."
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr "La etapa del ciclo de vida de desarrollo."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "La etapa de planificación muestra el tiempo desde el paso anterior hasta el envío de tu primera confirmación. Este tiempo se añadirá automáticamente una vez que usted envíe el primer cambio."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "La etapa de producción muestra el tiempo total que tarda entre la creación de una incidencia y el despliegue del código a producción. Los datos se añadirán automáticamente una vez haya finalizado por completo el ciclo de idea a producción."
@@ -4460,6 +6192,9 @@ msgstr "El proyecto puede ser accedido por cualquier usuario conectado."
msgid "The project can be accessed without any authentication."
msgstr "El proyecto puede accederse sin ninguna autenticación."
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "El repositorio para este proyecto no existe."
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "La etapa de revisión muestra el tiempo desde la creación de la solicitud de fusión hasta que los cambios se fusionaron. Los datos se añadirán automáticamente después de fusionar su primera solicitud de fusión."
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "El tiempo utilizado por cada entrada de datos obtenido por esa etapa."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "El valor en el punto medio de una serie de valores observados. Por ejemplo, entre 3, 5, 9, la mediana es 5. Entre 3, 5, 7, 8, la mediana es (5 + 7) / 2 = 6."
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "Tiempo antes de que una incidencia sea programada"
@@ -4628,6 +6390,9 @@ msgstr "Tiempo antes de que empieze la implementación de una incidencia"
msgid "Time between merge request creation and merge/close"
msgstr "Tiempo entre la creación de la solicitud de fusión y la integración o cierre de ésta"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr "s"
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "Tiempo Total"
@@ -4845,9 +6655,18 @@ msgstr "Tiempo total de pruebas para todos los cambios o integraciones"
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr "Desbloquear"
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "Subir nuevo archivo"
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr "Utiliza tu configuración de notificación global"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr "Ver archivo @ "
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr "Ver archivo reemplazado @ "
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Interno"
@@ -5003,6 +6886,9 @@ msgstr "Desconocido"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "¿Quieres ver los datos? Por favor pide acceso al administrador."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "No hay suficientes datos para mostrar en esta etapa."
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr "Wiki"
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "Retirar Solicitud de Acceso"
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Va a eliminar %{group_name}. ¡El grupo eliminado NO puede ser restaurado! ¿Estás TOTALMENTE seguro?"
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "Debes iniciar sesión para destacar un proyecto"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "Necesitas permisos."
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr "nombre de la rama"
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "día"
@@ -5320,9 +7493,25 @@ msgstr[1] "días"
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr "contraseña"
msgid "personal access token"
msgstr "token de acceso personal"
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr "usuario"
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/fil_PH/gitlab.po b/locale/fil_PH/gitlab.po
index 77e7824cb8e..b3275d60379 100644
--- a/locale/fil_PH/gitlab.po
+++ b/locale/fil_PH/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:01\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Filipino\n"
"Language: fil_PH\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: fil\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] ""
@@ -77,6 +99,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -94,6 +119,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -117,16 +145,23 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] ""
msgstr[1] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
-msgid "(checkout the %{link} for information on how to install it)."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
msgid "+ %{moreCount} more"
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr ""
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr ""
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr ""
msgid "Add Contribution guide"
msgstr ""
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr ""
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr ""
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr ""
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr ""
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -529,12 +735,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -804,9 +1118,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -828,6 +1148,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr ""
@@ -837,9 +1160,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr ""
msgid "Cherry-pick this merge request"
msgstr ""
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,16 +1529,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1185,6 +1568,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1218,6 +1613,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1275,6 +1673,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr ""
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr ""
@@ -1648,6 +2064,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr ""
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr ""
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
@@ -1699,12 +2139,21 @@ msgstr ""
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1744,15 +2196,27 @@ msgstr ""
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr ""
msgid "Cron syntax"
msgstr ""
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr ""
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr ""
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr ""
@@ -1792,6 +2265,9 @@ msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1807,15 +2283,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] ""
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr ""
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr ""
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2112,43 +2678,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr ""
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr ""
@@ -2283,6 +2927,12 @@ msgstr ""
msgid "Find file"
msgstr ""
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr ""
msgid "FirstPushedBy|pushed by"
msgstr ""
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,10 +3247,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr ""
msgid "GoToYourFork|Fork"
msgstr ""
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,30 +3582,83 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr ""
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr ""
msgid "Introducing Cycle Analytics"
msgstr ""
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2668,6 +3737,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr ""
msgid "Leave project"
msgstr ""
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2856,18 +3997,30 @@ msgstr ""
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,16 +4272,16 @@ msgid_plural "New Issues"
msgstr[0] ""
msgstr[1] ""
-msgid "New Kubernetes Cluster"
+msgid "New Label"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Label"
+msgid "New Snippet"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Snippets"
msgstr ""
msgid "New branch"
@@ -3005,6 +4293,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr ""
@@ -3041,9 +4332,15 @@ msgstr ""
msgid "New tag"
msgstr ""
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr ""
msgid "No schedules"
msgstr ""
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3104,12 +4425,21 @@ msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr ""
@@ -3182,6 +4512,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3191,6 +4524,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr ""
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr ""
@@ -3212,6 +4575,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr ""
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3590,9 +5004,27 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -3602,9 +5034,39 @@ msgstr ""
msgid "ProjectLifecycle|Stage"
msgstr ""
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3623,7 +5085,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3650,9 +5139,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3719,6 +5235,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr ""
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr ""
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr ""
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr ""
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr ""
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr ""
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr ""
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr ""
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] ""
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr ""
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr ""
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr ""
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr ""
@@ -4460,6 +6192,9 @@ msgstr ""
msgid "The project can be accessed without any authentication."
msgstr ""
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr ""
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr ""
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr ""
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr ""
@@ -4628,6 +6390,9 @@ msgstr ""
msgid "Time between merge request creation and merge/close"
msgstr ""
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr ""
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr ""
@@ -4845,9 +6655,18 @@ msgstr ""
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr ""
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr ""
@@ -5003,6 +6886,9 @@ msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr ""
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr ""
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr ""
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr ""
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] ""
@@ -5320,9 +7493,25 @@ msgstr[1] ""
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/fr/gitlab.po b/locale/fr/gitlab.po
index a7627d3f774..165dc97055b 100644
--- a/locale/fr/gitlab.po
+++ b/locale/fr/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-02 17:23\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] "%d métrique"
msgstr[1] "%d métriques"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] "%d changement à valider"
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] "%d changement qui ne sera pas validé"
msgstr[1] "%d changements qui ne seront pas validés"
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s commit supplémentaire a été ignoré afin d’éviter de causer des problèmes de performance."
@@ -77,6 +99,9 @@ msgstr "%{actionText} et %{openOrClose} %{noteable}"
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "%{commit_author_link} a créé %{commit_timeago}"
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} participant·e"
@@ -94,6 +119,9 @@ msgstr "%{loadingIcon} Démarré"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} est verrouillé par l’utilisateur GitLab %{lock_user_id}"
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr "%{nip_domain} peut être utilisé comme alternative à un domaine personnalisé."
@@ -117,18 +145,25 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] "%{storage_name} : la tentative d’accès au stockage a échoué sur l’hôte :"
msgstr[1] "%{storage_name} : %{failed_attempts} tentatives d’accès au stockage ont échoué :"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr "%{text} est disponible"
msgid "%{title} changes"
msgstr "Changements %{title}"
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr "%{staged} changements prêts à être validés et %{unstaged} autres changements"
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(lisez %{link} pour savoir comment l’installer)."
-
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} de plus"
@@ -202,6 +237,30 @@ msgstr "Page introuvable"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr "Veuillez contacter votre administrateur GitLab si vous pensez qu’il s’agit d’une erreur."
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr "<strong>%{created_count}</strong> créés, <strong>%{closed_count}</strong> clos."
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr "<strong>%{pushes}</strong> poussées Git, plus de <strong>%{commits}</strong> commits effectués par <strong>%{people}</strong> contributeurs."
+
msgid "<strong>Removes</strong> source branch"
msgstr "<strong>Supprime</strong> la branche source"
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr "Une personne avec un accès en écriture à la branche source a sélectionné cette option"
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "À propos de l’autoâ€déploiement"
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Rapports d’abus"
@@ -235,14 +303,23 @@ msgstr "Rapports d’abus"
msgid "Accept terms"
msgstr "Accepter les conditions"
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Jetons d’accès"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "L’accès aux stockages défaillants a été temporairement désactivé pour permettre la récupération du montage. Réinitialisez les informations de stockage quand le problème sera résolu pour permettre à nouveau l’accès."
msgid "Access your runner token, customize your pipeline configuration, and view your pipeline status and coverage report."
-msgstr ""
+msgstr "Accédez à votre jeton d’exécuteur, personnalisez la configuration de votre pipeline et affichez l’état de votre pipeline et le rapport de couverture."
msgid "Account"
msgstr "Compte"
@@ -259,12 +336,18 @@ msgstr "Sessions actives"
msgid "Activity"
msgstr "Activité"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "Ajouter un journal des modifications"
msgid "Add Contribution guide"
msgstr "Ajouter un guide de contribution"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr "Ajouter une grappe de serveurs Kubernetes"
@@ -274,6 +357,12 @@ msgstr "Ajouter une licence"
msgid "Add Readme"
msgstr "Ajouter un fichier Readme"
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Ajouter un nouveau dossier"
@@ -283,6 +372,24 @@ msgstr "Ajouter une réaction"
msgid "Add todo"
msgstr "Ajouter à la liste « à faire »"
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Arrêter toutes les tâches"
@@ -364,12 +471,39 @@ msgstr "Autoriser les requêtes sur le réseau local à partir de hooks et de se
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Vous permet d’ajouter et de gérer des grappes de serveurs Kubernetes."
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr "Également appelé « émetteur » ou « identifiant du tiers de confiance »"
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr "Aussi appelée « adresse URL du service du tiers de confiance » ou « URL de réponse »"
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr "Vous pouvez également utiliser un %{personal_access_token_link}. Lorsque vous créerez votre jeton d’accès, vous devrez sélectionner le champ <code>repo</code>, afin que nous puissions afficher une liste de vos dépôts publics et privés qui sont disponibles pour être importés."
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr "Une erreur est survenue lors de la création de la nouvelle branche."
+msgid "An error occured whilst fetching the job trace."
+msgstr "Une erreur est survenue pendant le rapatriement de la trace de la tâche."
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr "Une erreur est survenue lors du rapatriement de dernier pipeline."
+
msgid "An error occured whilst loading all the files."
msgstr "Une erreur est survenue lors du chargement de l’ensemble des fichiers."
@@ -388,12 +522,24 @@ msgstr "Une erreur est survenue lors du chargement des données de version de la
msgid "An error occured whilst loading the merge request."
msgstr "Une erreur est survenue lors du chargement de la demande de fusion."
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr "Une erreur est survenue lors du chargement des tâches des pipelines."
+
msgid "An error occurred previewing the blob"
msgstr "Une erreur s’est produite lors de la prévisualisation du blob"
msgid "An error occurred when toggling the notification subscription"
msgstr "Une erreur s’est produite lors de l’activation ou la désactivation de l’abonnement aux notifications"
+msgid "An error occurred when updating the issue weight"
+msgstr "Une erreur est survenue lors de la mise à jour du poids du ticket"
+
+msgid "An error occurred while adding approver"
+msgstr "Une erreur s’est produite lors de l’ajout de l’approba·teur·trice"
+
+msgid "An error occurred while detecting host keys"
+msgstr "Une erreur est survenue lors de la détection des clefs de l’hôte"
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr "Une erreur s’est produite lors de la révocation de l’alerte. Actualisez la page et essayez à nouveau."
@@ -415,8 +561,11 @@ msgstr "Une erreur s’est produite lors de la récupération des projets"
msgid "An error occurred while importing project: ${details}"
msgstr "Une erreur s’est produite lors de l’importation du projet : ${details}"
-msgid "An error occurred while loading commits"
-msgstr "Une erreur s’est produite lors du chargement des commits"
+msgid "An error occurred while initializing path locks"
+msgstr "Une erreur est survenue lors de l’initialisation des verrous des chemins d’accès"
+
+msgid "An error occurred while loading commit signatures"
+msgstr ""
msgid "An error occurred while loading diff"
msgstr "Une erreur s’est produite lors du chargement du diff"
@@ -430,6 +579,9 @@ msgstr "Une erreur s’est produite lors du chargement du fichier"
msgid "An error occurred while making the request."
msgstr "Une erreur s’est produite lors de la requête."
+msgid "An error occurred while removing approver"
+msgstr "Une erreur est survenue lors de la suppression de l’approba·teur·trice"
+
msgid "An error occurred while rendering KaTeX"
msgstr "Une erreur s’est produite lors du rendu de KaTeX"
@@ -442,18 +594,48 @@ msgstr "Une erreur s’est produite lors de la récupération de l’activité d
msgid "An error occurred while retrieving diff"
msgstr "Une erreur s’est produite lors de la récupération du diff"
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr "Une erreur est survenue lors de l’enregistrement du statut du remplacement LDAP. Veuillez réessayer."
+
msgid "An error occurred while saving assignees"
msgstr "Une erreur s’est produite lors de l’enregistrement des destinataires"
+msgid "An error occurred while subscribing to notifications."
+msgstr "Une erreur est survenue lors de l’abonnement aux notifications."
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr "Une erreur est survenue lors du désabonnement aux notifications."
+
msgid "An error occurred while validating username"
msgstr "Une erreur s’est produite lors de la validation du nom d’utilisateur·rice"
msgid "An error occurred. Please try again."
msgstr "Une erreur est survenue. Merci de réessayer."
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr "Apparence"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "Applications"
@@ -469,6 +651,12 @@ msgstr "Projet archivé ! Le dépôt et les autres ressources du projet sont e
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Êtesâ€vous sûr·e de vouloir supprimer ce pipeline programmé ?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr "Êtes-vous sûr·e de vouloir supprimer cette identité ?"
@@ -478,15 +666,24 @@ msgstr "Êtesâ€vous sûr·e de vouloir réinitialiser le jeton d’inscriptionâ
msgid "Are you sure you want to reset the health check token?"
msgstr "Êtesâ€vous sûr·e de vouloir réinitialiser le jeton de bilan de santé ?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr "Êtesâ€vous sûr·e de vouloir déverrouiller %{path_lock_path} ?"
+
msgid "Are you sure?"
msgstr "Êtesâ€vous certain(e) ?"
msgid "Artifacts"
msgstr "Artéfacts"
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr "Demandez au responsable du groupe de configurer un exécuteur de groupe."
+msgid "Assertion consumer service URL"
+msgstr "URL du service consommateur d’assertion"
+
msgid "Assign custom color like #FF0000"
msgstr "Attribuer une couleur personnalisée comme #FF0000"
@@ -514,12 +711,21 @@ msgstr "Assigné à moi"
msgid "Assignee"
msgstr "Assigné·e"
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr "Assigné·e(s)"
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Attachez un fichier par glisserâ€déposer ou %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr "août"
@@ -529,12 +735,36 @@ msgstr "août"
msgid "Authentication Log"
msgstr "Journal d’authentification"
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr "Auteur·e"
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr "Auteur·e·s : %{authors}"
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr "Auto DevOps activé"
@@ -592,6 +822,12 @@ msgstr "L’avatar sera supprimé. Êtesâ€vous sûr·e ?"
msgid "Average per day: %{average}"
msgstr "Moyenne par jour : %{average}"
+msgid "Background Color"
+msgstr "Couleur de fond"
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr "Couleur d’arrièreâ€plan"
@@ -673,6 +909,81 @@ msgstr "Commencer avec le commit sélectionné"
msgid "Below are examples of regex for existing tools:"
msgstr "Voici quelques exemples d’expressions rationnelles pour des outils existants :"
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr "Facturation"
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr "%{group_name} est actuellement sur le calendrier de facturation %{plan_link}."
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr "La rétrogradation automatique et la mise à niveau vers certains calendriers de facturation ne sont actuellement pas disponibles."
+
+msgid "BillingPlans|Current plan"
+msgstr "Calendrier actuel"
+
+msgid "BillingPlans|Customer Support"
+msgstr "Service client"
+
+msgid "BillingPlans|Downgrade"
+msgstr "Rétrograder"
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr "En savoir plus sur chaque calendrier de facturation en lisant notre %{faq_link}."
+
+msgid "BillingPlans|Manage plan"
+msgstr "Gérer le calendrier"
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr "Veuillez contacter le %{customer_support_link} dans ce cas."
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr "Afficher toutes les caractéristiques de %{plan_name}"
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr "Ce groupe utilise le plan associé à son groupe parent."
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr "Pour gérer le calendrier de facturation de ce groupe, rendez vous à la section facturation de %{parent_billing_page_link}."
+
+msgid "BillingPlans|Upgrade"
+msgstr "Mise à niveau"
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr "Vous êtes actuellement sur le calendrier %{plan_link}."
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr "caractéristiques"
+
+msgid "BillingPlans|frequently asked questions"
+msgstr "foire aux questions"
+
+msgid "BillingPlans|monthly"
+msgstr "mensuel"
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr "au prix annuel de %{price_per_year}"
+
+msgid "BillingPlans|per user"
+msgstr "par utilisateur"
+
+msgid "Bitbucket import"
+msgstr "Importation de Bitbucket"
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr "Tableaux"
@@ -792,6 +1103,9 @@ msgstr "Périmée"
msgid "Branches|Stale branches"
msgstr "Branches périmées"
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr "Cette branche ne peut pas être mise à jour automatiquement car elle a divergé de son homologue en amont."
+
msgid "Branches|The default branch cannot be deleted"
msgstr "La branche par défaut ne peut pas être supprimée"
@@ -804,9 +1118,15 @@ msgstr "Afin d’éviter de perdre des données, il est conseillé de fusionner
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "Pour confirmer, veuillez saisir %{branch_name_confirmation} :"
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr "Pour rejeter les changements locaux et écraser la branche avec la version du dépôt en amont, veuillez la supprimer ici et cliquer sur « Mettre à jour maintenant » ciâ€dessus."
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "Vous êtes sur le point de supprimer définitivement la branche protégée « %{branch_name} »."
+msgid "Branches|diverged from upstream"
+msgstr "en divergence du dépôt en amont"
+
msgid "Branches|merged"
msgstr "fusionnée"
@@ -828,6 +1148,9 @@ msgstr "Parcourir les fichiers"
msgid "Browse files"
msgstr "Parcourir les fichiers"
+msgid "Business metrics (Custom)"
+msgstr "Métriques commerciales (personnalisées)"
+
msgid "ByAuthor|by"
msgstr "par"
@@ -837,9 +1160,15 @@ msgstr "Intégration et livraison continues"
msgid "CI / CD Settings"
msgstr "Paramètres CI / CD (intégration et livraison continues)"
+msgid "CI/CD"
+msgstr "Intégration et livraison continues"
+
msgid "CI/CD configuration"
msgstr "Configuration de l’intégration et de la livraison continues"
+msgid "CI/CD for external repo"
+msgstr "Intégration et livraison continues pour dépôt externe"
+
msgid "CI/CD settings"
msgstr "Paramètres de l’intégration et de la livraison continues"
@@ -867,6 +1196,9 @@ msgstr "La stratégie de déploiement nécessite un nom de domaine pour fonction
msgid "CICD|Disable Auto DevOps"
msgstr "Désactiver Auto DevOps"
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr "Ne définissez pas un domaine ici si vous mettez en place plusieurs grappes de serveurs Kubernetes avec Auto DevOps."
+
msgid "CICD|Enable Auto DevOps"
msgstr "Activer Auto DevOps"
@@ -888,6 +1220,12 @@ msgstr "La configuration de pipeline de l’Auto DevOps sera utilisée lorsqu’
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr "Vous devez spécifier un domaine si vous voulez utiliser la revue automatique d’applications Auto Review Apps et le déploiement automatique d’étapes Auto Deploy stages."
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr "Impossible de trouver le dernier commit (HEAD) pour cette branche"
@@ -903,6 +1241,12 @@ msgstr "Ne peut être fusionnée automatiquement"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Impossible de modifier la grappe de serveurs gérée par Kubernetes"
+msgid "Certificate fingerprint"
+msgstr "Empreinte du certificat"
+
+msgid "Change Weight"
+msgstr "Modifier le poids"
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr "Modifiez cette valeur pour influencer la fréquence d’interrogation de l’interface utilisateur GitLab pour les mises à jour."
@@ -948,6 +1292,12 @@ msgstr "Picorer ce commit"
msgid "Cherry-pick this merge request"
msgstr "Picorer cette demande de fusion"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr "Choisir le fichier…"
@@ -963,9 +1313,21 @@ msgstr "Choisissez entre <code>clone</code> ou <code>fetch</code> pour obtenir l
msgid "Choose file..."
msgstr "Choisir le fichier…"
+msgid "Choose the top-level group for your repository imports."
+msgstr "Choisissez le groupe de premier niveau pour vos importations dans le dépôt."
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr "Choisissez les groupes que vous souhaitez synchroniser avec ce nœud secondaire."
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr "Choisissez quels dépôts vous voulez connecter pour exécuter des pipelines d’intégration et de livraison continues (CI/CD)."
+
msgid "Choose which repositories you want to import."
msgstr "Choisissez les dépôts que vous voulez importer."
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "annulé"
@@ -1035,12 +1397,21 @@ msgstr "* (tout environnement)"
msgid "CiVariable|All environments"
msgstr "Tous les environnements"
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr "Une erreur s’est produite pendant la sauvegarde des variables"
+msgid "CiVariable|New environment"
+msgstr "Nouvel environnement"
+
msgid "CiVariable|Protected"
msgstr "Protégée"
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr "Changer l’état de protection"
@@ -1050,15 +1421,24 @@ msgstr "La validation a échoué"
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr "CircuitBreaker API"
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr "Vider le champ de recherche"
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr "Cliquez sur n’importe quel <strong>nom de projet</strong> dans la liste des projets ciâ€dessous pour naviguer jusqu’au jalon du projet."
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr "Cliquez sur le bouton <strong>Promouvoir</strong> en haut à droite pour le promouvoir en tant que jalon de groupe."
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr "Cliquez sur le bouton <strong>Sélectionner aucun</strong> sur la droite, puisque nous n’avons seulement besoin que de « Google Code Project Hosting »."
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr "Cliquez sur le bouton ci-dessous pour lancer le processus d’installation en accédant à la page Kubernetes"
@@ -1068,12 +1448,30 @@ msgstr "Cliquez pour l’agrandir."
msgid "Click to expand text"
msgstr "Cliquez pour agrandir le texte"
+msgid "Client authentication certificate"
+msgstr "Certificat d’authentification du client"
+
+msgid "Client authentication key"
+msgstr "Clef d’authentification du client"
+
+msgid "Client authentication key password"
+msgstr "Mot de passe de la clef d’authentification client"
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr "Cloner le dépôt"
msgid "Close"
msgstr "Fermer"
+msgid "Closed"
+msgstr "Fermé(e)"
+
+msgid "Closed issues"
+msgstr "Tickets clos"
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr "%{appList} a été installé avec succès sur votre grappe de serveurs Kubernetes"
@@ -1083,9 +1481,6 @@ msgstr "URL de l’API"
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Ajouter une grappe de serveurs Kubernetes"
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr "Ajouter une grappe de serveurs Kubernetes existante"
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr "Options avancées concernant l’intégration de cette grappe de serveurs Kubernetes"
@@ -1107,9 +1502,6 @@ msgstr "Certificat d’autorité de certification"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Ensemble de certificats des autorités de certification (format PEM)"
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr "Choisissez comment configurer l’intégration de la grappe de serveurs Kubernetes"
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr "Choisissez les environnements de votre projet qui utiliseront cette grappe de serveurs Kubernetes."
@@ -1137,17 +1529,8 @@ msgstr "Copier le jeton"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Créer une grappe de serveurs Kubernetes"
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr "Créer un cluster Kubernetes sur Google Kubernetes Engine"
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr "Créer une nouvelle grappe de serveurs Kubernetes sur Google Kubernetes Engine directement depuis GitLab"
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr "Créer sur Google Kubernetes Engine"
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
-msgstr "Entrer les détails pour la grappe de serveurs Kubernetes existante"
+msgid "ClusterIntegration|Did you know?"
+msgstr "Le saviezâ€vous ?"
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Entrez les détails de votre grappe de serveurs Kubernetes"
@@ -1185,6 +1568,15 @@ msgstr "Projet Google Kubernetes Engine"
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
+msgid "ClusterIntegration|Hide"
+msgstr "Masquer"
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr "Si vous configurez plusieurs grappes de serveurs et que vous utilisez Auto DevOps, %{help_link_start}veillez d’abord lire ceci%{help_link_end}."
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr "Afin d’afficher son état de santé, nous devons mettre votre grappe de serveurs à disposition de Prometheus pour récupérer les données nécessaires."
+
msgid "ClusterIntegration|Ingress"
msgstr "Ingress"
@@ -1194,6 +1586,9 @@ msgstr "Adresse IP Ingress"
msgid "ClusterIntegration|Install"
msgstr "Installer"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr "Installer Prometheus"
+
msgid "ClusterIntegration|Installed"
msgstr "Installé"
@@ -1218,6 +1613,9 @@ msgstr "Grappe de serveurs Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Détails de la grappe de serveurs Kubernetes"
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr "État de santé de la grappe de serveurs Kubernetes"
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr "Intégration d’une grappe de serveurs Kubernetes"
@@ -1275,6 +1673,9 @@ msgstr "Gérez votre grappe de serveurs Kubernetes en visitant %{link_gke}"
msgid "ClusterIntegration|More information"
msgstr "Plus d’informations"
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr "Plusieurs grappes de serveurs Kubernetes sont disponibles dans GitLab Enterprise Edition Premium et Ultimate"
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr "Aucun type de machine ne correspond à votre recherche"
@@ -1311,9 +1712,6 @@ msgstr "Prometheus"
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr "Lisez notre %{link_to_help_page} sur l’intégration d’une grappe de serveurs Kubernetes."
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr "Recevez jusqu’à 500 US$ de crédit gratuit pour Google Cloud Platform"
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr "Supprimer l’intégration de la grappe de serveurs Kubernetes"
@@ -1428,6 +1826,9 @@ msgstr "correctement configuré"
msgid "ClusterIntegration|sign up"
msgstr "s’inscrire"
+msgid "Cohorts"
+msgstr "Cohortes"
+
msgid "Collapse"
msgstr "Réduire"
@@ -1505,7 +1906,7 @@ msgid "Committed by"
msgstr "Commit de"
msgid "Commit…"
-msgstr ""
+msgstr "Commit…"
msgid "Compare"
msgstr "Comparer"
@@ -1555,8 +1956,8 @@ msgstr "Configurer les vérifications Git automatiques et la maintenance des dé
msgid "Configure limits for web and API requests."
msgstr "Configurer les limites pour les requêtes Web et d’API."
-msgid "Configure push mirrors."
-msgstr "Configurez les miroirs où pousser le code."
+msgid "Configure push and pull mirrors."
+msgstr "Configurez les miroirs où récupérer et pousser le code."
msgid "Configure storage path and circuit breaker settings."
msgstr "Configurez les paramètres du chemin de stockage et du disjoncteur."
@@ -1567,9 +1968,18 @@ msgstr "Configurez la façon dont un·e utilisateur·rice crée un nouveau compt
msgid "Connect"
msgstr "Connecter"
+msgid "Connect all repositories"
+msgstr "Connecter tous les dépôts"
+
msgid "Connect repositories from GitHub"
msgstr "Se connecter à des dépôts à partir de GitHub"
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr "Connectez vos dépôts externes afin que les pipelines d’intégration et de livraison continues (CI/CD) s’exécutent lors de nouveaux commits. Un projet GitLab sera créé avec uniquement les fonctionnalités CI/CD activées."
+
+msgid "Connecting..."
+msgstr "Connexion en cours…"
+
msgid "Container Registry"
msgstr "Registre de conteneur"
@@ -1621,6 +2031,9 @@ msgstr "Vous pouvez également utiliser un %{deploy_token} pour un accès en lec
msgid "Continue"
msgstr "Continuer"
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "Intégration et déploiement continus"
@@ -1633,6 +2046,9 @@ msgstr "Contribution"
msgid "Contribution guide"
msgstr "Guide de contribution"
+msgid "Contributions per group member"
+msgstr "Contributions par membre du groupe"
+
msgid "Contributors"
msgstr "Contributeurs"
@@ -1648,6 +2064,24 @@ msgstr "Commits sur %{branch_name}, à l’exclusion des commits de fusion (limi
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr "Veuillez patienter, cette page va être automatiquement actualisée."
+msgid "Control the display of third party offers."
+msgstr "Contrôle l’affichage des offres tierces."
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "Contrôle la concurrence maximale du remplissage du stockage pour les gros fichiers (LFS) pour ce nœud secondaire"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "Contrôle la concurrence maximale des remplacements de dépôt pour ce nœud secondaire"
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr "Contrôle la concurrence maximale des opérations de vérification pour ce nœud Geo"
+
+msgid "ConvDev Index"
+msgstr "Index ConvDev"
+
+msgid "Copy SSH public key to clipboard"
+msgstr "Copier la clef SSH publique dans le presseâ€papiers"
+
msgid "Copy URL to clipboard"
msgstr "Copier l’URL dans le presseâ€papiers"
@@ -1660,18 +2094,21 @@ msgstr "Copier la commande dans le presseâ€papiers"
msgid "Copy commit SHA to clipboard"
msgstr "Copier le condensat SHA du commit"
-msgid "Copy file name to clipboard"
-msgstr "Copier le nom du fichier dans le presseâ€papiers"
-
msgid "Copy file path to clipboard"
msgstr "Copier le chemin d’accès du fichier dans le presseâ€papiers"
+msgid "Copy incoming email address to clipboard"
+msgstr "Copier l’adresse de courriel de l’expéditeur dans le presse-papiers"
+
msgid "Copy reference to clipboard"
msgstr "Copier la référence dans le presseâ€papiers"
msgid "Copy to clipboard"
msgstr "Copier dans le presseâ€papiers"
+msgid "Copy token to clipboard"
+msgstr "Copier le jeton dans le presseâ€papiers"
+
msgid "Create"
msgstr "Créer"
@@ -1684,6 +2121,9 @@ msgstr "Créer une nouvelle branche"
msgid "Create a new branch and merge request"
msgstr "Créer une nouvelle branche et une nouvelle demande de fusion"
+msgid "Create a new issue"
+msgstr "Créer un nouveau ticket"
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Créer un jeton d’accès personnel pour votre compte afin de récupérer ou pousser par %{protocol}."
@@ -1699,12 +2139,21 @@ msgstr "Créer un dossier"
msgid "Create empty repository"
msgstr "Créer un dépôt vide"
+msgid "Create epic"
+msgstr "Créer l’épopée"
+
msgid "Create file"
msgstr "Créer un fichier"
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr "Créer une étiquette de groupe"
+msgid "Create issue"
+msgstr "Créer un ticket"
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Créer des listes à partir d’étiquettes. Les tickets avec l’étiquette sélectionnée apparaissent dans cette liste."
@@ -1723,6 +2172,9 @@ msgstr "Créer un nouveau dossier"
msgid "Create new file"
msgstr "Créer un nouveau fichier"
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr "Créer une nouvelle étiquette"
@@ -1744,15 +2196,27 @@ msgstr "Créer un jeton d’accès personnel"
msgid "Created"
msgstr "Créé"
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr "Créé par moi"
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr "Création de l’épopée en cours"
+
msgid "Cron Timezone"
msgstr "Fuseau horaire des tâches planifiées cron"
msgid "Cron syntax"
msgstr "Syntaxe de la planification cron"
+msgid "Current node"
+msgstr "NÅ“ud actuel"
+
msgid "CurrentUser|Profile"
msgstr "Profil"
@@ -1768,6 +2232,15 @@ msgstr "Événements de notification personnalisés"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "Les niveaux de notification personnalisés sont similaires aux niveaux de participation. Cependant, ils permettent de recevoir également des notifications pour une sélection d’événements. Pour plus d’information, vous pouvez consulter %{notification_link}."
+msgid "Customize colors"
+msgstr "Personnaliser les couleurs"
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "Analyse de cycle"
@@ -1792,6 +2265,9 @@ msgstr "Préproduction"
msgid "CycleAnalyticsStage|Test"
msgstr "Test"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr "Tous"
@@ -1807,15 +2283,33 @@ msgstr "décembre"
msgid "Decline and sign out"
msgstr "Refuser et se déconnecter"
+msgid "Default classification label"
+msgstr "Étiquette de classement par défaut"
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "Définir un schéma personnalisé avec une syntaxe Cron"
msgid "Delete"
msgstr "Supprimer"
+msgid "Delete Snippet"
+msgstr "Supprimer L’extrait de code"
+
msgid "Delete list"
msgstr "Supprimer la liste"
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr "Refuser"
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "Déploiement"
@@ -1947,9 +2441,21 @@ msgstr "Votre nouveau jeton de déploiement pour votre projet a été créé."
msgid "Deprioritize label"
msgstr "Déprioriser l’étiquette"
+msgid "Descending"
+msgstr "Décroissant"
+
msgid "Description"
msgstr "Description"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr "Les modèles de description permettent de définir des modèles spécifiques au contexte et propres à votre projet pour les champs de description des tickets et des demandes de fusion."
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr "Détruire"
+
msgid "Details"
msgstr "Détails"
@@ -1977,9 +2483,27 @@ msgstr "Abandonner les modifications"
msgid "Discard draft"
msgstr "Abandonner le brouillon"
+msgid "Discover GitLab Geo."
+msgstr "Découvrez GitLab Geo."
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr "Passer l’introduction à Cycle Analytics"
+msgid "Dismiss Merge Request promotion"
+msgstr "Rejeter la promotion de la demande de fusion"
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr "Documentation des principaux fournisseurs d’identité"
+
msgid "Domain"
msgstr "Domaine"
@@ -2022,6 +2546,9 @@ msgstr "Votes négatifs"
msgid "Due date"
msgstr "Date d’échéance"
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr "Au cours de ce processus, il vous sera demandé les URL de GitLab. Utilisez les URL indiquées ciâ€dessous."
+
msgid "Each Runner can be in one of the following states:"
msgstr "Chaque exécuteur peut être dans l’un des états suivants :"
@@ -2034,12 +2561,27 @@ msgstr "Modifier l’étiquette"
msgid "Edit Pipeline Schedule %{id}"
msgstr "Éditer le pipeline programmé %{id}"
+msgid "Edit Snippet"
+msgstr "Modifier le fragment de code"
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr "Modifier les fichiers dans l’éditeur et valider les modifications ici"
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr "Modifier l’identité de %{user_name}"
+msgid "Elasticsearch"
+msgstr "Elasticsearch"
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr "Intégration d’Elasticsearch. AWS Elasticsearch IAM."
+
msgid "Email"
msgstr "Courriel"
@@ -2058,6 +2600,12 @@ msgstr "Activer"
msgid "Enable Auto DevOps"
msgstr "Activer Auto DevOps"
+msgid "Enable Pseudonymizer data collection"
+msgstr "Activer la collecte de données Pseudonymizer"
+
+msgid "Enable SAML authentication for this group"
+msgstr "Activer l’authentification SAML pour ce groupe"
+
msgid "Enable Sentry for error reporting and logging."
msgstr "Activer Sentry pour les rapports d’erreurs et la journalisation."
@@ -2067,6 +2615,9 @@ msgstr "Activer et configurer les métriques InfluxDB."
msgid "Enable and configure Prometheus metrics."
msgstr "Activer et configurer les métriques Prometheus."
+msgid "Enable classification control using an external service"
+msgstr "Activer le contrôle de classification à l’aide d’un service externe"
+
msgid "Enable for this project"
msgstr "Activer pour ce projet"
@@ -2076,6 +2627,9 @@ msgstr "Activer les exécuteurs de groupe"
msgid "Enable or disable certain group features and choose access levels."
msgstr "Activer ou désactiver certaines fonctions de groupe et choisir les niveaux d’accès."
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr "Activer ou désactiver la collecte de données Pseudonymizer."
+
msgid "Enable or disable version check and usage ping."
msgstr "Activer ou désactiver le contrôle de version et l’envoi des données d’utilisation."
@@ -2085,6 +2639,9 @@ msgstr "Activer reCAPTCHA ou Akismet et définir des limites d’adresse IP."
msgid "Enable the Performance Bar for a given group."
msgstr "Activer la barre de performance pour un groupe donné."
+msgid "Enabled"
+msgstr "activé"
+
msgid "Ends at (UTC)"
msgstr "Se termine à (UTC)"
@@ -2097,9 +2654,18 @@ msgstr "Une erreur s’est produite lors de la récupération des environnements
msgid "Environments|An error occurred while making the request."
msgstr "Une erreur s’est produite lors de la requête."
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr "Commit"
+msgid "Environments|Deploy to..."
+msgstr "Déployer vers…"
+
msgid "Environments|Deployment"
msgstr "Déploiement"
@@ -2112,45 +2678,75 @@ msgstr "Environnements"
msgid "Environments|Job"
msgstr "Tâche"
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr "Nouvel environnement"
msgid "Environments|No deployments yet"
msgstr "Aucun déploiement pour le moment"
-msgid "Environments|Open"
-msgstr "Ouvrir"
+msgid "Environments|No pod name has been specified"
+msgstr "Aucun nom de « pod » n’a été spécifié"
-msgid "Environments|Re-deploy"
-msgstr "Redéployer"
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr "Journaux du pod depuis"
+
+msgid "Environments|Re-deploy to environment"
+msgstr ""
msgid "Environments|Read more about environments"
msgstr "En savoir plus sur les environnements"
-msgid "Environments|Rollback"
-msgstr "Revenir en arrière"
+msgid "Environments|Rollback environment"
+msgstr ""
msgid "Environments|Show all"
msgstr "Tout afficher"
+msgid "Environments|Stop"
+msgstr "Arrêter"
+
+msgid "Environments|Stop environment"
+msgstr "Arrêter l’environnement"
+
msgid "Environments|Updated"
msgstr "Mis à jour"
msgid "Environments|You don't have any environments right now."
msgstr "Vous n’avez aucun environnement pour le moment."
+msgid "Epic"
+msgstr "Épopée"
+
+msgid "Epic will be removed! Are you sure?"
+msgstr "L’épopée sera supprimée ! Êtesâ€vous sûr(e) ?"
+
+msgid "Epics"
+msgstr "Épopées"
+
+msgid "Epics Roadmap"
+msgstr "Feuille de route des épopées"
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr "Les épopées vous permettent de gérer votre portefeuille de projets plus efficacement et avec moins d’efforts"
+
msgid "Error Reporting and Logging"
msgstr "Rapport d’erreur et journalisation"
-msgid "Error committing changes. Please try again."
-msgstr "Erreur lors de la validation des modifications. Veuillez réessayer."
+msgid "Error creating epic"
+msgstr "Erreur lors de la création de l’épopée"
msgid "Error fetching contributors data."
msgstr "Erreur lors de l’extraction des données des contributeur·rice·s."
-msgid "Error fetching job trace"
-msgstr "Erreur lors de la récupération de la trace de la tâche"
-
msgid "Error fetching labels."
msgstr "Erreur lors de la récupération des étiquettes."
@@ -2169,6 +2765,9 @@ msgstr "Erreur lors du chargement des données de branche. Veuillez réessayer."
msgid "Error loading last commit."
msgstr "Erreur lors du chargement du dernier commit."
+msgid "Error loading markdown preview"
+msgstr "Erreur lors du chargement de l’aperçu du Markdown"
+
msgid "Error loading merge requests."
msgstr "Erreur lors du chargement des demandes de fusion."
@@ -2217,6 +2816,9 @@ msgstr "Chaque mois (le 1ᵉʳ à 4 h du matin)"
msgid "Every week (Sundays at 4:00am)"
msgstr "Chaque semaine (dimanche à 4 h du matin)"
+msgid "Everyone can contribute"
+msgstr "Tout le monde peut contribuer"
+
msgid "Expand"
msgstr "Étendre"
@@ -2226,12 +2828,48 @@ msgstr "Tout étendre"
msgid "Expand sidebar"
msgstr "Étendre la barre latérale"
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr "Explorer GitLab"
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr "Explorer les groupes"
+
msgid "Explore projects"
msgstr "Explorer les projets"
msgid "Explore public groups"
msgstr "Explorer les groupes publics"
+msgid "External Classification Policy Authorization"
+msgstr "Autorisation de politique de classification externe"
+
+msgid "External authentication"
+msgstr "Authentification externe"
+
+msgid "External authorization denied access to this project"
+msgstr "L’autorisation externe a refusé l’accès à ce projet"
+
+msgid "External authorization request timeout"
+msgstr "Expiration du délai d’attente de la demande d’autorisation externe"
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr "Échec"
@@ -2274,6 +2912,12 @@ msgstr "Fichiers"
msgid "Files (%{human_size})"
msgstr "Fichiers (%{human_size})"
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr "Renseignez les champs ciâ€dessous, activez <strong>%{enable_label}</strong> et appuyez sur <strong>%{save_changes}</strong>"
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Filtrer par message de commit"
@@ -2283,6 +2927,12 @@ msgstr "Rechercher par chemin d’accès"
msgid "Find file"
msgstr "Rechercher un fichier"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr "Terminé"
@@ -2292,6 +2942,30 @@ msgstr "En premier"
msgid "FirstPushedBy|pushed by"
msgstr "poussé par"
+msgid "FogBugz Email"
+msgstr "Courriel de FogBugz"
+
+msgid "FogBugz Import"
+msgstr "Importation de FogBugz"
+
+msgid "FogBugz Password"
+msgstr "Mot de passe FogBugz"
+
+msgid "FogBugz URL"
+msgstr "URL de FogBugz"
+
+msgid "FogBugz import"
+msgstr "Importation de FogBugz"
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr "Couleur de la police"
+
+msgid "Footer message"
+msgstr "Message de pied de page"
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr "Pour les projets internes, tout utilisateur connecté peut afficher les pipelines et accéder aux détails des tâches (journaux de sortie et artefacts)"
@@ -2324,6 +2998,18 @@ msgstr "Erreurs trouvées dans votre fichier .gitlab-ci.yml :"
msgid "From %{provider_title}"
msgstr "De %{provider_title}"
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Depuis la création du ticket jusqu’au déploiement en production"
@@ -2345,6 +3031,201 @@ msgstr "Pipelines généraux"
msgid "Generate a default set of labels"
msgstr "Générer un jeu d’étiquettes par défaut"
+msgid "Geo Nodes"
+msgstr "NÅ“uds Geo"
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr "Geo vous permet de répliquer votre instance GitLab vers d’autres emplacements géographiques."
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr "Le nœud est défaillant ou en panne."
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr "Le nœud est lent, surchargé, ou il vient juste de se rétablir après une indisponibilité."
+
+msgid "GeoNodes|Checksummed"
+msgstr "Vérifié par somme de contrôle"
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr "Données périmées à partir de %{timeago}"
+
+msgid "GeoNodes|Data replication lag"
+msgstr "Latence de la réplication des données"
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr "Échec"
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr "Version de GitLab"
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr "La version de GitLab ne correspond pas à la version du nœud principal"
+
+msgid "GeoNodes|Health status"
+msgstr "État de santé"
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr "Nouveau nœud"
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr "Non vérifié par somme de contrôle"
+
+msgid "GeoNodes|Out of sync"
+msgstr "Désynchronisé"
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr "Supprimer un nÅ“ud arrête le processus de synchronisation. Êtesâ€vous sûr(e) ?"
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr "Emplacements de réplication"
+
+msgid "GeoNodes|Repositories"
+msgstr "Dépôts"
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr "Sélectif"
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr "Configuration du stockage"
+
+msgid "GeoNodes|Sync settings"
+msgstr "Paramètres de synchronisation"
+
+msgid "GeoNodes|Synced"
+msgstr "Synchronisé"
+
+msgid "GeoNodes|Unused slots"
+msgstr "Emplacements non utilisés"
+
+msgid "GeoNodes|Unverified"
+msgstr "Non vérifié"
+
+msgid "GeoNodes|Used slots"
+msgstr "Emplacements utilisés"
+
+msgid "GeoNodes|Verified"
+msgstr "Vérifié"
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr "Wikis"
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr "Tous les projets"
+
+msgid "Geo|File sync capacity"
+msgstr "Capacité de synchronisation de fichiers"
+
+msgid "Geo|Groups to synchronize"
+msgstr "Groupes à synchroniser"
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr "URL du dépôt Git"
@@ -2366,11 +3247,29 @@ msgstr "Importation de GitHub"
msgid "GitLab CI Linter has been moved"
msgstr "GitLab CI Linter a été déplacé"
+msgid "GitLab Geo"
+msgstr "GitLab Geo"
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr "Les exécuteurs de groupe peuvent exécuter du code pour tous les projets de ce groupe."
-msgid "GitLab Runner section"
-msgstr "Section de l’exécuteur GitLab"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr "URL d’authentification unique GitLab"
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr "Gitaly"
@@ -2381,18 +3280,33 @@ msgstr "Serveurs Gitaly"
msgid "Gitaly|Address"
msgstr "Adresse"
+msgid "Gitea Host URL"
+msgstr "URL de l’hôte Gitea"
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr "Retour"
msgid "Go back"
msgstr "Retour"
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Aller à votre dépôt divergent"
msgid "GoToYourFork|Fork"
msgstr "Dépôt divergent"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "L’authentification Google n’est pas %{link_to_documentation}. Demandez à votre administrat·eur·rice GitLab si vous souhaitez utiliser ce service."
@@ -2402,18 +3316,72 @@ msgstr "Compris !"
msgid "Graph"
msgstr "Graphique"
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr "Paramètres du groupe CI/CD"
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr "Identifiant du groupe"
msgid "Group Runners"
msgstr "Exécuteurs de groupe"
+msgid "Group avatar"
+msgstr "Avatar de groupe"
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr "Les responsables de groupe peuvent créer des exécuteurs de groupe via %{link}"
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Empêcher le partage d’un projet du groupe %{group} avec d’autres groupes"
@@ -2438,9 +3406,33 @@ msgstr "ne peut pas être désactivé lorsque le groupe parent a activé le « 
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "supprimer le partage avec verrou de groupe pour %{ancestor_group_name}"
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr "Les groupes peuvent également être imbriqués en créant des %{subgroup_docs_link_start}sousâ€groupes%{subgroup_docs_link_end}."
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Un groupe est une collection de plusieurs projets."
@@ -2480,6 +3472,12 @@ msgstr "Désolé, aucun groupe ne correspond à vos critères de recherche"
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr "Désolé, aucun groupe ni projet ne correspond à vos critères de recherche"
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr "Message d’enâ€tête"
+
msgid "Health Check"
msgstr "État des services"
@@ -2551,11 +3549,20 @@ msgstr "Identifiant"
msgid "Identities"
msgstr "Identités"
+msgid "Identity provider single sign on URL"
+msgstr "URL d’authentification unique du fournisseur d’identité"
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr "Si désactivé, le niveau d’accès dépendra des autorisations de l’utilisa·teur·trice dans le projet."
msgid "If enabled"
-msgstr ""
+msgstr "Si activé"
+
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr "Si activé, l’accès aux projets sera validé sur un service externe en se basant sur leurs étiquettes de classification respectives."
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr "Si vous utilisez GitHub, vous verrez les statuts des pipelines sur GitHub pour vos commits et demandes d’intégration (pull requests). %{more_info_link}"
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr "Si vous avez déjà des fichiers, vous pouvez les pousser à l’aide de la %{link_to_cli} ciâ€dessous."
@@ -2575,29 +3582,82 @@ msgstr "par balayage"
msgid "Import"
msgstr "Importer"
+msgid "Import Projects from Gitea"
+msgstr "Importe des projets depuis Gitea"
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr "Importer tous les dépôts"
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr "Importation en cours"
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr "Importer des dépôts à partir de GitHub"
msgid "Import repository"
msgstr "Importer un dépôt"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr "Inclure un accord sur les conditions générales d’utilisation et la politique de confidentialité que tous les utilisateurs doivent accepter."
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
+msgstr "En ligne"
+
+msgid "Install GitLab Runner"
msgstr ""
msgid "Install Runner on Kubernetes"
msgstr "Installez un exécuteur sur Kubernetes"
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "Installez un exécuteur compatible avec l’intégration continue de GitLab"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] "Instance"
+msgstr[1] "Instances"
msgid "Instance does not support multiple Kubernetes clusters"
msgstr "L’instance ne prend pas en charge plusieurs grappes de serveurs Kubernetes"
@@ -2623,8 +3683,11 @@ msgstr "Modèle d’intervalle"
msgid "Introducing Cycle Analytics"
msgstr "Introduction à l’analyseur de cycle"
-msgid "Issue Board"
-msgstr "Tableau des tickets"
+msgid "Issue Boards"
+msgstr "Tableaux des tickets"
+
+msgid "Issue board focus mode"
+msgstr ""
msgid "Issue events"
msgstr "Événements du ticket"
@@ -2632,12 +3695,18 @@ msgstr "Événements du ticket"
msgid "IssueBoards|Board"
msgstr "Tableau"
+msgid "IssueBoards|Boards"
+msgstr "Tableaux"
+
msgid "Issues"
msgstr "Tickets"
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "Les tickets peuvent être des bogues, des tâches ou des sujets de discussion. De plus, les tickets sont consultables et filtrables."
+msgid "Issues closed"
+msgstr "Tickets clos"
+
msgid "Jan"
msgstr "janv."
@@ -2668,6 +3737,9 @@ msgstr "juin"
msgid "Koding"
msgstr "Koding"
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -2707,12 +3779,18 @@ msgstr "Étiquette"
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr "%{firstLabelName} +%{remainingLabelCount} de plus"
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr "%{labelsString} et %{remainingLabelCount} de plus"
+msgid "LabelSelect|Labels"
+msgstr "Étiquettes"
+
msgid "Labels"
msgstr "Étiquettes"
@@ -2787,12 +3865,30 @@ msgstr "Quitter le groupe"
msgid "Leave project"
msgstr "Quitter le projet"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr "Licence"
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr "Liste"
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr "Lister vos dépôts GitHub"
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr "Chargement de l’IDE GitLab…"
@@ -2814,15 +3910,39 @@ msgstr "Verrouiller aux projets en cours"
msgid "Locked"
msgstr "Verrouillé"
+msgid "Locked Files"
+msgstr "Fichiers verrouillés"
+
msgid "Locked to current projects"
msgstr "Verrouillé aux projets en cours"
-msgid "Login"
-msgstr "Se connecter"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr "Gestion des accès"
msgid "Manage all notifications"
msgstr "Gérer toutes les notifications"
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr "Gérer les étiquettes de groupe"
@@ -2832,6 +3952,27 @@ msgstr "Gérer les étiquettes"
msgid "Manage project labels"
msgstr "Gérer les étiquettes de projet"
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr "mars"
@@ -2856,18 +3997,30 @@ msgstr "Médian"
msgid "Members"
msgstr "Membres"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr "Demande de fusion"
+
msgid "Merge Request:"
msgstr "Demande de fusion :"
msgid "Merge Requests"
msgstr "Demandes de fusion"
+msgid "Merge Requests created"
+msgstr "Demandes de fusion créées"
+
msgid "Merge events"
msgstr "Événements de fusion"
msgid "Merge request"
msgstr "Demande de fusion"
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr "Demandes de fusion"
@@ -2887,10 +4040,10 @@ msgid "MergeRequests|Updating discussions failed"
msgstr "Échec de la mise à jour des discussions"
msgid "MergeRequests|View file @ %{commitId}"
-msgstr ""
+msgstr "Afficher le fichier au commit %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
-msgstr ""
+msgstr "Afficher le fichier remplacé au commit %{commitId}"
msgid "Merged"
msgstr "Fusionnée"
@@ -2898,12 +4051,114 @@ msgstr "Fusionnée"
msgid "Messages"
msgstr "Messages"
+msgid "Metrics"
+msgstr "Métriques"
+
msgid "Metrics - Influx"
msgstr "Métriques — Influx"
msgid "Metrics - Prometheus"
msgstr "Métriques — Prometheus"
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr "Environnement"
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr "Nom"
+
+msgid "Metrics|New metric"
+msgstr "Nouvelle métrique"
+
+msgid "Metrics|No deployed environments"
+msgstr "Aucun environnement déployé"
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr "Documentation des requêtes Prometheus"
+
+msgid "Metrics|Query"
+msgstr "Requête"
+
+msgid "Metrics|Response"
+msgstr "Réponse"
+
+msgid "Metrics|System"
+msgstr "Système"
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr "Une erreur s’est produite lors de la récupération des données d’environnement. Veuillez réessayer."
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr "Une erreur s’est produite lors de l’obtention des informations de déploiement."
+
+msgid "Metrics|There was an error getting environments information."
+msgstr "Une erreur s’est produite lors de l’obtention des informations d’environnement."
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr "Type"
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr "Jalon"
@@ -2928,6 +4183,9 @@ msgstr "Promouvoir %{milestoneTitle} en tant que jalon de groupe ?"
msgid "Milestones|Promote Milestone"
msgstr "Promouvoir le jalon"
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "ajouter une clef SSH"
@@ -2940,21 +4198,36 @@ msgstr "Fermer"
msgid "Monitoring"
msgstr "Supervision"
+msgid "Months"
+msgstr "Mois"
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr "Plus d’actions"
+msgid "More info"
+msgstr "En savoir plus"
+
msgid "More information"
msgstr "Plus d’informations"
msgid "More information is available|here"
msgstr "ici"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr "Déplacer"
msgid "Move issue"
msgstr "Déplacer le ticket"
+msgid "Multiple issue boards"
+msgstr "Tableaux de tickets multiples"
+
msgid "Name"
msgstr "Nom"
@@ -2964,6 +4237,9 @@ msgstr "Nommez la nouvelle étiquette"
msgid "Name your individual key via a title"
msgstr "Nommez votre clef personnelle avec un titre"
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Aide"
@@ -2976,6 +4252,18 @@ msgstr "Connexion / Inscription"
msgid "Nav|Sign out and sign in with a different account"
msgstr "Se déconnecter et se reconnecter avec un autre compte"
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr "Nouveau"
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr "Nouvelle identité"
@@ -2984,18 +4272,18 @@ msgid_plural "New Issues"
msgstr[0] "Nouveau ticket"
msgstr[1] "Nouveaux tickets"
-msgid "New Kubernetes Cluster"
-msgstr "Nouvelle grappe de serveurs Kubernetes"
-
-msgid "New Kubernetes cluster"
-msgstr "Nouvelle grappe de serveurs Kubernetes"
-
msgid "New Label"
msgstr "Nouvelle étiquette"
msgid "New Pipeline Schedule"
msgstr "Nouvelle planification de pipeline"
+msgid "New Snippet"
+msgstr "Nouvel extrait de code"
+
+msgid "New Snippets"
+msgstr "Nouveaux extraits de code"
+
msgid "New branch"
msgstr "Nouvelle branche"
@@ -3005,6 +4293,9 @@ msgstr "Nouvelle branche indisponible"
msgid "New directory"
msgstr "Nouveau dossier"
+msgid "New epic"
+msgstr "Nouvelle épopée"
+
msgid "New file"
msgstr "Nouveau fichier"
@@ -3041,9 +4332,15 @@ msgstr "Nouveau sousâ€groupe"
msgid "New tag"
msgstr "Nouvelle étiquette"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr "Non"
+msgid "No Label"
+msgstr "Aucune étiquette"
+
msgid "No assignee"
msgstr "Aucune personne assignée"
@@ -3068,18 +4365,42 @@ msgstr "Aucun fichier trouvé"
msgid "No files found."
msgstr "Aucun fichier trouvé."
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr "Aucune demande de fusion trouvée"
msgid "No messages were logged"
msgstr "Aucun message n’a été enregistré"
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "Aucun dépôt"
msgid "No schedules"
msgstr "Aucune planification"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "Aucun·e"
@@ -3104,12 +4425,21 @@ msgstr "Données insuffisantes"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Notez que la branche principale « master » est automatiquement protégée. %{link_to_protected_branches}"
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "Remarque : En tant qu’administra·teur·trice, vous pouvez configurer %{github_integration_link}, ce qui vous permettra de vous connecter via GitHub et de permettre l’importation de dépôts sans générer de jeton d’accès personnel."
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "Remarque : Envisagez de demander à votre administra·teur·trice GitLab de configurer %{github_integration_link}, ce qui vous permettra de vous connecter via GitHub et d’importer des dépôts sans générer de jeton d’accès personnel."
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "Événement de notifications"
@@ -3182,6 +4512,9 @@ msgstr "novembre"
msgid "Number of access attempts"
msgstr "Nombre de tentatives d’accès"
+msgid "OK"
+msgstr "OK"
+
msgid "Oct"
msgstr "oct."
@@ -3191,6 +4524,15 @@ msgstr "octobre"
msgid "OfSearchInADropdown|Filter"
msgstr "Filtre"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr "Une fois importés, les dépôts peuvent être mis en miroir via SSH. Voir %{ssh_link}"
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr "Paramètres d’intégration de l’EDI en ligne."
@@ -3200,9 +4542,30 @@ msgstr "Seuls les commentaires du commit suivant sont affichés ciâ€dessous"
msgid "Only project members can comment."
msgstr "Seuls les membres du projet peuvent commenter."
+msgid "Oops, are you sure?"
+msgstr "Ouh là, êtesâ€vous sûr(e) ?"
+
+msgid "Open"
+msgstr "Ouvrir"
+
msgid "Open in Xcode"
msgstr "Ouvrir dans Xcode"
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr "Tickets ouverts"
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Ouvert"
@@ -3212,6 +4575,12 @@ msgstr "Ouvrir dans une nouvelle fenêtre"
msgid "Operations"
msgstr "Opérations"
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "Options"
@@ -3221,6 +4590,9 @@ msgstr "Ou vous pouvez choisir l’une des couleurs suggérées ciâ€dessous"
msgid "Other Labels"
msgstr "Autres étiquettes"
+msgid "Other information"
+msgstr "Autres informations"
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr "Sinon, il est recommandé de commencer avec l’une des options ciâ€dessous."
@@ -3257,6 +4629,9 @@ msgstr "Mot de Passe"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr "Collez votre clef SSH publique, qui est habituellement située dans le fichier « ~/.ssh/id_rsa.pub » et commence par « ssh-rsa ». N’utilisez pas votre clef SSH privée !"
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr "Pause"
@@ -3290,6 +4665,9 @@ msgstr "Planification de pipeline"
msgid "Pipeline Schedules"
msgstr "Planifications de pipelines"
+msgid "Pipeline quota"
+msgstr "Quota du pipeline"
+
msgid "Pipeline triggers"
msgstr "Déclencheurs de pipeline"
@@ -3434,6 +4812,12 @@ msgstr "avec les étapes"
msgid "Plain diff"
msgstr "Diff brut"
+msgid "Planned finish date"
+msgstr "Date de fin prévisionnelle"
+
+msgid "Planned start date"
+msgstr "Date de début prévisionnelle"
+
msgid "PlantUML"
msgstr "PlantUML"
@@ -3443,6 +4827,15 @@ msgstr "Lancer"
msgid "Please accept the Terms of Service before continuing."
msgstr "Veuillez accepter les conditions générales d’utilisation avant de continuer."
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "Veuillez sélectionner au moins un filtre pour voir les résultats"
@@ -3452,6 +4845,9 @@ msgstr "Veuillez résoudre le reCAPTCHA"
msgid "Please try again"
msgstr "Veuillez réessayer"
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr "Veuillez patienter pendant la connexion à votre dépôt. Actualisez à votre guise."
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Veuillez patienter pendant l’importation de votre dépôt. Actualisez à votre guise."
@@ -3461,6 +4857,9 @@ msgstr "Préférences"
msgid "Preferences|Navigation theme"
msgstr "Thème de navigation"
+msgid "Primary"
+msgstr "Principal"
+
msgid "Prioritize"
msgstr "Prioriser"
@@ -3485,9 +4884,15 @@ msgstr "Des projets privés peuvent être créés dans votre espace de noms pers
msgid "Profile"
msgstr "Profil"
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr "Compte programmé pour suppression."
+msgid "Profiles|Add key"
+msgstr "Ajouter une clef"
+
msgid "Profiles|Change username"
msgstr "Changer le nom d’utilisateur·rice"
@@ -3515,9 +4920,15 @@ msgstr "Nom d’utilisateur incorrect"
msgid "Profiles|Path"
msgstr "Chemin d’accès"
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Saisissez votre %{confirmationValue} pour confirmer :"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr "Mettre à jour le nom d’utilisateur·rice"
@@ -3536,6 +4947,9 @@ msgstr "Vous devez transférer la propriété ou supprimer ces groupes avant de
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "Votre compte est actuellement propriétaire des groupes suivants :"
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr "votre compte"
@@ -3590,9 +5004,27 @@ msgstr "Le lien de l’exportation du projet a expiré. Merci de générer une n
msgid "Project export started. A download link will be sent by email."
msgstr "L’exportation du projet a débuté. Un lien de téléchargement sera envoyé par courriel."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "S’abonner"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr "Responsables"
+
+msgid "ProjectCreationLevel|No one"
+msgstr "Personne"
+
msgid "ProjectFileTree|Name"
msgstr "Nom"
@@ -3602,9 +5034,39 @@ msgstr "Jamais"
msgid "ProjectLifecycle|Stage"
msgstr "Étape"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr "Projets"
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "Les plus consultés"
@@ -3623,8 +5085,35 @@ msgstr "Un problème est survenu de notre côté."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "Désolé, aucun projet ne correspond à votre recherche"
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr "Cette fonctionnalité requiert la prise en charge du localStorage par votre navigateur"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
+msgstr ""
msgid "PrometheusDashboard|Time"
msgstr "Heure"
@@ -3650,9 +5139,18 @@ msgstr "Par défaut, Prometheus écoute sur « http://localhost:9090 ». Il nâ
msgid "PrometheusService|Common metrics"
msgstr "Métriques communes"
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "Recherche et configuration des métriques en cours…"
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "Installer Prometheus sur les grappes de serveurs"
@@ -3665,21 +5163,24 @@ msgstr "Configuration manuelle"
msgid "PrometheusService|Metrics"
msgstr "Métriques"
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr "Les métriques sont automatiquement configurées et supervisées en fonction d’une bibliothèque de métriques provenant d’exportateurs populaires."
-
msgid "PrometheusService|Missing environment variable"
msgstr "Variable d’environnement manquante"
msgid "PrometheusService|More information"
msgstr "Plus d’informations"
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr "URL de base de l’API Prometheus, telle que http://prometheus.example.com/"
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr "Prometheus est géré automatiquement sur vos grappes de serveurs"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr "Service de supervision de séries temporelles"
@@ -3704,12 +5205,27 @@ msgstr "Promouvoir en jalon de groupe"
msgid "Promote to group label"
msgstr "Promouvoir en tant qu’étiquette de groupe"
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr "Astuce :"
msgid "Provider"
msgstr "Fournisseur"
+msgid "Pseudonymizer data collection"
+msgstr "Collecte de données Pseudonymizer"
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "Public — le groupe ainsi que n’importe quel projet public est accessible sans authentification."
@@ -3719,6 +5235,9 @@ msgstr "Public - le projet est accessible sans aucune authentification."
msgid "Public pipelines"
msgstr "Pipelines publics"
+msgid "Push Rules"
+msgstr "Règles de poussage Git"
+
msgid "Push events"
msgstr "Événements de poussée"
@@ -3728,15 +5247,27 @@ msgstr "Pousser le projet en ligne de commande"
msgid "Push to create a project"
msgstr "Pousser pour créer un projet"
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr "Poussé"
+
+msgid "Pushes"
+msgstr "Poussées Git"
+
+msgid "Quarters"
+msgstr "Trimestres"
+
msgid "Quick actions can be used in the issues description and comment boxes."
msgstr "Les actions rapides peuvent être utilisées dans la description des tickets et dans les zones de commentaire."
-msgid "Re-deploy"
-msgstr "Redéployer"
-
msgid "Read more"
msgstr "Lire plus"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "LisezMoi"
@@ -3746,6 +5277,9 @@ msgstr "Fonctionnalités en temps réel"
msgid "Reference:"
msgstr "Référence :"
+msgid "Refresh"
+msgstr "Actualiser"
+
msgid "Register / Sign In"
msgstr "Inscription / Connexion"
@@ -3797,12 +5331,27 @@ msgstr "Supprimer la priorité"
msgid "Remove project"
msgstr "Supprimer le projet"
+msgid "Repair authentication"
+msgstr "Réparer l’authentification"
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr "Dépôt par URL"
+
msgid "Repository"
msgstr "Dépôt"
msgid "Repository Settings"
msgstr "Paramètres du dépôt"
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr "Maintenance du dépôt"
@@ -3812,9 +5361,15 @@ msgstr "Miroir du dépôt"
msgid "Repository storage"
msgstr "Stockage du dépôt"
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "Demander l’accès"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "Exiger que tous les utilisateurs acceptent les conditions générales d’utilisation et la politique de confidentialité quand ils accèdent à GitLab."
@@ -3836,6 +5391,9 @@ msgstr "Résoudre les conflits sur la branche source"
msgid "Resolve discussion"
msgstr "Résoudre la discussion"
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr "Reprendre"
@@ -3862,14 +5420,23 @@ msgstr "Défaire cette demande de fusion"
msgid "Review"
msgstr "Examiner"
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr "Examen"
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr "Examen (demande de fusion !%{mergeRequestId})"
-msgid "Rollback"
-msgstr "Restaurer (rollback)"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr "Feuille de route"
+
+msgid "Run CI/CD pipelines for external repositories"
+msgstr ""
msgid "Runner token"
msgstr "Jeton de l’exécuteur"
@@ -3886,6 +5453,21 @@ msgstr "Les exécuteurs peuvent être placés sur différents utilisateurs et se
msgid "Running"
msgstr "En cours d’exécution"
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr "Clefs SSH"
@@ -3895,6 +5477,9 @@ msgstr "Vérification SSL"
msgid "Save"
msgstr "Enregistrer"
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr "Enregistrer les modifications"
@@ -3916,6 +5501,15 @@ msgstr "Planifications"
msgid "Scheduling Pipelines"
msgstr "Planification des pipelines"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr "Faire défiler vers le bas"
@@ -3955,6 +5549,21 @@ msgstr "Nombre de secondes avant réinitialisation des informations d’échec"
msgid "Seconds to wait for a storage access attempt"
msgstr "Nombre de secondes d’attente avant une tentative d’accès au stockage"
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr "Sélectionner"
@@ -3985,12 +5594,21 @@ msgstr "Sélectionnez le projet et la zone afin de choisir le type de machine"
msgid "Select project to choose zone"
msgstr "Sélectionnez le projet afin de choisir la zone"
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr "Sélectionner une branche source"
msgid "Select target branch"
msgstr "Sélectionner une branche cible"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr "Envoyer un courriel"
@@ -4003,9 +5621,15 @@ msgstr "septembre"
msgid "Server version"
msgstr "Version du serveur"
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr "Modèles de service"
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr "Expiration de la session, restrictions des projets et taille des pièces jointes."
@@ -4030,6 +5654,9 @@ msgstr "Configuration CI/CD"
msgid "Set up Koding"
msgstr "Configurer Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "définir un mot de passe"
@@ -4042,9 +5669,24 @@ msgstr "Configurer automatiquement un exécuteur spécifique"
msgid "Share"
msgstr "Partager"
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr "Exécuteurs partagés"
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr "Afficher la commande"
@@ -4074,6 +5716,30 @@ msgstr[1] "Affichage de %d événements"
msgid "Side-by-side"
msgstr "côte à côte"
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr "Se déconnecter"
@@ -4086,6 +5752,9 @@ msgstr "Restrictions d’inscription"
msgid "Size and domain settings for static websites"
msgstr "Paramètres de taille et de domaine pour les sites Web statiques"
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr "Plus lent, mais permet de s’assurer que l’espace de travail du projet est vierge, comme il clone le dépôt à partir de zéro pour chaque tâche"
@@ -4107,6 +5776,12 @@ msgstr "Une erreur s’est produite lors du basculement du bouton"
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr "Une erreur s’est produite lors de la fermeture du / de la %{issuable}. Veuillez réessayer plus tard"
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr "Une erreur s’est produite lors de la récupération des projets."
@@ -4117,11 +5792,14 @@ msgid "Something went wrong while reopening the %{issuable}. Please try again la
msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
-msgstr ""
+msgstr "Une erreur s’est produite lors de la « résolution » de la discussion. Veuillez réessayer."
msgid "Something went wrong. Please try again."
msgstr "Quelque chose s’est mal passé. Veuillez réessayer."
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr "Trier par"
@@ -4164,6 +5842,9 @@ msgstr "Mis à jour récemment"
msgid "SortOptions|Least popular"
msgstr "Popularité croissante"
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr "Jalon"
@@ -4173,6 +5854,9 @@ msgstr "Jalon avec une échéance lointaine"
msgid "SortOptions|Milestone due soon"
msgstr "Jalon avec une échéance proche"
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr "Popularité décroissante"
@@ -4212,6 +5896,9 @@ msgstr "Commence plus tard"
msgid "SortOptions|Start soon"
msgstr "Commence bientôt"
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr "Source"
@@ -4237,10 +5924,10 @@ msgid "Specify the following URL during the Runner setup:"
msgstr "Spécifiez l’URL suivante lors de la configuration de l’exécuteur :"
msgid "Squash commits"
-msgstr "Compiler les modifications (squash commits)"
+msgstr "Combiner (squash) les commits"
msgid "Stage"
-msgstr ""
+msgstr "Étape"
msgid "Stage & Commit"
msgstr ""
@@ -4255,7 +5942,7 @@ msgid "Staged"
msgstr "Prêt à valider"
msgid "Staged %{type}"
-msgstr "%{type} est prêt à être valider"
+msgstr "%{type} en étape"
msgid "Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging."
msgstr "Mettez une étoile sur une étiquette pour en faire une étiquette prioritaire. Ordonnez les étiquettes prioritaires pour changer leurs priorités relatives en les glissant."
@@ -4282,11 +5969,17 @@ msgid "Started"
msgstr "Démarré"
msgid "Starts at (UTC)"
-msgstr "Commence à (UTC)"
+msgstr "Démarre à (UTC)"
+
+msgid "State your message to activate"
+msgstr ""
msgid "Status"
msgstr "État "
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr "Arrêter cet environnement"
@@ -4296,9 +5989,18 @@ msgstr "Arrêté"
msgid "Storage"
msgstr "Stockage"
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr "Sousâ€groupes"
+msgid "Submit as spam"
+msgstr "Soumettre comme indésirable"
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr "S’abonner"
@@ -4311,9 +6013,21 @@ msgstr "S’abonner au niveau du projet"
msgid "Switch branch/tag"
msgstr "Changer de branche ou d’étiquette"
+msgid "Sync information"
+msgstr "Synchroniser les informations"
+
msgid "System Hooks"
msgstr "« Hooks » système"
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] "Étiquette (%{tag_count})"
@@ -4350,7 +6064,7 @@ msgid "TagsPage|Edit release notes"
msgstr "Modifier les notes de version"
msgid "TagsPage|Existing branch name, tag, or commit SHA"
-msgstr "Nom de branche, d’étiquette ou SHA de commit existant"
+msgstr "Branche, étiquette ou condensat SHA d’un commit"
msgid "TagsPage|Filter by tag name"
msgstr "Filtrer par nom d’étiquette"
@@ -4362,10 +6076,10 @@ msgid "TagsPage|New tag"
msgstr "Nouvelle étiquette"
msgid "TagsPage|Optionally, add a message to the tag."
-msgstr "Éventuellement, ajoutez un message à l’étiquette."
+msgstr "Vous pouvez éventuellement ajouter un message de commentaire à l’étiquette."
msgid "TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page."
-msgstr "Éventuellement, ajouter des notes de version pour l’étiquette. Elles seront stockées dans la base de données de GitLab et affichées sur la page des étiquettes."
+msgstr "Vous pouvez éventuellement ajouter des notes de version à l’étiquette. Elles seront stockées dans la base de données de GitLab et affichées sur la page des étiquettes."
msgid "TagsPage|Release notes"
msgstr "Notes de version"
@@ -4386,7 +6100,7 @@ msgid "TagsPage|This tag has no release notes."
msgstr "Cette étiquette n’a pas de notes de version."
msgid "TagsPage|Use git tag command to add a new one:"
-msgstr "Utilisez la commande « git tag » pour en ajouter un nouveau :"
+msgstr "Utilisez la commande « git tag » pour en rajouter :"
msgid "TagsPage|Write your release notes or drag files here…"
msgstr "Rédigez vos notes de version ou faites glisser des fichiers ici…"
@@ -4412,35 +6126,50 @@ msgstr "Conditions générales d’utilisation et politique de confidentialité"
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
-msgstr "Le suivi des tickets est l’endroit où ajouter des éléments à améliorer ou à résoudre dans un projet"
+msgstr "Le système de suivi est un endroit où l’on peut ouvrir un ticket pour signaler des choses à améliorer ou des dysfonctionnements à résoudre dans un projet"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
-msgstr "Le suivi des tickets est l’endroit où ajouter des éléments à améliorer ou à résoudre dans un projet. Vous pouvez vous inscrire ou vous connecter pour créer des tickets pour ce projet."
+msgstr "Le système de suivi est un endroit où l’on peut ouvrir un ticket pour signaler des choses à améliorer ou des dysfonctionnements à résoudre dans un projet. Vous pouvez vous inscrire ou vous connecter pour créer des tickets de suivi pour ce projet."
+
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "L’étape de développement montre le temps entre le premier commit et la création de la demande de fusion. Les données seront automatiquement ajoutées ici une fois que vous aurez créé votre première demande de fusion."
+msgstr "Le présentoir de code affiche le temps entre le premier commit et la création de la demande de fusion. Les données seront automatiquement ajoutées ici une fois que vous aurez créé votre première demande de fusion."
msgid "The collection of events added to the data gathered for that stage."
msgstr "L’ensemble d’événements ajoutés aux données recueillies pour cette étape."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "La relation de divergence a été supprimée."
msgid "The import will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
-msgstr "L’importation expirera après %{timeout}. Pour les dépôts qui prennent plus de temps, utilisez une combinaison clone / push."
+msgstr "L’importation expirera après %{timeout}. Pour les dépôts qui prennent plus de temps, utilisez une combinaison de clone et push."
msgid "The issue stage shows the time it takes from creating an issue to assigning the issue to a milestone, or add the issue to a list on your Issue Board. Begin creating issues to see data for this stage."
-msgstr "L’étape des tickets montre le temps nécessaire entre la création d’un ticket et son assignation à un jalon ou son ajout à une liste d’un tableau de tickets. Commencez par créer des tickets pour voir des données de cette étape."
+msgstr "Le présentoir des tickets affiche le temps nécessaire entre la création d’un ticket et son assignation à un jalon ou son ajout à une liste dans votre tableau de tickets. Commencez par créer des tickets pour voir des données sur ce présentoir."
msgid "The maximum file size allowed is 200KB."
-msgstr "La taille de fichier maximale autorisée est de 200 Kio."
+msgstr "La taille maximale autorisée pour un fichier est de 200 Kio."
msgid "The number of attempts GitLab will make to access a storage."
-msgstr "Le nombre de tentatives que GitLab va effectuer pour accéder au stockage."
+msgstr "Le nombre de tentatives que GitLab va effectuer pour accéder à un stockage."
+
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
-msgstr "Nombre d’échecs avant que GitLab n’empêche tout accès au stockage. Ce nombre d’échecs peut être réinitialisé dans l’interface d’administration : %{link_to_health_page} ou en suivant le %{api_documentation_link}."
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
+msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
msgstr "Le chemin d’accès au fichier de configuration de l’intégration continue. Par défaut, <code>.gitlab-ci.yml</code>"
@@ -4451,17 +6180,23 @@ msgstr "La phase du cycle de développement."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "L’étape de planification montre le temps entre l’étape précédente et l’envoi de votre premier commit. Ce temps sera automatiquement ajouté quand vous pousserez votre premier commit."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "L’étape de mise en production montre le temps nécessaire entre la création d’un ticket et le déploiement du code en production. Les données seront automatiquement ajoutées une fois que vous aurez complété le cycle complet, depuis l’idée jusqu’à la mise en production."
msgid "The project can be accessed by any logged in user."
-msgstr "Votre projet peut être accédé par n’importe quel utilisa·teur·trice authentifié·e."
+msgstr "Votre projet est accessible à n’importe quel·le utilisa·teur·trice authentifié·e."
msgid "The project can be accessed without any authentication."
-msgstr "Votre projet peut être accédé sans aucune authentification."
+msgstr "Votre projet est accessible sans aucune authentification."
+
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
msgid "The repository for this project does not exist."
-msgstr "Le dépôt pour ce projet n'existe pas."
+msgstr "Le dépôt de ce projet n’existe pas."
msgid "The repository for this project is empty"
msgstr "Le dépôt de ce projet est vide"
@@ -4470,31 +6205,40 @@ msgid "The repository must be accessible over <code>http://</code>, <code>https:
msgstr "Le dépôt doit être accessible via <code>http://</code>, <code>https://</code> ou <code>git://</code>."
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "L’étape d’évaluation montre le temps entre la création de la demande de fusion et la fusion effective de celleâ€ci. Ces données seront automatiquement ajoutées après que vous ayez fusionné votre première demande de fusion."
+msgstr "L’étape d’évaluation montre le temps entre la création de la demande de fusion et la fusion effective de celleâ€ci. Ces données seront automatiquement ajoutées après que vous aurez fusionné votre première demande de fusion."
+
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
msgid "The secure token used by the Runner to checkout the project"
msgstr "Le jeton sécurisé utilisé par l’exécuteur pour vérifier (checkout) le projet"
msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
-msgstr "L’étape de pré-production indique le temps entre la fusion de la DF et le déploiement du code dans l’environnent de production. Les données seront automatiquement ajoutées une fois que vous déploierez en production pour la première fois."
+msgstr "L’étape de pré-production indique le temps entre l’acceptation d’une demande fusion et le déploiement du code dans l’environnent de production. Les données seront automatiquement ajoutées lorsque vous aurez fait votre première mise en production."
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "L’étape de test montre le temps que le CI de GitLab met pour exécuter chaque pipeline liés à la demande de fusion. Les données seront automatiquement ajoutées après que votre premier pipeline s’achèvera."
+msgstr "L’étape de test montre le temps que que met l’intégration continue de GitLab pour exécuter chaque pipeline pour une demande de fusion donnée. Les données seront automatiquement ajoutées après que votre premier pipeline s’achèvera."
msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
msgstr "Délai en secondes pendant lequel GitLab gardera les informations d’échec. Si aucun échec ne survient pendant ce délai, les informations de ce montage seront réinitialisées."
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
-msgstr "Temps en secondes pendant lequel GitLab essaiera d’accéder au stockage. Après ce délai, une erreur d’expiration d’attente sera déclenchée."
+msgstr "Temps en secondes pendant lequel GitLab essaiera d’accéder au stockage. Après ce délai, une erreur d’expiration du délai d’attente sera déclenchée."
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
-msgstr "Le temps en secondes entre les vérifications de stockage. GitLab ne débute pas de nouvelle vérification si une vérification est déjà en cours."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
+msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "Le temps pris par chaque entrée récoltée durant cette étape."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "La valeur située au point médian d’une série de valeur observée. C.à.d., entre 3, 5, 9, le médian est 5. Entre 3, 5, 7, 8, le médian est (5+7)/2 = 6."
+msgstr "La valeur située au point médian d’une série de valeur observée. Par exemple., entre 3, 5 et 9, le médian est 5. Entre 3, 5, 7 et 8, le médian est (5+7)/2 = 6."
msgid "There are no issues to show"
msgstr "Il n’y a aucun ticket à afficher"
@@ -4508,12 +6252,6 @@ msgstr "Il n’y a aucune demande de fusion à afficher"
msgid "There are problems accessing Git storage: "
msgstr "Il y a des difficultés à accéder aux données Git : "
-msgid "There was an error loading jobs"
-msgstr "Une erreur est survenue lors du chargement des tâches"
-
-msgid "There was an error loading latest pipeline"
-msgstr "Une erreur est survenue lors du chargement du dernier pipeline"
-
msgid "There was an error loading users activity calendar."
msgstr "Une erreur s’est produite lors du chargement du calendrier d’activité des utilisateurs."
@@ -4521,22 +6259,34 @@ msgid "There was an error saving your notification settings."
msgstr "Une erreur s’est produite lors de l’enregistrement de vos paramètres de notification."
msgid "There was an error subscribing to this label."
-msgstr "Une erreur s’est produite lors de l’abonnement à ce label."
+msgstr "Une erreur s’est produite lors de l’abonnement à cette étiquette."
msgid "There was an error when reseting email token."
msgstr "Une erreur s’est produite lors de la réinitialisation du jeton de courriel."
msgid "There was an error when subscribing to this label."
-msgstr "Une erreur s’est produite lors de l’abonnement à ce label."
+msgstr "Une erreur s’est produite lors de l’abonnement à cette étiquette."
msgid "There was an error when unsubscribing from this label."
-msgstr "Une erreur s’est produite lors de la désinscription à ce label."
+msgstr "Une erreur s’est produite lors de la désinscription à cette étiquette."
msgid "They can be managed using the %{link}."
msgstr "Ils peuvent être gérés en utilisant %{link}."
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
-msgstr "Cette instance de GitLab ne fournit aucun exécuteur partagé pour le moment. Les administrateur•rice•s de l’instance peuvent enregistrer des exécuteurs partagés dans la zone d’administration."
+msgstr "Cette instance de GitLab ne fournit aucun exécuteur partagé pour le moment. Les administra·teur·trice·s de l’instance peuvent enregistrer des exécuteurs partagés dans la zone d’administration."
+
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
msgid "This diff is collapsed."
msgstr "Ce diff est replié."
@@ -4544,6 +6294,12 @@ msgstr "Ce diff est replié."
msgid "This directory"
msgstr "Ce répertoire"
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr "Ce groupe ne fournit pas encore d’exécuteurs de groupe."
@@ -4563,10 +6319,10 @@ msgid "This issue is locked."
msgstr "Ce ticket est verrouillé."
msgid "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
-msgstr "Cette tâche dépend de l’utilisateur•rice pour déclencher son processus. Elles sont souvent utilisées pour déployer du code dans des environnements de production"
+msgstr "Cette tâche dépend de l’utilisa·teur·trice pour déclencher son processus. Elles sont souvent utilisées pour déployer du code dans des environnements de production"
msgid "This job depends on upstream jobs that need to succeed in order for this job to be triggered"
-msgstr "Cette tâche dépend des tâches en amont qui doivent réussir pour que celle-ci soit déclenchée"
+msgstr "Cette tâche dépend des tâches en amont qui doivent réussir pour que celleâ€ci soit déclenchée"
msgid "This job does not have a trace."
msgstr "Cette tâche n’a pas de trace."
@@ -4581,28 +6337,28 @@ msgid "This job has not been triggered yet"
msgstr "Cette tâche n’a pas encore été déclenchée"
msgid "This job has not started yet"
-msgstr "Cete tâche n’a pas encore commencée"
+msgstr "Cette tâche n’a pas encore commencée"
msgid "This job is in pending state and is waiting to be picked by a runner"
-msgstr "Cette tâche est en attente et attend d’être choisie par un exécuteur"
+msgstr "Cette tâche est en attente d’être choisie par un exécuteur"
msgid "This job requires a manual action"
msgstr "Cette tâche nécessite une action manuelle"
msgid "This means you can not push code until you create an empty repository or import existing one."
-msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous n’avez pas créé un dépôt vide, ou que vous n’avez pas importé un dépôt existant."
+msgstr "Cela signifie que vous ne pouvez pas pousser du code tant que vous n’avez pas créé un dépôt vide ou que vous n’avez pas importé un dépôt existant."
msgid "This merge request is locked."
msgstr "Cette demande de fusion est verrouillée."
msgid "This option is disabled while you still have unstaged changes"
-msgstr "Cette option est désactivée tant que vous avez des changements non-indexés"
+msgstr "Cette option est désactivée tant que vous avez des changements non indexés"
msgid "This page is unavailable because you are not allowed to read information across multiple projects."
-msgstr "Cette page n’est pas disponible car vous n’êtes pas autorisé à lire des informations dans plusieurs projets."
+msgstr "Cette page n’est pas disponible car vous n’êtes pas autorisé à lire des informations à travers de multiples projets."
msgid "This page will be removed in a future release."
-msgstr "Cette page sera supprimée dans une future mise à jour."
+msgstr "Cette page sera supprimée dans une version ultérieure."
msgid "This project"
msgstr "Ce projet"
@@ -4619,6 +6375,12 @@ msgstr "Ce diff n’a pas pu être affiché car il est trop grand."
msgid "This user has no identities"
msgstr "Cet utilisa·teur·trice n’a aucune identité"
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "Temps avant qu’un ticket ne soit planifié"
@@ -4626,10 +6388,13 @@ msgid "Time before an issue starts implementation"
msgstr "Temps avant que la résolution du ticket ne débute"
msgid "Time between merge request creation and merge/close"
-msgstr "Temps entre la création d'une demande de fusion et sa fusion/clôture"
+msgstr "Temps entre la création d’une demande de fusion et sa fusion/clôture"
+
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
msgid "Time remaining"
-msgstr "Temp restant"
+msgstr "Temps restant"
msgid "Time spent"
msgstr "Temps passé"
@@ -4644,7 +6409,7 @@ msgid "TimeTrackingEstimated|Est"
msgstr "Est"
msgid "TimeTracking|Estimated:"
-msgstr "Estimé :"
+msgstr "Estimé :"
msgid "TimeTracking|Spent"
msgstr "Passé"
@@ -4794,12 +6559,30 @@ msgstr "s"
msgid "Tip:"
msgstr "Astuce :"
+msgid "Title"
+msgstr "Titre"
+
msgid "To GitLab"
msgstr "Vers GitLab"
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "Afin d’ajouter une clef SSH, vous devez soit %{generate_link_start}en génèrer une%{link_end}, soit utiliser une %{existing_link_start}clef existante%{link_end}."
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr "Pour importer les dépôts GitHub, vous pouvez utiliser un %{personal_access_token_link}. Lorsque vous créez votre jeton d’accès, vous devrez sélectionner le champ <code>repo</code>, afin que nous puissions afficher une liste de vos dépôts publics et privés qui sont disponibles pour être importés."
@@ -4809,21 +6592,45 @@ msgstr "Pour importer des dépôts GitHub, vous devez d’abord autoriser GitLab
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Pour importer un dépôt SVN, consultez %{svn_link}."
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr "Pour commencer à exécuter vos tâches, vous pouvez ajouter des exécuteurs à votre groupe"
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr "Pour valider vos configurations GitLab CI, allez dans 'CI / CD → Pipelines' dans votre projet, et cliquez sur le bouton 'CI Lint'."
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr "Tâche"
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr "Afficher/masquer la barre latérale"
msgid "Toggle discussion"
msgstr "Basculer la discussion"
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr "Afficher/masquer la barre latérale"
@@ -4836,6 +6643,9 @@ msgstr "État du commutateur : Actif"
msgid "Too many changes to show."
msgstr "Trop de changements à afficher."
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "Temps total"
@@ -4845,9 +6655,18 @@ msgstr "Temps total de test pour tous les commits/fusions"
msgid "Total: %{total}"
msgstr "Total : %{total}"
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "Suivre le temps estimé/passé avec les actions rapides"
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr "Déclencher cette action manuelle"
@@ -4857,9 +6676,21 @@ msgstr "Les déclencheurs peuvent forcer la reconstruction pour une branche ou u
msgid "Try again"
msgstr "Veuillez réessayer"
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr "Impossible de charger le diff. %{button_try_again}"
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr "Inconnu"
+
msgid "Unlock"
msgstr "Déverrouiller"
@@ -4902,14 +6733,30 @@ msgstr "Non vérifié"
msgid "Up to date"
msgstr "À jour"
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr "Modifiez le nom du groupe, sa description, son logo et d’autres paramètres généraux."
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "Téléverser un nouveau fichier"
@@ -4928,18 +6775,36 @@ msgstr "Votes positifs"
msgid "Usage statistics"
msgstr "Statistiques d’utilisation"
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr "Utilisez les jalons de groupe pour gérer les tickets de plusieurs projets dans le même jalon."
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "Utiliser le jeton d’inscription suivant pendant l’installation :"
msgid "Use your global notification setting"
msgstr "Utiliser vos paramètres de notification globaux"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr "Limites de l’utilisateur et du débit IP"
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr "Utilisa·teur·trice·s"
@@ -4958,15 +6823,27 @@ msgstr "Divers paramètres de courriel."
msgid "Various settings that affect GitLab performance."
msgstr "Divers paramètres qui affectent les performances de GitLab."
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr "Vérifié"
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr "Voir le fichier @ "
msgid "View group labels"
msgstr "Afficher les labels de groupe"
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr "Afficher les tâches"
@@ -4988,6 +6865,12 @@ msgstr "Voir le fichier remplacé @ "
msgid "Visibility and access controls"
msgstr "Contrôles de visibilité et d’accès"
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Interne"
@@ -5003,6 +6886,9 @@ msgstr "Inconnu"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Vous voulez voir les données ? Merci de contacter un administrateur pour en obtenir l’accès."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "Nous n'avons pas suffisamment de données pour afficher cette étape."
@@ -5015,12 +6901,27 @@ msgstr "Web IDE"
msgid "Web terminal"
msgstr "Terminal Web"
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr "Poids"
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr "Lorsqu’un exécuteur est verrouillé, il ne peut pas être affecté à d’autres projets"
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr "Lorsque cette option est activée, les utilisateur•rice•s ne pourront pas utiliser GitLab tant que les conditions générales d’utilisation ne seront pas acceptés."
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr "Wiki"
@@ -5156,12 +7057,24 @@ msgstr "Pages"
msgid "Wiki|Wiki Pages"
msgstr "Pages du Wiki"
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "Retirer la demande d'accès"
msgid "Yes"
msgstr "Oui"
+msgid "Yes, add it"
+msgstr "Oui, l’ajouter"
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Vous êtes sur le point de supprimer %{group_name}. Les groupes supprimés NE PEUVENT PAS être restaurés ! Êtes vous ABSOLUMENT sûr·e ?"
@@ -5177,6 +7090,9 @@ msgstr "Vous allez transférer %{project_full_name} à un•e nouveau•elle pro
msgid "You are on a read-only GitLab instance."
msgstr "Vous êtes sur une instance GitLab en lecture seule."
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr "Vous pouvez %{linkStart}afficher les données brutes%{linkEnd} à la place."
@@ -5189,6 +7105,9 @@ msgstr "Vous pouvez marquer un label comme important pour en faire un label prio
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr "Vous pouvez également tester votre .gitlab-ci.yml avec %{linkStart}Lint%{linkEnd}"
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr "Vous pouvez facilement installer un Exécuteur sur un cluster Kubernetes. %{link_to_help_page}"
@@ -5204,12 +7123,24 @@ msgstr "Vous ne pouvez modifier des fichiers que dans une branche"
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Vous pouvez résoudre le conflit de fusion Git soit en mode interactif, en cliquant sur les boutons « %{use_ours} » ou « %{use_theirs} », soit en modifiant directement les fichiers. Valider ces modifications dans la branche « %{branch_name} »"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr "Vous ne pouvez pas écrire sur cette instance GitLab en lecture-seule."
msgid "You do not have any assigned merge requests"
msgstr "Aucune demande de fusion ne vous a été affectée"
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr "Vous n’avez pas les autorisations"
@@ -5228,6 +7159,12 @@ msgstr "Seul un responsable peut forcer la suppression d’un verrou"
msgid "You must sign in to star a project"
msgstr "Vous devez vous connecter pour mettre un projet en favori"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "Vous avez besoin d’une autorisation."
@@ -5258,9 +7195,18 @@ msgstr "Vous ne pourrez pas récupérer ou pousser de code par SSH tant que vous
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "Vous devrez utiliser différents noms de branches pour obtenir une comparaison valide."
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr "Vous recevez ce courriel en raison de votre compte sur %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr "Vos groupes"
@@ -5276,6 +7222,12 @@ msgstr "Activité de vos projets favoris"
msgid "Your Todos"
msgstr "Vos tâches à faire"
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr "Vos modifications peuvent être validées sur %{branch_name} car une demande de fusion est ouverte."
@@ -5300,18 +7252,239 @@ msgstr "auparavant "
msgid "among other things"
msgstr "entre autres choses"
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr "assignez vous"
msgid "branch name"
msgstr "nom de la branche"
+msgid "by"
+msgstr "par"
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr "instructions en ligne de commande"
msgid "connecting"
msgstr "connexion en cours"
+msgid "could not read private key, is the passphrase correct?"
+msgstr "impossible de lire la clef privée, la phrase secrète estâ€elle correcte ?"
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "jour"
@@ -5320,9 +7493,25 @@ msgstr[1] "jours"
msgid "deploy token"
msgstr "jeton de déploiement"
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr "n’a détecté aucune vulnérabilité"
+
msgid "disabled"
msgstr "désactivé"
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr "activé"
@@ -5332,12 +7521,30 @@ msgstr "%{slash_command} mettra à jour la durée estimée avec la dernière com
msgid "for this project"
msgstr "pour ce projet"
+msgid "here"
+msgstr "ici"
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr "importation en cours"
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr "dernière version"
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "demande de fusion"
@@ -5355,9 +7562,24 @@ msgstr "%{metricsLinkStart}L’usage mémoire%{metricsLinkEnd} %{emphasisStart}a
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr "%{metricsLinkStart}L’usage mémoire%{metricsLinkEnd} %{emphasisStart}est resté stable%{emphasisEnd} à %{memoryFrom}MO"
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr "Autoriser les commits des membres qui peuvent fusionner dans la branche cible"
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr "Annuler la fusion automatique"
@@ -5418,9 +7640,24 @@ msgstr "La fusion a échoué."
msgid "mrWidget|Merge locally"
msgstr "Fusionner localement"
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr "Fusionnée par"
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr "Diff simple"
@@ -5439,6 +7676,9 @@ msgstr "Supprimer la branche source"
msgid "mrWidget|Remove source branch"
msgstr "Supprimer la branche source"
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr "Demande de fusion de"
@@ -5490,9 +7730,6 @@ msgstr "Cette demande de fusion est en cours de fusion"
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr "Ce projet est archivé, l’accès en écriture a été désactivé"
-msgid "mrWidget|Web IDE"
-msgstr "Web IDE"
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr "Vous pouvez fusionner cette demande de fusion manuellement à l’aide de la"
@@ -5531,27 +7768,42 @@ msgstr "mot de passe"
msgid "personal access token"
msgstr "jeton d’accès personnel"
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr "restant"
msgid "remove due date"
msgstr "supprimer la date d’échéance"
+msgid "remove weight"
+msgstr "supprimer le poids"
+
msgid "source"
msgstr "source"
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr "%{slash_command} mettra à jour la somme du temps passé."
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr "ce document"
+msgid "to help your contributors communicate effectively!"
+msgstr "pour aider vos contributeurs à communiquer efficacement !"
+
msgid "username"
msgstr "nom d’utilisa·teur·trice"
msgid "uses Kubernetes clusters to deploy your code!"
msgstr "utilise les clusters Kubernetes pour déployer votre code !"
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr "avec %{additions} ajouts, %{deletions} suppressions."
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 8f5b04762d2..9b05dabdade 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -36,6 +36,16 @@ msgid_plural "%d exporters"
msgstr[0] ""
msgstr[1] ""
+msgid "%d failed test result"
+msgid_plural "%d failed test results"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "%d fixed test result"
+msgid_plural "%d fixed test results"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d issue"
msgid_plural "%d issues"
msgstr[0] ""
@@ -120,6 +130,11 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] ""
msgstr[1] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr ""
@@ -238,6 +253,12 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr ""
@@ -310,6 +331,15 @@ msgstr ""
msgid "Add users to group"
msgstr ""
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -376,6 +406,9 @@ msgstr ""
msgid "All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings."
msgstr ""
+msgid "All users"
+msgstr ""
+
msgid "Allow commits from members who can merge to the target branch."
msgstr ""
@@ -502,6 +535,9 @@ msgstr ""
msgid "Anonymous"
msgstr ""
+msgid "Anti-spam verification"
+msgstr ""
+
msgid "Any"
msgstr ""
@@ -532,6 +568,9 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
@@ -622,6 +661,9 @@ msgstr ""
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -679,6 +721,9 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -766,6 +811,9 @@ msgstr ""
msgid "Bitbucket import"
msgstr ""
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -1002,6 +1050,9 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Change template"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -1530,6 +1581,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1756,6 +1810,9 @@ msgstr ""
msgid "Control the display of third party offers."
msgstr ""
+msgid "ConvDev Index"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr ""
@@ -1792,6 +1849,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
@@ -1918,6 +1978,9 @@ msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1951,6 +2014,9 @@ msgstr ""
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
msgid "Deny"
msgstr ""
@@ -2403,6 +2469,9 @@ msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2412,6 +2481,9 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
msgid "Explore GitLab"
msgstr ""
@@ -2427,6 +2499,9 @@ msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2472,6 +2547,9 @@ msgstr ""
msgid "Files (%{human_size})"
msgstr ""
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr ""
@@ -2681,6 +2759,9 @@ msgstr ""
msgid "Group avatar"
msgstr ""
+msgid "Group details"
+msgstr ""
+
msgid "Group info:"
msgstr ""
@@ -2938,6 +3019,12 @@ msgstr ""
msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance Statistics"
+msgstr ""
+
+msgid "Instance Statistics visibility"
+msgstr ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -3007,6 +3094,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -3129,6 +3219,9 @@ msgstr ""
msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
msgstr ""
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
@@ -3165,9 +3258,15 @@ msgstr ""
msgid "Locked to current projects"
msgstr ""
+msgid "Logs"
+msgstr ""
+
msgid "Make sure you're logged into the account that owns the projects you'd like to import."
msgstr ""
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
msgid "Manage access"
msgstr ""
@@ -3363,6 +3462,9 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
@@ -3482,6 +3584,9 @@ msgstr ""
msgid "New tag"
msgstr ""
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
@@ -3509,12 +3614,21 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No labels with such name or description"
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
msgid "No public groups"
msgstr ""
@@ -3557,9 +3671,6 @@ msgstr ""
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
-msgid "Notes|Are you sure you want to cancel creating this comment?"
-msgstr ""
-
msgid "Notification events"
msgstr ""
@@ -3650,6 +3761,9 @@ msgstr ""
msgid "Online IDE integration settings."
msgstr ""
+msgid "Only admins"
+msgstr ""
+
msgid "Only comments from the following commit are shown below"
msgstr ""
@@ -3665,6 +3779,12 @@ msgstr ""
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr ""
@@ -3941,6 +4061,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Preview"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3965,6 +4088,9 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
@@ -4001,6 +4127,9 @@ msgstr ""
msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
msgstr ""
+msgid "Profiles|This emoji and message will appear on your profile and throughout the interface. The message can contain emoji codes, too."
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
@@ -4298,6 +4427,45 @@ msgstr ""
msgid "Remove project"
msgstr ""
+msgid "Rename"
+msgstr ""
+
+msgid "Rename file"
+msgstr ""
+
+msgid "Rename folder"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Reports|%{failedString} and %{resolvedString}"
+msgstr ""
+
+msgid "Reports|Class"
+msgstr ""
+
+msgid "Reports|Execution time"
+msgstr ""
+
+msgid "Reports|Failure"
+msgstr ""
+
+msgid "Reports|System output"
+msgstr ""
+
+msgid "Reports|Test summary"
+msgstr ""
+
+msgid "Reports|Test summary failed loading results"
+msgstr ""
+
+msgid "Reports|Test summary results are being parsed"
+msgstr ""
+
+msgid "Reports|no changed test results"
+msgstr ""
+
msgid "Repository"
msgstr ""
@@ -4319,6 +4487,9 @@ msgstr ""
msgid "Request Access"
msgstr ""
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -4570,6 +4741,9 @@ msgstr ""
msgid "Shared Runners"
msgstr ""
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4599,6 +4773,12 @@ msgstr[1] ""
msgid "Side-by-side"
msgstr ""
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4812,6 +4992,9 @@ msgstr ""
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4830,6 +5013,9 @@ msgstr ""
msgid "Submit as spam"
msgstr ""
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4845,6 +5031,9 @@ msgstr ""
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4934,6 +5123,9 @@ msgstr ""
msgid "Team"
msgstr ""
+msgid "Template"
+msgstr ""
+
msgid "Terms of Service Agreement and Privacy Policy"
msgstr ""
@@ -5093,6 +5285,9 @@ msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -5385,12 +5580,18 @@ msgstr ""
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -5427,6 +5628,9 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
@@ -5472,10 +5676,8 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update now"
msgstr ""
@@ -5516,12 +5718,18 @@ msgstr ""
msgid "Use one line per URI"
msgstr ""
+msgid "Use template"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
@@ -5531,6 +5739,9 @@ msgstr ""
msgid "Users"
msgstr ""
+msgid "User|Current Status"
+msgstr ""
+
msgid "Variables"
msgstr ""
@@ -5555,6 +5766,9 @@ msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -5597,6 +5811,9 @@ msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr ""
@@ -5870,9 +6087,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5924,9 +6150,6 @@ msgstr ""
msgid "branch name"
msgstr ""
-msgid "ciReport|Show complete code vulnerabilities report"
-msgstr ""
-
msgid "command line instructions"
msgstr ""
@@ -6153,6 +6376,11 @@ msgstr ""
msgid "or"
msgstr ""
+msgid "out of %d total test"
+msgid_plural "out of %d total tests"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "parent"
msgid_plural "parents"
msgstr[0] ""
@@ -6188,6 +6416,9 @@ msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/gl_ES/gitlab.po b/locale/gl_ES/gitlab.po
index 6b1139aa799..401895f0a16 100644
--- a/locale/gl_ES/gitlab.po
+++ b/locale/gl_ES/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Galician\n"
"Language: gl_ES\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] ""
@@ -77,6 +99,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -94,6 +119,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -117,16 +145,23 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] ""
msgstr[1] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
-msgid "(checkout the %{link} for information on how to install it)."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
msgid "+ %{moreCount} more"
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr ""
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr ""
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr ""
msgid "Add Contribution guide"
msgstr ""
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr ""
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr ""
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr ""
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr ""
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -529,12 +735,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -804,9 +1118,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -828,6 +1148,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr ""
@@ -837,9 +1160,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr ""
msgid "Cherry-pick this merge request"
msgstr ""
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,16 +1529,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1185,6 +1568,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1218,6 +1613,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1275,6 +1673,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr ""
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr ""
@@ -1648,6 +2064,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr ""
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr ""
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
@@ -1699,12 +2139,21 @@ msgstr ""
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1744,15 +2196,27 @@ msgstr ""
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr ""
msgid "Cron syntax"
msgstr ""
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr ""
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr ""
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr ""
@@ -1792,6 +2265,9 @@ msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1807,15 +2283,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] ""
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr ""
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr ""
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2112,43 +2678,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr ""
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr ""
@@ -2283,6 +2927,12 @@ msgstr ""
msgid "Find file"
msgstr ""
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr ""
msgid "FirstPushedBy|pushed by"
msgstr ""
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,10 +3247,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr ""
msgid "GoToYourFork|Fork"
msgstr ""
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,30 +3582,83 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr ""
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr ""
msgid "Introducing Cycle Analytics"
msgstr ""
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2668,6 +3737,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr ""
msgid "Leave project"
msgstr ""
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2856,18 +3997,30 @@ msgstr ""
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,16 +4272,16 @@ msgid_plural "New Issues"
msgstr[0] ""
msgstr[1] ""
-msgid "New Kubernetes Cluster"
+msgid "New Label"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Label"
+msgid "New Snippet"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Snippets"
msgstr ""
msgid "New branch"
@@ -3005,6 +4293,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr ""
@@ -3041,9 +4332,15 @@ msgstr ""
msgid "New tag"
msgstr ""
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr ""
msgid "No schedules"
msgstr ""
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3104,12 +4425,21 @@ msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr ""
@@ -3182,6 +4512,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3191,6 +4524,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr ""
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr ""
@@ -3212,6 +4575,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr ""
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3590,9 +5004,27 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -3602,9 +5034,39 @@ msgstr ""
msgid "ProjectLifecycle|Stage"
msgstr ""
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3623,7 +5085,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3650,9 +5139,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3719,6 +5235,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr ""
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr ""
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr ""
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr ""
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr ""
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr ""
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr ""
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr ""
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] ""
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr ""
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr ""
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr ""
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr ""
@@ -4460,6 +6192,9 @@ msgstr ""
msgid "The project can be accessed without any authentication."
msgstr ""
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr ""
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr ""
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr ""
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr ""
@@ -4628,6 +6390,9 @@ msgstr ""
msgid "Time between merge request creation and merge/close"
msgstr ""
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr ""
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr ""
@@ -4845,9 +6655,18 @@ msgstr ""
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr ""
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr ""
@@ -5003,6 +6886,9 @@ msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr ""
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr ""
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr ""
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr ""
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] ""
@@ -5320,9 +7493,25 @@ msgstr[1] ""
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/id_ID/gitlab.po b/locale/id_ID/gitlab.po
index 9a2df080a9e..27b6e13db7e 100644
--- a/locale/id_ID/gitlab.po
+++ b/locale/id_ID/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:01\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Indonesian\n"
"Language: id_ID\n"
@@ -15,6 +13,18 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: id\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:39\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -48,6 +58,10 @@ msgid "%d metric"
msgid_plural "%d metrics"
msgstr[0] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -56,6 +70,10 @@ msgid "%d unstaged change"
msgid_plural "%d unstaged changes"
msgstr[0] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] ""
@@ -66,6 +84,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -82,6 +103,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -104,16 +128,21 @@ msgid "%{storage_name}: failed storage access attempt on host:"
msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:"
msgstr[0] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
-msgid "(checkout the %{link} for information on how to install it)."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
msgid "+ %{moreCount} more"
@@ -181,6 +210,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -202,9 +255,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr ""
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -214,9 +276,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -238,12 +309,18 @@ msgstr ""
msgid "Activity"
msgstr ""
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr ""
msgid "Add Contribution guide"
msgstr ""
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -253,6 +330,12 @@ msgstr ""
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr ""
@@ -262,6 +345,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -343,12 +444,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -367,12 +495,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -394,7 +534,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -409,6 +552,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -421,18 +567,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr ""
@@ -448,6 +624,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -457,15 +639,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -493,12 +684,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr ""
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -508,12 +708,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -571,6 +795,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -652,6 +882,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -770,6 +1075,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -782,9 +1090,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -806,6 +1120,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr ""
@@ -815,9 +1132,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -845,6 +1168,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -866,6 +1192,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -881,6 +1213,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -926,6 +1264,12 @@ msgstr ""
msgid "Cherry-pick this merge request"
msgstr ""
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -941,9 +1285,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -1013,12 +1369,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1028,15 +1393,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1046,12 +1420,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1061,9 +1453,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1085,9 +1474,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1115,16 +1501,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1163,6 +1540,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1172,6 +1558,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1196,6 +1585,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1253,6 +1645,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1289,9 +1684,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1406,6 +1798,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1531,7 +1926,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1543,9 +1938,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1597,6 +2001,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1609,6 +2016,9 @@ msgstr ""
msgid "Contribution guide"
msgstr ""
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr ""
@@ -1624,6 +2034,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr ""
@@ -1636,10 +2064,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr ""
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1648,6 +2076,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1660,6 +2091,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
@@ -1675,12 +2109,21 @@ msgstr ""
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1699,6 +2142,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1720,15 +2166,27 @@ msgstr ""
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr ""
msgid "Cron syntax"
msgstr ""
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1744,6 +2202,15 @@ msgstr ""
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr ""
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr ""
@@ -1768,6 +2235,9 @@ msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1783,15 +2253,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] ""
@@ -1922,9 +2410,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr ""
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -1952,9 +2452,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -1997,6 +2515,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2009,12 +2530,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr ""
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2033,6 +2569,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2042,6 +2584,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2051,6 +2596,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2060,6 +2608,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2072,9 +2623,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2087,43 +2647,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2144,6 +2734,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2192,6 +2785,9 @@ msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2201,12 +2797,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2249,6 +2881,12 @@ msgstr ""
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr ""
@@ -2258,6 +2896,12 @@ msgstr ""
msgid "Find file"
msgstr ""
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2267,6 +2911,30 @@ msgstr ""
msgid "FirstPushedBy|pushed by"
msgstr ""
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2298,6 +2966,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -2319,6 +2999,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2340,10 +3215,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2355,18 +3248,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr ""
msgid "GoToYourFork|Fork"
msgstr ""
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2376,18 +3284,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2412,9 +3374,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2454,6 +3440,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2524,12 +3516,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2548,30 +3549,82 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr ""
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2596,7 +3649,10 @@ msgstr ""
msgid "Introducing Cycle Analytics"
msgstr ""
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2605,12 +3661,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2641,6 +3703,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2680,12 +3745,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2759,12 +3830,30 @@ msgstr ""
msgid "Leave project"
msgstr ""
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2786,15 +3875,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2804,6 +3917,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2828,18 +3962,30 @@ msgstr ""
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2870,12 +4016,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2900,6 +4148,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
@@ -2912,21 +4163,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2936,6 +4202,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2948,6 +4217,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2955,16 +4236,16 @@ msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] ""
-msgid "New Kubernetes Cluster"
+msgid "New Label"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Label"
+msgid "New Snippet"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Snippets"
msgstr ""
msgid "New branch"
@@ -2976,6 +4257,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr ""
@@ -3012,9 +4296,15 @@ msgstr ""
msgid "New tag"
msgstr ""
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3039,18 +4329,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr ""
msgid "No schedules"
msgstr ""
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3075,12 +4389,21 @@ msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr ""
@@ -3153,6 +4476,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3162,6 +4488,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr ""
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3171,9 +4506,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr ""
@@ -3183,6 +4539,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr ""
@@ -3192,6 +4554,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3228,6 +4593,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3261,6 +4629,9 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3405,6 +4776,12 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3414,6 +4791,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3423,6 +4809,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3432,6 +4821,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3456,9 +4848,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3486,9 +4884,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3507,6 +4911,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3561,9 +4968,27 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -3573,9 +4998,39 @@ msgstr ""
msgid "ProjectLifecycle|Stage"
msgstr ""
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3594,7 +5049,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3621,9 +5103,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3636,21 +5127,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3675,12 +5169,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3690,6 +5199,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3699,15 +5211,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr ""
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr ""
@@ -3717,6 +5241,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3768,12 +5295,27 @@ msgstr ""
msgid "Remove project"
msgstr ""
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3783,9 +5325,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr ""
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3807,6 +5355,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3832,13 +5383,22 @@ msgstr ""
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3856,6 +5416,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3865,6 +5440,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3886,6 +5464,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr ""
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3925,6 +5512,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3955,12 +5557,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -3973,9 +5584,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4000,6 +5617,9 @@ msgstr ""
msgid "Set up Koding"
msgstr ""
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr ""
@@ -4012,9 +5632,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4043,6 +5678,30 @@ msgstr[0] ""
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4055,6 +5714,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4076,6 +5738,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4091,6 +5759,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4133,6 +5804,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4142,6 +5816,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4181,6 +5858,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4253,9 +5933,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4265,9 +5951,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4280,9 +5975,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr ""
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4380,18 +6087,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -4407,7 +6126,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4419,6 +6141,9 @@ msgstr ""
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr ""
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr ""
@@ -4428,6 +6153,9 @@ msgstr ""
msgid "The project can be accessed without any authentication."
msgstr ""
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr ""
@@ -4440,6 +6168,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr ""
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4455,12 +6186,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr ""
@@ -4476,12 +6213,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4503,15 +6234,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4587,6 +6336,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr ""
@@ -4596,6 +6351,9 @@ msgstr ""
msgid "Time between merge request creation and merge/close"
msgstr ""
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4760,12 +6518,30 @@ msgstr ""
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4775,21 +6551,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4802,6 +6602,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr ""
@@ -4811,9 +6614,18 @@ msgstr ""
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4823,9 +6635,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4868,13 +6692,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr ""
@@ -4893,18 +6734,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4923,15 +6782,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4953,6 +6824,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr ""
@@ -4968,6 +6845,9 @@ msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr ""
@@ -4980,12 +6860,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5121,12 +7016,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr ""
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
@@ -5142,6 +7049,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5154,6 +7064,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5169,12 +7082,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5193,6 +7118,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr ""
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr ""
@@ -5223,9 +7154,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5241,6 +7181,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5265,18 +7211,238 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] ""
@@ -5284,9 +7450,23 @@ msgstr[0] ""
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5296,12 +7476,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5318,9 +7516,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5381,9 +7594,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5402,6 +7630,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5453,9 +7684,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5493,27 +7721,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/it/gitlab.po b/locale/it/gitlab.po
index 9db2619c625..14335f97bd6 100644
--- a/locale/it/gitlab.po
+++ b/locale/it/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Italian\n"
"Language: it_IT\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] "%d metrica"
msgstr[1] "%d metriche"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s commit aggiuntivo è stato omesso per evitare degradi di prestazioni negli issues."
@@ -77,6 +99,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "%{commit_author_link} fatto %{commit_timeago}"
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} partecipante"
@@ -94,6 +119,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -117,18 +145,25 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] "%{storage_name}: tentativo d'accesso all'archiviazione fallito da parte dell'host:"
msgstr[1] "%{storage_name}: %{failed_attempts} tentativi d'accesso all'archiviazione falliti:"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr "%{text} è disponibile"
msgid "%{title} changes"
msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(vedi il %{link} su come installarlo)."
-
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} più"
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "Riguardo il rilascio automatico"
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Segnalazioni di abuso"
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Token di accesso"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "L'accesso agli storages è stato temporaneamente disabilitato per consentire il mount di ripristino. Resetta le info d'archiviazione dopo che l'issue è stato risolto per consentire nuovamente l'accesso."
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr "Attività"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "Aggiungi Changelog"
msgid "Add Contribution guide"
msgstr "Aggiungi Guida per contribuire"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr "Aggiungi Licenza"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Aggiungi una directory (cartella)"
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr "Errore durante l'attivazione/disattivazione della sottoscrizione per l'iscrizione"
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr "Si è verificato un errore. Riprova."
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr "Aspetto"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "Applicazioni"
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Sei sicuro di voler cancellare questa pipeline programmata?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr "Sei sicuro di voler ripristinare il token di registrazione?"
msgid "Are you sure you want to reset the health check token?"
msgstr "Confermi di voler resettare il token di controllo di stato?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr "Sei sicuro?"
msgid "Artifacts"
msgstr "Artefatti"
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Aggiungi un file tramite trascina &amp; rilascia ( drag &amp; drop) o %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr "Ago"
@@ -529,12 +735,36 @@ msgstr "Agosto"
msgid "Authentication Log"
msgstr "Log di autenticazione"
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr "Autore"
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr "La branch predefinita non può esser eliminata"
@@ -804,9 +1118,15 @@ msgstr "Per evitare perdita di dati considera di mergiare questa branch prima di
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "Per confermare, scrivi %{branch_name_confirmation}:"
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "Stai per eliminare la branch protetta (%{branch_name}) in maniera permanente."
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr "mergiata"
@@ -828,6 +1148,9 @@ msgstr "Esplora Files"
msgid "Browse files"
msgstr "Guarda i files"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "per"
@@ -837,9 +1160,15 @@ msgstr "CI / CD"
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr "Cherry-pick di questo commit"
msgid "Cherry-pick this merge request"
msgstr "Cherry-pick questa richiesta di merge"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "cancellato"
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr "api circuitbreaker"
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr "Clona repository"
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr "API URL"
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr "Certificato CA"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Certificate Authority bundle (formato PEM)"
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,18 +1529,9 @@ msgstr "Copia Token"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
-msgstr "Inserisci i dettagli per un cluster Kubernetes esistente"
-
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr ""
@@ -1185,6 +1568,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr "Ingresso"
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr "Installa"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr "Installato"
@@ -1218,6 +1613,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1275,6 +1673,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr "Guida per contribuire"
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr "Collaboratori"
@@ -1648,6 +2064,24 @@ msgstr "Esegui i commit su %{branch_name}, escludendo i commit di merge. Limitat
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr "Attendere prego, questa pagina si ricaricherà automaticamente appena pronta."
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr "Copia URL negli appunti"
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr "Copia l'SHA del commit negli appunti"
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Creare un token di accesso sul tuo account per eseguire pull o push tramite %{protocol}"
@@ -1699,12 +2139,21 @@ msgstr "Crea cartella"
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr "Crea file"
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr "Crea una nuova cartella"
msgid "Create new file"
msgstr "Crea un nuovo File"
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1744,15 +2196,27 @@ msgstr "Crea token d'accesso personale"
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr "Timezone del Cron"
msgid "Cron syntax"
msgstr "Sintassi Cron"
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr "Eventi-Notifica personalizzati"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "I livelli di notifica personalizzati sono uguali a quelli di partecipazione. Con i livelli di notifica personalizzati riceverai anche notifiche per gli eventi da te scelti %{notification_link}."
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "Statistiche Cicliche"
@@ -1792,6 +2265,9 @@ msgstr "Pre-rilascio"
msgid "CycleAnalyticsStage|Test"
msgstr "Test"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr "Tutti"
@@ -1807,15 +2283,33 @@ msgstr "Dicembre"
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "Definisci un patter personalizzato mediante la sintassi cron"
msgid "Delete"
msgstr "Elimina"
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "Rilascio"
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr "Descrizione"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "Dettagli"
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr "Chiudi l'introduzione alle Analisi Cicliche"
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr "Cambia programmazione della pipeline %{id}"
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr "Errore durante il fetch degli ambienti."
msgid "Environments|An error occurred while making the request."
msgstr "Errore durante l'esecuzione della richiesta."
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr "Commit"
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr "Rilascio"
@@ -2112,43 +2678,73 @@ msgstr "Ambienti"
msgid "Environments|Job"
msgstr "Job"
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr "Nuovo ambiente"
msgid "Environments|No deployments yet"
msgstr "Ancora nessuna chiave di rilascio"
-msgid "Environments|Open"
-msgstr "Apri"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr ""
-msgid "Environments|Re-deploy"
-msgstr "Rilascia di nuovo"
+msgid "Environments|Re-deploy to environment"
+msgstr ""
msgid "Environments|Read more about environments"
msgstr "Leggi di più sugli ambienti"
-msgid "Environments|Rollback"
-msgstr "Rollback (ripristina)"
+msgid "Environments|Rollback environment"
+msgstr ""
msgid "Environments|Show all"
msgstr "Mostra tutti"
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr "Aggiornato"
msgid "Environments|You don't have any environments right now."
msgstr "Attualmente non hai alcun ambiente."
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr "Ogni primo giorno del mese (alle 4 del mattino)"
msgid "Every week (Sundays at 4:00am)"
msgstr "Ogni settimana (Di domenica alle 4 del mattino)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr "Esplora progetti"
msgid "Explore public groups"
msgstr "Esplora gruppi pubblici"
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr "Files"
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Filtra per messaggio di commit"
@@ -2283,6 +2927,12 @@ msgstr "Trova in percorso"
msgid "Find file"
msgstr "Trova file"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr "Primo"
msgid "FirstPushedBy|pushed by"
msgstr "Push di"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Dalla creazione di un issue fino al rilascio in produzione"
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,11 +3247,29 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
-msgstr "Sezione Gitlab Runner"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr ""
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Vai il tuo fork"
msgid "GoToYourFork|Fork"
msgstr "Fork"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "L'autenticazione Google non è %{link_to_documentation}. Richiedi al tuo amministratore Gitlab se desideri utilizzare il servizio."
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Blocca la condivisione di un progetto di %{group} con altri gruppi"
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr "Verifica stato"
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,30 +3582,83 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr "Importa repository"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr "Intervallo di Pattern"
msgid "Introducing Cycle Analytics"
msgstr "Introduzione delle Analisi Cicliche"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr "Gen"
@@ -2668,6 +3737,9 @@ msgstr "Giugno"
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr "Abbandona il gruppo"
msgid "Leave project"
msgstr "Abbandona il progetto"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr "Bloccato"
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
-msgstr "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr "Mar"
@@ -2856,18 +3997,30 @@ msgstr "Mediano"
msgid "Members"
msgstr "Membri"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr "Richieste di merge"
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr "Richiesta di merge"
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr "Messaggi"
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "aggiungi una chiave SSH"
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr "Monitoraggio"
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr "Ulteriori informazioni sono disponibili | qui"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,18 +4272,18 @@ msgid_plural "New Issues"
msgstr[0] "Nuovo Issue"
msgstr[1] "Nuovi Issues"
-msgid "New Kubernetes Cluster"
-msgstr ""
-
-msgid "New Kubernetes cluster"
-msgstr ""
-
msgid "New Label"
msgstr ""
msgid "New Pipeline Schedule"
msgstr "Nuova pianificazione Pipeline"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "Nuova Branch"
@@ -3005,6 +4293,9 @@ msgstr ""
msgid "New directory"
msgstr "Nuova directory"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "Nuovo file"
@@ -3041,9 +4332,15 @@ msgstr "Nuovo sottogruppo"
msgid "New tag"
msgstr "Nuovo tag"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "Nessuna Repository"
msgid "No schedules"
msgstr "Nessuna pianificazione"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "Nessuno"
@@ -3104,12 +4425,21 @@ msgstr "Dati insufficienti "
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "Notifica eventi"
@@ -3182,6 +4512,9 @@ msgstr "Novembre"
msgid "Number of access attempts"
msgstr "Numero di tentativi di accesso raggiunto"
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr "Ott"
@@ -3191,6 +4524,15 @@ msgstr "Ottobre"
msgid "OfSearchInADropdown|Filter"
msgstr "Filtra"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Solo i membri del progetto possono commentare."
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Aperto"
@@ -3212,6 +4575,12 @@ msgstr "Si apre in una nuova finestra"
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "Opzioni"
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr "Password"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr "Pianificazione Pipeline"
msgid "Pipeline Schedules"
msgstr "Pianificazione multipla Pipeline"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr "con più stadi"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr "Preferenze"
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr "Profilo"
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr "Account pianificato per la rimozione."
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr "Username non valido"
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Inserisci il tuo %{confirmationValue} per confermare:"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr "Devi trasferire la proprietà o eliminare questi gruppi prima che tu pos
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "Il tuo account è attualmente proprietario in questi gruppi:"
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr "il tuo account"
@@ -3590,9 +5004,27 @@ msgstr "Il link d'esportazione del progetto è scaduto. Genera una nuova esporta
msgid "Project export started. A download link will be sent by email."
msgstr "Esportazione del progetto iniziata. Un link di download sarà inviato via email."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "Iscriviti"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Nome"
@@ -3602,9 +5034,39 @@ msgstr "Mai"
msgid "ProjectLifecycle|Stage"
msgstr "Stadio"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr "Progetti"
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "Visitati di frequente"
@@ -3623,8 +5085,35 @@ msgstr "Qualcosa è andato storto dalla nostra parte."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "Siamo spiacenti, non ci sono progetti che corrispondono alla tua ricerca"
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr "Questa feature richiede il supporto del localStorage del browser"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
+msgstr ""
msgid "PrometheusDashboard|Time"
msgstr ""
@@ -3650,9 +5139,18 @@ msgstr "Di default, Prometheus è in ascolto su ‘http://localhost:9090‘. Non
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "Ricerco e configuro le metriche..."
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr "Metriche"
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr "Variabile d'ambiente mancante"
msgid "PrometheusService|More information"
msgstr "Ulteriori informazioni"
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "Pubblico - il gruppo e tutti i progetti pubblici possono essere visualizzati senza alcuna autenticazione."
@@ -3719,6 +5235,9 @@ msgstr "Public - Chiunque può accedere a questo progetto senza alcuna autentica
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr "Vedi altro"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "Leggimi"
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr "Rimuovi progetto"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "Richiedi accesso"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr "Ripristina questa richiesta di merge"
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr "Chiavi SSH"
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr "Salva modifiche"
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr "Pianificazione pipelines"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr "Seleziona una branch di destinazione"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr "Settembre"
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr "Configura Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "imposta una password"
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] "Visualizza %d eventi"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr "Qualcosa è andato storto durante il fetch dei progetti."
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr "Ordina per"
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "Cambia branch/tag"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Lo stadio di programmazione mostra il tempo trascorso dal primo commit alla creazione di una richiesta di merge (MR). I dati saranno aggiunti una volta che avrai creato la prima richiesta di merge."
msgid "The collection of events added to the data gathered for that stage."
msgstr "L'insieme di eventi aggiunti ai dati raccolti per quello stadio."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "La relazione del fork è stata rimossa"
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr "Il ciclo vitale della fase di sviluppo."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "Lo stadio di pianificazione mostra il tempo trascorso dal primo commit al suo step precedente. Questo periodo sarà disponibile automaticamente nel momento in cui farai il primo commit."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "Lo stadio di produzione mostra il tempo totale che trascorre tra la creazione di un issue il suo rilascio (inteso come codice) in produzione. Questo dato sarà disponibile automaticamente nel momento in cui avrai completato l'intero processo ideale del ciclo di produzione"
@@ -4460,6 +6192,9 @@ msgstr "Qualunque utente autenticato può accedere a questo progetto."
msgid "The project can be accessed without any authentication."
msgstr "Chiunque può accedere a questo progetto (senza alcuna autenticazione)."
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "La repository di questo progetto non esiste."
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "Lo stadio di revisione mostra il tempo tra una richiesta di merge al suo svolgimento effettivo. Questo dato sarà disponibile appena avrai completato una MR (Merger Request)"
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "Il tempo aggregato relativo eventi/data entry raccolto in quello stadio."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "Il valore falsato nel mezzo di una serie di dati osservati. ES: tra 3,5,9 il mediano è 5. Tra 3,5,7,8 il mediano è (5+7)/2 quindi 6."
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "Il tempo che impiega un issue per esser pianificato"
@@ -4628,6 +6390,9 @@ msgstr "Il tempo che impiega un issue per esser implementato"
msgid "Time between merge request creation and merge/close"
msgstr "Il tempo tra la creazione di una richiesta di merge ed il merge/close"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr "s"
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "Tempo Totale"
@@ -4845,9 +6655,18 @@ msgstr "Tempo totale di test per tutti i commits/merges"
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "Carica un nuovo file"
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr "Usa le tue impostazioni globali "
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Interno"
@@ -5003,6 +6886,9 @@ msgstr "Sconosciuto"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Vuoi visualizzare i dati? Richiedi l'accesso ad un amministratore, grazie."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "Non ci sono sufficienti dati da mostrare su questo stadio"
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "Ritira richiesta d'accesso"
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Stai per rimuovere il gruppo %{group_name}. I gruppi rimossi NON POSSONO esser ripristinati! Sei ASSOLUTAMENTE sicuro?"
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "Devi accedere per porre una star al progetto"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "Necessiti del permesso."
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr "fa"
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "giorno"
@@ -5320,9 +7493,25 @@ msgstr[1] "giorni"
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/ja/gitlab.po b/locale/ja/gitlab.po
index ccdb620bd1e..acd78058d50 100644
--- a/locale/ja/gitlab.po
+++ b/locale/ja/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
@@ -15,10 +13,22 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:39\n"
+
+msgid " and"
+msgstr " ã¨"
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] " %dãƒã‚¤ãƒ³ãƒˆæ‚ªåŒ–"
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] " %dãƒã‚¤ãƒ³ãƒˆã§æ”¹å–„"
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
+msgstr[0] "%d 個ã®å¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«"
msgid "%d commit"
msgid_plural "%d commits"
@@ -46,14 +56,22 @@ msgstr[0] "%d 個ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
msgid "%d metric"
msgid_plural "%d metrics"
+msgstr[0] "%d メトリクス"
+
+msgid "%d new license"
+msgid_plural "%d new licenses"
msgstr[0] ""
msgid "%d staged change"
msgid_plural "%d staged changes"
-msgstr[0] ""
+msgstr[0] "%d件ã®ã‚¹ãƒ†ãƒ¼ã‚¸æ¸ˆã¿å¤‰æ›´"
msgid "%d unstaged change"
msgid_plural "%d unstaged changes"
+msgstr[0] "%d件ã®æœªã‚¹ãƒ†ãƒ¼ã‚¸ã®å¤‰æ›´"
+
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
msgstr[0] ""
msgid "%s additional commit has been omitted to prevent performance issues."
@@ -61,20 +79,23 @@ msgid_plural "%s additional commits have been omitted to prevent performance iss
msgstr[0] "パフォーマンス低下をé¿ã‘ã‚‹ãŸã‚ %s 個ã®ã‚³ãƒŸãƒƒãƒˆã‚’çœç•¥ã—ã¾ã—ãŸã€‚"
msgid "%{actionText} & %{openOrClose} %{noteable}"
-msgstr ""
+msgstr "%{actionText} 㨠%{openOrClose} %{noteable}"
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "%{commit_author_link} ㌠%{commit_timeago} ã«ã‚³ãƒŸãƒƒãƒˆã—ã¾ã—ãŸ"
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} 人ã®å‚加者"
msgid "%{filePath} deleted"
-msgstr ""
+msgstr "%{filePath} ãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸ"
msgid "%{group_docs_link_start}Groups%{group_docs_link_end} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
-msgstr ""
+msgstr "%{group_docs_link_start}グループ%{group_docs_link_end}を使用ã™ã‚‹ã¨ã€è¤‡æ•°ã®ãƒ—ロジェクトを管ç†ã—ã¦å…±åŒä½œæ¥­ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ‰€å±žã™ã‚‹ãƒ—ロジェクトã®ã™ã¹ã¦ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚"
msgid "%{loadingIcon} Started"
msgstr "%{loadingIcon} 開始"
@@ -82,11 +103,14 @@ msgstr "%{loadingIcon} 開始"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} ã¯GitLab ユーザー %{lock_user_id} ã«ã‚ˆã£ã¦ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™"
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr "%{nip_domain} ã¯ã€ã‚«ã‚¹ã‚¿ãƒ ãƒ‰ãƒ¡ã‚¤ãƒ³ã®ä»£æ›¿ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã™ã€‚"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
-msgstr ""
+msgstr "%{default_branch} ã‹ã‚‰ %{number_commits_behind} コミットé…ã‚Œã¦ã„ã¦ã€ %{number_commits_ahead} コミット進んã§ã„ã¾ã™ã€‚"
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt."
msgstr "%{maximum_failures}回中 %{number_of_failures}回失敗。次回アクセスå¯èƒ½ã§ã™ã€‚"
@@ -104,29 +128,34 @@ msgid "%{storage_name}: failed storage access attempt on host:"
msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:"
msgstr[0] "%{storage_name}: 失敗ã—ãŸã‚¢ã‚¯ã‚»ã‚¹ã®è©¦è¡Œå›žæ•° %{failed_attempts}:"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+
msgid "%{text} is available"
msgstr "%{text} ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚"
msgid "%{title} changes"
msgstr "%{title} ã®å¤‰æ›´"
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(インストール方法㯠%{link} ã‚’ã”覧ãã ã•ã„)。"
+msgid "%{unstaged} unstaged and %{staged} staged changes"
+msgstr "%{unstaged} 件ã®æœªã‚¹ãƒ†ãƒ¼ã‚¸ã®å¤‰æ›´ã¨ã€ %{staged} 件ã®ã‚¹ãƒ†ãƒ¼ã‚¸æ¸ˆã¿å¤‰æ›´"
msgid "+ %{moreCount} more"
msgstr "+ 他 %{moreCount} 件"
msgid "- Runner is active and can process any new jobs"
-msgstr ""
+msgstr "- RunnerãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã§æ–°ã—ã„ジョブを処ç†ã§ãã¾ã™"
msgid "- Runner is paused and will not receive any new jobs"
-msgstr ""
+msgstr "- RunnerãŒåœæ­¢ä¸­ã®ãŸã‚æ–°ã—ã„ジョブã¯å‡¦ç†ã•ã‚Œã¾ã›ã‚“"
msgid "- show less"
-msgstr ""
+msgstr "- 折りãŸãŸã‚€"
msgid "1 %{type} addition"
msgid_plural "%{count} %{type} additions"
@@ -138,7 +167,7 @@ msgstr[0] "%{count} 件 %{type} ã®ä¿®æ­£"
msgid "1 closed issue"
msgid_plural "%d closed issues"
-msgstr[0] ""
+msgstr[0] "%d件ã®ã‚¯ãƒ­ãƒ¼ã‚ºã•ã‚ŒãŸèª²é¡Œ"
msgid "1 closed merge request"
msgid_plural "%d closed merge requests"
@@ -164,28 +193,52 @@ msgid "1st contribution!"
msgstr "最åˆã®è²¢çŒ®!"
msgid "2FA enabled"
-msgstr ""
+msgstr "2段階èªè¨¼ãŒæœ‰åŠ¹"
msgid "403|Please contact your GitLab administrator to get the permission."
-msgstr ""
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã®é–²è¦§ã«ã¯æ¨©é™ãŒå¿…è¦ã§ã™ã€‚GitLab管ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。"
msgid "403|You don't have the permission to access this page."
-msgstr ""
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "404|Make sure the address is correct and the page hasn't moved."
-msgstr ""
+msgstr "URLãŒæ­£ã—ããªã„ã‹ã€ãƒšãƒ¼ã‚¸ãŒç§»å‹•ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "404|Page Not Found"
-msgstr ""
+msgstr "ページãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ãŒæ­£ã—ããªã„å ´åˆã€GitLab 管ç†è€…ã«é€£çµ¡ã—ã¦ãã ã•ã„。"
+
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
msgstr ""
msgid "<strong>Removes</strong> source branch"
msgstr "ソースブランãƒã‚’<strong>削除</strong>"
msgid "A 'Runner' is a process which runs a job. You can setup as many Runners as you need."
-msgstr ""
+msgstr "「Runnerã€ã¯ã‚¸ãƒ§ãƒ–を実行ã™ã‚‹ãƒ—ロセスã§ã™ã€‚å¿…è¦ãªæ•°ã® Runner ã‚’ä»»æ„ã«ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—ã§ãã¾ã™ã€‚"
msgid "A collection of graphs regarding Continuous Integration"
msgstr "CIã«ã¤ã„ã¦ã®ã‚°ãƒ©ãƒ•"
@@ -202,21 +255,39 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr "ã“ã®ã‚ªãƒ—ションをé¸æŠžã—ãŸã‚½ãƒ¼ã‚¹ãƒ–ランãƒã¸ã®æ›¸ãè¾¼ã¿ã‚’許å¯ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼"
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "自動デプロイã«ã¤ã„ã¦"
+msgid "About this feature"
+msgstr "ã“ã®æ©Ÿèƒ½ã«ã¤ã„ã¦"
+
msgid "Abuse Reports"
msgstr "ä¸æ­£è¡Œç‚ºãƒ¬ãƒãƒ¼ãƒˆ"
msgid "Abuse reports"
-msgstr ""
+msgstr "迷惑行為レãƒãƒ¼ãƒˆ"
msgid "Accept terms"
+msgstr "利用è¦ç´„ã«åŒæ„ã™ã‚‹"
+
+msgid "Accepted MR"
msgstr ""
msgid "Access Tokens"
msgstr "アクセス トークン"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "mount ã«ã‚ˆã£ã¦å¾©æ—§ã§ãるよã†ã«ã€å¤±æ•—ãŒç™ºç”Ÿã—ã¦ã„るストレージã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’一時的ã«æŠ‘æ­¢ã—ã¾ã—ãŸã€‚å†åº¦ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ãŸã‚ã«ã¯ã€å•é¡Œã‚’解決ã—ã¦ã‹ã‚‰ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸æƒ…報をリセットã—ã¦ãã ã•ã„。"
@@ -227,7 +298,7 @@ msgid "Account"
msgstr "アカウント"
msgid "Account and limit"
-msgstr ""
+msgstr "アカウントã¨åˆ¶é™"
msgid "Active"
msgstr "有効"
@@ -238,12 +309,18 @@ msgstr "アクティブ セッション"
msgid "Activity"
msgstr "アクティビティー"
+msgid "Add"
+msgstr "追加"
+
msgid "Add Changelog"
msgstr "変更履歴を追加"
msgid "Add Contribution guide"
msgstr "貢献者å‘ã‘ガイドを追加"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr "Kubernetes クラスターを追加"
@@ -253,15 +330,39 @@ msgstr "ライセンスを追加"
msgid "Add Readme"
msgstr "Readmeを追加"
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’追加"
msgid "Add reaction"
-msgstr ""
+msgstr "リアクションã®è¿½åŠ "
msgid "Add todo"
msgstr "Todoを追加"
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr "追加テキスト"
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "å…¨ã¦ã®ã‚¸ãƒ§ãƒ–ã‚’åœæ­¢"
@@ -278,7 +379,7 @@ msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs
msgstr "å…¨ã¦ã®ã‚¸ãƒ§ãƒ–ã‚’åœæ­¢ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šç¾åœ¨å®Ÿè¡Œä¸­ã®ã‚¸ãƒ§ãƒ–ã¯åœæ­¢ã•ã‚Œã¾ã™ã€‚"
msgid "AdminHealthPageLink|health page"
-msgstr ""
+msgstr "ステータスページ"
msgid "AdminProjects|Delete"
msgstr "削除"
@@ -290,7 +391,7 @@ msgid "AdminProjects|Delete project"
msgstr "プロジェクトã®å‰Šé™¤"
msgid "AdminSettings|Specify a domain to use by default for every project's Auto Review Apps and Auto Deploy stages."
-msgstr ""
+msgstr "ã™ã¹ã¦ã®ãƒ—ロジェクトã®Auto Review AppsãŠã‚ˆã³Auto Deployステージã§ä½¿ç”¨ã™ã‚‹ã€ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’指定ã—ã¾ã™ã€‚"
msgid "AdminUsers|Block user"
msgstr "ブロックユーザー"
@@ -314,7 +415,7 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr "確èªã®ãŸã‚ã€%{username} を入力ã—ã¦ãã ã•ã„"
msgid "Advanced"
-msgstr ""
+msgstr "高度ãªè¨­å®š"
msgid "Advanced settings"
msgstr "高度ãªè¨­å®š"
@@ -329,7 +430,7 @@ msgid "All features are enabled for blank projects, from templates, or when impo
msgstr "空ã®ãƒ—ロジェクトã€ãƒ†ãƒ³ãƒ—レートã‹ã‚‰ã€ã¾ãŸã¯ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«ã™ã¹ã¦ã®æ©Ÿèƒ½ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ãŒã€å¾Œã§ãƒ—ロジェクト設定ã§ç„¡åŠ¹ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "Allow commits from members who can merge to the target branch."
-msgstr ""
+msgstr "ターゲットブランãƒã«ãƒžãƒ¼ã‚¸ã§ãるメンãƒãƒ¼ã‹ã‚‰ã®ã‚³ãƒŸãƒƒãƒˆã‚’許å¯ã—ã¾ã™ã€‚"
msgid "Allow public access to pipelines and job details, including output logs and artifacts"
msgstr ""
@@ -338,15 +439,42 @@ msgid "Allow rendering of PlantUML diagrams in Asciidoc documents."
msgstr "Asciidocドキュメントã§ã®PlantUML図ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚’許å¯ã—ã¾ã™ã€‚"
msgid "Allow requests to the local network from hooks and services."
-msgstr ""
+msgstr "フックãŠã‚ˆã³ã‚µãƒ¼ãƒ“スã‹ã‚‰ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’許å¯ã™ã‚‹ã€‚"
msgid "Allows you to add and manage Kubernetes clusters."
+msgstr "Kubernetes クラスターを追加ãŠã‚ˆã³ç®¡ç†ã§ãã¾ã™ã€‚"
+
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
msgstr ""
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
+msgstr "ã‚ã‚‹ã„ã¯ã€ %{personal_access_token_link} を使用ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚パーソナルアクセストークンを作æˆã™ã‚‹éš›ã«ã€<code>repo</code>スコープをé¸æŠžã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒã§ãるパブリックリãƒã‚¸ãƒˆãƒªã¨ãƒ—ライベートリãƒã‚¸ãƒˆãƒªã®ä¸€è¦§ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
msgstr ""
msgid "An error occured creating the new branch."
+msgstr "æ–°ã—ã„ブランãƒã®ä½œæˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
msgstr ""
msgid "An error occured whilst loading all the files."
@@ -367,15 +495,27 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr "Blobã®ãƒ—レビュー中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred when toggling the notification subscription"
+msgstr "通知購読ã®åˆ‡ã‚Šæ›¿ãˆæ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+msgid "An error occurred when updating the issue weight"
msgstr ""
-msgid "An error occurred while dismissing the alert. Refresh the page and try again."
+msgid "An error occurred while adding approver"
msgstr ""
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
+msgid "An error occurred while dismissing the alert. Refresh the page and try again."
+msgstr "アラートã®æ¶ˆåŽ»ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ページを更新ã—ã¦ã‚„ã‚Šç›´ã—ã¦ä¸‹ã•ã„。"
+
msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
msgstr "ãƒã‚¤ãƒ©ã‚¤ãƒˆã‚’消去ã—ã¦ã„ã‚‹ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ページを更新ã—ã¦ã‚‚ã†ä¸€åº¦æ¶ˆåŽ»ã—ã¦ãã ã•ã„。"
@@ -394,8 +534,11 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
-msgstr "コミットを読ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
+msgstr ""
msgid "An error occurred while loading diff"
msgstr "差分ã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -409,6 +552,9 @@ msgstr "ファイルã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred while making the request."
msgstr "リクエスト作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr "KaTeXã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
@@ -421,18 +567,48 @@ msgstr "カレンダーアクティビティーå–å¾—ã®éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿ
msgid "An error occurred while retrieving diff"
msgstr "差分をå–å¾—ã®éš›ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr "担当者ã®ç™»éŒ²ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr "ユーザåã®æ¤œè¨¼ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "An error occurred. Please try again."
msgstr "エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚å†åº¦ãŠè©¦ã—ãã ã•ã„。"
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr "ä»»æ„ã®ãƒ©ãƒ™ãƒ«"
+
msgid "Appearance"
msgstr "外観"
+msgid "Application"
+msgstr "アプリケーション"
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "アプリケーション"
@@ -443,18 +619,27 @@ msgid "April"
msgstr "4月"
msgid "Archived project! Repository and other project resources are read-only"
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã¯ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚リãƒã‚¸ãƒˆãƒªãŠã‚ˆã³ãã®ä»–ã®ãƒ—ロジェクトリソースã¯èª­ã¿å–り専用ã§ã™"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "ã“ã®ãƒ‘イプラインスケジュールを削除ã—ã¾ã™ã‹ï¼Ÿ"
-msgid "Are you sure you want to remove this identity?"
+msgid "Are you sure you want to lose unsaved changes?"
msgstr ""
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
+msgid "Are you sure you want to remove this identity?"
+msgstr "ã“ã® ID を削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
+
msgid "Are you sure you want to reset registration token?"
msgstr "本当ã«ç™»éŒ²ãƒˆãƒ¼ã‚¯ãƒ³ã‚’リセットã—ã¾ã™ã‹ï¼Ÿ"
msgid "Are you sure you want to reset the health check token?"
+msgstr "本当ã«ãƒ˜ãƒ«ã‚¹ãƒã‚§ãƒƒã‚¯ãƒˆãƒ¼ã‚¯ãƒ³ã‚’リセットã—ã¾ã™ã‹ï¼Ÿ"
+
+msgid "Are you sure you want to unlock %{path_lock_path}?"
msgstr ""
msgid "Are you sure?"
@@ -463,7 +648,13 @@ msgstr "本当ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "Artifacts"
msgstr "アーティファクト"
+msgid "Ascending"
+msgstr "昇順"
+
msgid "Ask your group maintainer to setup a group Runner."
+msgstr "グループ Runner ã®è¨­å®šã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã® Maintainer ã«ä¾é ¼ã—ã¦ãã ã•ã„。"
+
+msgid "Assertion consumer service URL"
msgstr ""
msgid "Assign custom color like #FF0000"
@@ -479,26 +670,35 @@ msgid "Assign to"
msgstr "割り当ã¦å…ˆ"
msgid "Assigned Issues"
-msgstr ""
+msgstr "割り当ã¦ã‚‰ã‚ŒãŸèª²é¡Œ"
msgid "Assigned Merge Requests"
-msgstr ""
+msgstr "割り当ã¦ã‚‰ã‚ŒãŸãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
msgid "Assigned to :name"
-msgstr ""
+msgstr ":name ãŒæ‹…当"
msgid "Assigned to me"
-msgstr ""
+msgstr "自分ã«å‰²ã‚Šå½“ã¦ã‚‹"
msgid "Assignee"
msgstr "担当者"
-msgid "Assignee(s)"
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
msgstr ""
+msgid "Assignee(s)"
+msgstr "担当者"
+
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "ドラッグ&ドロップã¾ãŸã¯ %{upload_link} ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’添付"
+msgid "Audit Events"
+msgstr "監査イベント"
+
msgid "Aug"
msgstr "8月"
@@ -508,26 +708,50 @@ msgstr "8月"
msgid "Authentication Log"
msgstr "èªè¨¼ãƒ­ã‚°"
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
+msgstr "作æˆè€…"
+
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
msgstr ""
msgid "Authors: %{authors}"
+msgstr "作æˆè€…: %{authors}"
+
+msgid "Auto DevOps"
msgstr ""
msgid "Auto DevOps enabled"
-msgstr ""
+msgstr "Auto DevOps ãŒæœ‰åŠ¹ã§ã™"
msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
+msgstr "Auto DevOps, Runner,ãŠã‚ˆã³æˆæžœç‰©"
msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly."
-msgstr ""
+msgstr "自動 Review Apps ã¨è‡ªå‹•ãƒ‡ãƒ—ロイã§ã¯ã€ %{kubernetes} ãŒæ­£ã—ã動作ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "Auto Review Apps and Auto Deploy need a domain name and a %{kubernetes} to work correctly."
-msgstr ""
+msgstr "自動 Review Apps ã¨è‡ªå‹•ãƒ‡ãƒ—ロイã§ã¯ã€ãƒ‰ãƒ¡ã‚¤ãƒ³åã¨æ­£å¸¸ã«å‹•ä½œã™ã‚‹ %{kubernetes} ãŒå¿…è¦ã§ã™ã€‚"
msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
-msgstr ""
+msgstr "自動 Review Apps ã¨è‡ªå‹•ãƒ‡ãƒ—ロイを正ã—ãå‹•ã‹ã™ãŸã‚ã«ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒå¿…è¦ã§ã™ã€‚"
msgid "Auto-cancel redundant, pending pipelines"
msgstr ""
@@ -536,16 +760,16 @@ msgid "AutoDevOps|Auto DevOps"
msgstr "Auto DevOps"
msgid "AutoDevOps|Auto DevOps documentation"
-msgstr ""
+msgstr "Auto DevOps ドキュメント"
msgid "AutoDevOps|Enable in settings"
msgstr "設定を有効ã«ã™ã‚‹"
msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
+msgstr "ã‚らã‹ã˜ã‚定義ã•ã‚ŒãŸ CI/CD ã®æ§‹æˆã‚’基ã«è‡ªå‹•çš„ã«ã‚¢ãƒ—リケーションをビルドã€ãƒ†ã‚¹ãƒˆã€ãƒ‡ãƒ—ロイã—ã¾ã™ã€‚"
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
-msgstr ""
+msgstr "詳ã—ãã¯ã€ %{link_to_documentation} を見ã¦ãã ã•ã„。"
msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}."
msgstr "ã“ã®ãƒ—ロジェクト㮠%{link_to_auto_devops_settings} ã‚’ã™ã‚‹å ´åˆã€è‡ªå‹•ãƒ“ルドãŠã‚ˆã³ãƒ†ã‚¹ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚%{link_to_add_kubernetes_cluster} ã—ãŸå ´åˆã€è‡ªå‹•ãƒ‡ãƒ—ロイã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚"
@@ -554,28 +778,34 @@ msgid "AutoDevOps|add a Kubernetes cluster"
msgstr "Kubernetes クラスターを追加"
msgid "AutoDevOps|enable Auto DevOps"
-msgstr ""
+msgstr "Auto DevOps を有効ã«ã™ã‚‹"
msgid "Available"
msgstr "利用å¯èƒ½"
msgid "Available group Runners : %{runners}"
-msgstr ""
+msgstr "利用å¯èƒ½ãªã‚°ãƒ«ãƒ¼ãƒ— Runner : %{runners}"
msgid "Available group Runners : %{runners}."
-msgstr ""
+msgstr "利用å¯èƒ½ãªã‚°ãƒ«ãƒ¼ãƒ— Runner : %{runners}。"
msgid "Avatar will be removed. Are you sure?"
msgstr "ã‚¢ãƒã‚¿ãƒ¼ã‚’削除ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "Average per day: %{average}"
+msgstr "1æ—¥ã‚ãŸã‚Šã®å¹³å‡: %{average}"
+
+msgid "Background Color"
+msgstr "背景色"
+
+msgid "Background Jobs"
msgstr ""
msgid "Background color"
-msgstr ""
+msgstr "背景色"
msgid "Background jobs"
-msgstr ""
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚¸ãƒ§ãƒ–"
msgid "Badges"
msgstr "ãƒãƒƒã‚¸"
@@ -647,17 +877,92 @@ msgid "Badges|Your badges"
msgstr "ãƒãƒƒã‚¸"
msgid "Begin with the selected commit"
-msgstr ""
+msgstr "é¸æŠžã—ãŸã‚³ãƒŸãƒƒãƒˆã§ã¯ã˜ã‚ã‚‹"
msgid "Below are examples of regex for existing tools:"
msgstr ""
-msgid "Boards"
+msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Branch %{branchName} was not found in this project's repository."
+msgid "Billing"
+msgstr "請求"
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr "ç¾åœ¨ã®ãƒ—ラン"
+
+msgid "BillingPlans|Customer Support"
+msgstr "カスタマー サãƒãƒ¼ãƒˆ"
+
+msgid "BillingPlans|Downgrade"
+msgstr "ダウングレード"
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr "プランã®ç®¡ç†"
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr "アップグレード"
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
msgstr ""
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
+msgid "Boards"
+msgstr "ボード"
+
+msgid "Branch %{branchName} was not found in this project's repository."
+msgstr "%{branchName} ブランãƒã¯ã“ã®ãƒ—ロジェクトã®ãƒªãƒã‚¸ãƒˆãƒªã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚"
+
msgid "Branch (%{branch_count})"
msgid_plural "Branches (%{branch_count})"
msgstr[0] "ブランム(%{branch_count})"
@@ -699,7 +1004,7 @@ msgid "Branches|Compare"
msgstr "比較"
msgid "Branches|Delete all branches that are merged into '%{default_branch}'"
-msgstr ""
+msgstr "'%{default_branch}'ã«ãƒžãƒ¼ã‚¸ã•ã‚ŒãŸã™ã¹ã¦ã®ãƒ–ランãƒã‚’削除"
msgid "Branches|Delete branch"
msgstr "ブランãƒã‚’削除"
@@ -708,10 +1013,10 @@ msgid "Branches|Delete merged branches"
msgstr "マージã•ã‚ŒãŸãƒ–ランãƒã‚’削除"
msgid "Branches|Delete protected branch"
-msgstr ""
+msgstr "ä¿è­·ã•ã‚ŒãŸãƒ–ランãƒã‚’削除"
msgid "Branches|Delete protected branch '%{branch_name}'?"
-msgstr ""
+msgstr "ä¿è­·ã•ã‚Œã¦ã„るブランム'%{branch_name}' を削除ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Branches|Deleting the '%{branch_name}' branch cannot be undone. Are you sure?"
msgstr "'%{branch_name}' ブランãƒã‚’削除ã—ãŸã‚‰å…ƒã«ã¯æˆ»ã›ã¾ã›ã‚“。よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -735,7 +1040,7 @@ msgid "Branches|Once you confirm and press %{delete_protected_branch}, it cannot
msgstr "ã‚‚ã†ä¸€åº¦ç¢ºèªã— %{delete_protected_branch} を押ã—ã¦ãã ã•ã„。æ“作後ã€å…ƒã«æˆ»ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
msgid "Branches|Only a project maintainer or owner can delete a protected branch"
-msgstr ""
+msgstr "プロジェクト㮠Maintainer 㨠Owner ã ã‘ãŒä¿è­·ã•ã‚Œã¦ã„るブランãƒã‚’削除ã§ãã¾ã™"
msgid "Branches|Overview"
msgstr "概è¦"
@@ -753,7 +1058,7 @@ msgid "Branches|Show more active branches"
msgstr "アクティブブランãƒã‚’ã•ã‚‰ã«è¡¨ç¤º"
msgid "Branches|Show more stale branches"
-msgstr ""
+msgstr "å¤ã„ブランãƒã‚’ã™ã¹ã¦è¡¨ç¤º"
msgid "Branches|Show overview of the branches"
msgstr "ブランãƒã®æ¦‚è¦ã‚’表示"
@@ -762,12 +1067,15 @@ msgid "Branches|Show stale branches"
msgstr "éŽåŽ»ã®ãƒ–ランãƒã‚’表示"
msgid "Branches|Sort by"
-msgstr ""
+msgstr "並ã¹æ›¿ãˆ"
msgid "Branches|Stale"
-msgstr ""
+msgstr "å¤ã„"
msgid "Branches|Stale branches"
+msgstr "å¤ã„ブランãƒ"
+
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
msgstr ""
msgid "Branches|The default branch cannot be deleted"
@@ -777,12 +1085,18 @@ msgid "Branches|This branch hasn’t been merged into %{default_branch}."
msgstr "ã“ã®ãƒ–ランãƒã¯%{default_branch} ã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "Branches|To avoid data loss, consider merging this branch before deleting it."
-msgstr ""
+msgstr "データã®æ¶ˆå¤±ã‚’é¿ã‘ã‚‹ãŸã‚ã€å‰Šé™¤ã™ã‚‹å‰ã«ã“ã®ãƒ–ランãƒã‚’マージã™ã‚‹ã“ã¨ã‚’オススメã—ã¾ã™ã€‚"
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "確èªã®ãŸã‚ã€%{branch_name_confirmation} を入力ã—ã¦ãã ã•ã„"
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
+msgstr "ä¿è­·ã•ã‚ŒãŸ %{branch_name} ブランãƒã‚’削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
+
+msgid "Branches|diverged from upstream"
msgstr ""
msgid "Branches|merged"
@@ -806,6 +1120,9 @@ msgstr "ファイルを表示"
msgid "Browse files"
msgstr "ファイルを表示"
+msgid "Business metrics (Custom)"
+msgstr "ビジãƒã‚¹ãƒ¡ãƒˆãƒªã‚¯ã‚¹ï¼ˆã‚«ã‚¹ã‚¿ãƒ ï¼‰"
+
msgid "ByAuthor|by"
msgstr "作者"
@@ -813,62 +1130,77 @@ msgid "CI / CD"
msgstr "CI / CD"
msgid "CI / CD Settings"
-msgstr ""
+msgstr "CI / CD 設定"
+
+msgid "CI/CD"
+msgstr "CI/CD"
msgid "CI/CD configuration"
+msgstr "CI/CD 設定"
+
+msgid "CI/CD for external repo"
msgstr ""
msgid "CI/CD settings"
msgstr "CI/CD 設定"
msgid "CICD|An explicit %{ci_file} needs to be specified before you can begin using Continuous Integration and Delivery."
-msgstr ""
+msgstr "継続的インテグレーションã¨ãƒ‡ãƒªãƒãƒªãƒ¼ã‚’使用ã™ã‚‹ã«ã¯ã€æ˜Žç¤ºçš„ã« %{ci_file} を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "CICD|Auto DevOps"
msgstr "Auto DevOps"
msgid "CICD|Auto DevOps will automatically build, test, and deploy your application based on a predefined Continuous Integration and Delivery configuration."
-msgstr ""
+msgstr "Auto DevOps ã¯ã‚らã‹ã˜ã‚定義ã•ã‚ŒãŸç¶™ç¶šçš„インテグレーションã¨ãƒ‡ãƒªãƒãƒªãƒ¼ã®è¨­å®šã«åŸºã¥ã„ã¦ã€ã‚¢ãƒ—リケーションを自動的ã«ãƒ“ルドã€ãƒ†ã‚¹ãƒˆã€ãƒ‡ãƒ—ロイã—ã¾ã™ã€‚"
msgid "CICD|Automatic deployment to staging, manual deployment to production"
-msgstr ""
+msgstr "ステージングã¸ã®è‡ªå‹•ãƒ‡ãƒ—ロイã€æœ¬ç•ªç’°å¢ƒã¸ã®æ‰‹å‹•ãƒ‡ãƒ—ロイ"
msgid "CICD|Continuous deployment to production"
-msgstr ""
+msgstr "本番環境ã¸ã®ç¶™ç¶šçš„デプロイ"
msgid "CICD|Deployment strategy"
-msgstr ""
+msgstr "デプロイ戦略"
msgid "CICD|Deployment strategy needs a domain name to work correctly."
-msgstr ""
+msgstr "デプロイ戦略を正ã—ã動作ã•ã›ã‚‹ãŸã‚ã«ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒå¿…è¦ã§ã™ã€‚"
msgid "CICD|Disable Auto DevOps"
+msgstr "Auto DevOps を無効ã«ã™ã‚‹"
+
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
msgstr ""
msgid "CICD|Enable Auto DevOps"
-msgstr ""
+msgstr "Auto DevOps を有効ã«ã™ã‚‹"
msgid "CICD|Follow the instance default to either have Auto DevOps enabled or disabled when there is no project specific %{ci_file}."
-msgstr ""
+msgstr "プロジェクト固有㮠%{ci_file} ãŒç„¡ã„å ´åˆã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã«å¾“ã„ Auto DevOps ã®æœ‰åŠ¹ã¨ç„¡åŠ¹ã‚’切り替ãˆã¾ã™ã€‚"
msgid "CICD|Instance default (%{state})"
-msgstr ""
+msgstr "インスタンスã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆï¼ˆ%{state})"
msgid "CICD|Jobs"
msgstr "ジョブ"
msgid "CICD|Learn more about Auto DevOps"
-msgstr ""
+msgstr "Auto DevOps ã®è©³ç´°"
msgid "CICD|The Auto DevOps pipeline configuration will be used when there is no %{ci_file} in the project."
-msgstr ""
+msgstr "プロジェクト㫠%{ci_file} ãŒãªã„å ´åˆã€Auto DevOps ã®ãƒ‘イプライン設定ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
+msgstr "自動 Review Apps ã¨è‡ªå‹•ãƒ‡ãƒ—ロイステージを使用ã—ãŸã„å ´åˆã¯ã€ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid "Callback URL"
msgstr ""
-msgid "Can't find HEAD commit for this branch"
+msgid "Callback url"
msgstr ""
+msgid "Can't find HEAD commit for this branch"
+msgstr "ã“ã®ãƒ–ランãƒã«ã¯ HEAD コミットãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
msgid "Cancel"
msgstr "キャンセル"
@@ -879,11 +1211,17 @@ msgid "Cannot be merged automatically"
msgstr "自動的ã«ãƒžãƒ¼ã‚¸ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
msgid "Cannot modify managed Kubernetes cluster"
+msgstr "管ç†ä¸‹ã® Kubernetes クラスターを変更ã§ãã¾ã›ã‚“"
+
+msgid "Certificate fingerprint"
msgstr ""
-msgid "Change this value to influence how frequently the GitLab UI polls for updates."
+msgid "Change Weight"
msgstr ""
+msgid "Change this value to influence how frequently the GitLab UI polls for updates."
+msgstr "GitLab UI ã®æ›´æ–°é »åº¦ã‚’変更ã™ã‚‹ã«ã¯ã“ã®å€¤ã‚’変更ã—ã¦ãã ã•ã„。"
+
msgid "ChangeTypeActionLabel|Pick into branch"
msgstr "ピック先ブランãƒ:"
@@ -897,13 +1235,13 @@ msgid "ChangeTypeAction|Revert"
msgstr "リãƒãƒ¼ãƒˆ"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
-msgstr ""
+msgstr "コミット済ã®å¤‰æ›´ã‚’ revert ã™ã‚‹ãŸã‚ã«æ–°ã—ã„コミットを作æˆã—ã¾ã™"
msgid "Changelog"
msgstr "変更履歴"
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
-msgstr ""
+msgstr "<b>source</b>リビジョンãŒ<b>target</b>リビジョン内ã«å–ã‚Šè¾¼ã¾ã‚Œã¦ã„るよã†ãªå¤‰æ›´ã¨ã—ã¦è¡¨ç¤ºã•ã‚Œã¾ã™"
msgid "Charts"
msgstr "ãƒãƒ£ãƒ¼ãƒˆ"
@@ -926,14 +1264,20 @@ msgstr "ã“ã®ã‚³ãƒŸãƒƒãƒˆã‚’ãƒã‚§ãƒªãƒ¼ãƒ”ック"
msgid "Cherry-pick this merge request"
msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ãƒã‚§ãƒªãƒ¼ãƒ”ック"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr "ファイルをé¸æŠž..."
msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request."
-msgstr ""
+msgstr "変更内容を確èªã—ãŸã‚Šãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’作æˆã™ã‚‹ãŸã‚ã«ã€Branch/tag (例: %{master}) ã‚’é¸æŠžã™ã‚‹ã‹ã€ã‚³ãƒŸãƒƒãƒˆID(例: %{sha})を入力ã—ã¦ãã ã•ã„。"
msgid "Choose any color."
-msgstr ""
+msgstr "カラーをé¸æŠžã—ã¦ãã ã•ã„。"
msgid "Choose between <code>clone</code> or <code>fetch</code> to get the recent application code"
msgstr ""
@@ -941,9 +1285,21 @@ msgstr ""
msgid "Choose file..."
msgstr "ファイルをé¸æŠž..."
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr "インãƒãƒ¼ãƒˆã—ãŸã„リãƒã‚¸ãƒˆãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。"
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "キャンセル"
@@ -999,13 +1355,13 @@ msgid "CiStatus|running"
msgstr "実行中"
msgid "CiVariables|Input variable key"
-msgstr ""
+msgstr "キーを入力"
msgid "CiVariables|Input variable value"
-msgstr ""
+msgstr "値を入力"
msgid "CiVariables|Remove variable row"
-msgstr ""
+msgstr "環境変数を削除"
msgid "CiVariable|* (All environments)"
msgstr "* (ã™ã¹ã¦ã®ç’°å¢ƒ)"
@@ -1013,28 +1369,46 @@ msgstr "* (ã™ã¹ã¦ã®ç’°å¢ƒ)"
msgid "CiVariable|All environments"
msgstr "ã™ã¹ã¦ã®ç’°å¢ƒ"
+msgid "CiVariable|Create wildcard"
+msgstr "ワイルドカードã®ä½œæˆ"
+
msgid "CiVariable|Error occured while saving variables"
msgstr "変数ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+msgid "CiVariable|New environment"
+msgstr "æ–°ã—ã„環境"
+
msgid "CiVariable|Protected"
msgstr "ä¿è­·"
-msgid "CiVariable|Toggle protected"
+msgid "CiVariable|Search environments"
msgstr ""
+msgid "CiVariable|Toggle protected"
+msgstr "ä¿è­·ã®åˆ‡ã‚Šæ›¿ãˆ"
+
msgid "CiVariable|Validation failed"
msgstr "検証ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
-msgid "Clear search input"
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
msgstr ""
+msgid "Clear search input"
+msgstr "検索欄ã®æ¶ˆåŽ»"
+
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr "プロジェクトリストã§<strong>プロジェクトå</strong>をクリックã™ã‚‹ã¨ã€ãƒ—ロジェクトã®ãƒžã‚¤ãƒ«ã‚¹ãƒˆãƒ¼ãƒ³ã«ç§»å‹•ã—ã¾ã™ã€‚"
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
+msgstr "å³ä¸Šã®<strong>昇格</strong>ボタンをクリックã—ã¦ã‚°ãƒ«ãƒ¼ãƒ—マイルストーンã¸æ˜‡æ ¼"
+
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
msgstr ""
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
@@ -1046,132 +1420,147 @@ msgstr ""
msgid "Click to expand text"
msgstr "クリックã—ã¦ãƒ†ã‚­ã‚¹ãƒˆã‚’展開ã™ã‚‹"
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr "クライアントèªè¨¼ã‚­ãƒ¼"
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr "リãƒã‚¸ãƒˆãƒªã‚’クローン"
msgid "Close"
msgstr ""
-msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
msgstr ""
+msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
+msgstr "%{appList} ã¯æ­£å¸¸ã« Kubernetes クラスターã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¾ã—ãŸ"
+
msgid "ClusterIntegration|API URL"
msgstr "API URL"
msgid "ClusterIntegration|Add Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes クラスターを追加"
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
-msgstr ""
+msgstr "ã“ã® Kubernetes クラスター統åˆã«é–¢ã™ã‚‹è©³ç´°ã‚ªãƒ—ション"
msgid "ClusterIntegration|An error occured while trying to fetch project zones: %{error}"
-msgstr ""
+msgstr "プロジェクトゾーンã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %{error}"
msgid "ClusterIntegration|An error occured while trying to fetch your projects: %{error}"
-msgstr ""
+msgstr "プロジェクトã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ: %{error}"
msgid "ClusterIntegration|Applications"
msgstr "アプリケーション"
msgid "ClusterIntegration|Are you sure you want to remove this Kubernetes cluster's integration? This will not delete your actual Kubernetes cluster."
-msgstr ""
+msgstr "ã“ã® Kubernetes クラスター統åˆã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿã“ã®æ“作ã§ã¯å®Ÿéš›ã® Kubernetes クラスターã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“。"
msgid "ClusterIntegration|CA Certificate"
-msgstr ""
+msgstr "CA 証明書"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "èªè¨¼å±€ãƒãƒ³ãƒ‰ãƒ« (PEMå½¢å¼)"
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
-msgstr ""
+msgstr "ã©ã®ãƒ—ロジェクト環境ã§ã“ã® Kubernetes クラスターを使ã†ã‹é¸æŠžã—ã¦ãã ã•ã„。"
msgid "ClusterIntegration|Control how your Kubernetes cluster integrates with GitLab"
-msgstr ""
+msgstr "Kubernetes クラスター㨠GitLab ã®çµ±åˆæ–¹æ³•ã®åˆ¶å¾¡"
msgid "ClusterIntegration|Copy API URL"
msgstr "API URLをコピー"
msgid "ClusterIntegration|Copy CA Certificate"
-msgstr ""
+msgstr "CA 証明書をコピー"
msgid "ClusterIntegration|Copy Ingress IP Address to clipboard"
-msgstr ""
+msgstr "Ingressã®IPアドレスをクリップボードã«ã‚³ãƒ”ーã™ã‚‹"
msgid "ClusterIntegration|Copy Jupyter Hostname to clipboard"
-msgstr ""
+msgstr "Jupyter ã®ãƒ›ã‚¹ãƒˆåをクリップボードã¸ã‚³ãƒ”ー"
msgid "ClusterIntegration|Copy Kubernetes cluster name"
-msgstr ""
+msgstr "Kubernetes クラスターåをコピー"
msgid "ClusterIntegration|Copy Token"
msgstr "トークンをコピー"
msgid "ClusterIntegration|Create Kubernetes cluster"
-msgstr ""
-
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
+msgstr "Kubernetes クラスターを作æˆ"
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes クラスターã®è©³ç´°ã‚’入力ã—ã¦ãã ã•ã„"
msgid "ClusterIntegration|Environment scope"
msgstr "環境スコープ"
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
-msgstr ""
+msgstr "Google Cloud Platform (GCP) ã®ã™ã¹ã¦ã®æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ã¯ã€300ドル分ã®ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆãŒä»˜ä¸Žã•ã‚Œã¾ã™ %{sign_up_link} 。ã¾ãŸã€Google ã¨ã®ãƒ‘ートナーシップã«ã‚ˆã‚Šã€Google Kubernetes Engine 㨠GitLab ã®ã‚¤ãƒ³ãƒ†ã‚°ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’開始ã™ã‚‹ãŸã‚ã«ã€æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãƒ»æ—¢å­˜ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’å•ã‚ãšã€GCP アカウントã«è¿½åŠ ã®200ドル分ã®ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’æä¾›ã—ã¾ã™ã€‚"
msgid "ClusterIntegration|Fetching machine types"
-msgstr ""
+msgstr "マシンタイプをå–得中"
msgid "ClusterIntegration|Fetching projects"
-msgstr ""
+msgstr "プロジェクトをå–得中"
msgid "ClusterIntegration|Fetching zones"
-msgstr ""
+msgstr "ゾーンをå–得中"
msgid "ClusterIntegration|GitLab Integration"
-msgstr ""
+msgstr "GitLabã‚’çµ±åˆ"
msgid "ClusterIntegration|GitLab Runner"
msgstr "GitLab Runner"
msgid "ClusterIntegration|Google Cloud Platform project"
-msgstr ""
+msgstr "Google Cloud Platform プロジェクト"
msgid "ClusterIntegration|Google Kubernetes Engine"
msgstr "Google Kubernetes Engine"
msgid "ClusterIntegration|Google Kubernetes Engine project"
-msgstr ""
+msgstr "Google Kubernetes Engine プロジェクト"
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
-msgid "ClusterIntegration|Ingress"
+msgid "ClusterIntegration|Hide"
+msgstr "éžè¡¨ç¤º"
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
msgstr ""
-msgid "ClusterIntegration|Ingress IP Address"
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
msgstr ""
+msgid "ClusterIntegration|Ingress"
+msgstr "Ingress"
+
+msgid "ClusterIntegration|Ingress IP Address"
+msgstr "Ingress 㮠IP アドレス"
+
msgid "ClusterIntegration|Install"
msgstr "インストール"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr "Prometheus をインストール"
+
msgid "ClusterIntegration|Installed"
msgstr "インストール済ã¿"
@@ -1179,94 +1568,100 @@ msgid "ClusterIntegration|Installing"
msgstr "インストール中"
msgid "ClusterIntegration|Integrate Kubernetes cluster automation"
-msgstr ""
+msgstr "Kubernetes クラスターを自動統åˆ"
msgid "ClusterIntegration|Integration status"
-msgstr ""
+msgstr "çµ±åˆã®çŠ¶æ…‹"
msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
+msgstr "Jupyter ã®ãƒ›ã‚¹ãƒˆå"
msgid "ClusterIntegration|JupyterHub"
-msgstr ""
+msgstr "JupyterHub"
msgid "ClusterIntegration|Kubernetes cluster"
msgstr "Kubernetes クラスター"
msgid "ClusterIntegration|Kubernetes cluster details"
+msgstr "Kubernetes クラスターã®è©³ç´°"
+
+msgid "ClusterIntegration|Kubernetes cluster health"
msgstr ""
msgid "ClusterIntegration|Kubernetes cluster integration"
-msgstr ""
+msgstr "Kubernetes クラスターã®çµ±åˆ"
msgid "ClusterIntegration|Kubernetes cluster integration is disabled for this project."
-msgstr ""
+msgstr "Kubernetes クラスターã®çµ±åˆãŒã“ã®ãƒ—ロジェクトã§ç„¡åŠ¹ã§ã™ã€‚"
msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project."
-msgstr ""
+msgstr "Kubernetes クラスターã®çµ±åˆãŒã“ã®ãƒ—ロジェクトã§æœ‰åŠ¹ã§ã™ã€‚"
msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project. Disabling this integration will not affect your Kubernetes cluster, it will only temporarily turn off GitLab's connection to it."
-msgstr ""
+msgstr "Kubernetes クラスターã®çµ±åˆãŒã“ã®ãƒ—ロジェクトã§æœ‰åŠ¹ã§ã™ã€‚ã“ã®çµ±åˆã‚’無効ã«ã—ã¦ã‚‚ Kubernetes クラスターã«ã¯å½±éŸ¿ã›ãšã€GitLab ã¨ã®æŽ¥ç¶šãŒä¸€æ™‚çš„ã«åˆ‡æ–­ã•ã‚Œã‚‹ã ã‘ã§ã™ã€‚"
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
-msgstr ""
+msgstr "Kubernetes クラスターを Google Kubernetes Engine 上ã«ä½œæˆã—ã¦ã„ã¾ã™..."
msgid "ClusterIntegration|Kubernetes cluster name"
-msgstr ""
+msgstr "Kubernetes クラスターå"
msgid "ClusterIntegration|Kubernetes cluster was successfully created on Google Kubernetes Engine. Refresh the page to see Kubernetes cluster's details"
-msgstr ""
+msgstr "Kubernetes クラスター ã¯æ­£å¸¸ã« Google Kubernetes Engine ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚クラスター ã®è©³ç´°ã‚’表示ã™ã‚‹ã«ã¯ãƒšãƒ¼ã‚¸ã‚’æ›´æ–°ã—ã¦ãã ã•ã„。"
msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way. %{link_to_help_page}"
-msgstr ""
+msgstr "Kubernetes クラスターを利用ã™ã‚‹ã¨ã€ Review Apps ã®ä½¿ç”¨ã€ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイã€ãƒ‘イプラインã®å®Ÿè¡Œãªã©ã‚’より簡å˜ã«å®Ÿç¾ã§ãã¾ã™ã€‚%{link_to_help_page}"
msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications and to provide Review Apps for this project"
-msgstr ""
+msgstr "Kubernetes クラスターã¯ã€ã“ã®ãƒ—ロジェクトã«ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイや Review Apps ã®ç’°å¢ƒã‚’æä¾›ã™ã‚‹ã®ã«ä½¿ç”¨ã§ãã¾ã™ã€‚"
msgid "ClusterIntegration|Learn more about %{help_link_start_machine_type}machine types%{help_link_end} and %{help_link_start_pricing}pricing%{help_link_end}."
-msgstr ""
+msgstr "%{help_link_start_machine_type}マシンタイプ%{help_link_end}ã¨%{help_link_start_pricing}価格%{help_link_end}ã®è©³ç´°ã€‚"
msgid "ClusterIntegration|Learn more about %{help_link_start}Kubernetes%{help_link_end}."
-msgstr ""
+msgstr "%{help_link_start}Kubernetes%{help_link_end}ã®è©³ç´°ã€‚"
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
-msgstr ""
+msgstr "%{help_link_start}ゾーン%{help_link_end}ã®è©³ç´°ã€‚"
msgid "ClusterIntegration|Learn more about environments"
-msgstr ""
+msgstr "環境ã®è©³ç´°"
msgid "ClusterIntegration|Learn more about security configuration"
-msgstr ""
+msgstr "セキュリティ設定ã®è©³ç´°"
msgid "ClusterIntegration|Machine type"
-msgstr ""
+msgstr "マシンタイプ"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters"
-msgstr ""
+msgstr "Kubernetes クラスター を作æˆã™ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã® %{link_to_requirements} を確èªã—ã¦ãã ã•ã„"
msgid "ClusterIntegration|Manage"
msgstr "管ç†"
msgid "ClusterIntegration|Manage your Kubernetes cluster by visiting %{link_gke}"
-msgstr ""
+msgstr "%{link_gke} ã«ã‚¢ã‚¯ã‚»ã‚¹ã—㦠Kubernetes クラスターを管ç†"
msgid "ClusterIntegration|More information"
msgstr "詳細情報"
-msgid "ClusterIntegration|No machine types matched your search"
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
msgstr ""
+msgid "ClusterIntegration|No machine types matched your search"
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒžã‚·ãƒ³ã‚¿ã‚¤ãƒ—ã¯ã‚ã‚Šã¾ã›ã‚“"
+
msgid "ClusterIntegration|No projects found"
-msgstr ""
+msgstr "プロジェクトãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "ClusterIntegration|No projects matched your search"
-msgstr ""
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ãƒ—ロジェクトã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "ClusterIntegration|No zones matched your search"
-msgstr ""
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã™ã‚‹ã‚¾ãƒ¼ãƒ³ã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "ClusterIntegration|Note:"
-msgstr ""
+msgstr "注æ„:"
msgid "ClusterIntegration|Number of nodes"
msgstr "ノード数"
@@ -1287,19 +1682,16 @@ msgid "ClusterIntegration|Prometheus"
msgstr "Prometheus"
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
-msgstr ""
-
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
+msgstr "Kubernetes クラスターã®çµ±åˆã«ã¤ã„ã¦ã¯ã€%{link_to_help_page} ã‚’ãŠèª­ã¿ãã ã•ã„。"
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
-msgstr ""
+msgstr "Kubernetes クラスターã®çµ±åˆã‚’削除"
msgid "ClusterIntegration|Remove integration"
msgstr "çµ±åˆã‚’削除"
msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster."
-msgstr ""
+msgstr "プロジェクトã‹ã‚‰ Kubernetes クラスターã®è¨­å®šã‚’削除ã—ã¾ã™ã€‚ãªãŠã€å®Ÿéš›ã® Kubernetes クラスターã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“。"
msgid "ClusterIntegration|Request to begin installing failed"
msgstr "インストール開始ã«å¤±æ•—ã—ã¾ã—ãŸ"
@@ -1308,37 +1700,37 @@ msgid "ClusterIntegration|Save changes"
msgstr "変更をä¿å­˜"
msgid "ClusterIntegration|Search machine types"
-msgstr ""
+msgstr "マシンタイプã®æ¤œç´¢"
msgid "ClusterIntegration|Search projects"
-msgstr ""
+msgstr "プロジェクトã®æ¤œç´¢"
msgid "ClusterIntegration|Search zones"
-msgstr ""
+msgstr "ゾーンを検索"
msgid "ClusterIntegration|Security"
msgstr "セキュリティ"
msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes クラスターã®è©³ç´°ã‚’閲覧ã€ç·¨é›†ã™ã‚‹"
msgid "ClusterIntegration|Select machine type"
-msgstr ""
+msgstr "マシンタイプをé¸æŠž"
msgid "ClusterIntegration|Select project"
-msgstr ""
+msgstr "プロジェクトをé¸æŠž"
msgid "ClusterIntegration|Select project and zone to choose machine type"
-msgstr ""
+msgstr "プロジェクトã¨ã‚¾ãƒ¼ãƒ³ã‚’é¸æŠžã—ã¦ãƒžã‚·ãƒ³ã‚¿ã‚¤ãƒ—ã‚’é¸æŠž"
msgid "ClusterIntegration|Select project to choose zone"
-msgstr ""
+msgstr "プロジェクトをé¸æŠžã—ã¦ã‚¾ãƒ¼ãƒ³ã‚’é¸æŠž"
msgid "ClusterIntegration|Select zone"
-msgstr ""
+msgstr "ゾーンをé¸æŠž"
msgid "ClusterIntegration|Select zone to choose machine type"
-msgstr ""
+msgstr "ゾーンをé¸æŠžã—ã¦ãƒžã‚·ãƒ³ã‚¿ã‚¤ãƒ—ã‚’é¸æŠž"
msgid "ClusterIntegration|Service token"
msgstr "サービストークン"
@@ -1347,34 +1739,34 @@ msgid "ClusterIntegration|Show"
msgstr "表示"
msgid "ClusterIntegration|Something went wrong on our end."
-msgstr ""
+msgstr "å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
+msgstr "Google Kubernetes Engine 上㮠Kubernetes クラスターを作æˆä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
+msgstr "%{title} ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "ClusterIntegration|The default cluster configuration grants access to a wide set of functionalities needed to successfully build and deploy a containerised application."
-msgstr ""
+msgstr "既定ã®ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼è¨­å®šã§ã¯ã€ã‚³ãƒ³ãƒ†ãƒŠåŒ–ã•ã‚ŒãŸã‚¢ãƒ—リケーションを正常ã«ãƒ“ルドやデプロイã™ã‚‹ãŸã‚ã«å¿…è¦ãªæ§˜ã€…ãªæ©Ÿèƒ½ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚"
msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below"
-msgstr ""
+msgstr "ã“ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã¯ %{link_to_container_project} 㧠Kubernetes クラスターを作æˆã™ã‚‹ã®ã«ä»¥ä¸‹ã®æ¨©é™ãŒå¿…è¦ã§ã™"
msgid "ClusterIntegration|Toggle Kubernetes Cluster"
-msgstr ""
+msgstr "Kubernetes クラスターを切り替ãˆ"
msgid "ClusterIntegration|Toggle Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes クラスターを切り替ãˆ"
msgid "ClusterIntegration|Token"
msgstr "トークン"
msgid "ClusterIntegration|Validating project billing status"
-msgstr ""
+msgstr "プロジェクトã®è«‹æ±‚ステータスを検証ã—ã¦ã„ã¾ã™"
msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクト㫠Kubernetes クラスターを関連付ã‘ã‚‹ã“ã¨ã§ã€Review Apps ã®ä½¿ç”¨ã€ã‚¢ãƒ—リケーションã®ãƒ‡ãƒ—ロイã€ãƒ‘イプラインã®å®Ÿè¡Œãªã©ã‚’ç°¡å˜ã«è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr "アカウント㫠%{link_to_kubernetes_engine} ãŒå¿…è¦ã§ã™ã€‚"
@@ -1395,7 +1787,7 @@ msgid "ClusterIntegration|help page"
msgstr "ヘルプ ページ"
msgid "ClusterIntegration|installing applications"
-msgstr ""
+msgstr "アプリケーションをインストールã—ã¦ã„ã¾ã™"
msgid "ClusterIntegration|meets the requirements"
msgstr "å¿…è¦æ¡ä»¶"
@@ -1406,17 +1798,20 @@ msgstr "æ­£ã—ã設定ã•ã‚Œã¦ã„ã‚‹"
msgid "ClusterIntegration|sign up"
msgstr "æ–°è¦ç™»éŒ²"
-msgid "Collapse"
+msgid "Cohorts"
msgstr ""
+msgid "Collapse"
+msgstr "折りãŸãŸã‚€"
+
msgid "Collapse sidebar"
-msgstr ""
+msgstr "サイドãƒãƒ¼ã‚’éš ã™"
msgid "Comment & resolve discussion"
-msgstr ""
+msgstr "ã“ã®æ¤œè¨Žã«ã‚³ãƒ¡ãƒ³ãƒˆã—解決ã™ã‚‹"
msgid "Comment & unresolve discussion"
-msgstr ""
+msgstr "ã“ã®æ¤œè¨Žã«ã‚³ãƒ¡ãƒ³ãƒˆã—未解決ã«ã™ã‚‹"
msgid "Comments"
msgstr "コメント"
@@ -1469,7 +1864,7 @@ msgid "Commits|An error occurred while fetching merge requests data."
msgstr "マージリクエストデータã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Commits|Commit: %{commitText}"
-msgstr ""
+msgstr "コミット: %{commitText}"
msgid "Commits|History"
msgstr "履歴"
@@ -1493,10 +1888,10 @@ msgid "Compare Revisions"
msgstr "リビジョンを比較"
msgid "Compare changes with the last commit"
-msgstr ""
+msgstr "最後ã®ã‚³ãƒŸãƒƒãƒˆã¨å¤‰æ›´ã‚’比較"
msgid "Compare changes with the merge request target branch"
-msgstr ""
+msgstr "マージリクエストã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ–ランãƒã¨ã®å¤‰æ›´ã‚’比較ã™ã‚‹"
msgid "CompareBranches|%{source_branch} and %{target_branch} are the same."
msgstr "%{source_branch} 㨠%{target_branch} ã¯ä¸€è‡´ã—ã¾ã™ã€‚"
@@ -1520,55 +1915,64 @@ msgid "Confidentiality"
msgstr ""
msgid "Configure Gitaly timeouts."
-msgstr ""
+msgstr "Gitaly ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’設定ã—ã¾ã™ã€‚"
msgid "Configure Sidekiq job throttling."
-msgstr ""
+msgstr "Sidekiq job throttling ã®è¨­å®š"
msgid "Configure automatic git checks and housekeeping on repositories."
-msgstr ""
+msgstr "リãƒã‚¸ãƒˆãƒªã«å¯¾ã—ã¦è‡ªå‹•å®Ÿè¡Œã™ã‚‹ Git ãƒã‚§ãƒƒã‚¯ã¨ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングを設定ã—ã¾ã™ã€‚"
msgid "Configure limits for web and API requests."
-msgstr ""
+msgstr "ウェブãŠã‚ˆã³APIリクエストã®åˆ¶é™ã‚’設定ã™ã‚‹ã€‚"
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
-msgstr ""
+msgstr "ストレージã®ãƒ‘スã¨ã‚µãƒ¼ã‚­ãƒƒãƒˆãƒ–レーカーを設定ã™ã‚‹ã€‚"
msgid "Configure the way a user creates a new account."
-msgstr ""
+msgstr "ユーザーãŒæ–°ã—ã„アカウントを作æˆã™ã‚‹æ–¹æ³•ã‚’設定ã—ã¾ã™ã€‚"
msgid "Connect"
msgstr "接続"
+msgid "Connect all repositories"
+msgstr "ã™ã¹ã¦ã®ãƒªãƒã‚¸ãƒˆãƒªã¸æŽ¥ç¶š"
+
msgid "Connect repositories from GitHub"
+msgstr "GitHubã‹ã‚‰ãƒªãƒã‚¸ãƒˆãƒªã«æŽ¥ç¶š"
+
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
msgstr ""
+msgid "Connecting..."
+msgstr "接続ã—ã¦ã„ã¾ã™..."
+
msgid "Container Registry"
-msgstr ""
+msgstr "コンテナレジストリ"
msgid "ContainerRegistry|Created"
-msgstr ""
+msgstr "作æˆæ¸ˆã¿"
msgid "ContainerRegistry|First log in to GitLab&rsquo;s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
-msgstr ""
+msgstr "ã¾ãšã€GitLab ã®ã‚³ãƒ³ãƒ†ãƒŠãƒ¬ã‚¸ã‚¹ãƒˆãƒªã« GitLab ユーザーåã¨ãƒ‘スワードを使ã£ã¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¾ã™ã€‚%{link_2fa} を利用ã—ã¦ã„ã‚Œã°ã€%{link_token} を使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™:"
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
-msgstr ""
+msgstr "GitLab ã§ã¯ã€æœ€å¤§ 3 ã¤ã®ãƒ¬ãƒ™ãƒ«ã®ã‚¤ãƒ¡ãƒ¼ã‚¸åをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚例ã¨ã—ã¦æ¬¡ã®ã‚ˆã†ãªã‚¤ãƒ¡ãƒ¼ã‚¸åãŒãƒ—ロジェクトã§æœ‰åŠ¹ã§ã™:"
msgid "ContainerRegistry|How to use the Container Registry"
-msgstr "コンテナ レジストリ使用方法"
+msgstr "コンテナレジストリ使用方法"
msgid "ContainerRegistry|Learn more about"
msgstr "詳細ã«ã¤ã„ã¦"
msgid "ContainerRegistry|No tags in Container Registry for this container image."
-msgstr ""
+msgstr "ã“ã®ã‚³ãƒ³ãƒ†ãƒŠã‚¤ãƒ¡ãƒ¼ã‚¸ã¯ã‚³ãƒ³ãƒ†ãƒŠãƒ¬ã‚¸ã‚¹ãƒˆãƒªã«ã‚¿ã‚°ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "ContainerRegistry|Once you log in, you&rsquo;re free to create and upload a container image using the common %{build} and %{push} commands"
-msgstr ""
+msgstr "ログインã™ã‚‹ã¨è‡ªç”±ã« %{build} 㨠%{push} コマンドã§ã‚³ãƒ³ãƒ†ãƒŠã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’作æˆãƒ»ã‚¢ãƒƒãƒ—ロードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "ContainerRegistry|Remove repository"
msgstr "リãƒã‚¸ãƒˆãƒªã®å‰Šé™¤"
@@ -1586,29 +1990,35 @@ msgid "ContainerRegistry|Tag ID"
msgstr "ã‚¿ã‚°ID"
msgid "ContainerRegistry|Use different image names"
-msgstr ""
+msgstr "ä»–ã®ã‚¤ãƒ¡ãƒ¼ã‚¸åを付ã‘ã¦ãã ã•ã„"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
-msgstr ""
+msgstr "GitLabã¨çµ±åˆã•ã‚ŒãŸã‚³ãƒ³ãƒ†ãƒŠãƒ¬ã‚¸ã‚¹ãƒˆãƒªã§ã€å…¨ã¦ã®ãƒ—ロジェクトã«Dockerイメージを格ç´ã™ã‚‹å ´æ‰€ãŒã‚ã‚Šã¾ã™ã€‚"
msgid "ContainerRegistry|You can also use a %{deploy_token} for read-only access to the registry images."
-msgstr ""
+msgstr "レジストリイメージã¸ã®èª­ã¿å–り専用アクセスã®ãŸã‚ã« %{deploy_token} を使用ã§ãã¾ã™ã€‚"
msgid "Continue"
+msgstr "続行"
+
+msgid "Continue to the next step"
msgstr ""
msgid "Continuous Integration and Deployment"
-msgstr ""
+msgstr "継続的インテグレーションã¨ãƒ‡ãƒ—ロイ"
msgid "Contribute to GitLab"
-msgstr ""
+msgstr "GitLab ã«è²¢çŒ®ã™ã‚‹"
msgid "Contribution"
-msgstr ""
+msgstr "貢献度"
msgid "Contribution guide"
msgstr "貢献者å‘ã‘ガイド"
+msgid "Contributions per group member"
+msgstr "グループメンãƒãƒ¼ã®è²¢çŒ®åº¦"
+
msgid "Contributors"
msgstr "貢献者"
@@ -1616,14 +2026,32 @@ msgid "ContributorsPage|%{startDate} – %{endDate}"
msgstr "%{startDate} – %{endDate}"
msgid "ContributorsPage|Building repository graph."
-msgstr ""
+msgstr "リãƒã‚¸ãƒˆãƒªã‚°ãƒ©ãƒ•ã‚’構築ã—ã¦ã„ã¾ã™ã€‚"
msgid "ContributorsPage|Commits to %{branch_name}, excluding merge commits. Limited to 6,000 commits."
-msgstr ""
+msgstr "%{branch_name} ã¸ã®ã‚³ãƒŸãƒƒãƒˆï¼ˆãƒžãƒ¼ã‚¸ã‚³ãƒŸãƒƒãƒˆã‚’除ãã€6,000コミットã¾ã§ï¼‰"
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
+msgstr "ã—ã°ã‚‰ããŠå¾…ã¡ãã ã•ã„ã€ã“ã®ãƒšãƒ¼ã‚¸ã¯æº–å‚™ãŒæ•´ã†ã¨è‡ªå‹•çš„ã«æ›´æ–°ã•ã‚Œã¾ã™ã€‚"
+
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
msgstr ""
+msgid "Copy SSH public key to clipboard"
+msgstr "SSH 公開éµã‚’クリップボードã«ã‚³ãƒ”ー"
+
msgid "Copy URL to clipboard"
msgstr "クリップボードã«URLをコピー"
@@ -1636,16 +2064,19 @@ msgstr "コマンドをクリップボードã«ã‚³ãƒ”ー"
msgid "Copy commit SHA to clipboard"
msgstr "コミットã®SHAをクリップボードã«ã‚³ãƒ”ー"
-msgid "Copy file name to clipboard"
-msgstr ""
-
msgid "Copy file path to clipboard"
+msgstr "ファイルパスをクリップボードã«ã‚³ãƒ”ーã™ã‚‹"
+
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
-msgstr ""
+msgstr "クリップボードã¸ã‚³ãƒ”ー"
msgid "Copy to clipboard"
+msgstr "クリップボードã«ã‚³ãƒ”ー"
+
+msgid "Copy token to clipboard"
msgstr ""
msgid "Create"
@@ -1660,6 +2091,9 @@ msgstr "æ–°ã—ã„ブランãƒã‚’作æˆ"
msgid "Create a new branch and merge request"
msgstr "ブランãƒã®æ–°è¦ä½œæˆã¨ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "%{protocol} ã§ãƒ—ッシュやプルã™ã‚‹ãŸã‚ã®ã‚ãªãŸå€‹äººç”¨ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³ã‚’作æˆ"
@@ -1667,7 +2101,7 @@ msgid "Create branch"
msgstr "ブランãƒä½œæˆ"
msgid "Create commit"
-msgstr ""
+msgstr "コミットã®ä½œæˆ"
msgid "Create directory"
msgstr "ディレクトリを作æˆ"
@@ -1675,15 +2109,24 @@ msgstr "ディレクトリを作æˆ"
msgid "Create empty repository"
msgstr "空ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’作æˆã™ã‚‹"
+msgid "Create epic"
+msgstr "エピックã®ä½œæˆ"
+
msgid "Create file"
msgstr "ファイルを作æˆ"
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr "グループラベルを作æˆ"
-msgid "Create lists from labels. Issues with that label appear in that list."
+msgid "Create issue"
msgstr ""
+msgid "Create lists from labels. Issues with that label appear in that list."
+msgstr "ラベルã‹ã‚‰ãƒªã‚¹ãƒˆã‚’作æˆã€‚ãã®ãƒ©ãƒ™ãƒ«ã®èª²é¡ŒãŒãƒªã‚¹ãƒˆã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
msgid "Create merge request"
msgstr "マージリクエストを作æˆ"
@@ -1699,6 +2142,9 @@ msgstr "æ–°ã—ã„ディレクトリを作æˆ"
msgid "Create new file"
msgstr "æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ä½œæˆ"
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr "ラベルã®æ–°è¦ä½œæˆ"
@@ -1720,17 +2166,29 @@ msgstr "個人用アクセストークンを作æˆ"
msgid "Created"
msgstr "作æˆæ¸ˆã¿"
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
+msgstr "自分ãŒä½œæˆ"
+
+msgid "Created on:"
msgstr ""
+msgid "Creating epic"
+msgstr "エピックを作æˆã—ã¦ã„ã¾ã™"
+
msgid "Cron Timezone"
msgstr "Cron ã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³"
msgid "Cron syntax"
msgstr "Cron ã®æ§‹æ–‡"
+msgid "Current node"
+msgstr "ç¾åœ¨ã®ãƒŽãƒ¼ãƒ‰"
+
msgid "CurrentUser|Profile"
-msgstr ""
+msgstr "プロフィール"
msgid "CurrentUser|Settings"
msgstr "設定"
@@ -1744,6 +2202,15 @@ msgstr "カスタム通知設定"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "\"カスタム\" ã®é€šçŸ¥ãƒ¬ãƒ™ãƒ«ã®åŸºæœ¬ã¯ \"å‚加\" ã¨åŒã˜ã§ã™ã€‚ã¾ãŸã€ã‚«ã‚¹ã‚¿ãƒ é€šçŸ¥ã«è¨­å®šã™ã‚‹ã“ã¨ã§é¸æŠžã—ãŸã‚«ã‚¹ã‚¿ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã®é€šçŸ¥ã‚’å—ã‘å–ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã‚‚ã£ã¨è©³ã—ã知りãŸã„å ´åˆã¯ %{notification_link} を見ã¦ãã ã•ã„。"
+msgid "Customize colors"
+msgstr "カスタムカラー"
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "サイクル分æž"
@@ -1768,11 +2235,14 @@ msgstr "ステージング"
msgid "CycleAnalyticsStage|Test"
msgstr "テスト"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr "ã™ã¹ã¦"
msgid "DashboardProjects|Personal"
-msgstr ""
+msgstr "個人"
msgid "Dec"
msgstr "12月"
@@ -1781,6 +2251,15 @@ msgid "December"
msgstr "12月"
msgid "Decline and sign out"
+msgstr "辞退ã—ã¦ã‚µã‚¤ãƒ³ã‚¢ã‚¦ãƒˆ"
+
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
msgstr ""
msgid "Define a custom pattern with cron syntax"
@@ -1789,7 +2268,16 @@ msgstr "Cron 構文ã§ã‚«ã‚¹ã‚¿ãƒ ãªãƒ‘ターンを指定ã™ã‚‹"
msgid "Delete"
msgstr "削除"
+msgid "Delete Snippet"
+msgstr "スニペットを削除"
+
msgid "Delete list"
+msgstr "リストを削除ã™ã‚‹"
+
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
msgstr ""
msgid "Deploy"
@@ -1800,94 +2288,94 @@ msgid "Deploy Keys"
msgstr "デプロイキー"
msgid "DeployKeys|+%{count} others"
-msgstr ""
+msgstr "+ %{count} プロジェクト"
msgid "DeployKeys|Current project"
msgstr "ç¾åœ¨ã®ãƒ—ロジェクト"
msgid "DeployKeys|Deploy key"
-msgstr ""
+msgstr "デプロイキー"
msgid "DeployKeys|Enabled deploy keys"
-msgstr ""
+msgstr "有効ãªãƒ‡ãƒ—ロイキー"
msgid "DeployKeys|Error enabling deploy key"
-msgstr ""
+msgstr "デプロイキーã®æœ‰åŠ¹ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿ"
msgid "DeployKeys|Error getting deploy keys"
-msgstr ""
+msgstr "デプロイキーã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿ"
msgid "DeployKeys|Error removing deploy key"
-msgstr ""
+msgstr "デプロイキーã®å‰Šé™¤ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿ"
msgid "DeployKeys|Expand %{count} other projects"
-msgstr ""
+msgstr "他㮠%{count} プロジェクトを展開"
msgid "DeployKeys|Loading deploy keys"
-msgstr ""
+msgstr "デプロイキーを読込中"
msgid "DeployKeys|No deploy keys found. Create one with the form above."
-msgstr ""
+msgstr "デプロイキーãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。上ã®ãƒ•ã‚©ãƒ¼ãƒ ã§ä½œæˆã—ã¦ãã ã•ã„。"
msgid "DeployKeys|Privately accessible deploy keys"
-msgstr ""
+msgstr "プライベートアクセスãŒå¯èƒ½ãªãƒ‡ãƒ—ロイキー"
msgid "DeployKeys|Project usage"
-msgstr ""
+msgstr "プロジェクトã®ä½¿ç”¨çŠ¶æ³"
msgid "DeployKeys|Publicly accessible deploy keys"
-msgstr ""
+msgstr "パブリックアクセスãŒå¯èƒ½ãªãƒ‡ãƒ—ロイキー"
msgid "DeployKeys|Read access only"
-msgstr ""
+msgstr "読ã¿å–り専用"
msgid "DeployKeys|Write access allowed"
-msgstr ""
+msgstr "書ãè¾¼ã¿ã‚¢ã‚¯ã‚»ã‚¹è¨±å¯"
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
-msgstr ""
+msgstr "ã“ã®ãƒ‡ãƒ—ロイキーを削除ã—ã¾ã™ã€‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "DeployTokens|Active Deploy Tokens (%{active_tokens})"
-msgstr ""
+msgstr "アクティブãªãƒ‡ãƒ—ロイトークン (%{active_tokens})"
msgid "DeployTokens|Add a deploy token"
-msgstr ""
+msgstr "デプロイトークンを追加"
msgid "DeployTokens|Allows read-only access to the registry images"
-msgstr ""
+msgstr "レジストリイメージã¸ã®èª­ã¿å–り専用アクセスを許å¯ã™ã‚‹"
msgid "DeployTokens|Allows read-only access to the repository"
-msgstr ""
+msgstr "リãƒã‚¸ãƒˆãƒªã¸ã®èª­ã¿å–り専用アクセスを許å¯ã™ã‚‹"
msgid "DeployTokens|Copy deploy token to clipboard"
-msgstr ""
+msgstr "デプロイトークンをクリップボードã«ã‚³ãƒ”ーã™ã‚‹"
msgid "DeployTokens|Copy username to clipboard"
msgstr "ユーザーåをクリップボードã«ã‚³ãƒ”ーã™ã‚‹"
msgid "DeployTokens|Create deploy token"
-msgstr ""
+msgstr "デプロイトークンを作æˆ"
msgid "DeployTokens|Created"
-msgstr ""
+msgstr "作æˆæ—¥"
msgid "DeployTokens|Deploy Tokens"
-msgstr ""
+msgstr "デプロイトークン"
msgid "DeployTokens|Deploy tokens allow read-only access to your repository and registry images."
-msgstr ""
+msgstr "デプロイトークンã«ã‚ˆã‚‹ãƒªãƒã‚¸ãƒˆãƒªãŠã‚ˆã³ãƒ¬ã‚¸ã‚¹ãƒˆãƒªã‚¤ãƒ¡ãƒ¼ã‚¸ã¸ã®èª­ã¿å–り専用アクセスを許å¯"
msgid "DeployTokens|Expires"
-msgstr ""
+msgstr "有効期é™"
msgid "DeployTokens|Name"
msgstr "åå‰"
msgid "DeployTokens|Pick a name for the application, and we'll give you a unique deploy token."
-msgstr ""
+msgstr "アプリケーションã®åå‰ã‚’é¸æŠžã™ã‚‹ã¨ã€å›ºæœ‰ã®ãƒ‡ãƒ—ロイトークンãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
msgid "DeployTokens|Revoke"
-msgstr ""
+msgstr "失効"
msgid "DeployTokens|Revoke %{name}"
msgstr "%{name} ã‚’å–り消ã™"
@@ -1899,10 +2387,10 @@ msgid "DeployTokens|This action cannot be undone."
msgstr "ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。"
msgid "DeployTokens|This project has no active Deploy Tokens."
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ‡ãƒ—ロイトークンã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "DeployTokens|Use this token as a password. Make sure you save it - you won't be able to access it again."
-msgstr ""
+msgstr "ã“ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’パスワードã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ã€‚å†åº¦ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ã¯ã§ããªã„ã®ã§ã€å¿˜ã‚Œãšã«ä¿å­˜ã—ã¦ãã ã•ã„。"
msgid "DeployTokens|Use this username as a login."
msgstr "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åをログインã«ä½¿ç”¨ã—ã¾ã™ã€‚"
@@ -1911,20 +2399,32 @@ msgid "DeployTokens|Username"
msgstr "ユーザーå"
msgid "DeployTokens|You are about to revoke"
-msgstr ""
+msgstr "失効ã—よã†ã¨ã—ã¦ã„ã¾ã™"
msgid "DeployTokens|Your New Deploy Token"
-msgstr ""
+msgstr "æ–°è¦ãƒ‡ãƒ—ロイトークン"
msgid "DeployTokens|Your new project deploy token has been created."
-msgstr ""
+msgstr "æ–°ã—ã„プロジェクトデプロイトークンãŒä½œæˆã•ã‚Œã¾ã—ãŸã€‚"
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr "é™é †"
+
msgid "Description"
msgstr "説明"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "詳細"
@@ -1941,7 +2441,7 @@ msgid "Disable"
msgstr "無効"
msgid "Disable for this project"
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã§ã¯ç„¡åŠ¹ã«ã™ã‚‹"
msgid "Disable group Runners"
msgstr ""
@@ -1952,12 +2452,30 @@ msgstr "変更を破棄ã™ã‚‹"
msgid "Discard draft"
msgstr "下書ãを破棄"
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
+msgstr "サイクル分æžã®ç´¹ä»‹ã‚’é–‰ã˜ã‚‹"
+
+msgid "Dismiss Merge Request promotion"
msgstr ""
-msgid "Domain"
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
msgstr ""
+msgid "Documentation for popular identity providers"
+msgstr ""
+
+msgid "Domain"
+msgstr "ドメイン"
+
msgid "Don't show again"
msgstr "次回ã‹ã‚‰è¡¨ç¤ºã—ãªã„"
@@ -1992,11 +2510,14 @@ msgid "DownloadSource|Download"
msgstr "ダウンロード"
msgid "Downvotes"
-msgstr ""
+msgstr "イマイãƒ"
msgid "Due date"
msgstr "期é™"
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2004,17 +2525,32 @@ msgid "Edit"
msgstr "編集"
msgid "Edit Label"
-msgstr ""
+msgstr "ラベルã®ç·¨é›†"
msgid "Edit Pipeline Schedule %{id}"
msgstr "パイプラインスケジュール %{id} を編集"
+msgid "Edit Snippet"
+msgstr "スニペットを編集"
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr "Elasticsearch"
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr "メール"
@@ -2031,6 +2567,12 @@ msgid "Enable"
msgstr "有効化ã™ã‚‹"
msgid "Enable Auto DevOps"
+msgstr "Auto DevOps を有効ã«ã™ã‚‹"
+
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
msgstr ""
msgid "Enable Sentry for error reporting and logging."
@@ -2042,17 +2584,23 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
-msgid "Enable for this project"
+msgid "Enable classification control using an external service"
msgstr ""
+msgid "Enable for this project"
+msgstr "ã“ã®ãƒ—ロジェクトã§ã¯æœ‰åŠ¹ã«ã™ã‚‹"
+
msgid "Enable group Runners"
-msgstr ""
+msgstr "グループ Runner を有効ã«ã™ã‚‹"
msgid "Enable or disable certain group features and choose access levels."
+msgstr "特定ã®ã‚°ãƒ«ãƒ¼ãƒ—機能を有効ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã€ã‚¢ã‚¯ã‚»ã‚¹ãƒ¬ãƒ™ãƒ«ã‚’é¸æŠžã—ã¾ã™ã€‚"
+
+msgid "Enable or disable the Pseudonymizer data collection."
msgstr ""
msgid "Enable or disable version check and usage ping."
-msgstr ""
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒã‚§ãƒƒã‚¯ã¨ä½¿ç”¨çŠ¶æ³ã® ping を有効ã«ã™ã‚‹ã€‚"
msgid "Enable reCAPTCHA or Akismet and set IP limits."
msgstr ""
@@ -2060,11 +2608,14 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr "有効"
+
msgid "Ends at (UTC)"
-msgstr ""
+msgstr "終了時刻 (UTC)"
msgid "Environments"
-msgstr ""
+msgstr "環境"
msgid "Environments|An error occurred while fetching the environments."
msgstr "環境をå–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
@@ -2072,9 +2623,18 @@ msgstr "環境をå–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Environments|An error occurred while making the request."
msgstr "リクエスト作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr "コミット"
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr "デプロイ"
@@ -2087,25 +2647,43 @@ msgstr "環境一覧"
msgid "Environments|Job"
msgstr "ジョブ"
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr "æ–°ã—ã„環境"
msgid "Environments|No deployments yet"
msgstr "未デプロイ"
-msgid "Environments|Open"
-msgstr "オープン"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr ""
-msgid "Environments|Re-deploy"
-msgstr "å†ãƒ‡ãƒ—ロイ"
+msgid "Environments|Re-deploy to environment"
+msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
-msgstr "ロールãƒãƒƒã‚¯"
+msgid "Environments|Rollback environment"
+msgstr ""
msgid "Environments|Show all"
+msgstr "全件を表示"
+
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
msgstr ""
msgid "Environments|Updated"
@@ -2114,23 +2692,35 @@ msgstr "更新済ã¿"
msgid "Environments|You don't have any environments right now."
msgstr ""
+msgid "Epic"
+msgstr ""
+
+msgid "Epic will be removed! Are you sure?"
+msgstr ""
+
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
msgid "Error Reporting and Logging"
msgstr "エラー報告ã¨ãƒ­ã‚°"
-msgid "Error committing changes. Please try again."
+msgid "Error creating epic"
msgstr ""
msgid "Error fetching contributors data."
msgstr ""
-msgid "Error fetching job trace"
-msgstr ""
-
msgid "Error fetching labels."
msgstr "ラベルã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Error fetching network graph."
-msgstr ""
+msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚°ãƒ©ãƒ•ã®å–得中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Error fetching refs"
msgstr ""
@@ -2139,31 +2729,34 @@ msgid "Error fetching usage ping data."
msgstr ""
msgid "Error loading branch data. Please try again."
-msgstr ""
+msgstr "ブランムデータã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Error loading last commit."
+msgstr "ç›´è¿‘ã®ã‚³ãƒŸãƒƒãƒˆã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
+
+msgid "Error loading markdown preview"
msgstr ""
msgid "Error loading merge requests."
-msgstr ""
+msgstr "マージリクエストをロード中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Error loading project data. Please try again."
-msgstr ""
+msgstr "プロジェクトデータã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Error occurred when toggling the notification subscription"
-msgstr ""
+msgstr "通知購読ã®åˆ‡ã‚Šæ›¿ãˆã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Error saving label update."
-msgstr ""
+msgstr "ラベルã®æ›´æ–°ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Error updating status for all todos."
-msgstr ""
+msgstr "ã™ã¹ã¦ã® TODO ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’更新中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Error updating todo status."
-msgstr ""
+msgstr "TODO ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’更新中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "Estimated"
-msgstr ""
+msgstr "見ç©"
msgid "EventFilterBy|Filter by all"
msgstr "ã™ã¹ã¦"
@@ -2192,19 +2785,58 @@ msgstr "毎月 (1æ—¥ã®åˆå‰4:00)"
msgid "Every week (Sundays at 4:00am)"
msgstr "毎週 (日曜日ã®åˆå‰4:00)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr "展開"
msgid "Expand all"
-msgstr ""
+msgstr "ã™ã¹ã¦å±•é–‹"
msgid "Expand sidebar"
+msgstr "サイドãƒãƒ¼ã‚’é–‹ã"
+
+msgid "Explore"
msgstr ""
-msgid "Explore projects"
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
msgstr ""
+msgid "Explore groups"
+msgstr ""
+
+msgid "Explore projects"
+msgstr "プロジェクトを探ã™"
+
msgid "Explore public groups"
+msgstr "公開グループを検索"
+
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr "分類ラベル"
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr "分類ラベル"
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
msgstr ""
msgid "Failed"
@@ -2217,19 +2849,19 @@ msgid "Failed to change the owner"
msgstr "オーナーを変更ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Failed to check related branches."
-msgstr ""
+msgstr "関連ã™ã‚‹ãƒ–ランãƒã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
msgid "Failed to remove issue from board, please try again."
-msgstr ""
+msgstr "ボードã®èª²é¡Œã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Failed to remove the pipeline schedule"
msgstr "パイプラインスケジュールを削除ã§ãã¾ã›ã‚“ã§ã—ãŸ"
msgid "Failed to update issues, please try again."
-msgstr ""
+msgstr "課題ã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Failure"
-msgstr ""
+msgstr "失敗"
msgid "Faster as it re-uses the project workspace (falling back to clone if it doesn't exist)"
msgstr ""
@@ -2241,7 +2873,7 @@ msgid "February"
msgstr "2月"
msgid "Fields on this page are now uneditable, you can configure"
-msgstr ""
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã®é …ç›®ã¯ç·¨é›†ã§ããªã„設定ã§ã™ã€‚次㮠Kubernetes クラスターを設定ã§ãã¾ã™ã€‚"
msgid "Files"
msgstr "ファイル"
@@ -2249,6 +2881,12 @@ msgstr "ファイル"
msgid "Files (%{human_size})"
msgstr "ファイル (%{human_size})"
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "コミットメッセージã§çµžã‚Šè¾¼ã¿"
@@ -2258,6 +2896,12 @@ msgstr "パスã§æ¤œç´¢"
msgid "Find file"
msgstr "ファイルを検索"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr "完了"
@@ -2267,6 +2911,30 @@ msgstr "åˆå›ž"
msgid "FirstPushedBy|pushed by"
msgstr "プッシュã—ãŸäºº"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr "フォントã®è‰²"
+
+msgid "Footer message"
+msgstr "フッターメッセージ"
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2293,11 +2961,23 @@ msgid "Format"
msgstr "フォーマット"
msgid "Found errors in your .gitlab-ci.yml:"
-msgstr ""
+msgstr ".gitlab-ci.yml ã«ã‚¨ãƒ©ãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ:"
msgid "From %{provider_title}"
msgstr "%{provider_title}ã‹ã‚‰"
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "課題ãŒç™»éŒ²ã•ã‚Œã¦ã‹ã‚‰ãƒ—ロダクションã«ãƒ‡ãƒ—ロイã•ã‚Œã‚‹ã¾ã§"
@@ -2305,13 +2985,13 @@ msgid "From merge request merge until deploy to production"
msgstr "マージリクエストãŒãƒžãƒ¼ã‚¸ã•ã‚Œã¦ã‹ã‚‰ãƒ—ロダクションã«ãƒ‡ãƒ—ロイã•ã‚Œã‚‹ã¾ã§"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
-msgstr ""
+msgstr "Kubernetes クラスターã®è©³ç´°ç”»é¢ã‚’介ã—ã¦ã€ã‚¢ãƒ—リケーションリストã‹ã‚‰ Runner をインストールã—ã¾ã™ã€‚"
msgid "GPG Keys"
msgstr "GPG キー"
msgid "General"
-msgstr ""
+msgstr "一般"
msgid "General pipelines"
msgstr ""
@@ -2319,8 +2999,203 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr "åˆæœŸè¨­å®šãƒ©ãƒ™ãƒ«ã‚»ãƒƒãƒˆã‚’生æˆã™ã‚‹"
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr "失敗"
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr "æ–°è¦ãƒŽãƒ¼ãƒ‰"
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr "ノードã®å‰Šé™¤ã«æˆåŠŸã—ã¾ã—ãŸã€‚"
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr "ノード読ã¿è¾¼ã¿ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr "ノードã®å‰Šé™¤ä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr "ストレージã®è¨­å®š"
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr "Git"
+
msgid "Git repository URL"
-msgstr "Gitリãƒã‚¸ãƒˆãƒªURL"
+msgstr "Git リãƒã‚¸ãƒˆãƒª URL"
msgid "Git revision"
msgstr "Git リビジョン"
@@ -2338,13 +3213,31 @@ msgid "GitHub import"
msgstr "GitHub インãƒãƒ¼ãƒˆ"
msgid "GitLab CI Linter has been moved"
-msgstr ""
+msgstr "GitLab CI Linter ãŒç§»å‹•ã—ã¾ã—ãŸ"
+
+msgid "GitLab Geo"
+msgstr "GitLab Geo"
msgid "GitLab Group Runners can execute code for all the projects in this group."
+msgstr "GitLab グループ Runner ã¯ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®å…¨ã¦ã®ãƒ—ロジェクトã®ã‚³ãƒ¼ãƒ‰ã‚’実行ã§ãã¾ã™ã€‚"
+
+msgid "GitLab Import"
msgstr ""
-msgid "GitLab Runner section"
-msgstr "GitLab Runner セクション"
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr "Gitaly"
@@ -2353,83 +3246,176 @@ msgid "Gitaly Servers"
msgstr "Gitaly サーãƒãƒ¼"
msgid "Gitaly|Address"
+msgstr "アドレス"
+
+msgid "Gitea Host URL"
msgstr ""
-msgid "Go Back"
+msgid "Gitea Import"
msgstr ""
+msgid "Go Back"
+msgstr "戻る"
+
msgid "Go back"
msgstr "å‰ã«æˆ»ã‚‹"
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "自分ã®ãƒ•ã‚©ãƒ¼ã‚¯ã¸ç§»å‹•"
msgid "GoToYourFork|Fork"
msgstr "フォーク"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
-msgstr "Googleèªè¨¼ã¯ %{link_to_documentation} ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“ã®ã‚µãƒ¼ãƒ“スã«ã¤ã„ã¦ã¯GitLab管ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。"
+msgstr "Google èªè¨¼ã¯ %{link_to_documentation} ã§ã¯ã‚ã‚Šã¾ã›ã‚“。ã“ã®ã‚µãƒ¼ãƒ“スã«ã¤ã„ã¦ã¯ GitLab 管ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。"
msgid "Got it!"
-msgstr "入手ã—ã¾ã—ょã†!"
+msgstr "入手ã—ã¾ã—ょã†ï¼"
msgid "Graph"
+msgstr "グラフ"
+
+msgid "Group"
msgstr ""
msgid "Group CI/CD settings"
+msgstr "CI/CD グループ設定"
+
+msgid "Group Git LFS status:"
msgstr ""
msgid "Group ID"
msgstr "グループ ID"
msgid "Group Runners"
+msgstr "グループ Runner"
+
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
+msgstr "グループ Maintainer 㯠%{link} ã§ã‚°ãƒ«ãƒ¼ãƒ— Runner を登録ã§ãã¾ã™ã€‚"
+
+msgid "Group: %{group_name}"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr "ロードマップã®èª­ã¿è¾¼ã¿ä¸­"
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
msgstr ""
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgstr "%{group} 内ã®ãƒ—ロジェクトを他ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ãªã„よã†ã«ã™ã‚‹"
+
msgid "GroupSettings|Share with group lock"
msgstr ""
msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
-msgstr ""
+msgstr "ã“ã®è¨­å®šã¯ %{ancestor_group} ã«é©ç”¨ã•ã‚Œã€ã‚µãƒ–グループã§ä¸Šæ›¸ãã•ã‚Œã¾ã™ã€‚"
msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "ã“ã®è¨­å®šã¯ %{ancestor_group} ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ—ロジェクトを他ã®ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã™ã‚‹ã«ã¯ã€è¨­å®šã‚’上書ãã™ã‚‹ã‹ã€%{remove_ancestor_share_with_group_lock} ã™ã‚‹ã‚ˆã†ã«ã‚ªãƒ¼ãƒŠãƒ¼ã«ç¢ºèªã—ã¦ãã ã•ã„。"
msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
-msgstr ""
+msgstr "ã“ã®è¨­å®šã¯ %{ancestor_group} ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚設定を上書ãã€ã¾ãŸã¯ %{remove_ancestor_share_with_group_lock} ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
-msgstr ""
+msgstr "ã“ã®è¨­å®šã¯ã‚°ãƒ«ãƒ¼ãƒ—オーナーã«ã‚ˆã£ã¦ä¸Šæ›¸ãã•ã‚Œãªã„é™ã‚Šã€ã™ã¹ã¦ã®ã‚µãƒ–グループã«é©ç”¨ã•ã‚Œã¾ã™ã€‚プロジェクトã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ—¢ã«ã‚るグループã¯ã€æ‰‹å‹•ã§å‰Šé™¤ã—ãªã„é™ã‚Šå¼•ã続ãアクセスã§ãã¾ã™ã€‚"
msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
+msgstr "グループã®ãƒ­ãƒƒã‚¯ã‚’ %{ancestor_group_name} ã®å…±æœ‰ã‹ã‚‰å‰Šé™¤"
+
+msgid "Groups"
msgstr ""
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
+msgstr "グループã¯ã€%{subgroup_docs_link_start}サブグループ%{subgroup_docs_link_end}を作æˆã™ã‚‹ã“ã¨ã§ãƒã‚¹ãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚"
+
+msgid "GroupsDropdown|Frequently visited"
msgstr ""
-msgid "GroupsEmptyState|A group is a collection of several projects."
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr "よã使ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¯ã“ã“ã«è¡¨ç¤ºã•ã‚Œã¾ã™"
+
+msgid "GroupsDropdown|Loading groups"
msgstr ""
-msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgid "GroupsDropdown|Search your groups"
msgstr ""
-msgid "GroupsEmptyState|No groups found"
+msgid "GroupsDropdown|Something went wrong on our end."
msgstr ""
-msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgid "GroupsDropdown|Sorry, no groups matched your search"
msgstr ""
-msgid "GroupsTree|Create a project in this group."
+msgid "GroupsDropdown|This feature requires browser localStorage support"
msgstr ""
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr "グループã¯è¤‡æ•°ã®ãƒ—ロジェクトã®é›†åˆä½“ã§ã™ã€‚"
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr "グループã¯ãƒ—ロジェクトを整ç†ã™ã‚‹ãŸã‚ã®ã€ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã®ã‚ˆã†ã«æ©Ÿèƒ½ã—ã¾ã™ã€‚"
+
+msgid "GroupsEmptyState|No groups found"
+msgstr "グループã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "GroupsEmptyState|You can manage your group member’s permissions and access to each project in the group."
+msgstr "グループメンãƒãƒ¼ã®æ¨©é™ç®¡ç†ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—内ã®å„プロジェクトã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’管ç†ã§ãã¾ã™ã€‚"
+
+msgid "GroupsTree|Create a project in this group."
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ—ロジェクトを作æˆã™ã‚‹ã€‚"
+
msgid "GroupsTree|Create a subgroup in this group."
msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚µãƒ–グループを作æˆã™ã‚‹"
@@ -2437,23 +3423,29 @@ msgid "GroupsTree|Edit group"
msgstr "グループを編集"
msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
-msgstr ""
+msgstr "グループã®å”¯ä¸€ã®ã‚ªãƒ¼ãƒŠãƒ¼ã¨ãªã£ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰é›¢è„±ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。"
msgid "GroupsTree|Filter by name..."
-msgstr ""
+msgstr "åå‰ã§çµžã‚Šè¾¼ã¿..."
msgid "GroupsTree|Leave this group"
-msgstr ""
+msgstr "ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰é›¢è„±ã™ã‚‹"
msgid "GroupsTree|Loading groups"
-msgstr ""
+msgstr "グループã®èª­ã¿è¾¼ã¿ä¸­"
msgid "GroupsTree|Sorry, no groups matched your search"
-msgstr ""
+msgstr "ã™ã¿ã¾ã›ã‚“ã€æ¤œç´¢ã«ä¸€è‡´ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ãŒå­˜åœ¨ã—ã¾ã›ã‚“"
msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr "ã™ã¿ã¾ã›ã‚“ã€æ¤œç´¢ã«ä¸€è‡´ã™ã‚‹ãƒ—ロジェクトã‹ã‚°ãƒ«ãƒ¼ãƒ—ãŒå­˜åœ¨ã—ã¾ã›ã‚“"
+
+msgid "Have your users email"
msgstr ""
+msgid "Header message"
+msgstr "ヘッダーメッセージ"
+
msgid "Health Check"
msgstr "正常性ãƒã‚§ãƒƒã‚¯"
@@ -2476,17 +3468,17 @@ msgid "Help"
msgstr "ヘルプ"
msgid "Help page"
-msgstr ""
+msgstr "ヘルプページ"
msgid "Help page text and support page url."
msgstr "ヘルプページテキストã¨ã‚µãƒãƒ¼ãƒˆãƒšãƒ¼ã‚¸URL。"
msgid "Hide value"
msgid_plural "Hide values"
-msgstr[0] ""
+msgstr[0] "éžè¡¨ç¤º"
msgid "Hide whitespace changes"
-msgstr ""
+msgstr "空白ã®å¤‰æ›´ã‚’éš ã™"
msgid "History"
msgstr "履歴"
@@ -2495,13 +3487,13 @@ msgid "Housekeeping successfully started"
msgstr "ãƒã‚¦ã‚¹ã‚­ãƒ¼ãƒ”ングã¯æ­£å¸¸ã«èµ·å‹•ã—ã¾ã—ãŸã€‚"
msgid "I accept the %{terms_link}"
-msgstr ""
+msgstr "%{terms_link} ã«åŒæ„ã™ã‚‹"
msgid "I accept the|Terms of Service and Privacy Policy"
msgstr ""
msgid "ID"
-msgstr ""
+msgstr "ID"
msgid "IDE|Commit"
msgstr "コミット"
@@ -2513,7 +3505,7 @@ msgid "IDE|Go back"
msgstr "戻る"
msgid "IDE|Open in file view"
-msgstr ""
+msgstr "ファイルビューã§é–‹ã"
msgid "IDE|Review"
msgstr "レビュー"
@@ -2524,12 +3516,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2537,40 +3538,92 @@ msgid "If your HTTP repository is not publicly accessible, add authentication in
msgstr ""
msgid "ImageDiffViewer|2-up"
-msgstr ""
+msgstr "2-up"
msgid "ImageDiffViewer|Onion skin"
-msgstr ""
+msgstr "オニオンスキン"
msgid "ImageDiffViewer|Swipe"
-msgstr ""
+msgstr "スワイプ"
msgid "Import"
msgstr "インãƒãƒ¼ãƒˆ"
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr "ã™ã¹ã¦ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’インãƒãƒ¼ãƒˆ"
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr "インãƒãƒ¼ãƒˆä¸­ã§ã™"
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
-msgstr "リãƒã‚¸ãƒˆãƒªã‚’GitHubã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹"
+msgstr "リãƒã‚¸ãƒˆãƒªã‚’ GitHub ã‹ã‚‰ã‚¤ãƒ³ãƒãƒ¼ãƒˆã™ã‚‹"
msgid "Import repository"
msgstr ""
+msgid "ImportButtons|Connect repositories from"
+msgstr "リãƒã‚¸ãƒˆãƒªã¸æŽ¥ç¶š"
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
+msgid "Install GitLab Runner"
+msgstr ""
+
msgid "Install Runner on Kubernetes"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "GitLab CI ã¨äº’æ›ã® Runner をインストール"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2596,7 +3649,10 @@ msgstr "é–“éš”ã®ãƒ‘ターン"
msgid "Introducing Cycle Analytics"
msgstr "サイクル分æžã®ã”紹介"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2605,12 +3661,18 @@ msgstr "課題イベント"
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr "課題"
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr "1月"
@@ -2641,6 +3703,9 @@ msgstr "6月"
msgid "Koding"
msgstr "Koding"
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -2666,7 +3731,7 @@ msgid "Kubernetes service integration has been deprecated. %{deprecated_message_
msgstr ""
msgid "LFS"
-msgstr ""
+msgstr "LFS"
msgid "LFSStatus|Disabled"
msgstr "無効"
@@ -2680,17 +3745,23 @@ msgstr "ラベル"
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr "ラベル"
+
msgid "Labels"
msgstr "ラベル"
msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
-msgstr ""
+msgstr "ラベルを%{features} ã«é©ç”¨ã§ãã¾ã™ã€‚グループラベルã¯ã‚°ãƒ«ãƒ¼ãƒ—内ã®ã™ã¹ã¦ã®ãƒ—ロジェクトã§ä½¿ç”¨ã§ãã¾ã™ã€‚"
msgid "Labels can be applied to issues and merge requests to categorize them."
msgstr ""
@@ -2702,7 +3773,7 @@ msgid "Labels|<span>Promote label</span> %{labelTitle} <span>to Group Label?</sp
msgstr ""
msgid "Labels|Promote Label"
-msgstr ""
+msgstr "ラベルã®æ˜‡æ ¼"
msgid "Last %d day"
msgid_plural "Last %d days"
@@ -2721,7 +3792,7 @@ msgid "Last edited by %{name}"
msgstr "最終編集者 %{name}"
msgid "Last update"
-msgstr ""
+msgstr "最終更新"
msgid "Last updated"
msgstr ""
@@ -2733,7 +3804,7 @@ msgid "LastPushEvent|at"
msgstr "ã“ã®æ™‚刻ã«"
msgid "Latest changes"
-msgstr ""
+msgstr "最新ã®å¤‰æ›´"
msgid "Learn more"
msgstr ""
@@ -2759,26 +3830,44 @@ msgstr "グループを離脱"
msgid "Leave project"
msgstr "プロジェクトを離脱"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr "ライセンス"
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr "リスト"
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
+msgstr "GitHub リãƒã‚¸ãƒˆãƒªã‚’一覧表示"
+
+msgid "Loading contribution stats for group members"
msgstr ""
msgid "Loading the GitLab IDE..."
-msgstr "GitLab IDEã®èª­ã¿è¾¼ã¿ä¸­..."
+msgstr "GitLab IDE ã®èª­ã¿è¾¼ã¿ä¸­..."
msgid "Loading..."
msgstr "読ã¿è¾¼ã¿ä¸­..."
msgid "Lock"
-msgstr ""
+msgstr "ロック"
msgid "Lock %{issuableDisplayName}"
-msgstr ""
+msgstr "ロック %{issuableDisplayName}"
msgid "Lock not found"
-msgstr ""
+msgstr "ロックãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
msgid "Lock to current projects"
msgstr ""
@@ -2786,22 +3875,67 @@ msgstr ""
msgid "Locked"
msgstr "ロック中"
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
-msgstr "ログイン"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr ""
msgid "Manage all notifications"
msgstr ""
-msgid "Manage group labels"
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
msgstr ""
-msgid "Manage labels"
+msgid "Manage applications that you've authorized to use your account."
msgstr ""
+msgid "Manage group labels"
+msgstr "グループラベルã®ç®¡ç†"
+
+msgid "Manage labels"
+msgstr "ラベルを管ç†"
+
msgid "Manage project labels"
+msgstr "プロジェクトラベルã®ç®¡ç†"
+
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
msgstr ""
msgid "Mar"
@@ -2811,7 +3945,7 @@ msgid "March"
msgstr "3月"
msgid "Mark todo as done"
-msgstr ""
+msgstr "Todo を完了ã«ã™ã‚‹"
msgid "Markdown enabled"
msgstr ""
@@ -2828,18 +3962,30 @@ msgstr "中央値"
msgid "Members"
msgstr "メンãƒãƒ¼"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr "マージリクエスト"
+
msgid "Merge Request:"
msgstr "マージリクエスト:"
msgid "Merge Requests"
msgstr "マージリクエスト"
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr "マージイベント"
msgid "Merge request"
msgstr "マージリクエスト"
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr "マージリクエスト"
@@ -2847,7 +3993,7 @@ msgid "Merge requests are a place to propose changes you've made to a project an
msgstr ""
msgid "MergeRequests|Resolve this discussion in a new issue"
-msgstr ""
+msgstr "æ–°ã—ã„課題ã§ã“ã®æ¤œè¨Žã‚’解決ã™ã‚‹"
msgid "MergeRequests|Saving the comment failed"
msgstr ""
@@ -2856,7 +4002,7 @@ msgid "MergeRequests|Toggle comments for this file"
msgstr ""
msgid "MergeRequests|Updating discussions failed"
-msgstr ""
+msgstr "検討ã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "MergeRequests|View file @ %{commitId}"
msgstr ""
@@ -2870,35 +4016,140 @@ msgstr "マージ済ã¿"
msgid "Messages"
msgstr "メッセージ"
+msgid "Metrics"
+msgstr "メトリクス"
+
msgid "Metrics - Influx"
-msgstr ""
+msgstr "メトリクス - Influx"
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr "環境"
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr "åå‰"
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr "レスãƒãƒ³ã‚¹"
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr "タイプ"
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr "マイルストーン"
msgid "Milestones"
-msgstr ""
+msgstr "マイルストーン"
msgid "Milestones|Delete milestone"
msgstr "マイルストーンã®å‰Šé™¤"
msgid "Milestones|Delete milestone %{milestoneTitle}?"
-msgstr "マイルストーン %{milestoneTitle} を削除ã—ã¾ã™ã‹?"
+msgstr "マイルストーン %{milestoneTitle} を削除ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Milestones|Failed to delete milestone %{milestoneTitle}"
msgstr "マイルストーン %{milestoneTitle} ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ"
msgid "Milestones|Milestone %{milestoneTitle} was not found"
-msgstr ""
+msgstr "マイルストーン %{milestoneTitle} ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
msgid "Milestones|Promote %{milestoneTitle} to group milestone?"
-msgstr ""
+msgstr "%{milestoneTitle} をグループマイルストーンã«æ˜‡æ ¼ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Milestones|Promote Milestone"
-msgstr ""
+msgstr "マイルストーンã®æ˜‡æ ¼"
+
+msgid "Milestones|This action cannot be reversed."
+msgstr "ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。"
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "SSH éµã‚’追加"
@@ -2907,66 +4158,96 @@ msgid "Modal|Cancel"
msgstr "キャンセル"
msgid "Modal|Close"
-msgstr ""
+msgstr "é–‰ã˜ã‚‹"
msgid "Monitoring"
msgstr "監視"
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr "詳ã—ã„情報"
msgid "More information is available|here"
msgstr "ã“ã“ã‚’å‚ç…§"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr "移動"
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr "åå‰"
msgid "Name new label"
-msgstr ""
+msgstr "æ–°ã—ã„ラベルã«åå‰ã‚’ã¤ã‘ã‚‹"
msgid "Name your individual key via a title"
msgstr ""
-msgid "Nav|Help"
+msgid "Name:"
msgstr ""
+msgid "Nav|Help"
+msgstr "ヘルプ"
+
msgid "Nav|Home"
-msgstr ""
+msgstr "ホーム"
msgid "Nav|Sign In / Register"
-msgstr ""
+msgstr "サインイン / 登録"
msgid "Nav|Sign out and sign in with a different account"
-msgstr ""
+msgstr "別ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã™ã‚‹"
-msgid "New Identity"
+msgid "Network"
msgstr ""
-msgid "New Issue"
-msgid_plural "New Issues"
-msgstr[0] "æ–°è¦èª²é¡Œ"
+msgid "New"
+msgstr ""
-msgid "New Kubernetes Cluster"
+msgid "New Application"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Group"
msgstr ""
+msgid "New Identity"
+msgstr "æ–°ã—ã„ ID"
+
+msgid "New Issue"
+msgid_plural "New Issues"
+msgstr[0] "æ–°è¦èª²é¡Œ"
+
msgid "New Label"
-msgstr ""
+msgstr "æ–°ã—ã„ラベル"
msgid "New Pipeline Schedule"
msgstr "æ–°è¦ãƒ‘イプラインスケジュール"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "æ–°è¦ãƒ–ランãƒ"
@@ -2976,6 +4257,9 @@ msgstr "æ–°ã—ã„ブランãƒã¯åˆ©ç”¨ã§ãã¾ã›ã‚“"
msgid "New directory"
msgstr "æ–°è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«"
@@ -3012,7 +4296,13 @@ msgstr "æ–°è¦ã‚µãƒ–グループ"
msgid "New tag"
msgstr "æ–°è¦ã‚¿ã‚°"
+msgid "New..."
+msgstr ""
+
msgid "No"
+msgstr "ã„ã„ãˆ"
+
+msgid "No Label"
msgstr ""
msgid "No assignee"
@@ -3022,10 +4312,10 @@ msgid "No changes"
msgstr "変更ãªã—"
msgid "No connection could be made to a Gitaly Server, please check your logs!"
-msgstr ""
+msgstr "Gitaly サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ログを確èªã—ã¦ãã ã•ã„ï¼"
msgid "No due date"
-msgstr ""
+msgstr "期é™ãªã—"
msgid "No estimate or time spent"
msgstr ""
@@ -3039,10 +4329,31 @@ msgstr ""
msgid "No files found."
msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
-msgid "No merge requests found"
+msgid "No issues for the selected time period."
msgstr ""
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
+msgid "No merge requests found"
+msgstr "マージリクエストã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
msgid "No messages were logged"
+msgstr "メッセージã¯è¨˜éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
msgstr ""
msgid "No repository"
@@ -3051,20 +4362,23 @@ msgstr "リãƒã‚¸ãƒˆãƒªãŒã‚ã‚Šã¾ã›ã‚“"
msgid "No schedules"
msgstr "スケジュールãªã—"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "ãªã—"
msgid "Not allowed to merge"
-msgstr ""
+msgstr "マージã¯è¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“"
msgid "Not available"
msgstr "利用ã§ãã¾ã›ã‚“"
msgid "Not available for private projects"
-msgstr ""
+msgstr "プライベートプロジェクトã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
msgid "Not available for protected branches"
-msgstr ""
+msgstr "ä¿è­·ã•ã‚ŒãŸãƒ–ランãƒã§ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“"
msgid "Not confidential"
msgstr ""
@@ -3073,14 +4387,23 @@ msgid "Not enough data"
msgstr "データä¸è¶³"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
+msgstr "マスターブランãƒã¯è‡ªå‹•çš„ã«ä¿è­·ã•ã‚Œã‚‹ã“ã¨ã«ç•™æ„ã—ã¦ãã ã•ã„。%{link_to_protected_branches}"
+
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
msgstr ""
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "イベント通知"
@@ -3139,10 +4462,10 @@ msgid "Notifications"
msgstr "通知"
msgid "Notifications off"
-msgstr ""
+msgstr "通知オフ"
msgid "Notifications on"
-msgstr ""
+msgstr "通知オン"
msgid "Nov"
msgstr "11月"
@@ -3151,7 +4474,10 @@ msgid "November"
msgstr "11月"
msgid "Number of access attempts"
-msgstr ""
+msgstr "アクセス試行回数"
+
+msgid "OK"
+msgstr "OK"
msgid "Oct"
msgstr "10月"
@@ -3162,6 +4488,15 @@ msgstr "10月"
msgid "OfSearchInADropdown|Filter"
msgstr "フィルター"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3171,7 +4506,28 @@ msgstr ""
msgid "Only project members can comment."
msgstr "プロジェクトメンãƒãƒ¼ã®ã¿ã‚³ãƒ¡ãƒ³ãƒˆã§ãã¾ã™"
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
+msgstr "Xcode ã§é–‹ã"
+
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
msgstr ""
msgid "OpenedNDaysAgo|Opened"
@@ -3181,6 +4537,12 @@ msgid "Opens in a new window"
msgstr "æ–°è¦ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§é–‹ã"
msgid "Operations"
+msgstr "é‹ç”¨"
+
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
msgstr ""
msgid "Options"
@@ -3190,6 +4552,9 @@ msgid "Or you can choose one of the suggested colors below"
msgstr ""
msgid "Other Labels"
+msgstr "ãã®ä»–ã®ãƒ©ãƒ™ãƒ«"
+
+msgid "Other information"
msgstr ""
msgid "Otherwise it is recommended you start with one of the options below."
@@ -3208,7 +4573,7 @@ msgid "Pages"
msgstr "Pages"
msgid "Pagination|Last »"
-msgstr ""
+msgstr "最後 »"
msgid "Pagination|Next"
msgstr ""
@@ -3217,7 +4582,7 @@ msgid "Pagination|Prev"
msgstr ""
msgid "Pagination|« First"
-msgstr ""
+msgstr "« 最åˆ"
msgid "Part of merge request changes"
msgstr ""
@@ -3228,6 +4593,9 @@ msgstr "パスワード"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3244,10 +4612,10 @@ msgid "Performance optimization"
msgstr "パフォーマンスã®æœ€é©åŒ–"
msgid "Permissions"
-msgstr ""
+msgstr "権é™"
msgid "Personal Access Token"
-msgstr ""
+msgstr "個人ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³"
msgid "Pipeline"
msgstr "パイプライン"
@@ -3261,6 +4629,9 @@ msgstr "パイプラインスケジュール"
msgid "Pipeline Schedules"
msgstr "パイプラインスケジュール"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3340,7 +4711,7 @@ msgid "Pipelines|Get started with Pipelines"
msgstr ""
msgid "Pipelines|Loading Pipelines"
-msgstr ""
+msgstr "パイプラインを読ã¿è¾¼ã¿ä¸­"
msgid "Pipelines|Project cache successfully reset."
msgstr ""
@@ -3370,10 +4741,10 @@ msgid "Pipeline|Existing branch name or tag"
msgstr ""
msgid "Pipeline|Run Pipeline"
-msgstr ""
+msgstr "パイプラインを実行"
msgid "Pipeline|Search branches"
-msgstr ""
+msgstr "ブランãƒã®æ¤œç´¢"
msgid "Pipeline|Specify variable values to be used in this run. The values specified in %{settings_link} will be used by default."
msgstr ""
@@ -3382,13 +4753,13 @@ msgid "Pipeline|Stop pipeline"
msgstr "パイプラインã®åœæ­¢"
msgid "Pipeline|Stop pipeline #%{pipelineId}?"
-msgstr ""
+msgstr "#%{pipelineId} パイプラインをåœæ­¢ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Pipeline|Variables"
-msgstr ""
+msgstr "変数"
msgid "Pipeline|You’re about to stop pipeline %{pipelineId}."
-msgstr ""
+msgstr "%{pipelineId} パイプラインをåœæ­¢ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚"
msgid "Pipeline|all"
msgstr "全件"
@@ -3405,6 +4776,12 @@ msgstr "ステージã‚ã‚Š"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr "PlantUML"
@@ -3412,15 +4789,27 @@ msgid "Play"
msgstr ""
msgid "Please accept the Terms of Service before continuing."
+msgstr "続ã‘ã‚‹å‰ã«ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
msgstr ""
msgid "Please select at least one filter to see results"
msgstr ""
msgid "Please solve the reCAPTCHA"
-msgstr "reCAPTCHAを解決ã—ã¦ãã ã•ã„"
+msgstr "reCAPTCHA を解決ã—ã¦ãã ã•ã„"
msgid "Please try again"
+msgstr "ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„"
+
+msgid "Please wait while we connect to your repository. Refresh at will."
msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
@@ -3432,6 +4821,9 @@ msgstr "基本設定"
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3454,16 +4846,22 @@ msgid "Private projects can be created in your personal namespace with:"
msgstr ""
msgid "Profile"
+msgstr "プロフィール"
+
+msgid "Profile Settings"
msgstr ""
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr "ユーザーåã®å¤‰æ›´"
msgid "Profiles|Current path: %{path}"
-msgstr ""
+msgstr "ç¾åœ¨ã®ãƒ‘ス: %{path}"
msgid "Profiles|Delete Account"
msgstr "アカウント削除"
@@ -3475,7 +4873,7 @@ msgid "Profiles|Delete your account?"
msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’削除ã—ã¾ã™ã‹ï¼Ÿ"
msgid "Profiles|Deleting an account has the following effects:"
-msgstr ""
+msgstr "アカウントを削除ã™ã‚‹ã¨æ¬¡ã®ã‚ˆã†ãªå½±éŸ¿ãŒã‚ã‚Šã¾ã™:"
msgid "Profiles|Invalid password"
msgstr "パスワードãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
@@ -3486,9 +4884,15 @@ msgstr "ユーザーåãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“"
msgid "Profiles|Path"
msgstr "パス"
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "確èªã®ãŸã‚ %{confirmationValue} を入力ã—ã¦ãã ã•ã„:"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr "ユーザーåã‚’æ›´æ–°"
@@ -3507,6 +4911,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr "ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ"
@@ -3514,10 +4921,10 @@ msgid "Profiling - Performance bar"
msgstr ""
msgid "Programming languages used in this repository"
-msgstr ""
+msgstr "ã“ã®ãƒªãƒã‚¸ãƒˆãƒªã§ä½¿ç”¨ã•ã‚Œã¦ã„るプログラミング言語"
msgid "Progress"
-msgstr ""
+msgstr "進行状æ³"
msgid "Project"
msgstr "プロジェクト"
@@ -3561,9 +4968,27 @@ msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒªãƒ³ã‚¯ã¯æœŸé™åˆ‡ã‚Œã«ãªã‚Š
msgid "Project export started. A download link will be sent by email."
msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚’開始ã—ã¾ã—ãŸã€‚ダウンロードã®ãƒªãƒ³ã‚¯ã¯ãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡ã—ã¾ã™"
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "講読"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "åå‰"
@@ -3573,12 +4998,42 @@ msgstr "記録ãªã—"
msgid "ProjectLifecycle|Stage"
msgstr "ステージ"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr "プロジェクト"
-msgid "ProjectsDropdown|Frequently visited"
+msgid "Projects shared with %{group_name}"
msgstr ""
+msgid "ProjectsDropdown|Frequently visited"
+msgstr "よã使ã†ãƒ—ロジェクト"
+
msgid "ProjectsDropdown|Loading projects"
msgstr ""
@@ -3592,22 +5047,49 @@ msgid "ProjectsDropdown|Something went wrong on our end."
msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
+msgstr "検索æ¡ä»¶ã«ä¸€è‡´ã—ãŸãƒ—ロジェクトã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+msgid "PrometheusAlerts|Add alert"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Alert set"
msgstr ""
-msgid "PrometheusDashboard|Time"
+msgid "PrometheusAlerts|Edit alert"
msgstr ""
-msgid "PrometheusService|%{exporters} with %{metrics} were found"
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
+msgid "PrometheusDashboard|Time"
+msgstr "時間"
+
+msgid "PrometheusService|%{exporters} with %{metrics} were found"
+msgstr "%{metrics} ã® %{exporters} ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ"
+
msgid "PrometheusService|<p class=\"text-tertiary\">No <a href=\"%{docsUrl}\">common metrics</a> were found</p>"
msgstr ""
msgid "PrometheusService|Active"
-msgstr ""
+msgstr "アクティブ"
msgid "PrometheusService|Auto configuration"
msgstr ""
@@ -3621,14 +5103,23 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr "カスタムメトリクスを検索..."
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
msgid "PrometheusService|Manage clusters"
-msgstr ""
+msgstr "クラスター管ç†"
msgid "PrometheusService|Manual configuration"
msgstr "手動構æˆ"
@@ -3636,21 +5127,24 @@ msgstr "手動構æˆ"
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
-msgstr ""
+msgstr "未設定ã®ç’°å¢ƒå¤‰æ•°"
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr "æ–°è¦ãƒ¡ãƒˆãƒªã‚¯ã‚¹"
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3664,32 +5158,50 @@ msgid "PrometheusService|Waiting for your first deployment to an environment to
msgstr ""
msgid "Promote"
-msgstr ""
+msgstr "昇格"
msgid "Promote these project milestones into a group milestone."
msgstr ""
msgid "Promote to Group Milestone"
-msgstr ""
+msgstr "グループマイルストーンã«æ˜‡æ ¼"
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr "次回ã‹ã‚‰ã¯ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„"
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr "ã“ã®æ©Ÿèƒ½ã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+msgid "Promotions|Upgrade plan"
+msgstr "プランをアップグレード"
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
msgid "Public - The project can be accessed without any authentication."
-msgstr ""
+msgstr "公開 - プロジェクトã¯èªè¨¼ç„¡ã—ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™"
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr "プッシュイベント"
@@ -3699,24 +5211,39 @@ msgstr "コマンドラインã‹ã‚‰ãƒ—ロジェクトをプッシュ"
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr "プッシュ済ã¿"
+
+msgid "Pushes"
msgstr ""
-msgid "Re-deploy"
+msgid "Quarters"
+msgstr ""
+
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr "続ãを読む"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "Readme"
msgid "Real-time features"
-msgstr ""
+msgstr "リアルタイム機能"
msgid "Reference:"
msgstr "å‚ç…§:"
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr "登録 / サインイン"
@@ -3757,7 +5284,7 @@ msgid "Remove"
msgstr "削除"
msgid "Remove Runner"
-msgstr ""
+msgstr "Runner を削除"
msgid "Remove avatar"
msgstr "ã‚¢ãƒã‚¿ãƒ¼ã‚’削除"
@@ -3768,24 +5295,45 @@ msgstr ""
msgid "Remove project"
msgstr "プロジェクトを削除"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr "リãƒã‚¸ãƒˆãƒª URL"
+
msgid "Repository"
msgstr "リãƒã‚¸ãƒˆãƒª"
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
msgid "Repository mirror"
-msgstr ""
+msgstr "リãƒã‚¸ãƒˆãƒªãƒŸãƒ©ãƒ¼"
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "アクセス権é™ã‚’リクエストã™ã‚‹"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3802,22 +5350,25 @@ msgid "Resolve all discussions in new issue"
msgstr ""
msgid "Resolve conflicts on source branch"
-msgstr ""
+msgstr "ソースブランãƒã§ã®ç«¶åˆã‚’解決ã™ã‚‹"
msgid "Resolve discussion"
+msgstr "検討を解決"
+
+msgid "Response metrics (Custom)"
msgstr ""
msgid "Resume"
-msgstr ""
+msgstr "å†é–‹"
msgid "Retry"
msgstr ""
msgid "Retry this job"
-msgstr ""
+msgstr "ジョブをå†è©¦è¡Œã—ã¦ãã ã•ã„"
msgid "Retry verification"
-msgstr ""
+msgstr "検証をå†è©¦è¡Œã—ã¦ãã ã•ã„"
msgid "Reveal value"
msgid_plural "Reveal values"
@@ -3830,6 +5381,9 @@ msgid "Revert this merge request"
msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’リãƒãƒ¼ãƒˆ"
msgid "Review"
+msgstr "レビュー"
+
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
msgstr ""
msgid "Reviewing"
@@ -3838,7 +5392,13 @@ msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr "ロードマップ"
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3856,6 +5416,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr "SAML SSO"
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr "SSH éµ"
@@ -3865,6 +5440,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr "変更をä¿å­˜"
@@ -3886,6 +5464,15 @@ msgstr "スケジュール"
msgid "Scheduling Pipelines"
msgstr "パイプラインスケジューリング"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3896,19 +5483,19 @@ msgid "Search"
msgstr "検索"
msgid "Search branches"
-msgstr ""
+msgstr "ブランãƒã‚’検索"
msgid "Search branches and tags"
msgstr "ブランãƒã¾ãŸã¯ã‚¿ã‚°ã‚’検索"
msgid "Search files"
-msgstr ""
+msgstr "ファイルã®æ¤œç´¢"
msgid "Search for projects, issues, etc."
msgstr ""
msgid "Search merge requests"
-msgstr ""
+msgstr "マージリクエストを検索"
msgid "Search milestones"
msgstr "マイルストーンを検索"
@@ -3925,9 +5512,24 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
-msgid "Select"
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr "セキュリティレãƒãƒ¼ãƒˆ"
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
msgstr ""
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
+msgid "Select"
+msgstr "é¸æŠž"
+
msgid "Select Archive Format"
msgstr "アーカイブã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’é¸æŠž"
@@ -3947,7 +5549,7 @@ msgid "Select branch/tag"
msgstr "ブランãƒãƒ»ã‚¿ã‚°é¸æŠž"
msgid "Select project"
-msgstr ""
+msgstr "プロジェクトã®é¸æŠž"
msgid "Select project and zone to choose machine type"
msgstr ""
@@ -3955,12 +5557,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
-msgid "Select source branch"
+msgid "Select projects you want to import."
msgstr ""
+msgid "Select source branch"
+msgstr "ソースブランãƒã‚’é¸æŠž"
+
msgid "Select target branch"
msgstr "ターゲットブランãƒã‚’é¸æŠž"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr "メールをé€ä¿¡"
@@ -3973,9 +5584,15 @@ msgstr "9月"
msgid "Server version"
msgstr "サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr "サービス テンプレート"
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -3995,11 +5612,14 @@ msgid "Set requirements for a user to sign-in. Enable mandatory two-factor authe
msgstr ""
msgid "Set up CI/CD"
-msgstr "CI/CDを設定"
+msgstr "CI/CD を設定"
msgid "Set up Koding"
msgstr "Koding を設定"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "パスワードを設定"
@@ -4010,9 +5630,24 @@ msgid "Setup a specific Runner automatically"
msgstr ""
msgid "Share"
+msgstr "共有"
+
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
msgstr ""
msgid "Shared Runners"
+msgstr "共有 Runner"
+
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
msgstr ""
msgid "Show command"
@@ -4043,6 +5678,30 @@ msgstr[0] "%d ã®ã‚¤ãƒ™ãƒ³ãƒˆã‚’表示中"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr "æ•°å­—ã®ã¿ä½¿ç”¨ã§ãã¾ã™"
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr "シングルサインオンã§ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã™ã‚‹"
+
msgid "Sign out"
msgstr "サインアウト"
@@ -4050,10 +5709,13 @@ msgid "Sign-in restrictions"
msgstr ""
msgid "Sign-up restrictions"
-msgstr ""
+msgstr "サインアップã®åˆ¶é™"
msgid "Size and domain settings for static websites"
-msgstr ""
+msgstr "é™çš„ãªã‚¦ã‚§ãƒ–サイトã®ã‚µã‚¤ã‚ºã¨ãƒ‰ãƒ¡ã‚¤ãƒ³ã®è¨­å®š"
+
+msgid "Slack application"
+msgstr "Slack アプリケーション"
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4076,6 +5738,12 @@ msgstr "ボタンã®åˆ‡ã‚Šæ›¿ãˆä¸­ã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸ"
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4086,43 +5754,46 @@ msgid "Something went wrong while reopening the %{issuable}. Please try again la
msgstr ""
msgid "Something went wrong while resolving this discussion. Please try again."
-msgstr ""
+msgstr "ã“ã®æ¤œè¨Žã‚’解決ã—ã¦ã„ã‚‹ã¨ãã«å•é¡ŒãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ã‚‚ã†ä¸€åº¦ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„。"
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
-msgstr ""
+msgstr "アクセスレベル昇順"
msgid "SortOptions|Access level, descending"
-msgstr ""
+msgstr "アクセスレベルé™é †"
msgid "SortOptions|Created date"
-msgstr ""
+msgstr "作æˆæ—¥é †"
msgid "SortOptions|Due date"
-msgstr ""
+msgstr "期é™"
msgid "SortOptions|Due later"
-msgstr ""
+msgstr "期é™ã®é…ã„é †"
msgid "SortOptions|Due soon"
-msgstr ""
+msgstr "期é™ã®è¿‘ã„é †"
msgid "SortOptions|Label priority"
-msgstr ""
+msgstr "ラベルã®å„ªå…ˆåº¦é †"
msgid "SortOptions|Largest group"
-msgstr ""
+msgstr "グループã®å¤§ãã„é †"
msgid "SortOptions|Largest repository"
msgstr ""
msgid "SortOptions|Last created"
-msgstr ""
+msgstr "最新作æˆé †"
msgid "SortOptions|Last joined"
msgstr "æ–°ã—ãå‚加ã—ãŸé †"
@@ -4133,18 +5804,24 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr "人気順"
-msgid "SortOptions|Milestone"
+msgid "SortOptions|Less weight"
msgstr ""
+msgid "SortOptions|Milestone"
+msgstr "マイルストーン順"
+
msgid "SortOptions|Milestone due later"
msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
-msgid "SortOptions|Most popular"
+msgid "SortOptions|More weight"
msgstr ""
+msgid "SortOptions|Most popular"
+msgstr "人気順"
+
msgid "SortOptions|Name"
msgstr "åå‰"
@@ -4155,16 +5832,16 @@ msgid "SortOptions|Name, descending"
msgstr "åå‰ã€é™é †"
msgid "SortOptions|Oldest created"
-msgstr ""
+msgstr "å¤ã„é †"
msgid "SortOptions|Oldest joined"
-msgstr ""
+msgstr "å‚加ã—ãŸé †"
msgid "SortOptions|Oldest sign in"
-msgstr ""
+msgstr "サインイン順"
msgid "SortOptions|Oldest updated"
-msgstr ""
+msgstr "å¤ã„æ›´æ–°é †"
msgid "SortOptions|Popularity"
msgstr "人気順"
@@ -4173,7 +5850,7 @@ msgid "SortOptions|Priority"
msgstr ""
msgid "SortOptions|Recent sign in"
-msgstr ""
+msgstr "最近ã®ã‚µã‚¤ãƒ³ã‚¤ãƒ³é †"
msgid "SortOptions|Start later"
msgstr "å¤ã„é †"
@@ -4181,6 +5858,9 @@ msgstr "å¤ã„é †"
msgid "SortOptions|Start soon"
msgstr "æ–°ã—ã„é †"
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr "ソース"
@@ -4197,7 +5877,7 @@ msgid "Spam Logs"
msgstr "スパム ログ"
msgid "Spam and Anti-bot Protection"
-msgstr ""
+msgstr "スパムã¨ã‚¢ãƒ³ãƒãƒœãƒƒãƒˆä¿è­·"
msgid "Specific Runners"
msgstr ""
@@ -4209,19 +5889,19 @@ msgid "Squash commits"
msgstr ""
msgid "Stage"
-msgstr ""
+msgstr "ステージ"
msgid "Stage & Commit"
msgstr ""
msgid "Stage all changes"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®å¤‰æ›´ã‚’ステージã™ã‚‹"
msgid "Stage changes"
-msgstr ""
+msgstr "変更をステージã™ã‚‹"
msgid "Staged"
-msgstr ""
+msgstr "ステージ済"
msgid "Staged %{type}"
msgstr ""
@@ -4233,10 +5913,10 @@ msgid "StarProject|Star"
msgstr "スターを付ã‘ã‚‹"
msgid "Starred Projects"
-msgstr ""
+msgstr "スター付ãプロジェクト"
msgid "Starred Projects' Activity"
-msgstr ""
+msgstr "スター付ãプロジェクトã®æ´»å‹•"
msgid "Starred projects"
msgstr ""
@@ -4253,21 +5933,36 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
-msgid "Stop this environment"
+msgid "Stop impersonation"
msgstr ""
+msgid "Stop this environment"
+msgstr "ã“ã®ç’°å¢ƒã‚’åœæ­¢ã™ã‚‹"
+
msgid "Stopped"
msgstr "åœæ­¢ä¸­"
msgid "Storage"
msgstr "ストレージ"
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr "サブグループ"
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4280,12 +5975,24 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "ブランãƒãƒ»ã‚¿ã‚°åˆ‡ã‚Šæ›¿ãˆ"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
+msgstr "システムフック"
+
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
msgstr ""
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
-msgstr[0] "ã‚¿ã‚° (%{tag_count})"
+msgstr[0] "タグ(%{tag_count})"
msgid "Tags"
msgstr "ã‚¿ã‚°"
@@ -4318,10 +6025,10 @@ msgid "TagsPage|Edit release notes"
msgstr "リリースノートを編集"
msgid "TagsPage|Existing branch name, tag, or commit SHA"
-msgstr ""
+msgstr "æ—¢ã«å­˜åœ¨ã™ã‚‹ãƒ–ランãƒãƒ»ã‚¿ã‚°ãƒ»ã‚³ãƒŸãƒƒãƒˆãƒãƒƒã‚·ãƒ¥ã§ã™"
msgid "TagsPage|Filter by tag name"
-msgstr ""
+msgstr "ã‚¿ã‚°åã§çµžã‚Šè¾¼ã¿"
msgid "TagsPage|New Tag"
msgstr "æ–°ã—ã„ã‚¿ã‚°"
@@ -4366,7 +6073,7 @@ msgid "Target Branch"
msgstr "ターゲットブランãƒ"
msgid "Target branch"
-msgstr ""
+msgstr "ターゲットブランãƒ"
msgid "Team"
msgstr "ãƒãƒ¼ãƒ "
@@ -4380,10 +6087,19 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
-msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
+msgid "Thanks! Don't show me this again"
msgstr ""
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
+msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
+msgstr "課題トラッカーã¯ã€ãƒ—ロジェクトを改善ã—ãŸã‚Šè§£æ±ºã—ãŸã‚Šã™ã‚‹ãŸã‚ã«å¿…è¦ãªæƒ…報を追加ã™ã‚‹å ´æ‰€ã§ã™"
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
+msgstr "課題トラッカーã¯ã€ãƒ—ロジェクトを改善ã—ãŸã‚Šè§£æ±ºã—ãŸã‚Šã™ã‚‹ãŸã‚ã«å¿…è¦ãªæƒ…報を追加ã™ã‚‹å ´æ‰€ã§ã™ã€‚ã“ã®ãƒ—ロジェクトã«èª²é¡Œã‚’作æˆã™ã‚‹ãŸã‚ã«ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ç™»éŒ²ã¾ãŸã¯ã‚µã‚¤ãƒ³ã‚¤ãƒ³ã—ã¦ãã ã•ã„。"
+
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
msgstr ""
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
@@ -4392,6 +6108,9 @@ msgstr "コーディングステージã§ã¯ã€æœ€åˆã®ã‚³ãƒŸãƒƒãƒˆã‹ã‚‰ãƒžãƒ¼
msgid "The collection of events added to the data gathered for that stage."
msgstr "ã“ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã§è¨ˆæ¸¬ãƒ‡ãƒ¼ã‚¿ã«è¿½åŠ ã•ã‚ŒãŸã‚¤ãƒ™ãƒ³ãƒˆãƒªã‚¹ãƒˆ"
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "フォークã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒå‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚"
@@ -4405,9 +6124,12 @@ msgid "The maximum file size allowed is 200KB."
msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
+msgstr "GitLab ã«ã‚ˆã‚‹ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹è©¦è¡Œå›žæ•°"
+
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4419,6 +6141,9 @@ msgstr "開発ライフサイクルã®æ®µéšŽ"
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "計画ステージã§ã¯ã€èª²é¡Œã‚¹ãƒ†ãƒ¼ã‚¸ã«ç™»éŒ²ã•ã‚Œã¦ã‹ã‚‰ãƒ—ッシュã•ã‚ŒãŸæœ€åˆã®ã‚³ãƒŸãƒƒãƒˆæ™‚刻ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚最åˆã®ã‚³ãƒŸãƒƒãƒˆãŒãƒ—ッシュã•ã‚Œã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "プロダクションステージã§ã¯ã€èª²é¡ŒãŒä½œæˆã•ã‚Œã¦ã‹ã‚‰ãƒ—ロダクションã¸ãƒ‡ãƒ—ロイã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚アイディアã®æ™‚点ã‹ã‚‰ãƒ—ロダクションã¾ã§ã®å…¨ã‚¹ãƒ†ãƒ¼ã‚¸ãŒå®Œäº†ã—ãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
@@ -4428,11 +6153,14 @@ msgstr "プロジェクトã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã‚ã‚Œã°èª°ã§ã‚‚ã‚¢
msgid "The project can be accessed without any authentication."
msgstr "プロジェクトã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ãªã—ã«èª°ã§ã‚‚アクセスã§ãã¾ã™ã€‚"
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
-msgstr "ã“ã®ãƒ—ロジェクトã«ãƒªãƒã‚¸ãƒˆãƒªãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“。"
+msgstr "ã“ã®ãƒ—ロジェクトã«ãƒªãƒã‚¸ãƒˆãƒªã¯ã‚ã‚Šã¾ã›ã‚“。"
msgid "The repository for this project is empty"
-msgstr ""
+msgstr "ã“ã®ãƒ—ロジェクトã«ãƒªãƒã‚¸ãƒˆãƒªã¯ã‚ã‚Šã¾ã›ã‚“"
msgid "The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>."
msgstr ""
@@ -4440,6 +6168,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "レビューステージã¨ã¯ã€ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’作æˆã—ã¦ã‹ã‚‰ãƒžãƒ¼ã‚¸ã™ã‚‹ã¾ã§ã®æ™‚é–“ã§ã™ã€‚ã“ã®ãƒ‡ãƒ¼ã‚¿ã¯æœ€åˆã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒãƒžãƒ¼ã‚¸ã•ã‚ŒãŸã¨ãã«è‡ªå‹•çš„ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4455,47 +6186,47 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "ã“ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã«åŽé›†ã•ã‚ŒãŸãƒ‡ãƒ¼ã‚¿æ¯Žã®æ™‚é–“"
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
-msgstr "得られãŸä¸€é€£ã®ãƒ‡ãƒ¼ã‚¿ã‚’å°ã•ã„é †ã«ä¸¦ã¹ãŸã¨ãã«ä¸­å¤®ã«ä½ç½®ã™ã‚‹å€¤ã€‚例ãˆã°ã€3, 5, 9ã®ä¸­å¤®å€¤ã¯5。3, 5, 7, 8ã®ä¸­å¤®å€¤ã¯ (5+7)/2 = 6。"
+msgstr "得られãŸä¸€é€£ã®ãƒ‡ãƒ¼ã‚¿ã‚’å°ã•ã„é †ã«ä¸¦ã¹ãŸã¨ãã«ä¸­å¤®ã«ä½ç½®ã™ã‚‹å€¤ã€‚例ãˆã°ã€3, 5, 9 ã®ä¸­å¤®å€¤ã¯ 5。3, 5, 7, 8 ã®ä¸­å¤®å€¤ã¯ (5+7)/2 = 6。"
msgid "There are no issues to show"
-msgstr ""
+msgstr "表示ã™ã‚‹èª²é¡ŒãŒã‚ã‚Šã¾ã›ã‚“"
msgid "There are no labels yet"
msgstr ""
msgid "There are no merge requests to show"
-msgstr ""
+msgstr "表示ã™ã‚‹ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒã‚ã‚Šã¾ã›ã‚“"
msgid "There are problems accessing Git storage: "
msgstr "Git ストレージã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«å•é¡ŒãŒã‚ã‚Šã¾ã™: "
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
-msgstr ""
+msgstr "ユーザーã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ“ティカレンダーã®èª­ã¿è¾¼ã¿ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "There was an error saving your notification settings."
msgstr "通知設定をä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "There was an error subscribing to this label."
-msgstr ""
+msgstr "ラベルã®è³¼èª­ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "There was an error when reseting email token."
msgstr "メールトークンã®ãƒªã‚»ãƒƒãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "There was an error when subscribing to this label."
-msgstr ""
+msgstr "ラベルã®è³¼èª­ã™ã‚‹ã¨ãã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
msgid "There was an error when unsubscribing from this label."
msgstr ""
@@ -4503,15 +6234,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr "ディレクトリ"
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4528,7 +6277,7 @@ msgid "This issue is confidential and locked."
msgstr ""
msgid "This issue is locked."
-msgstr "ã“ã®èª²é¡Œã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™"
+msgstr "ã“ã®èª²é¡Œã¯ãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
msgstr ""
@@ -4537,7 +6286,7 @@ msgid "This job depends on upstream jobs that need to succeed in order for this
msgstr ""
msgid "This job does not have a trace."
-msgstr ""
+msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã«ã¯ãƒˆãƒ¬ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“。"
msgid "This job has been canceled"
msgstr "ã“ã®ã‚¸ãƒ§ãƒ–ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•ã‚Œã¾ã—ãŸ"
@@ -4570,7 +6319,7 @@ msgid "This page is unavailable because you are not allowed to read information
msgstr "複数ã®ãƒ—ロジェクト間ã§èª­ã¿è¾¼ã¿ãŒè¨±å¯ã•ã‚Œã¦ã„ãªã„ãŸã‚ã€ã“ã®ãƒšãƒ¼ã‚¸ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。"
msgid "This page will be removed in a future release."
-msgstr ""
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã¯ã€å°†æ¥ã®ãƒªãƒªãƒ¼ã‚¹ã§å‰Šé™¤ã•ã‚Œã‚‹äºˆå®šã§ã™ã€‚"
msgid "This project"
msgstr "プロジェクト"
@@ -4587,6 +6336,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "課題ãŒè¨ˆç”»ã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“"
@@ -4596,6 +6351,9 @@ msgstr "課題ã®å®Ÿè£…ãŒé–‹å§‹ã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“"
msgid "Time between merge request creation and merge/close"
msgstr "マージリクエストãŒä½œæˆã•ã‚Œã¦ã‹ã‚‰ãƒžãƒ¼ã‚¸ã¾ãŸã¯ã‚¯ãƒ­ãƒ¼ã‚ºã•ã‚Œã‚‹ã¾ã§ã®æ™‚é–“"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr "残り時間"
@@ -4760,12 +6518,30 @@ msgstr "秒"
msgid "Tip:"
msgstr "ヒント:"
+msgid "Title"
+msgstr "タイトル"
+
msgid "To GitLab"
-msgstr "GitLabã¸"
+msgstr "GitLab ã¸"
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4775,19 +6551,43 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr "Todo"
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
+msgstr "検討ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤ºã‚’切り替ãˆã‚‹"
+
+msgid "Toggle navigation"
msgstr ""
msgid "Toggle sidebar"
@@ -4802,6 +6602,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "åˆè¨ˆæ™‚é–“"
@@ -4811,9 +6614,18 @@ msgstr "ã™ã¹ã¦ã®ã‚³ãƒŸãƒƒãƒˆ/マージã®åˆè¨ˆãƒ†ã‚¹ãƒˆæ™‚é–“"
msgid "Total: %{total}"
msgstr "åˆè¨ˆ: %{total}"
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4821,31 +6633,43 @@ msgid "Triggers can force a specific branch or tag to get rebuilt with an API ca
msgstr ""
msgid "Try again"
+msgstr "å†è©¦è¡Œ"
+
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
msgstr ""
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
-msgid "Unlock"
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
msgstr ""
+msgid "Unknown"
+msgstr ""
+
+msgid "Unlock"
+msgstr "アンロック"
+
msgid "Unlocked"
msgstr ""
msgid "Unresolve discussion"
-msgstr ""
+msgstr "検討を未解決ã«ã™ã‚‹"
msgid "Unstage all changes"
-msgstr ""
+msgstr "ã™ã¹ã¦ã®å¤‰æ›´ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã‚’å–り消ã™"
msgid "Unstage changes"
-msgstr ""
+msgstr "ステージã—ãŸå¤‰æ›´ã‚’å–り消ã™"
msgid "Unstaged"
-msgstr ""
+msgstr "ステージをå–り消ã—"
msgid "Unstaged %{type}"
-msgstr ""
+msgstr "ステージをå–り消㗠%{type}"
msgid "Unstaged and staged %{type}"
msgstr ""
@@ -4866,13 +6690,30 @@ msgid "Unverified"
msgstr ""
msgid "Up to date"
-msgstr ""
+msgstr "最新"
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
+msgstr "グループåã€èª¬æ˜Žã€ã‚¢ãƒã‚¿ãƒ¼ã€ãã®ä»–ã®ä¸€èˆ¬è¨­å®šã‚’æ›´æ–°ã—ã¾ã™ã€‚"
+
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
msgstr ""
msgid "Upload New File"
@@ -4893,50 +6734,80 @@ msgstr "ã„ã„ã­"
msgid "Usage statistics"
msgstr "使用状æ³ã®çµ±è¨ˆ"
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "セットアップã®éš›ã«æ¬¡ã®ç™»éŒ²ãƒˆãƒ¼ã‚¯ãƒ³ã‚’使用ã—ã¦ãã ã•ã„:"
msgid "Use your global notification setting"
msgstr "全体通知設定を利用"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
+msgstr "ユーザーã¨IPレートã®åˆ¶é™"
+
+msgid "User map"
msgstr ""
msgid "Users"
-msgstr ""
+msgstr "ユーザー"
msgid "Variables"
-msgstr ""
+msgstr "変数"
msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want."
msgstr ""
msgid "Various container registry settings."
-msgstr ""
+msgstr "å„種コンテナレジストリã®è¨­å®šã€‚"
msgid "Various email settings."
-msgstr ""
+msgstr "å„種メール設定。"
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
+msgstr "検証済ã¿"
+
+msgid "View epics list"
msgstr ""
msgid "View file @ "
-msgstr ""
+msgstr "ファイルを表示 @ "
msgid "View group labels"
+msgstr "グループラベルを表示"
+
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
msgstr ""
msgid "View jobs"
msgstr ""
msgid "View labels"
-msgstr ""
+msgstr "ラベルを表示"
msgid "View log"
msgstr ""
@@ -4945,12 +6816,18 @@ msgid "View open merge request"
msgstr "オープンãªãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’表示"
msgid "View project labels"
-msgstr ""
+msgstr "プロジェクトラベルを表示"
msgid "View replaced file @ "
msgstr ""
msgid "Visibility and access controls"
+msgstr "å¯è¦–性ã¨ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡"
+
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
msgstr ""
msgid "VisibilityLevel|Internal"
@@ -4968,6 +6845,9 @@ msgstr "ä¸æ˜Ž"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "ã“ã®ãƒ‡ãƒ¼ã‚¿ã‚’å‚ç…§ã—ãŸã„ã§ã™ã‹ï¼Ÿã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ç®¡ç†è€…ã«å•ã„åˆã‚ã›ã¦ãã ã•ã„。"
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "データä¸è¶³ã®ãŸã‚ã€ã“ã®ã‚¹ãƒ†ãƒ¼ã‚¸ã®è¡¨ç¤ºã¯ã§ãã¾ã›ã‚“。"
@@ -4980,23 +6860,38 @@ msgstr "Web IDE"
msgid "Web terminal"
msgstr ""
-msgid "When a runner is locked, it cannot be assigned to other projects"
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
msgstr ""
+msgid "Weight %{weight}"
+msgstr ""
+
+msgid "When a runner is locked, it cannot be assigned to other projects"
+msgstr "Runner ãŒãƒ­ãƒƒã‚¯ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ä»–ã®ãƒ—ロジェクトã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
+
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr "Wiki"
msgid "WikiClone|Clone your wiki"
-msgstr "Wikiをクローン"
+msgstr "Wiki をクローン"
msgid "WikiClone|Git Access"
msgstr "Git アクセス"
msgid "WikiClone|Install Gollum"
-msgstr "Gollumをインストール"
+msgstr "Gollum をインストール"
msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:"
msgstr ""
@@ -5038,25 +6933,25 @@ msgid "WikiEmpty|You must be a project member in order to add wiki pages."
msgstr ""
msgid "WikiHistoricalPage|This is an old version of this page."
-msgstr ""
+msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã®å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ã€‚"
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
msgstr ""
msgid "WikiHistoricalPage|history"
-msgstr ""
+msgstr "履歴"
msgid "WikiHistoricalPage|most recent version"
-msgstr ""
+msgstr "最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
msgid "WikiMarkdownDocs|More examples are in the %{docs_link}"
-msgstr ""
+msgstr "ãã®ä»–ã®ä¾‹ã«ã¤ã„ã¦ã¯ã€%{docs_link} ã‚’å‚ç…§"
msgid "WikiMarkdownDocs|documentation"
-msgstr ""
+msgstr "ドキュメント"
msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}"
-msgstr ""
+msgstr "ページ(ã¾ãŸã¯æ–°è¦ãƒšãƒ¼ã‚¸) ã«ãƒªãƒ³ã‚¯ã™ã‚‹ã«ã¯ã€%{link_example} ã¨å…¥åŠ›ã™ã‚‹ã ã‘ã§ã™"
msgid "WikiNewPagePlaceholder|how-to-setup"
msgstr "セットアップ方法"
@@ -5071,10 +6966,10 @@ msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
msgstr "ã“ã®ãƒšãƒ¼ã‚¸ã‚’削除ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
msgid "WikiPageConfirmDelete|Delete page"
-msgstr ""
+msgstr "ページã®å‰Šé™¤"
msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
-msgstr ""
+msgstr "%{pageTitle} ページを削除ã—ã¾ã™ã‹ï¼Ÿ"
msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
msgstr ""
@@ -5116,17 +7011,29 @@ msgid "Wiki|Page version"
msgstr "ページã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³"
msgid "Wiki|Pages"
-msgstr ""
+msgstr "Pages"
msgid "Wiki|Wiki Pages"
msgstr "Wikiページ"
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "アクセスリクエストをå–り消ã™"
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "%{group_name} グループを削除ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ 削除ã•ã‚ŒãŸã‚°ãƒ«ãƒ¼ãƒ—ã¯çµ¶å¯¾ã«å…ƒã«æˆ»ã›ã¾ã›ã‚“ï¼æœ¬å½“ã«ã‚ˆã‚ã—ã„ã§ã™ã‹ï¼Ÿ"
@@ -5142,6 +7049,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5154,6 +7064,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5164,15 +7077,27 @@ msgid "You can only add files when you are on a branch"
msgstr "ファイルを追加ã™ã‚‹ã«ã¯ã€ã©ã“ã‹ã®ãƒ–ランãƒã«ã„ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
msgid "You can only edit files when you are on a branch"
-msgstr ""
+msgstr "ファイルを編集ã™ã‚‹ã«ã¯ã€ã©ã“ã‹ã®ãƒ–ランãƒã«ã„ãªã‘ã‚Œã°ã„ã‘ã¾ã›ã‚“"
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
+msgstr "割り当ã¦ã‚‰ã‚Œã¦ã„るマージリクエストã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
msgstr ""
msgid "You have no permissions"
@@ -5193,6 +7118,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "プロジェクトã«ã‚¹ã‚¿ãƒ¼ã‚’ã¤ã‘ãŸã„å ´åˆã¯ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "権é™ãŒå¿…è¦ã§ã™"
@@ -5215,15 +7146,24 @@ msgid "You won't be able to pull or push project code via %{protocol} until you
msgstr "%{set_password_link} ã§ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ãƒ‘スワードãŒã‚»ãƒƒãƒˆã•ã‚Œã¦ã„ãªã„ã®ã§ã€ãƒ—ロジェクト㫠%{protocol} ã§ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’プッシュã€ãƒ—ルã§ãã¾ã›ã‚“"
msgid "You won't be able to pull or push project code via SSH until you %{add_ssh_key_link} to your profile"
-msgstr "%{add_ssh_key_link} をプロファイルã«è¿½åŠ ã—ã¦ã„ãªã„ã®ã§ã€ãƒ—ロジェクトã«ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’プッシュã€ãƒ—ルã§ãã¾ã›ã‚“"
+msgstr ""
msgid "You won't be able to pull or push project code via SSH until you add an SSH key to your profile"
msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
+msgstr "有効ãªæ¯”較を行ã†ãŸã‚ã«ã¯ã€ç•°ãªã‚‹ãƒ–ランãƒåを使用ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
msgstr ""
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgstr "ã“ã®ãƒ¡ãƒ¼ãƒ«ã¯ %{host} ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå®›ã«é€ä¿¡ã•ã‚Œã¾ã—ãŸã€‚ %{manage_notifications_link}&middot;%{help_link}"
+
+msgid "YouTube"
msgstr ""
msgid "Your Groups"
@@ -5241,6 +7181,12 @@ msgstr "プロジェクトã®æ´»å‹•"
msgid "Your Todos"
msgstr "ã‚ãªãŸã®Todo"
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5248,7 +7194,7 @@ msgid "Your changes have been committed. Commit %{commitId} %{commitStats}"
msgstr ""
msgid "Your comment will not be visible to the public."
-msgstr ""
+msgstr "ã“ã®ã‚³ãƒ¡ãƒ³ãƒˆã¯ä¸€èˆ¬ã«ã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。"
msgid "Your groups"
msgstr "所属グループ"
@@ -5260,31 +7206,265 @@ msgid "Your projects"
msgstr "ã‚ãªãŸã®ãƒ—ロジェクト"
msgid "ago"
-msgstr ""
+msgstr "å‰"
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+
msgid "assign yourself"
msgstr "自分ã«å‰²ã‚Šå½“ã¦"
msgid "branch name"
msgstr "ブランãƒå"
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr "クラス"
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr "説明"
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr "ファイル"
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr "インスタンス"
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr "リンク"
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr "接続中"
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "æ—¥"
msgid "deploy token"
+msgstr "デプロイトークン"
+
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+
+msgid "detected no vulnerabilities"
msgstr ""
msgid "disabled"
+msgstr "無効"
+
+msgid "done"
msgstr ""
msgid "enabled"
@@ -5294,20 +7474,38 @@ msgid "estimateCommand|%{slash_command} will update the estimated time with the
msgstr ""
msgid "for this project"
+msgstr "ã“ã®ãƒ—ロジェクトã§ã¯"
+
+msgid "here"
+msgstr ""
+
+msgid "import flow"
msgstr ""
msgid "importing"
msgstr "インãƒãƒ¼ãƒˆä¸­"
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "マージリクエスト"
msgid "mrWidget| Please restore it or use a different %{missingBranchName} branch"
-msgstr ""
+msgstr "ブランãƒã‚’復元ã™ã‚‹ã‹ã€åˆ¥ã® %{missingBranchName} ブランãƒã‚’使用ã—ã¦ãã ã•ã„"
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage %{emphasisStart} decreased %{emphasisEnd} from %{memoryFrom}MB to %{memoryTo}MB"
msgstr ""
@@ -5318,12 +7516,27 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
-msgid "mrWidget|Cancel automatic merge"
+msgid "mrWidget|An error occured while removing your approval."
msgstr ""
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
+msgid "mrWidget|Cancel automatic merge"
+msgstr "自動マージã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«"
+
msgid "mrWidget|Check out branch"
msgstr "ブランãƒã®ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆ"
@@ -5346,7 +7559,7 @@ msgid "mrWidget|Closes"
msgstr ""
msgid "mrWidget|Create an issue to resolve them later"
-msgstr ""
+msgstr "ã‚ã¨ã§è§£æ±ºã™ã‚‹ãŸã‚ã«èª²é¡Œã‚’作æˆã™ã‚‹"
msgid "mrWidget|Deployment statistics are not available currently"
msgstr ""
@@ -5361,7 +7574,7 @@ msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the"
-msgstr ""
+msgstr "%{branch} ブランãƒãŒãƒ­ãƒ¼ã‚«ãƒ«ãƒªãƒã‚¸ãƒˆãƒªã«å­˜åœ¨ã™ã‚‹å ´åˆã¯ã€ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’手動ã§ãƒžãƒ¼ã‚¸ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -5370,7 +7583,7 @@ msgid "mrWidget|Loading deployment statistics"
msgstr ""
msgid "mrWidget|Mentions"
-msgstr ""
+msgstr "メンション"
msgid "mrWidget|Merge"
msgstr "マージ"
@@ -5381,20 +7594,35 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
+msgstr "マージ作業者"
+
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
msgstr ""
msgid "mrWidget|Plain diff"
msgstr ""
msgid "mrWidget|Refresh"
-msgstr ""
+msgstr "æ›´æ–°"
msgid "mrWidget|Refresh now"
msgstr "ã™ãã«æ›´æ–°"
msgid "mrWidget|Refreshing now"
-msgstr ""
+msgstr "更新中"
msgid "mrWidget|Remove Source Branch"
msgstr ""
@@ -5402,20 +7630,23 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr "ソースブランãƒã‚’削除ã™ã‚‹"
-msgid "mrWidget|Request to merge"
+msgid "mrWidget|Remove your approval"
msgstr ""
+msgid "mrWidget|Request to merge"
+msgstr "マージをリクエスト"
+
msgid "mrWidget|Resolve conflicts"
msgstr "競åˆã‚’解決ã™ã‚‹"
msgid "mrWidget|Revert"
-msgstr ""
+msgstr "リãƒãƒ¼ãƒˆ"
msgid "mrWidget|Revert this merge request in a new merge request"
-msgstr ""
+msgstr "æ–°ã—ã„マージリクエストã§ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’リãƒãƒ¼ãƒˆã™ã‚‹"
msgid "mrWidget|Set by"
-msgstr ""
+msgstr "設定者"
msgid "mrWidget|The changes were merged into"
msgstr ""
@@ -5442,19 +7673,16 @@ msgid "mrWidget|There are merge conflicts"
msgstr ""
msgid "mrWidget|There are unresolved discussions. Please resolve these discussions"
-msgstr ""
+msgstr "未解決ã®æ¤œè¨ŽãŒã‚ã‚Šã¾ã™ã€‚ã“れらã®æ¤œè¨Žã‚’解決ã—ã¦ãã ã•ã„。"
msgid "mrWidget|This merge request failed to be merged automatically"
msgstr ""
msgid "mrWidget|This merge request is in the process of being merged"
-msgstr ""
+msgstr "ã“ã®ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ãƒžãƒ¼ã‚¸å®Ÿè¡Œä¸­ã§ã™"
msgid "mrWidget|This project is archived, write access has been disabled"
-msgstr ""
-
-msgid "mrWidget|Web IDE"
-msgstr "Web IDE"
+msgstr "ã“ã®ãƒ—ロジェクトã¯ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã€æ›¸ãè¾¼ã¿ã¯ç„¡åŠ¹ã§ã™ã€‚"
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5472,7 +7700,7 @@ msgid "mrWidget|into"
msgstr ""
msgid "mrWidget|to be merged automatically when the pipeline succeeds"
-msgstr ""
+msgstr "パイプラインãŒæˆåŠŸã—ãŸã¨ãã¯è‡ªå‹•çš„ã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã™"
msgid "new merge request"
msgstr "æ–°è¦ãƒžãƒ¼ã‚¸ãƒªã‚¯ã‚¨ã‚¹ãƒˆ"
@@ -5493,27 +7721,42 @@ msgstr "パスワード"
msgid "personal access token"
msgstr "個人ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒˆãƒ¼ã‚¯ãƒ³"
-msgid "remaining"
+msgid "private key does not match certificate."
msgstr ""
+msgid "remaining"
+msgstr "残り"
+
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr "ソース"
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr "ã“ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ"
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr "ユーザーå"
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/ko/gitlab.po b/locale/ko/gitlab.po
index 87195cc72e3..36a0d3179b2 100644
--- a/locale/ko/gitlab.po
+++ b/locale/ko/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
@@ -15,10 +13,22 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 12:38\n"
+
+msgid " and"
+msgstr " 그리고"
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] " %d í¬ì¸íŠ¸ 저하"
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] " %d í¬ì¸íŠ¸ í–¥ìƒ"
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
+msgstr[0] "ë³€ê²½ëœ íŒŒì¼ %dê°œ"
msgid "%d commit"
msgid_plural "%d commits"
@@ -26,67 +36,81 @@ msgstr[0] "%d 커밋"
msgid "%d commit behind"
msgid_plural "%d commits behind"
-msgstr[0] ""
+msgstr[0] "%d 커밋 behind"
msgid "%d exporter"
msgid_plural "%d exporters"
-msgstr[0] ""
+msgstr[0] "%d 내보내기"
msgid "%d issue"
msgid_plural "%d issues"
-msgstr[0] ""
+msgstr[0] "%d ì´ìŠˆ"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] ""
+msgstr[0] "%d ë ˆì´ì–´"
msgid "%d merge request"
msgid_plural "%d merge requests"
-msgstr[0] ""
+msgstr[0] "머지 리퀘스트(MR) %d개"
msgid "%d metric"
msgid_plural "%d metrics"
-msgstr[0] ""
+msgstr[0] "%d 측정치"
+
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] "%dê°œì˜ìƒˆ ë¼ì´ì„ ìŠ¤"
msgid "%d staged change"
msgid_plural "%d staged changes"
-msgstr[0] ""
+msgstr[0] "%dê°œì˜ ìŠ¤í…Œì´ì§•ëœ 변경사항"
msgid "%d unstaged change"
msgid_plural "%d unstaged changes"
-msgstr[0] ""
+msgstr[0] "%dê°œì˜ ìŠ¤í…Œì´ì§•ë˜ì§€ ì•Šì€ ë³€ê²½ì‚¬í•­"
+
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] "ì·¨ì•½ì  %dê°œ"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s 추가 ì»¤ë°‹ì€ ì„±ëŠ¥ ì´ìŠˆë¥¼ 방지하기 위해 ìƒëžµë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "%{actionText} & %{openOrClose} %{noteable}"
-msgstr ""
+msgstr "%{actionText} & %{openOrClose} %{noteable}"
msgid "%{commit_author_link} authored %{commit_timeago}"
+msgstr "%{commit_timeago} ì— %{commit_author_link} ë‹˜ì´ ì»¤ë°‹í•˜ì˜€ìŠµë‹ˆë‹¤."
+
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
msgstr ""
msgid "%{count} participant"
msgid_plural "%{count} participants"
-msgstr[0] ""
+msgstr[0] "%{count} ëª…ì˜ ì°¸ì—¬ìž"
msgid "%{filePath} deleted"
-msgstr ""
+msgstr "%{filePath} ì‚­ì œë¨"
msgid "%{group_docs_link_start}Groups%{group_docs_link_end} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
-msgstr ""
+msgstr "%{group_docs_link_start}그룹%{group_docs_link_end}ì„ ì‚¬ìš©í•˜ë©´ 여러 프로ì íŠ¸ë¥¼ 관리하고 ê³µë™ ìž‘ì—…ì„ ìˆ˜í–‰ í•  수 있습니다. 그룹 회ì›ì€ 모든 프로ì íŠ¸ì— 액세스 í•  수 있습니다."
msgid "%{loadingIcon} Started"
-msgstr ""
+msgstr "%{loadingIcon} 시작ë¨"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
-msgstr ""
+msgstr "%{lock_path} 경로는 GitLab User %{lock_user_id} ì— ì˜í•´ 잠겼습니다."
+
+msgid "%{name}'s avatar"
+msgstr "%{name} ì˜ ì•„ë°”íƒ€"
msgid "%{nip_domain} can be used as an alternative to a custom domain."
-msgstr ""
+msgstr "%{nip_domain} ì€ ì»¤ìŠ¤í…€ ë„ë©”ì¸ ëŒ€ì‹  사용할 수 있습니다."
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
-msgstr ""
+msgstr "%{default_branch} 로부터 %{number_commits_behind} commits behind, %{number_commits_ahead} commits ahead"
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt."
msgstr "%{number_of_failures} / %{maximum_failures} 실패. GitLab ì€ ë‹¤ìŒ ì‹œë„ì—ì„œ 성공하면 ì ‘ê·¼ì„ í—ˆìš©í•  것입니다."
@@ -95,66 +119,71 @@ msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not re
msgstr "%{number_of_failures} / %{maximum_failures} 실패. GitLab ì€ ìžë™ìœ¼ë¡œ 다시 ì‹œë„하지 않습니다. 문제가 í•´ê²°ë˜ë©´ 저장 공간 정보를 초기화 해주세요. "
msgid "%{openOrClose} %{noteable}"
-msgstr ""
+msgstr "%{openOrClose} %{noteable}"
msgid "%{percent}%% complete"
-msgstr ""
+msgstr "%{percent}%% 완료"
msgid "%{storage_name}: failed storage access attempt on host:"
msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:"
+msgstr[0] "%{storage_name}: í˜¸ìŠ¤íŠ¸ì˜ storage ì ‘ê·¼ì— ì‹¤íŒ¨ %{failed_attempts} 회"
+
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
msgstr[0] ""
msgid "%{text} is available"
-msgstr ""
+msgstr "%{text} 사용 가능"
msgid "%{title} changes"
-msgstr ""
+msgstr "%{title} 변경"
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] "%{type} ì—ì„œ ì·¨ì•½ì  %{vulnerabilityCount} 개를 찾았습니다"
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "설치 ë°©ë²•ì— ëŒ€í•œ 정보를 얻기 위해 %{link} 를 ì²´í¬ì•„웃하세요."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
+msgstr "%{unstaged} ê±´ì´ ìŠ¤í…Œì´ì§•ë˜ì§€ 않았고, %{staged} ê±´ì´ ìŠ¤í…Œì´ì§• ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "+ %{moreCount} more"
-msgstr ""
+msgstr "+ %{moreCount} ë”"
msgid "- Runner is active and can process any new jobs"
-msgstr ""
+msgstr "- Runner ê°€ 활성화ë˜ì—ˆê³ , 새로운 ìž‘ì—…ì„ ì²˜ë¦¬í•  수 있습니다."
msgid "- Runner is paused and will not receive any new jobs"
-msgstr ""
+msgstr "- Runner ê°€ ì¼ì‹œì •ì§€ ë˜ì–´ 새로운 ìž‘ì—…ì„ ë°›ì„ ìˆ˜ 없습니다."
msgid "- show less"
-msgstr ""
+msgstr "-ëœ ë³´ê¸°"
msgid "1 %{type} addition"
msgid_plural "%{count} %{type} additions"
-msgstr[0] ""
+msgstr[0] "%{count} %{type} ê°œì˜ ì¶”ê°€ ì •ë³´"
msgid "1 %{type} modification"
msgid_plural "%{count} %{type} modifications"
-msgstr[0] ""
+msgstr[0] "%{count} ê°œ %{type} ì˜ ìˆ˜ì •ì‚¬í•­"
msgid "1 closed issue"
msgid_plural "%d closed issues"
-msgstr[0] ""
+msgstr[0] "%d ê°œì˜ ì´ìŠˆ closed"
msgid "1 closed merge request"
msgid_plural "%d closed merge requests"
-msgstr[0] ""
+msgstr[0] "%dê±´ì˜ ë¨¸ì§€ë¦¬í€˜ìŠ¤íŠ¸ 닫힘"
msgid "1 merged merge request"
msgid_plural "%d merged merge requests"
-msgstr[0] ""
+msgstr[0] "%dê±´ì˜ ë¨¸ì§€ë¦¬í€˜ìŠ¤íŠ¸ 머지ë¨"
msgid "1 open issue"
msgid_plural "%d open issues"
-msgstr[0] ""
+msgstr[0] "%dê°œì˜ ì˜¤í”ˆëœ ì´ìŠˆ"
msgid "1 open merge request"
msgid_plural "%d open merge requests"
-msgstr[0] ""
+msgstr[0] "%dê°œì˜ ì˜¤í”ˆëœ ë¨¸ì§€ 리퀘스트(MR)"
msgid "1 pipeline"
msgid_plural "%d pipelines"
@@ -164,28 +193,52 @@ msgid "1st contribution!"
msgstr ""
msgid "2FA enabled"
-msgstr ""
+msgstr "2FA 사용"
msgid "403|Please contact your GitLab administrator to get the permission."
-msgstr ""
+msgstr "403|ê¶Œí•œì„ ì–»ìœ¼ë ¤ë©´ GitLab 관리ìžì—게 문ì˜í•˜ì‹­ì‹œì˜¤."
msgid "403|You don't have the permission to access this page."
-msgstr ""
+msgstr "403|ì´ íŽ˜ì´ì§€ì— 대한 액세스 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤."
msgid "404|Make sure the address is correct and the page hasn't moved."
-msgstr ""
+msgstr "404|주소가 정확하고 페ì´ì§€ê°€ ì´ë™í•˜ì§€ 않았는지 확ì¸í•˜ì‹­ì‹œì˜¤."
msgid "404|Page Not Found"
-msgstr ""
+msgstr "404|페ì´ì§€ë¥¼ ì°¾ì„ ìˆ˜ 없습니다"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
+msgstr "404|ì´ê²ƒì´ ì‹¤ìˆ˜ì— ì˜í•œ 것ì´ë¼ê³  ìƒê°í•œë‹¤ë©´ GitLab 관리ìžì—게 문ì˜í•˜ì„¸ìš”."
+
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
msgstr ""
msgid "<strong>Removes</strong> source branch"
msgstr ""
msgid "A 'Runner' is a process which runs a job. You can setup as many Runners as you need."
-msgstr ""
+msgstr "'러너(Runner)'는 ìž‘ì—…ì„ ì‹¤í–‰í•˜ëŠ” 프로세스입니다. 필요한 ë§Œí¼ ëŸ¬ë„ˆë¥¼ ì…‹ì—…í•  수 있습니다."
msgid "A collection of graphs regarding Continuous Integration"
msgstr "지ì†ì ì¸ í†µí•©ì— ê´€í•œ 그래프 모ìŒ"
@@ -202,19 +255,37 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "ìžë™ ë°°í¬ ì •ë³´"
-msgid "Abuse Reports"
+msgid "About this feature"
msgstr ""
+msgid "Abuse Reports"
+msgstr "오남용 리í¬íŠ¸"
+
msgid "Abuse reports"
msgstr ""
msgid "Accept terms"
+msgstr "약관ë™ì˜"
+
+msgid "Accepted MR"
msgstr ""
msgid "Access Tokens"
+msgstr "액세스 토í°"
+
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
msgstr ""
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
@@ -224,7 +295,7 @@ msgid "Access your runner token, customize your pipeline configuration, and view
msgstr ""
msgid "Account"
-msgstr ""
+msgstr "계정"
msgid "Account and limit"
msgstr ""
@@ -233,17 +304,23 @@ msgid "Active"
msgstr "활성"
msgid "Active Sessions"
-msgstr ""
+msgstr "í™œì„±í™”ëœ ì„¸ì…˜"
msgid "Activity"
msgstr "활ë™"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "변경 로그 추가"
msgid "Add Contribution guide"
msgstr "기여 ê°€ì´ë“œ 추가"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -253,6 +330,12 @@ msgstr "ë¼ì´ì„ ìŠ¤ 추가"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "새 디렉토리 추가"
@@ -262,6 +345,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -278,7 +379,7 @@ msgid "AdminArea|You’re about to stop all jobs.This will halt all current jobs
msgstr ""
msgid "AdminHealthPageLink|health page"
-msgstr ""
+msgstr "ìƒíƒœ 페ì´ì§€"
msgid "AdminProjects|Delete"
msgstr ""
@@ -314,10 +415,10 @@ msgid "AdminUsers|To confirm, type %{username}"
msgstr ""
msgid "Advanced"
-msgstr ""
+msgstr "고급"
msgid "Advanced settings"
-msgstr ""
+msgstr "고급 설정"
msgid "All"
msgstr "ì „ì²´"
@@ -329,7 +430,7 @@ msgid "All features are enabled for blank projects, from templates, or when impo
msgstr ""
msgid "Allow commits from members who can merge to the target branch."
-msgstr ""
+msgstr "ëŒ€ìƒ ë¸Œëžœì¹˜ì— ë¨¸ì§€í•  수 있는 ë©¤ë²„ì˜ ì»¤ë°‹ì„ í—ˆìš©í•©ë‹ˆë‹¤."
msgid "Allow public access to pipelines and job details, including output logs and artifacts"
msgstr ""
@@ -343,12 +444,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -367,18 +495,30 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
-msgid "An error occurred while dismissing the alert. Refresh the page and try again."
+msgid "An error occurred when updating the issue weight"
msgstr ""
-msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
msgstr ""
+msgid "An error occurred while dismissing the alert. Refresh the page and try again."
+msgstr "Alertì„ í•´ì œí•˜ëŠ” 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 페ì´ì§€ë¥¼ 새로 고친 후 다시 ì‹œë„하십시오."
+
+msgid "An error occurred while dismissing the feature highlight. Refresh the page and try dismissing again."
+msgstr "기능 ê°•ì¡° 표시를 해제하는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 페ì´ì§€ë¥¼ 새로고침하고, 다시 ì‹œë„해주세요."
+
msgid "An error occurred while fetching markdown preview"
msgstr ""
@@ -394,7 +534,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -409,6 +552,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -416,26 +562,56 @@ msgid "An error occurred while rendering preview broadcast message"
msgstr ""
msgid "An error occurred while retrieving calendar activity"
-msgstr ""
+msgstr "ìº˜ë¦°ë” í™œë™ì„ 가져오는 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
+msgstr "오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„í•´ 주세요."
+
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
msgstr ""
msgid "Appearance"
msgstr ""
-msgid "Applications"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
msgstr ""
+msgid "Application: %{name}"
+msgstr ""
+
+msgid "Applications"
+msgstr "어플리케ì´ì…˜"
+
msgid "Apr"
msgstr ""
@@ -448,6 +624,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "ì´ íŒŒì´í”„ë¼ì¸ ìŠ¤ì¼€ì¥´ì„ ì‚­ì œ 하시겠습니까?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -457,13 +639,22 @@ msgstr "ë“±ë¡ í† í°ì„ 초기화 하시겠습니까?"
msgid "Are you sure you want to reset the health check token?"
msgstr "헬스 ì²´í¬ í† í°ì„ 초기화 하시겠습니까?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr "확실합니까?"
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
+msgstr "그룹 관리ìžì—게 그룹 Runner 를 설정하ë„ë¡ ìš”ì²­í•˜ì„¸ìš”"
+
+msgid "Assertion consumer service URL"
msgstr ""
msgid "Assign custom color like #FF0000"
@@ -493,12 +684,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
-msgid "Assignee(s)"
+msgid "Assignee boards not available with your current license"
msgstr ""
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
+msgid "Assignee(s)"
+msgstr "담당ìž"
+
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "드래그 &amp; 드롭 ë˜ëŠ” %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -508,44 +708,68 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
msgid "Auto DevOps, runners and job artifacts"
-msgstr ""
+msgstr "ìžë™ DevOps, Runner ìž‘ì—… artifacts"
msgid "Auto Review Apps and Auto Deploy need a %{kubernetes} to work correctly."
-msgstr ""
+msgstr "Auto Review Apps 와 Auto Deploy ê°€ ì •ìƒ ë™ìž‘하기 위해서는 %{kubernetes} ê°€ 필요합니다."
msgid "Auto Review Apps and Auto Deploy need a domain name and a %{kubernetes} to work correctly."
-msgstr ""
+msgstr "Auto Review Apps 와 Auto Deploy ê°€ ì •ìƒ ë™ìž‘하기 위해서는 ë„ë©”ì¸ ë„¤ìž„ê³¼ %{kubernetes} ê°€ 필요합니다."
msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
-msgstr ""
+msgstr "Auto Review Apps 와 Auto Deploy ê°€ ì •ìƒ ë™ìž‘하기 위해서는 ë„ë©”ì¸ ë„¤ìž„ì´ í•„ìš”í•©ë‹ˆë‹¤."
msgid "Auto-cancel redundant, pending pipelines"
msgstr ""
msgid "AutoDevOps|Auto DevOps"
-msgstr ""
+msgstr "Auto DevOps|Auto DevOps"
msgid "AutoDevOps|Auto DevOps documentation"
-msgstr ""
+msgstr "Auto DevOps 문서"
msgid "AutoDevOps|Enable in settings"
-msgstr ""
+msgstr "활성화하기"
msgid "AutoDevOps|It will automatically build, test, and deploy your application based on a predefined CI/CD configuration."
-msgstr ""
+msgstr "애플리케ì´ì…˜ì˜ 빌드, 테스트, ë°°í¬ê°€ ì‚¬ì „ì— ì •ì˜ëœ CI/CD ì„¤ì •ì— ë”°ë¼ ìžë™ìœ¼ë¡œ 수행ë©ë‹ˆë‹¤."
msgid "AutoDevOps|Learn more in the %{link_to_documentation}"
-msgstr ""
+msgstr "ë” ì•Œì•„ë³´ê¸° %{link_to_documentation}"
msgid "AutoDevOps|You can automatically build and test your application if you %{link_to_auto_devops_settings} for this project. You can automatically deploy it as well, if you %{link_to_add_kubernetes_cluster}."
msgstr ""
@@ -554,16 +778,16 @@ msgid "AutoDevOps|add a Kubernetes cluster"
msgstr ""
msgid "AutoDevOps|enable Auto DevOps"
-msgstr ""
+msgstr "AutoDevOps | Auto DevOps 활성화"
msgid "Available"
msgstr ""
msgid "Available group Runners : %{runners}"
-msgstr ""
+msgstr "사용 가능한 그룹 Runner: %{runners}"
msgid "Available group Runners : %{runners}."
-msgstr ""
+msgstr "사용 가능한 그룹 Runner: %{runners}."
msgid "Avatar will be removed. Are you sure?"
msgstr ""
@@ -571,6 +795,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -652,6 +882,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -770,19 +1075,28 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
-msgid "Branches|The default branch cannot be deleted"
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
msgstr ""
+msgid "Branches|The default branch cannot be deleted"
+msgstr "Default 브랜치는 삭제할 수 없습니다."
+
msgid "Branches|This branch hasn’t been merged into %{default_branch}."
-msgstr ""
+msgstr "ì´ ë¸Œëžœì¹˜ëŠ” %{default_branch} ë¡œ 병합ë˜ì§€ 않았습니다."
msgid "Branches|To avoid data loss, consider merging this branch before deleting it."
-msgstr ""
+msgstr "ë°ì´í„° ì†ì‹¤ì„ 방지 하려면 삭제하기 ì „ì— ì´ ë¸Œëžœì¹˜ë¥¼ 머지하는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤."
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
+msgstr "확ì¸í•˜ë ¤ë©´, %{branch_name_confirmation} 를 ìž…ë ¥ 합니다."
+
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
msgstr ""
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
+msgstr "ë‹¹ì‹ ì€ ë³´í˜¸ëœ %{branch_name} 브랜치를 삭제하려고 합니다."
+
+msgid "Branches|diverged from upstream"
msgstr ""
msgid "Branches|merged"
@@ -806,29 +1120,38 @@ msgstr "íŒŒì¼ ì°¾ì•„ë³´ê¸°"
msgid "Browse files"
msgstr "íŒŒì¼ ì°¾ì•„ë³´ê¸°"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "작성ìž"
msgid "CI / CD"
-msgstr ""
+msgstr "CI / CD"
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
-msgid "CI/CD settings"
+msgid "CI/CD for external repo"
msgstr ""
+msgid "CI/CD settings"
+msgstr "CI/CD 설정"
+
msgid "CICD|An explicit %{ci_file} needs to be specified before you can begin using Continuous Integration and Delivery."
-msgstr ""
+msgstr "CICD|Continuous Integration ê³¼ Delivery 를 사용하기 위해서는 %{ci_file} ì´ ë°˜ë“œì‹œ 명시ë˜ì–´ì•¼ 합니다."
msgid "CICD|Auto DevOps"
-msgstr ""
+msgstr "CICD|Auto DevOps"
msgid "CICD|Auto DevOps will automatically build, test, and deploy your application based on a predefined Continuous Integration and Delivery configuration."
-msgstr ""
+msgstr "CICD|Auto DevOps는 ì‚¬ì „ì— ì •ì˜ëœ Continuous Integrationê³¼ Delivery ì„¤ì •ì„ ë°”íƒ•ìœ¼ë¡œí•˜ì—¬ ìžë™ìœ¼ë¡œ 빌드, 테스트 그리고 ë°°í¬ë¥¼ 수행합니다."
msgid "CICD|Automatic deployment to staging, manual deployment to production"
msgstr ""
@@ -843,29 +1166,38 @@ msgid "CICD|Deployment strategy needs a domain name to work correctly."
msgstr ""
msgid "CICD|Disable Auto DevOps"
+msgstr "CICD|Auto DevOps 비활성화"
+
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
msgstr ""
msgid "CICD|Enable Auto DevOps"
-msgstr ""
+msgstr "CICD|Auto DevOps 활성화"
msgid "CICD|Follow the instance default to either have Auto DevOps enabled or disabled when there is no project specific %{ci_file}."
-msgstr ""
+msgstr "CICD|프로ì íŠ¸ì— %{ci_file} 파ì¼ì´ ì •ì˜ë˜ì–´ìžˆì§€ 않다면, Auto DevOps ê°€ 활성화 í˜¹ì€ ë¹„í™œì„±í™” ë  ìˆ˜ 있ë„ë¡ ì¸ìŠ¤í„´ìŠ¤ ê¸°ë³¸ê°’ì„ ë”°ë¥´ì„¸ìš”."
msgid "CICD|Instance default (%{state})"
-msgstr ""
+msgstr "CICD|ì¸ìŠ¤í„´ìŠ¤ 기본값 (%{state})"
msgid "CICD|Jobs"
msgstr ""
msgid "CICD|Learn more about Auto DevOps"
-msgstr ""
+msgstr "CICD|Auto DevOpsì— ëŒ€í•´ ë” ì•Œì•„ë³´ê¸°"
msgid "CICD|The Auto DevOps pipeline configuration will be used when there is no %{ci_file} in the project."
-msgstr ""
+msgstr "CICD|프로ì íŠ¸ ë‚´ì— %{ci_file} 파ì¼ì´ 존재하지 않으면, Auto DevOps 파ì´í”„ë¼ì¸ ì„¤ì •ì´ ì‚¬ìš©ë©ë‹ˆë‹¤."
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -881,6 +1213,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -897,19 +1235,19 @@ msgid "ChangeTypeAction|Revert"
msgstr "Revert"
msgid "ChangeTypeAction|This will create a new commit in order to revert the existing changes."
-msgstr ""
+msgstr "기존 변경 ì‚¬í•­ì„ ë˜ëŒë¦¬ê¸° 위해 새로운 ì»¤ë°‹ì„ ë§Œë“­ë‹ˆë‹¤."
msgid "Changelog"
msgstr "변경사항"
msgid "Changes are shown as if the <b>source</b> revision was being merged into the <b>target</b> revision."
-msgstr ""
+msgstr "변경 ì‚¬í•­ì€ <b>source</b> ë¦¬ë¹„ì „ì´ <b>target</b> ë¦¬ë¹„ì „ì— ë¨¸ì§€ëœ ê²ƒì²˜ëŸ¼ 표시ë©ë‹ˆë‹¤."
msgid "Charts"
msgstr "차트"
msgid "Chat"
-msgstr ""
+msgstr "채팅"
msgid "Check interval"
msgstr ""
@@ -924,7 +1262,13 @@ msgid "Cherry-pick this commit"
msgstr "ì´ ì»¤ë°‹ì„ Cherry-pick"
msgid "Cherry-pick this merge request"
-msgstr "ì´ ë¨¸ì§€ 리퀘스트를 Cherry-pick"
+msgstr "ì´ ë¨¸ì§€ 리퀘스트(MR)를 Cherry-pick"
+
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
msgid "Choose File ..."
msgstr ""
@@ -941,9 +1285,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "취소ë¨"
@@ -999,44 +1355,62 @@ msgid "CiStatus|running"
msgstr "실행 중"
msgid "CiVariables|Input variable key"
-msgstr ""
+msgstr "입력 변수 키"
msgid "CiVariables|Input variable value"
-msgstr ""
+msgstr "입력 변수 값"
msgid "CiVariables|Remove variable row"
-msgstr ""
+msgstr "변수 행 제거"
msgid "CiVariable|* (All environments)"
-msgstr ""
+msgstr "* (모든 환경)"
msgid "CiVariable|All environments"
+msgstr "모든 환경"
+
+msgid "CiVariable|Create wildcard"
msgstr ""
msgid "CiVariable|Error occured while saving variables"
+msgstr "CiVariable 변수를 저장 하는 중 오류가 ë°œìƒ í–ˆìŠµë‹ˆë‹¤."
+
+msgid "CiVariable|New environment"
msgstr ""
msgid "CiVariable|Protected"
+msgstr "보호ë¨"
+
+msgid "CiVariable|Search environments"
msgstr ""
msgid "CiVariable|Toggle protected"
-msgstr ""
+msgstr "Toggle 보호ë¨"
msgid "CiVariable|Validation failed"
-msgstr ""
+msgstr "유효성 검사 실패"
msgid "CircuitBreakerApiLink|circuitbreaker api"
+msgstr "circuitbreaker api"
+
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
msgstr ""
msgid "Clear search input"
-msgstr ""
+msgstr "검색 입력 지우기"
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1044,6 +1418,18 @@ msgid "Click to expand it."
msgstr ""
msgid "Click to expand text"
+msgstr "í…스트를 í´ë¦­í•˜ì—¬ 확장하세요."
+
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
msgstr ""
msgid "Clone repository"
@@ -1052,6 +1438,12 @@ msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1061,9 +1453,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1085,9 +1474,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1115,23 +1501,14 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ì˜ 세부 ì •ë³´ ìž…ë ¥"
msgid "ClusterIntegration|Environment scope"
-msgstr ""
+msgstr "환경 범위"
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
msgstr ""
@@ -1149,7 +1526,7 @@ msgid "ClusterIntegration|GitLab Integration"
msgstr ""
msgid "ClusterIntegration|GitLab Runner"
-msgstr ""
+msgstr "ClusterIntegration|GitLab Runner"
msgid "ClusterIntegration|Google Cloud Platform project"
msgstr ""
@@ -1161,6 +1538,15 @@ msgid "ClusterIntegration|Google Kubernetes Engine project"
msgstr ""
msgid "ClusterIntegration|Helm Tiller"
+msgstr "Helm Tiller"
+
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
msgstr ""
msgid "ClusterIntegration|Ingress"
@@ -1172,6 +1558,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1179,7 +1568,7 @@ msgid "ClusterIntegration|Installing"
msgstr ""
msgid "ClusterIntegration|Integrate Kubernetes cluster automation"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ìžë™í™” 통합"
msgid "ClusterIntegration|Integration status"
msgstr ""
@@ -1191,25 +1580,28 @@ msgid "ClusterIntegration|JupyterHub"
msgstr ""
msgid "ClusterIntegration|Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°"
msgid "ClusterIntegration|Kubernetes cluster details"
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ìƒì„¸"
+
+msgid "ClusterIntegration|Kubernetes cluster health"
msgstr ""
msgid "ClusterIntegration|Kubernetes cluster integration"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 통합"
msgid "ClusterIntegration|Kubernetes cluster integration is disabled for this project."
-msgstr ""
+msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해 Kubernetes í´ëŸ¬ìŠ¤í„° í†µí•©ì´ ë¹„í™œì„±í™”ë˜ì–´ìžˆìŠµë‹ˆë‹¤."
msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project."
-msgstr ""
+msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해 Kubernetes í´ëŸ¬ìŠ¤í„° í†µí•©ì´ í™œì„±í™”ë˜ì–´ìžˆìŠµë‹ˆë‹¤."
msgid "ClusterIntegration|Kubernetes cluster integration is enabled for this project. Disabling this integration will not affect your Kubernetes cluster, it will only temporarily turn off GitLab's connection to it."
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° í†µí•©ì´ í™œì„±í™”ë˜ì–´ìžˆìŠµë‹ˆë‹¤. ì´ í†µí•©ì„ ë¹„í™œì„±í™”í•´ë„ ê¸°ì¡´ Kubernetes í´ëŸ¬ìŠ¤í„°ì— ì˜í–¥ì„ 주지는 ì•Šê³  GitLabì˜ ì—°ê²°ì„ ì¼ì‹œì ìœ¼ë¡œë§Œ 해제합니다."
msgid "ClusterIntegration|Kubernetes cluster is being created on Google Kubernetes Engine..."
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ê°€ Google Kubernetes Engineì—ì„œ ìƒì„± 중입니다..."
msgid "ClusterIntegration|Kubernetes cluster name"
msgstr ""
@@ -1218,10 +1610,10 @@ msgid "ClusterIntegration|Kubernetes cluster was successfully created on Google
msgstr ""
msgid "ClusterIntegration|Kubernetes clusters allow you to use review apps, deploy your applications, run your pipelines, and much more in an easy way. %{link_to_help_page}"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 사용하면 리뷰 ì‘ìš© í”„ë¡œê·¸ëž¨ì„ ì‚¬ìš©í•˜ê³ , ì‘ìš© í”„ë¡œê·¸ëž¨ì„ ë°°í¬í•˜ê³ , 파ì´í”„ ë¼ì¸ì„ 실행하는 ë“±ì˜ ìž‘ì—…ì„ ì†ì‰½ê²Œ 수행 í•  수 있습니다. %{link_to_help_page}"
msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications and to provide Review Apps for this project"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ëŠ” 어플리케ì´ì…˜ì„ ë°°í¬í•˜ê³  ì´ í”„ë¡œì íŠ¸ì— 대한 리뷰 어플리케ì´ì…˜ì„ 제공하는 ë° ì‚¬ìš©í•  수 있습니다."
msgid "ClusterIntegration|Learn more about %{help_link_start_machine_type}machine types%{help_link_end} and %{help_link_start_pricing}pricing%{help_link_end}."
msgstr ""
@@ -1233,16 +1625,16 @@ msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_en
msgstr ""
msgid "ClusterIntegration|Learn more about environments"
-msgstr ""
+msgstr "í™˜ê²½ì— ëŒ€í•´ ìžì„¸ížˆ 알아보십시오."
msgid "ClusterIntegration|Learn more about security configuration"
msgstr ""
msgid "ClusterIntegration|Machine type"
-msgstr ""
+msgstr "머신 타입"
msgid "ClusterIntegration|Make sure your account %{link_to_requirements} to create Kubernetes clusters"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 만들려면 %{link_to_requirements} ë§í¬ì—ì„œ ê³„ì •ì˜ í•„ìˆ˜ì‚¬í•­ì„ í™•ì¸í•˜ì„¸ìš”."
msgid "ClusterIntegration|Manage"
msgstr ""
@@ -1253,6 +1645,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1266,46 +1661,43 @@ msgid "ClusterIntegration|No zones matched your search"
msgstr ""
msgid "ClusterIntegration|Note:"
-msgstr ""
+msgstr "Note:"
msgid "ClusterIntegration|Number of nodes"
-msgstr ""
+msgstr "노드 수"
msgid "ClusterIntegration|Please enter access information for your Kubernetes cluster. If you need help, you can read our %{link_to_help_page} on Kubernetes"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ì— 대한 액세스 정보를 입력하십시오. ë„ì›€ì´ í•„ìš”í•˜ì‹œë©´, Kubernetesì— ëŒ€í•œ %{link_to_help_page} 를 참고하세요."
msgid "ClusterIntegration|Please make sure that your Google account meets the following requirements:"
-msgstr ""
+msgstr "ë‹¹ì‹ ì˜ Google ê³„ì •ì´ ë‹¤ìŒì˜ 요구 ì‚¬í•­ì„ ì¶©ì¡±í•˜ëŠ”ì§€ í™•ì¸ í•˜ì„¸ìš”."
msgid "ClusterIntegration|Project namespace"
msgstr ""
msgid "ClusterIntegration|Project namespace (optional, unique)"
-msgstr ""
+msgstr "프로ì íŠ¸ 네임 스페ì´ìŠ¤ (optional, unique)"
msgid "ClusterIntegration|Prometheus"
-msgstr ""
+msgstr "Prometheus"
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
-msgstr ""
-
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 통합 알아보기 %{link_to_help_page}"
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 제거"
msgid "ClusterIntegration|Remove integration"
-msgstr ""
+msgstr "통합 제거"
msgid "ClusterIntegration|Remove this Kubernetes cluster's configuration from this project. This will not delete your actual Kubernetes cluster."
-msgstr ""
+msgstr "ì´ í”„ë¡œì íŠ¸ì—ì„œ Kubernetes í´ëŸ¬ìŠ¤í„° êµ¬ì„±ì„ ì œê±°í•˜ì‹­ì‹œì˜¤. ì´ë ‡ê²Œí•´ë„ 실제 Kubernetes í´ëŸ¬ìŠ¤í„°ëŠ” ì‚­ì œë˜ì§€ 않습니다."
msgid "ClusterIntegration|Request to begin installing failed"
-msgstr ""
+msgstr "설치 시작 요청 실패"
msgid "ClusterIntegration|Save changes"
-msgstr ""
+msgstr "변경 ì‚¬í•­ì„ ì €ìž¥"
msgid "ClusterIntegration|Search machine types"
msgstr ""
@@ -1320,7 +1712,7 @@ msgid "ClusterIntegration|Security"
msgstr ""
msgid "ClusterIntegration|See and edit the details for your Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ì˜ 세부 ì •ë³´ 보기 ë° ìˆ˜ì •"
msgid "ClusterIntegration|Select machine type"
msgstr ""
@@ -1341,31 +1733,31 @@ msgid "ClusterIntegration|Select zone to choose machine type"
msgstr ""
msgid "ClusterIntegration|Service token"
-msgstr ""
+msgstr "서비스 토í°"
msgid "ClusterIntegration|Show"
-msgstr ""
+msgstr "표시"
msgid "ClusterIntegration|Something went wrong on our end."
-msgstr ""
+msgstr "문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "ClusterIntegration|Something went wrong while creating your Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
+msgstr "구글 Kubernetes ì—”ì§„ì— Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 만드는 ë™ì•ˆ 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "ClusterIntegration|Something went wrong while installing %{title}"
-msgstr ""
+msgstr "설치하는 ë™ì•ˆ 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. %{title}"
msgid "ClusterIntegration|The default cluster configuration grants access to a wide set of functionalities needed to successfully build and deploy a containerised application."
msgstr ""
msgid "ClusterIntegration|This account must have permissions to create a Kubernetes cluster in the %{link_to_container_project} specified below"
-msgstr ""
+msgstr "%{link_to_container_project} 프로ì íŠ¸ì— Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 만들기 위해서는 ì´ ê³„ì •ì— ì•„ëž˜ì— ëª…ì‹œëœ ê¶Œí•œì´ í•„ìš”í•©ë‹ˆë‹¤"
msgid "ClusterIntegration|Toggle Kubernetes Cluster"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 토글"
msgid "ClusterIntegration|Toggle Kubernetes cluster"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 토글"
msgid "ClusterIntegration|Token"
msgstr ""
@@ -1374,16 +1766,16 @@ msgid "ClusterIntegration|Validating project billing status"
msgstr ""
msgid "ClusterIntegration|With a Kubernetes cluster associated to this project, you can use review apps, deploy your applications, run your pipelines, and much more in an easy way."
-msgstr ""
+msgstr "ì´ í”„ë¡œì íŠ¸ì— ì—°ê²°ëœ Kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 통해 어플리케ì´ì…˜ì„ 리뷰, ë°°í¬í•  수 있고, 파ì´í”„ë¼ì¸ì„ 실행할 수 있습니다. ê·¸ 외ì—ë„ ë§Žì€ ì¼ì„ 훨씬 쉬운 방법으로 수행할 수 있습니다."
msgid "ClusterIntegration|Your account must have %{link_to_kubernetes_engine}"
msgstr ""
msgid "ClusterIntegration|Zone"
-msgstr ""
+msgstr "Zone"
msgid "ClusterIntegration|access to Google Kubernetes Engine"
-msgstr ""
+msgstr "구글 Kubernetes 컨테ì´ë„ˆ ì—”ì§„ì— ì—‘ì„¸ìŠ¤"
msgid "ClusterIntegration|check the pricing here"
msgstr ""
@@ -1392,25 +1784,28 @@ msgid "ClusterIntegration|documentation"
msgstr ""
msgid "ClusterIntegration|help page"
-msgstr ""
+msgstr "ë„ì›€ë§ íŽ˜ì´ì§€"
msgid "ClusterIntegration|installing applications"
msgstr ""
msgid "ClusterIntegration|meets the requirements"
-msgstr ""
+msgstr "요구 ì‚¬í•­ì„ ì¶©ì¡±"
msgid "ClusterIntegration|properly configured"
-msgstr ""
+msgstr "ì •ìƒì ìœ¼ë¡œ 구성ë˜ì—ˆìŒ"
msgid "ClusterIntegration|sign up"
+msgstr "ClusterIntegration|가입"
+
+msgid "Cohorts"
msgstr ""
msgid "Collapse"
msgstr ""
msgid "Collapse sidebar"
-msgstr ""
+msgstr "사ì´ë“œ ë°” 축소"
msgid "Comment & resolve discussion"
msgstr ""
@@ -1531,7 +1926,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1543,53 +1938,62 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
-msgid "Container Registry"
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
msgstr ""
-msgid "ContainerRegistry|Created"
+msgid "Connecting..."
msgstr ""
+msgid "Container Registry"
+msgstr "컨테ì´ë„ˆ 레지스트리"
+
+msgid "ContainerRegistry|Created"
+msgstr "만든"
+
msgid "ContainerRegistry|First log in to GitLab&rsquo;s Container Registry using your GitLab username and password. If you have %{link_2fa} you need to use a %{link_token}:"
-msgstr ""
+msgstr "GitLab ì‚¬ìš©ìž ì´ë¦„ ë° ì•”í˜¸ë¥¼ 사용 하여 GitLabì˜ ì»¨í…Œì´ë„ˆ ë ˆì§€ìŠ¤íŠ¸ë¦¬ì— ì²˜ìŒ ë¡œê·¸ì¸ í•©ë‹ˆë‹¤. %{link_2fa} 를 사용한다면 %{link_token} 를 사용해야 합니다."
msgid "ContainerRegistry|GitLab supports up to 3 levels of image names. The following examples of images are valid for your project:"
msgstr ""
msgid "ContainerRegistry|How to use the Container Registry"
-msgstr ""
+msgstr "컨테ì´ë„ˆ 레지스트리를 사용 하는 방법"
msgid "ContainerRegistry|Learn more about"
-msgstr ""
+msgstr "ë” ì•Œì•„ë³´ê¸°"
msgid "ContainerRegistry|No tags in Container Registry for this container image."
-msgstr ""
+msgstr "컨테ì´ë„ˆ ë ˆì§€ìŠ¤íŠ¸ë¦¬ì— ì´ ì»¨í…Œì´ë„ˆ ì´ë¯¸ì§€ì— 대한 태그가 존재하지 않습니다."
msgid "ContainerRegistry|Once you log in, you&rsquo;re free to create and upload a container image using the common %{build} and %{push} commands"
-msgstr ""
+msgstr "로그ì¸í•˜ë©´, ì¼ë°˜ì ì¸ %{build} ë° %{push} ëª…ë ¹ì„ ì‚¬ìš©í•˜ì—¬ 컨테ì´ë„ˆ ì´ë¯¸ì§€ë¥¼ ìžìœ ë¡­ê²Œ ìƒì„±í•˜ê³  업로드할 수 있습니다."
msgid "ContainerRegistry|Remove repository"
-msgstr ""
+msgstr "저장소 제거"
msgid "ContainerRegistry|Remove tag"
-msgstr ""
+msgstr "태그 제거"
msgid "ContainerRegistry|Size"
-msgstr ""
+msgstr "í¬ê¸°"
msgid "ContainerRegistry|Tag"
-msgstr ""
+msgstr "태그"
msgid "ContainerRegistry|Tag ID"
-msgstr ""
+msgstr "태그 ID"
msgid "ContainerRegistry|Use different image names"
-msgstr ""
+msgstr "다른 ì´ë¯¸ì§€ ì´ë¦„ 사용"
msgid "ContainerRegistry|With the Docker Container Registry integrated into GitLab, every project can have its own space to store its Docker images."
-msgstr ""
+msgstr "GitLabì— í†µí•© Docker 컨테ì´ë„ˆ 레지스트리를 ì´ìš©í•˜ë©´, 모든 프로ì íŠ¸ëŠ” ìžì‹ ì˜ Docker ì´ë¯¸ì§€ë¥¼ 저장할 수 있는 ê³µê°„ì„ ê°€ì§ˆ 수 있습니다."
msgid "ContainerRegistry|You can also use a %{deploy_token} for read-only access to the registry images."
msgstr ""
@@ -1597,6 +2001,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1609,6 +2016,9 @@ msgstr ""
msgid "Contribution guide"
msgstr "ê¸°ì—¬ì— ëŒ€í•œ 안내"
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr "기여해 주신 분들"
@@ -1616,7 +2026,7 @@ msgid "ContributorsPage|%{startDate} – %{endDate}"
msgstr ""
msgid "ContributorsPage|Building repository graph."
-msgstr ""
+msgstr "저장소 그래프 작성"
msgid "ContributorsPage|Commits to %{branch_name}, excluding merge commits. Limited to 6,000 commits."
msgstr ""
@@ -1624,6 +2034,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr "URLì„ í´ë¦½ë³´ë“œì— 복사"
@@ -1636,10 +2064,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr "ì»¤ë°‹ì˜ SHA를 í´ë¦½ë³´ë“œë¡œ 복사합니다"
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1648,6 +2076,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1660,6 +2091,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "%{protocol}ì„ (를) 통해 Pull 하거나 Push í•  ê°œì¸ ì•¡ì„¸ìŠ¤ 토í°ì„ 만드십시오."
@@ -1675,17 +2109,26 @@ msgstr "디렉토리 만들기"
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
+msgstr "íŒŒì¼ ë§Œë“¤ê¸°"
+
+msgid "Create group"
msgstr ""
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
msgid "Create merge request"
-msgstr "머지 리퀘스트 만들기"
+msgstr "머지 리퀘스트(MR) 만들기"
msgid "Create merge request and branch"
msgstr ""
@@ -1694,9 +2137,12 @@ msgid "Create new branch"
msgstr ""
msgid "Create new directory"
-msgstr ""
+msgstr "새 디렉토리 만들기"
msgid "Create new file"
+msgstr "새 íŒŒì¼ ë§Œë“¤ê¸°"
+
+msgid "Create new file or directory"
msgstr ""
msgid "Create new label"
@@ -1718,22 +2164,34 @@ msgid "CreateTokenToCloneLink|create a personal access token"
msgstr "ê°œì¸ ì•¡ì„¸ìŠ¤ í† í° ë§Œë“¤ê¸°"
msgid "Created"
+msgstr "ìƒì„±ë¨"
+
+msgid "Created At"
msgstr ""
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr "Cron 시간대"
msgid "Cron syntax"
msgstr "í¬ë¡  구문"
-msgid "CurrentUser|Profile"
+msgid "Current node"
msgstr ""
+msgid "CurrentUser|Profile"
+msgstr "CurrentUser|프로파ì¼"
+
msgid "CurrentUser|Settings"
-msgstr ""
+msgstr "CurrentUser|설정"
msgid "Custom CI config path"
msgstr ""
@@ -1744,9 +2202,18 @@ msgstr "ì‚¬ìš©ìž ì •ì˜ ì•Œë¦¼ ì´ë²¤íŠ¸"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "ì‚¬ìš©ìž ì •ì˜ ì•Œë¦¼ ìˆ˜ì¤€ì€ ì°¸ì—¬ 수준과 ë™ì¼í•©ë‹ˆë‹¤. 맞춤 알림 ìˆ˜ì¤€ì„ ì‚¬ìš©í•˜ë©´ ì¼ë¶€ ì´ë²¤íŠ¸ì— 대한 ì•Œë¦¼ë„ ë°›ê²Œë©ë‹ˆë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ %{notification_link}ì„ í™•ì¸í•˜ì‹­ì‹œì˜¤."
-msgid "Cycle Analytics"
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
msgstr ""
+msgid "Cycle Analytics"
+msgstr "사ì´í´ 분ì„"
+
msgid "CycleAnalyticsStage|Code"
msgstr "코드"
@@ -1768,11 +2235,14 @@ msgstr "스테ì´ì§•"
msgid "CycleAnalyticsStage|Test"
msgstr "테스트"
-msgid "DashboardProjects|All"
+msgid "Dashboard"
msgstr ""
+msgid "DashboardProjects|All"
+msgstr "모든"
+
msgid "DashboardProjects|Personal"
-msgstr ""
+msgstr "ê°œì¸"
msgid "Dec"
msgstr ""
@@ -1781,6 +2251,15 @@ msgid "December"
msgstr ""
msgid "Decline and sign out"
+msgstr "취소 ë° ë¡œê·¸ì•„ì›ƒ"
+
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
msgstr ""
msgid "Define a custom pattern with cron syntax"
@@ -1789,63 +2268,72 @@ msgstr "cron êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì—¬ ì‚¬ìš©ìž ì •ì˜ íŒ¨í„´ ì •ì˜"
msgid "Delete"
msgstr "삭제 "
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "ë°°í¬"
msgid "Deploy Keys"
-msgstr ""
+msgstr "ë°°í¬ í‚¤"
msgid "DeployKeys|+%{count} others"
-msgstr ""
+msgstr "DeployKeys|+%{count} 기타"
msgid "DeployKeys|Current project"
-msgstr ""
+msgstr "DeployKeys|현재 프로ì íŠ¸"
msgid "DeployKeys|Deploy key"
-msgstr ""
+msgstr "DeployKeys|ë°°í¬ í‚¤"
msgid "DeployKeys|Enabled deploy keys"
-msgstr ""
+msgstr "DeployKeys|í™œì„±í™”ëœ ë°°í¬ í‚¤"
msgid "DeployKeys|Error enabling deploy key"
-msgstr ""
+msgstr "DeployKeys|ë°°í¬í‚¤ 사용 오류"
msgid "DeployKeys|Error getting deploy keys"
-msgstr ""
+msgstr "DeployKeys|ë°°í¬í‚¤ 가져오기 오류"
msgid "DeployKeys|Error removing deploy key"
-msgstr ""
+msgstr "DeployKeys|ë°°í¬í‚¤ 제거 오류"
msgid "DeployKeys|Expand %{count} other projects"
-msgstr ""
+msgstr "DeployKeys|확장 %{count} 기타 프로ì íŠ¸"
msgid "DeployKeys|Loading deploy keys"
-msgstr ""
+msgstr "DeployKeys|ë°°í¬í‚¤ 로드"
msgid "DeployKeys|No deploy keys found. Create one with the form above."
-msgstr ""
+msgstr "DeployKeys|ë°°í¬í‚¤ê°€ 존재하지 않습니다. ìœ„ì˜ ì–‘ì‹ì„ ì´ìš©í•´ 만드세요."
msgid "DeployKeys|Privately accessible deploy keys"
-msgstr ""
+msgstr "DeployKeys|비공개ì ìœ¼ë¡œ 엑세스 가능한 ë°°í¬í‚¤"
msgid "DeployKeys|Project usage"
-msgstr ""
+msgstr "DeployKeys|프로ì íŠ¸ 사용현황"
msgid "DeployKeys|Publicly accessible deploy keys"
-msgstr ""
+msgstr "DeployKeys|공개ì ìœ¼ë¡œ 엑세스 가능한 ë°°í¬í‚¤"
msgid "DeployKeys|Read access only"
-msgstr ""
+msgstr "DeployKeys|ì½ê¸° 엑세스 ì „ìš©"
msgid "DeployKeys|Write access allowed"
-msgstr ""
+msgstr "DeployKeys|쓰기 액세스 허용"
msgid "DeployKeys|You are going to remove this deploy key. Are you sure?"
-msgstr ""
+msgstr "DeployKeys|ì´ ë°°í¬í‚¤ë¥¼ 제거하려고 합니다. 확실합니까?"
msgid "DeployTokens|Active Deploy Tokens (%{active_tokens})"
msgstr ""
@@ -1922,9 +2410,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr "설명"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "ìƒì„¸"
@@ -1941,23 +2441,41 @@ msgid "Disable"
msgstr ""
msgid "Disable for this project"
-msgstr ""
+msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해 사용 중지"
msgid "Disable group Runners"
-msgstr ""
+msgstr "그룹 Runner 사용 중지"
msgid "Discard changes"
-msgstr ""
+msgstr "변경 ì‚¬í•­ì„ ì·¨ì†Œ"
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
+msgstr "사ì´í´ ë¶„ì„ ì†Œê°œ 박스 제거"
+
+msgid "Dismiss Merge Request promotion"
msgstr ""
-msgid "Domain"
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
msgstr ""
+msgid "Domain"
+msgstr "ë„ë©”ì¸"
+
msgid "Don't show again"
msgstr "다시 표시하지 ì•ŠìŒ"
@@ -1997,9 +2515,12 @@ msgstr ""
msgid "Due date"
msgstr ""
-msgid "Each Runner can be in one of the following states:"
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
msgstr ""
+msgid "Each Runner can be in one of the following states:"
+msgstr "ê° Runner는 ë‹¤ìŒ ìƒíƒœ 중 í•˜ë‚˜ì¼ ìˆ˜ 있습니다."
+
msgid "Edit"
msgstr "편집"
@@ -2009,12 +2530,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr "파ì´í”„ë¼ì¸ 스케줄 편집 %{id}"
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2022,7 +2558,7 @@ msgid "Email patch"
msgstr ""
msgid "Emails"
-msgstr ""
+msgstr "ì´ë©”ì¼"
msgid "Embed"
msgstr ""
@@ -2033,6 +2569,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2042,15 +2584,21 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
-msgid "Enable for this project"
+msgid "Enable classification control using an external service"
msgstr ""
+msgid "Enable for this project"
+msgstr "ì´ í”„ë¡œì íŠ¸ì— 대해 사용"
+
msgid "Enable group Runners"
-msgstr ""
+msgstr "그룹 Runner 사용"
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2060,11 +2608,14 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
msgid "Environments"
-msgstr ""
+msgstr "환경"
msgid "Environments|An error occurred while fetching the environments."
msgstr ""
@@ -2072,9 +2623,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2087,43 +2647,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
+msgstr ""
+
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2144,6 +2734,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2163,7 +2756,7 @@ msgid "Error updating todo status."
msgstr ""
msgid "Estimated"
-msgstr ""
+msgstr "예ìƒ"
msgid "EventFilterBy|Filter by all"
msgstr "모든 ê°’ì„ ê¸°ì¤€ìœ¼ë¡œ í•„í„°"
@@ -2192,6 +2785,9 @@ msgstr "매월 (1ì¼ ì˜¤ì „ 4ì‹œ)"
msgid "Every week (Sundays at 4:00am)"
msgstr "매주 (ì¼ìš”ì¼ ì˜¤ì „ 4ì‹œì—)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2199,12 +2795,48 @@ msgid "Expand all"
msgstr ""
msgid "Expand sidebar"
+msgstr "사ì´ë“œë°” 확장"
+
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
msgstr ""
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
+msgstr "공개 그룹 íƒìƒ‰"
+
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
msgstr ""
msgid "Failed"
@@ -2249,6 +2881,12 @@ msgstr "파ì¼"
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "커밋 메시지로 필터"
@@ -2258,6 +2896,12 @@ msgstr "경로로 찾기"
msgid "Find file"
msgstr "íŒŒì¼ ì°¾ê¸°"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2267,6 +2911,30 @@ msgstr "처ìŒ"
msgid "FirstPushedBy|pushed by"
msgstr "푸시한 사용ìž"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2284,7 +2952,7 @@ msgid "ForkedFromProjectPath|Forked from"
msgstr "í¬í¬í•œ 사용ìž"
msgid "ForkedFromProjectPath|Forked from %{project_name} (deleted)"
-msgstr ""
+msgstr "%{project_name} (ì‚­ì œ) ì—ì„œ í¬í¬ë¨"
msgid "Forking in progress"
msgstr ""
@@ -2298,20 +2966,32 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "ì´ìŠˆ ìƒì„±ì—ì„œ 프로ë•ì…˜ ë°°í¬ê¹Œì§€"
msgid "From merge request merge until deploy to production"
-msgstr "머지 리퀘스트 머지ì—ì„œ 프로ë•ì…˜ í™˜ê²½ì— ë°°í¬ê¹Œì§€"
+msgstr "머지 리퀘스트(MR) 머지ì—ì„œ 프로ë•ì…˜ í™˜ê²½ì— ë°°í¬ê¹Œì§€"
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° 세부사항 ë³´ê¸°ì˜ ì• í”Œë¦¬ì¼€ì´ì…˜ 목ë¡ì—ì„œ Runner를 설치하십시오."
msgid "GPG Keys"
-msgstr ""
+msgstr "GPG 키"
msgid "General"
-msgstr ""
+msgstr "ì¼ë°˜"
msgid "General pipelines"
msgstr ""
@@ -2319,11 +2999,206 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
msgid "Git revision"
-msgstr ""
+msgstr "Git 리비전"
msgid "Git storage health information has been reset"
msgstr "git storage ìƒíƒœ ì •ë³´ê°€ 초기화ë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -2340,87 +3215,198 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
-msgstr "GitLab Runner 섹션"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr ""
msgid "Gitaly Servers"
-msgstr ""
+msgstr "Gitaly 서버"
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "ë‹¹ì‹ ì˜ í¬í¬ë¡œ ì´ë™í•˜ì„¸ìš”"
msgid "GoToYourFork|Fork"
msgstr "í¬í¬"
-msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
msgstr ""
+msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
+msgstr "Google ì¸ì¦ì„ 사용할 수 없습니다. %{link_to_documentation} GitLab 관리ìžì—게 문ì˜í•˜ì„¸ìš”."
+
msgid "Got it!"
msgstr ""
msgid "Graph"
+msgstr "그래프"
+
+msgid "Group"
msgstr ""
msgid "Group CI/CD settings"
+msgstr "그룹 CI/CD 설정"
+
+msgid "Group Git LFS status:"
msgstr ""
msgid "Group ID"
-msgstr ""
+msgstr "그룹 ID"
msgid "Group Runners"
+msgstr "그룹 Runner"
+
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
msgstr ""
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
-msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgid "Group: %{group_name}"
msgstr ""
-msgid "GroupSettings|Share with group lock"
+msgid "GroupRoadmap|From %{dateWord}"
msgstr ""
-msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
+msgid "GroupRoadmap|Loading roadmap"
msgstr ""
-msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
+msgid "GroupRoadmap|Something went wrong while fetching epics"
msgstr ""
-msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
+msgid "GroupRoadmap|Sorry, no epics matched your search"
msgstr ""
-msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
msgstr ""
-msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
msgstr ""
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
+msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
+msgstr "%{group} ë‚´ì˜ í”„ë¡œì íŠ¸ë¥¼ 다른 ê·¸ë£¹ì— ê³µìœ í•  수 없게 합니다."
+
+msgid "GroupSettings|Share with group lock"
+msgstr "그룹 lock ì„ ê³µìœ í•©ë‹ˆë‹¤."
+
+msgid "GroupSettings|This setting is applied on %{ancestor_group} and has been overridden on this subgroup."
+msgstr "ì´ ì„¤ì •ì€ %{ancestor_group} ì— ì ìš©ë˜ê³  ì´ í•˜ìœ„ 그룹ì—ì„œ ìž¬ì •ì˜ ë˜ì—ˆìŠµë‹ˆë‹¤."
+
+msgid "GroupSettings|This setting is applied on %{ancestor_group}. To share projects in this group with another group, ask the owner to override the setting or %{remove_ancestor_share_with_group_lock}."
+msgstr "ì´ ì„¤ì •ì€ %{ancestor_group} ì— ì ìš© ë©ë‹ˆë‹¤. ì´ ê·¸ë£¹ì˜ í”„ë¡œì íŠ¸ë¥¼ 다른 그룹과 공유하려면, 소유ìžì—게 ì„¤ì •ì„ ìž¬ì •ì˜í•˜ê±°ë‚˜ %{remove_ancestor_share_with_group_lock} 하ë„ë¡ ìš”ì²­í•˜ì„¸ìš”."
+
+msgid "GroupSettings|This setting is applied on %{ancestor_group}. You can override the setting or %{remove_ancestor_share_with_group_lock}."
+msgstr "ì´ ì„¤ì •ì€ %{ancestor_group} ì— ì ìš©ë©ë‹ˆë‹¤. ì„¤ì •ì„ ìž¬ì •ì˜í•˜ê±°ë‚˜ %{remove_ancestor_share_with_group_lock} í•  수 있습니다."
+
+msgid "GroupSettings|This setting will be applied to all subgroups unless overridden by a group owner. Groups that already have access to the project will continue to have access unless removed manually."
+msgstr "ì´ ì„¤ì •ì€ ê·¸ë£¹ 소유ìžì— ì˜í•´ 재정ì˜ë˜ì§€ ì•Šì€ ëª¨ë“  하위 ê·¸ë£¹ì— ì ìš©ë©ë‹ˆë‹¤. ì´ë¯¸ 프로ì íŠ¸ì— 대한 ì ‘ê·¼ ê¶Œí•œì„ ê°€ì§„ ê·¸ë£¹ë“¤ì€ ê¶Œí•œì´ ì§ì ‘ 제거ë˜ì§€ 않는 í•œ 접근할 수 있습니다."
+
+msgid "GroupSettings|cannot be disabled when the parent group \"Share with group lock\" is enabled, except by the owner of the parent group"
+msgstr "부모 ê·¸ë£¹ì˜ \"그룹 lock 공유\" ê°€ 사용 가능하ë„ë¡ ì„¤ì •ë˜ì–´ìžˆìœ¼ë©´, 부모 ê·¸ë£¹ì˜ ì†Œìœ ìžë¥¼ ì œì™¸í•˜ê³ ëˆ„êµ¬ë„ ì‚¬ìš©í•˜ì§€ ì•Šë„ë¡ ì„¤ì •í•  수 없습니다."
+
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
+msgstr "%{ancestor_group_name} ì—ì„œ 그룹 lock 공유 제거"
+
+msgid "Groups"
msgstr ""
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
-msgid "GroupsEmptyState|A group is a collection of several projects."
+msgid "GroupsDropdown|Frequently visited"
msgstr ""
-msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
msgstr ""
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
+msgid "GroupsEmptyState|A group is a collection of several projects."
+msgstr "ê·¸ë£¹ì€ ì—¬ëŸ¬ 프로ì íŠ¸ì˜ 모ìŒìž…니다."
+
+msgid "GroupsEmptyState|If you organize your projects under a group, it works like a folder."
+msgstr "프로ì íŠ¸ë¥¼ ê·¸ë£¹ì— êµ¬ì„±í•˜ë©´, 마치 í´ë”처럼 ë™ìž‘합니다."
+
msgid "GroupsEmptyState|No groups found"
msgstr ""
@@ -2434,7 +3420,7 @@ msgid "GroupsTree|Create a subgroup in this group."
msgstr ""
msgid "GroupsTree|Edit group"
-msgstr ""
+msgstr "그룹 편집"
msgid "GroupsTree|Failed to leave the group. Please make sure you are not the only owner."
msgstr ""
@@ -2443,15 +3429,21 @@ msgid "GroupsTree|Filter by name..."
msgstr ""
msgid "GroupsTree|Leave this group"
-msgstr ""
+msgstr "ì´ ê·¸ë£¹ 떠나기"
msgid "GroupsTree|Loading groups"
-msgstr ""
+msgstr "그룹 로딩중입니다"
msgid "GroupsTree|Sorry, no groups matched your search"
-msgstr ""
+msgstr "죄송합니다, 검색과 ì¼ì¹˜í•˜ëŠ” ê·¸ë£¹ì´ ì—†ìŠµë‹ˆë‹¤"
msgid "GroupsTree|Sorry, no groups or projects matched your search"
+msgstr "죄송합니다, 검색과 ì¼ì¹˜í•˜ëŠ” 그룹 í˜¹ì€ í”„ë¡ì íŠ¸ê°€ 없습니다"
+
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
msgstr ""
msgid "Health Check"
@@ -2489,7 +3481,7 @@ msgid "Hide whitespace changes"
msgstr ""
msgid "History"
-msgstr ""
+msgstr "ì´ë ¥"
msgid "Housekeeping successfully started"
msgstr "Housekeepingì´ ì„±ê³µì ìœ¼ë¡œ 시작ë˜ì—ˆìŠµë‹ˆë‹¤"
@@ -2504,19 +3496,19 @@ msgid "ID"
msgstr ""
msgid "IDE|Commit"
-msgstr ""
+msgstr "IDE|커밋"
msgid "IDE|Edit"
-msgstr ""
+msgstr "IDE|편집"
msgid "IDE|Go back"
-msgstr ""
+msgstr "IDE|뒤로"
msgid "IDE|Open in file view"
msgstr ""
msgid "IDE|Review"
-msgstr ""
+msgstr "리뷰"
msgid "Identifier"
msgstr ""
@@ -2524,12 +3516,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2548,29 +3549,81 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr "저장소 가져 오기"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "GitLab CI 와 호환ë˜ëŠ” Runner 설치"
+msgid "Install Runner on Kubernetes"
+msgstr "Kubernetesì— Runner 설치"
+
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2582,7 +3635,7 @@ msgid "Integrations Settings"
msgstr ""
msgid "Interested parties can even contribute by pushing commits if they want to."
-msgstr ""
+msgstr "관심있는 íŒŒí‹°ë“¤ì€ ì›í•˜ëŠ” ê³³ì— ì»¤ë°‹ì„ í‘¸ì‹œí•¨ìœ¼ë¡œì¨ ê¸°ì—¬í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤."
msgid "Internal - The group and any internal projects can be viewed by any logged in user."
msgstr ""
@@ -2596,7 +3649,10 @@ msgstr "주기 패턴"
msgid "Introducing Cycle Analytics"
msgstr "Cycle Analytics 소개"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2605,10 +3661,16 @@ msgstr "ì´ìŠˆ ì´ë²¤íŠ¸"
msgid "IssueBoards|Board"
msgstr ""
-msgid "Issues"
+msgid "IssueBoards|Boards"
msgstr ""
+msgid "Issues"
+msgstr "ì´ìŠˆ"
+
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
+msgstr "ì´ìŠˆëŠ” 버그, ìž‘ì—… í˜¹ì€ ë…¼ì˜í•  ì•„ì´ë””ì–´ì¼ ìˆ˜ 있습니다. 그리고, ì´ìŠˆëŠ” 검색 ë° í•„í„°ë§ ê°€ëŠ¥í•©ë‹ˆë‹¤."
+
+msgid "Issues closed"
msgstr ""
msgid "Jan"
@@ -2641,6 +3703,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2648,22 +3713,22 @@ msgid "Kubernetes Cluster"
msgstr ""
msgid "Kubernetes cluster creation time exceeds timeout; %{timeout}"
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° ìƒì„± ì‹œê°„ì´ ì´ˆê³¼ë˜ì—ˆìŠµë‹ˆë‹¤. %{timeout}"
msgid "Kubernetes cluster integration was not removed."
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° í†µí•©ì´ ì œê±°ë˜ì§€ 않았습니다."
msgid "Kubernetes cluster integration was successfully removed."
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„° í†µí•©ì´ ì œê±°ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "Kubernetes cluster was successfully updated."
-msgstr ""
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ê°€ 성공ì ìœ¼ë¡œ ì—…ë°ì´íŠ¸ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "Kubernetes configured"
msgstr ""
msgid "Kubernetes service integration has been deprecated. %{deprecated_message_content} your Kubernetes clusters using the new <a href=\"%{url}\"/>Kubernetes Clusters</a> page"
-msgstr ""
+msgstr "Kubernetes 서비스 í†µí•©ì€ ë” ì´ìƒ 사용ë˜ì§€ 않습니다. %{deprecated_message_content} 새로운 <a href=\"%{url}\"/>Kubernetes í´ëŸ¬ìŠ¤í„°</a> 페ì´ì§€"
msgid "LFS"
msgstr ""
@@ -2680,20 +3745,26 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
-msgid "Labels"
+msgid "LabelSelect|Labels"
msgstr ""
+msgid "Labels"
+msgstr "ë ˆì´ë¸”"
+
msgid "Labels can be applied to %{features}. Group labels are available for any project within the group."
msgstr ""
msgid "Labels can be applied to issues and merge requests to categorize them."
-msgstr ""
+msgstr "ë¼ë²¨ì€ ì´ìŠˆì™€ 머지 리퀘스트(MR)ì— ì¹´í…Œê³ ë¼ì´ì¦ˆë¥¼ 위해 ì ìš©ê°€ëŠ¥í•©ë‹ˆë‹¤."
msgid "Labels can be applied to issues and merge requests."
msgstr ""
@@ -2759,12 +3830,30 @@ msgstr "그룹 떠나기"
msgid "Leave project"
msgstr "프로ì íŠ¸ì—ì„œ 나가기"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2775,7 +3864,7 @@ msgid "Lock"
msgstr ""
msgid "Lock %{issuableDisplayName}"
-msgstr ""
+msgstr "%{issuableDisplayName} 잠금"
msgid "Lock not found"
msgstr ""
@@ -2786,15 +3875,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2804,6 +3917,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2826,12 +3960,21 @@ msgid "Median"
msgstr "중앙값"
msgid "Members"
+msgstr "회ì›"
+
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
msgstr ""
-msgid "Merge Request:"
+msgid "Merge Request"
msgstr ""
+msgid "Merge Request:"
+msgstr "머지 리퀘스트(MR):"
+
msgid "Merge Requests"
+msgstr "병합 요청"
+
+msgid "Merge Requests created"
msgstr ""
msgid "Merge events"
@@ -2840,11 +3983,14 @@ msgstr "머지 ì´ë²¤íŠ¸"
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
msgid "Merge requests are a place to propose changes you've made to a project and discuss those changes with others"
-msgstr ""
+msgstr "머지 리퀘스트(MR)는 프로ì íŠ¸ì˜ 변경 ì‚¬í•­ì„ ì œì•ˆí•˜ê³  변경 ì‚¬í•­ì„ ë‹¤ë¥¸ 사람들과 ë…¼ì˜ í•˜ëŠ” 곳입니다."
msgid "MergeRequests|Resolve this discussion in a new issue"
msgstr ""
@@ -2868,6 +4014,9 @@ msgid "Merged"
msgstr ""
msgid "Messages"
+msgstr "메시지"
+
+msgid "Metrics"
msgstr ""
msgid "Metrics - Influx"
@@ -2876,6 +4025,105 @@ msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2900,6 +4148,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "SSH 키 추가"
@@ -2910,32 +4161,50 @@ msgid "Modal|Close"
msgstr ""
msgid "Monitoring"
+msgstr "모니터ë§"
+
+msgid "Months"
+msgstr ""
+
+msgid "More"
msgstr ""
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr "여기"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
msgid "Name new label"
-msgstr ""
+msgstr "새 ë¼ë²¨ ì´ë¦„ 지정"
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2948,25 +4217,37 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
-msgid "New Identity"
+msgid "Network"
msgstr ""
-msgid "New Issue"
-msgid_plural "New Issues"
-msgstr[0] "새 ì´ìŠˆ"
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
-msgid "New Kubernetes Cluster"
+msgid "New Group"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Identity"
msgstr ""
+msgid "New Issue"
+msgid_plural "New Issues"
+msgstr[0] "새 ì´ìŠˆ"
+
msgid "New Label"
msgstr ""
msgid "New Pipeline Schedule"
msgstr "새로운 파ì´í”„ë¼ì¸ ì¼ì •"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "새 브랜치"
@@ -2976,6 +4257,9 @@ msgstr ""
msgid "New directory"
msgstr "새 디렉토리"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "새 파ì¼"
@@ -2992,7 +4276,7 @@ msgid "New label"
msgstr ""
msgid "New merge request"
-msgstr "새 머지 리퀘스트"
+msgstr "새 머지 리퀘스트(MR)"
msgid "New pipelines will cancel older, pending pipelines on the same branch"
msgstr ""
@@ -3012,26 +4296,32 @@ msgstr ""
msgid "New tag"
msgstr "새 태그 "
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
-msgid "No assignee"
+msgid "No Label"
msgstr ""
+msgid "No assignee"
+msgstr "ë‹´ë‹¹ìž ì—†ìŒ"
+
msgid "No changes"
msgstr ""
msgid "No connection could be made to a Gitaly Server, please check your logs!"
-msgstr ""
+msgstr "Gitaly Serverì— ì—°ê²°í•  수 없습니다. 로그를 확ì¸í•˜ì‹­ì‹œì˜¤!"
msgid "No due date"
-msgstr ""
+msgstr "기한 ì—†ìŒ"
msgid "No estimate or time spent"
-msgstr ""
+msgstr "ì˜ˆìƒ ì‹œê°„ì´ë‚˜ ì†Œë¹„ëœ ì‹œê°„ì´ ì—†ìŠµë‹ˆë‹¤."
msgid "No file chosen"
-msgstr ""
+msgstr "파ì¼ì„ ì„ íƒí•˜ì§€ 않았습니다."
msgid "No files found"
msgstr ""
@@ -3039,23 +4329,47 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "저장소 ì—†ìŒ"
msgid "No schedules"
msgstr "ì¼ì • ì—†ìŒ"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
msgid "Not allowed to merge"
-msgstr ""
+msgstr "머지가 허용ë˜ì§€ ì•ŠìŒ"
msgid "Not available"
msgstr "사용할 수 ì—†ìŒ"
@@ -3067,7 +4381,7 @@ msgid "Not available for protected branches"
msgstr ""
msgid "Not confidential"
-msgstr ""
+msgstr "비밀 아님"
msgid "Not enough data"
msgstr "ë°ì´í„°ê°€ 충분하지 않습니다."
@@ -3075,12 +4389,21 @@ msgstr "ë°ì´í„°ê°€ 충분하지 않습니다."
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "알림 ì´ë²¤íŠ¸"
@@ -3088,19 +4411,19 @@ msgid "NotificationEvent|Close issue"
msgstr "ì´ìŠˆ 닫기"
msgid "NotificationEvent|Close merge request"
-msgstr "머지 리퀘스트 닫기"
+msgstr "머지 리퀘스트(MR) 닫기"
msgid "NotificationEvent|Failed pipeline"
msgstr "실패한 파ì´í”„ë¼ì¸"
msgid "NotificationEvent|Merge merge request"
-msgstr "머지 리퀘스트 머지하기"
+msgstr "머지 리퀘스트(MR) 머지하기"
msgid "NotificationEvent|New issue"
msgstr "새 ì´ìŠˆ"
msgid "NotificationEvent|New merge request"
-msgstr "새 머지 리퀘스트"
+msgstr "새 머지 리퀘스트(MR)"
msgid "NotificationEvent|New note"
msgstr "새 노트"
@@ -3109,7 +4432,7 @@ msgid "NotificationEvent|Reassign issue"
msgstr "ì´ìŠˆ 재지정"
msgid "NotificationEvent|Reassign merge request"
-msgstr "머지 리퀘스트 재 할당"
+msgstr "머지 리퀘스트(MR) 재 할당"
msgid "NotificationEvent|Reopen issue"
msgstr "ì´ìŠˆ 다시 열기"
@@ -3136,7 +4459,7 @@ msgid "NotificationLevel|Watch"
msgstr "Watch"
msgid "Notifications"
-msgstr ""
+msgstr "알림"
msgid "Notifications off"
msgstr ""
@@ -3151,6 +4474,9 @@ msgid "November"
msgstr ""
msgid "Number of access attempts"
+msgstr "ì ‘ê·¼ ì‹œë„ íšŸìˆ˜"
+
+msgid "OK"
msgstr ""
msgid "Oct"
@@ -3162,6 +4488,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr "í•„í„°"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3171,9 +4506,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr "열린"
@@ -3183,6 +4539,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "옵션 "
@@ -3192,6 +4554,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3199,7 +4564,7 @@ msgid "Outbound requests"
msgstr ""
msgid "Overview"
-msgstr ""
+msgstr "개요"
msgid "Owner"
msgstr "소유ìž"
@@ -3223,11 +4588,14 @@ msgid "Part of merge request changes"
msgstr ""
msgid "Password"
-msgstr ""
+msgstr "패스워드"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3261,6 +4629,9 @@ msgstr "파ì´í”„ë¼ì¸ 스케쥴"
msgid "Pipeline Schedules"
msgstr "파ì´í”„ë¼ì¸ 스케쥴"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3319,13 +4690,13 @@ msgid "Pipelines charts"
msgstr "파ì´í”„ë¼ì¸ 차트"
msgid "Pipelines for last month"
-msgstr ""
+msgstr "ì§€ë‚œë‹¬ì˜ íŒŒì´í”„ë¼ì¸"
msgid "Pipelines for last week"
-msgstr ""
+msgstr "ì§€ë‚œì£¼ì˜ íŒŒì´í”„ë¼ì¸"
msgid "Pipelines for last year"
-msgstr ""
+msgstr "ì§€ë‚œí•´ì˜ íŒŒì´í”„ë¼ì¸"
msgid "Pipelines|Build with confidence"
msgstr ""
@@ -3334,10 +4705,10 @@ msgid "Pipelines|CI Lint"
msgstr ""
msgid "Pipelines|Clear Runner Caches"
-msgstr ""
+msgstr "Runner ìºì‹œ 정리"
msgid "Pipelines|Get started with Pipelines"
-msgstr ""
+msgstr "파ì´í”„ ë¼ì¸ìœ¼ë¡œ 시작하기"
msgid "Pipelines|Loading Pipelines"
msgstr ""
@@ -3349,7 +4720,7 @@ msgid "Pipelines|Run Pipeline"
msgstr ""
msgid "Pipelines|Something went wrong while cleaning runners cache."
-msgstr ""
+msgstr "Runnerì˜ ìºì‹œë¥¼ ë¹„ìš°ë˜ ì¤‘ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤."
msgid "Pipelines|There are currently no %{scope} pipelines."
msgstr ""
@@ -3405,33 +4776,54 @@ msgstr "스테ì´ì§•"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
msgid "Play"
-msgstr ""
+msgstr "Play"
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
msgid "Please solve the reCAPTCHA"
-msgstr ""
+msgstr "ReCAPTCHA를 풀어 주십시오."
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
msgid "Preferences"
-msgstr ""
+msgstr "환경 설정"
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3445,10 +4837,10 @@ msgid "Prioritized label"
msgstr ""
msgid "Private - Project access must be granted explicitly to each user."
-msgstr ""
+msgstr "Private - 프로ì íŠ¸ ì ‘ê·¼ì€ ê° ì‚¬ìš©ìžë³„ë¡œ 명시ì ìœ¼ë¡œ 허용ë˜ì–´ì•¼ 합니다."
msgid "Private - The group and its projects can only be viewed by members."
-msgstr ""
+msgstr "Private - 그룹과 ê·¸ë£¹ì˜ í”„ë¡œì íŠ¸ë“¤ì€ ë©¤ë²„ë“¤ì´ ì—´ëžŒí•  수 있습니다."
msgid "Private projects can be created in your personal namespace with:"
msgstr ""
@@ -3456,7 +4848,13 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
+msgstr "ê³„ì •ì´ ì‚­ì œë  ì˜ˆì •ìž…ë‹ˆë‹¤."
+
+msgid "Profiles|Add key"
msgstr ""
msgid "Profiles|Change username"
@@ -3475,18 +4873,24 @@ msgid "Profiles|Delete your account?"
msgstr ""
msgid "Profiles|Deleting an account has the following effects:"
-msgstr ""
+msgstr "ê³„ì •ì„ ì‚­ì œí•˜ë©´ 다ìŒê³¼ ê°™ì€ ì˜í–¥ì´ 있습니다:"
msgid "Profiles|Invalid password"
-msgstr ""
+msgstr "ìž˜ëª»ëœ íŒ¨ìŠ¤ì›Œë“œ"
msgid "Profiles|Invalid username"
-msgstr ""
+msgstr "ìž˜ëª»ëœ ì‚¬ìš©ìžì´ë¦„"
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
+msgstr "확ì¸ì„ 위해 %{confirmationValue} 를 입력하세요."
+
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
msgstr ""
msgid "Profiles|Update username"
@@ -3499,16 +4903,19 @@ msgid "Profiles|Username successfully changed"
msgstr ""
msgid "Profiles|You don't have access to delete this user."
-msgstr ""
+msgstr "ì´ ì‚¬ìš©ìžë¥¼ 삭제할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤."
msgid "Profiles|You must transfer ownership or delete these groups before you can delete your account."
-msgstr ""
+msgstr "ë‹¹ì‹ ì˜ ê³„ì •ì„ ì‚­ì œí•˜ê¸° ì „ì— ì´ ê·¸ë£¹ë“¤ì˜ ì†Œìœ ê¶Œì„ ì´ì „하거나 삭제해야합니다."
msgid "Profiles|Your account is currently an owner in these groups:"
+msgstr "ë‹¹ì‹ ì˜ ê³„ì •ì€ í˜„ìž¬ ë‹¤ìŒ ê·¸ë£¹ë“¤ì˜ ì†Œìœ ìžìž…니다:"
+
+msgid "Profiles|e.g. My MacBook key"
msgstr ""
msgid "Profiles|your account"
-msgstr ""
+msgstr "계정"
msgid "Profiling - Performance bar"
msgstr ""
@@ -3523,7 +4930,7 @@ msgid "Project"
msgstr ""
msgid "Project '%{project_name}' is in the process of being deleted."
-msgstr ""
+msgstr "프로ì íŠ¸ '%{project_name}' ì‚­ì œ 중입니다."
msgid "Project '%{project_name}' queued for deletion."
msgstr "'%{project_name}'프로ì íŠ¸ê°€ ì‚­ì œ 처리 중입니다."
@@ -3541,10 +4948,10 @@ msgid "Project access must be granted explicitly to each user."
msgstr "프로ì íŠ¸ 액세스는 ê° ì‚¬ìš©ìžì—게 명시ì ìœ¼ë¡œ 부여ë˜ì–´ì•¼í•©ë‹ˆë‹¤."
msgid "Project avatar"
-msgstr ""
+msgstr "프로ì íŠ¸ 아바타"
msgid "Project avatar in repository: %{link}"
-msgstr ""
+msgstr "ì €ìž¥ì†Œì˜ í”„ë¡œì íŠ¸ 아바타: %{link}"
msgid "Project details"
msgstr "프로ì íŠ¸ ìƒì„¸"
@@ -3561,9 +4968,27 @@ msgstr "프로ì íŠ¸ 내보내기 ë§í¬ê°€ 만료ë˜ì—ˆìŠµë‹ˆë‹¤. 프로ì íŠ¸
msgid "Project export started. A download link will be sent by email."
msgstr "프로ì íŠ¸ 내보내기가 시작ë˜ì—ˆìŠµë‹ˆë‹¤. 다운로드 ë§í¬ëŠ” ì´ë©”ì¼ë¡œ 전송ë©ë‹ˆë‹¤."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "구ë…"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "ì´ë¦„"
@@ -3573,28 +4998,85 @@ msgstr "Never"
msgid "ProjectLifecycle|Stage"
msgstr "스테ì´ì§•"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
-msgid "ProjectsDropdown|Frequently visited"
+msgid "Projects shared with %{group_name}"
msgstr ""
+msgid "ProjectsDropdown|Frequently visited"
+msgstr "ìžì£¼ 방문"
+
msgid "ProjectsDropdown|Loading projects"
msgstr ""
msgid "ProjectsDropdown|Projects you visit often will appear here"
-msgstr ""
+msgstr "ìžì£¼ 방문하는 프로ì íŠ¸ëŠ” ì—¬ê¸°ì— í‘œì‹œë©ë‹ˆë‹¤"
msgid "ProjectsDropdown|Search your projects"
msgstr ""
msgid "ProjectsDropdown|Something went wrong on our end."
-msgstr ""
+msgstr "문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3621,9 +5103,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3636,21 +5127,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3675,21 +5169,39 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
-msgid "Protip:"
+msgid "Promotions|Don't show me this again"
msgstr ""
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
+msgid "Protip:"
+msgstr "Protip:"
+
msgid "Provider"
msgstr ""
-msgid "Public - The group and any public projects can be viewed without any authentication."
+msgid "Pseudonymizer data collection"
msgstr ""
+msgid "Public - The group and any public projects can be viewed without any authentication."
+msgstr "공개 - ì´ ê·¸ë£¹ê³¼ 모든 공개 프로ì íŠ¸ë“¤ì€ ì–´ë–¤ ì¸ì¦ ì—†ì´ë„ ë³¼ 수 있습니다."
+
msgid "Public - The project can be accessed without any authentication."
-msgstr ""
+msgstr "공개 - ì´ í”„ë¡œì íŠ¸ëŠ” ì–´ë–¤ ì¸ì¦ ì—†ì´ë„ 접근할 수 있습니다."
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr "푸쉬 ì´ë²¤íŠ¸"
@@ -3699,15 +5211,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
msgstr ""
-msgid "Re-deploy"
+msgid "Pushed"
msgstr ""
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
+msgstr ""
+
+msgid "Quick actions can be used in the issues description and comment boxes."
+msgstr "Quick actionì€ ì´ìŠˆ 설명ì´ë‚˜ 댓글 박스ì—ì„œ 사용 가능합니다."
+
msgid "Read more"
msgstr "ë” ì½ê¸°"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr ""
@@ -3717,9 +5241,12 @@ msgstr ""
msgid "Reference:"
msgstr ""
-msgid "Register / Sign In"
+msgid "Refresh"
msgstr ""
+msgid "Register / Sign In"
+msgstr "ë“±ë¡ / 로그ì¸"
+
msgid "Register and see your runners for this group."
msgstr ""
@@ -3742,10 +5269,10 @@ msgid "Related Jobs"
msgstr "관련 Jobs"
msgid "Related Merge Requests"
-msgstr "관련 머지 리퀘스트"
+msgstr "관련 머지 리퀘스트(MR)"
msgid "Related Merged Requests"
-msgstr "관련 머지 리퀘스트"
+msgstr "관련 머지 리퀘스트(MR)"
msgid "Related merge requests"
msgstr ""
@@ -3768,12 +5295,27 @@ msgstr ""
msgid "Remove project"
msgstr "프로ì íŠ¸ ì‚­ì œ"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3783,9 +5325,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "액세스 요청"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3807,6 +5355,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3821,31 +5372,40 @@ msgstr ""
msgid "Reveal value"
msgid_plural "Reveal values"
-msgstr[0] ""
+msgstr[0] "값 표시"
msgid "Revert this commit"
msgstr "ì´ ì»¤ë°‹ ë˜ëŒë¦¬ê¸°"
msgid "Revert this merge request"
-msgstr "ì´ ë¨¸ì§€ 리퀘스트 ë˜ëŒë¦¬ê¸°"
+msgstr "ì´ ë¨¸ì§€ 리퀘스트(MR) ë˜ëŒë¦¬ê¸°"
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
msgstr ""
msgid "Runners"
-msgstr ""
+msgstr "Runners"
msgid "Runners API"
msgstr ""
@@ -3856,15 +5416,33 @@ msgstr ""
msgid "Running"
msgstr ""
-msgid "SSH Keys"
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
msgstr ""
+msgid "SSH Keys"
+msgstr "SSH 키"
+
msgid "SSL Verification"
msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3872,7 +5450,7 @@ msgid "Save pipeline schedule"
msgstr "파ì´í”„ë¼ì¸ 스케줄 저장"
msgid "Save variables"
-msgstr ""
+msgstr "변수 저장"
msgid "Schedule a new pipeline"
msgstr "새로운 파ì´í”„ë¼ì¸ 스케줄 잡기"
@@ -3886,6 +5464,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr "파ì´í”„ë¼ì¸ 스케줄ë§"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3914,15 +5501,30 @@ msgid "Search milestones"
msgstr ""
msgid "Search project"
-msgstr ""
+msgstr "프로ì íŠ¸ 검색"
msgid "Search users"
-msgstr ""
+msgstr "ì‚¬ìš©ìž ê²€ìƒ‰"
msgid "Seconds before reseting failure information"
-msgstr ""
+msgstr "실패 정보를 리셋하기까지 ë‚¨ì€ ì‹œê°„(ì´ˆ)"
msgid "Seconds to wait for a storage access attempt"
+msgstr "저장공간 ì ‘ê·¼ ì‹œë„를 위해 대기할 시간 (ì´ˆ)"
+
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
msgstr ""
msgid "Select"
@@ -3941,7 +5543,7 @@ msgid "Select an existing Kubernetes cluster or create a new one"
msgstr ""
msgid "Select assignee"
-msgstr ""
+msgstr "ë‹´ë‹¹ìž ì„ íƒ"
msgid "Select branch/tag"
msgstr ""
@@ -3955,12 +5557,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr "ëŒ€ìƒ ë¸Œëžœì¹˜ ì„ íƒ"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -3973,7 +5584,13 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
+msgstr "서비스 템플릿"
+
+msgid "Service URL"
msgstr ""
msgid "Session expiration, projects limit and attachment size."
@@ -4000,21 +5617,39 @@ msgstr ""
msgid "Set up Koding"
msgstr "Koding 설정"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "패스워드 설정"
msgid "Settings"
-msgstr ""
+msgstr "설정"
msgid "Setup a specific Runner automatically"
-msgstr ""
+msgstr "특정 Runner ìžë™ 설정"
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4028,10 +5663,10 @@ msgid "Show latest version of the diff"
msgstr ""
msgid "Show parent pages"
-msgstr ""
+msgstr "부모 페ì´ì§€ 보기"
msgid "Show parent subgroups"
-msgstr ""
+msgstr "부모 하위 그룹 보기"
msgid "Show whitespace changes"
msgstr ""
@@ -4043,6 +5678,30 @@ msgstr[0] "%d ê°œì˜ ì´ë²¤íŠ¸ 표시 중"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4055,14 +5714,17 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
msgid "Snippets"
-msgstr ""
+msgstr "스니펫"
msgid "Something went wrong on our end"
-msgstr ""
+msgstr "문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤"
msgid "Something went wrong on our end."
msgstr ""
@@ -4071,17 +5733,23 @@ msgid "Something went wrong on our end. Please try again!"
msgstr ""
msgid "Something went wrong when toggling the button"
-msgstr ""
+msgstr "ë²„íŠ¼ì„ í† ê¸€í•˜ë˜ ì¤‘ 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
-msgid "Something went wrong while fetching the projects."
+msgid "Something went wrong while fetching assignees list"
msgstr ""
-msgid "Something went wrong while fetching the registry list."
+msgid "Something went wrong while fetching group member contributions"
msgstr ""
+msgid "Something went wrong while fetching the projects."
+msgstr "프로ì íŠ¸ë¥¼ 가져오는 ë™ì•ˆ 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤."
+
+msgid "Something went wrong while fetching the registry list."
+msgstr "레지스트리 목ë¡ì„ 가져오는 ë™ì•ˆ 문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤"
+
msgid "Something went wrong while reopening the %{issuable}. Please try again later"
msgstr ""
@@ -4089,16 +5757,19 @@ msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
msgid "Something went wrong. Please try again."
+msgstr "문제가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„해주세요."
+
+msgid "Sorry, no epics matched your search"
msgstr ""
msgid "Sort by"
msgstr ""
msgid "SortOptions|Access level, ascending"
-msgstr ""
+msgstr "권한 레벨, 오름차순"
msgid "SortOptions|Access level, descending"
-msgstr ""
+msgstr "권한 레벨, 내림차순"
msgid "SortOptions|Created date"
msgstr ""
@@ -4133,6 +5804,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4142,6 +5816,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4161,7 +5838,7 @@ msgid "SortOptions|Oldest joined"
msgstr ""
msgid "SortOptions|Oldest sign in"
-msgstr ""
+msgstr "ë¡œê·¸ì¸ ìˆœ"
msgid "SortOptions|Oldest updated"
msgstr ""
@@ -4176,13 +5853,16 @@ msgid "SortOptions|Recent sign in"
msgstr ""
msgid "SortOptions|Start later"
-msgstr ""
+msgstr "ì´ì „ 시작"
msgid "SortOptions|Start soon"
+msgstr "최근 시작"
+
+msgid "SortOptions|Weight"
msgstr ""
msgid "Source"
-msgstr ""
+msgstr "소스"
msgid "Source (branch or tag)"
msgstr ""
@@ -4191,10 +5871,10 @@ msgid "Source code"
msgstr "소스 코드"
msgid "Source is not available"
-msgstr ""
+msgstr "소스를 사용할 수 없습니다."
msgid "Spam Logs"
-msgstr ""
+msgstr "스팸 로그"
msgid "Spam and Anti-bot Protection"
msgstr ""
@@ -4239,7 +5919,7 @@ msgid "Starred Projects' Activity"
msgstr ""
msgid "Starred projects"
-msgstr ""
+msgstr "ë³„í‘œëœ í”„ë¡œì íŠ¸"
msgid "Start a %{new_merge_request} with these changes"
msgstr "ì´ ë³€ê²½ 사항으로 %{new_merge_request} ì„ ì‹œìž‘í•˜ì‹­ì‹œì˜¤."
@@ -4253,21 +5933,36 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
msgid "Stopped"
-msgstr ""
+msgstr "중지"
msgid "Storage"
+msgstr "스토리지"
+
+msgid "Storage:"
msgstr ""
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4280,9 +5975,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "스위치 브랜치/태그"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4294,43 +6001,43 @@ msgid "Tags:"
msgstr ""
msgid "TagsPage|Browse commits"
-msgstr ""
+msgstr "커밋 찾아보기"
msgid "TagsPage|Browse files"
-msgstr ""
+msgstr "íŒŒì¼ ëª©ë¡"
msgid "TagsPage|Can't find HEAD commit for this tag"
-msgstr ""
+msgstr "ì´ íƒœê·¸ì— ëŒ€í•œ HEAD ì»¤ë°‹ì„ ì°¾ì„ ìˆ˜ 없습니다."
msgid "TagsPage|Cancel"
-msgstr ""
+msgstr "취소"
msgid "TagsPage|Create tag"
-msgstr ""
+msgstr "태그 ìƒì„±"
msgid "TagsPage|Delete tag"
-msgstr ""
+msgstr "태그 삭졔"
msgid "TagsPage|Deleting the %{tag_name} tag cannot be undone. Are you sure?"
-msgstr ""
+msgstr "'%{tag_name}' 태그를 삭제하면 ë˜ëŒë¦´ 수 없습니다. 괜찮습니까?"
msgid "TagsPage|Edit release notes"
-msgstr ""
+msgstr "Release Note 편집"
msgid "TagsPage|Existing branch name, tag, or commit SHA"
-msgstr ""
+msgstr "기존 브랜치 ì´ë¦„, 태그 ë˜ëŠ” 커밋 SHA"
msgid "TagsPage|Filter by tag name"
-msgstr ""
+msgstr "태그 ì´ë¦„으로 í•„í„°ë§"
msgid "TagsPage|New Tag"
-msgstr ""
+msgstr "새 태그"
msgid "TagsPage|New tag"
-msgstr ""
+msgstr "새 태그"
msgid "TagsPage|Optionally, add a message to the tag."
-msgstr ""
+msgstr "ì„ íƒì ìœ¼ë¡œ íƒœê·¸ì— ë©”ì‹œì§€ë¥¼ 추가하십시오."
msgid "TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page."
msgstr ""
@@ -4339,7 +6046,7 @@ msgid "TagsPage|Release notes"
msgstr ""
msgid "TagsPage|Repository has no tags yet."
-msgstr ""
+msgstr "ì €ìž¥ì†Œì— ì•„ì§ íƒœê·¸ê°€ 없습니다."
msgid "TagsPage|Sort by"
msgstr ""
@@ -4348,7 +6055,7 @@ msgid "TagsPage|Tags"
msgstr ""
msgid "TagsPage|Tags give the ability to mark specific points in history as being important"
-msgstr ""
+msgstr "태그는 특정 지ì ì„ 중요하다고 표시하는 기능입니다."
msgid "TagsPage|This tag has no release notes."
msgstr ""
@@ -4380,18 +6087,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
-msgstr "Coding Stage는 첫 번째 커밋ì—서부터 머지 리퀘스트 ìƒì„±ê¹Œì§€ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. 첫 번째 머지 ë¦¬í€˜ìŠ¤íŠ¸ì„ ìƒì„±í•˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ ì—¬ê¸°ì— ì¶”ê°€ë©ë‹ˆë‹¤."
+msgstr "Coding Stage는 첫 번째 커밋ì—서부터 머지 리퀘스트(MR) ìƒì„±ê¹Œì§€ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. 첫 번째 머지 리퀘스트(MR)ì„ ìƒì„±í•˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ ì—¬ê¸°ì— ì¶”ê°€ë©ë‹ˆë‹¤."
msgid "The collection of events added to the data gathered for that stage."
msgstr "해당 단계ì—ì„œ 수집 ëœ ë°ì´í„°ê°€ ì´ë²¤íŠ¸ 모ìŒì— 추가ë˜ì—ˆìŠµë‹ˆë‹¤."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "í¬í¬ 관계가 제거ë˜ì—ˆìŠµë‹ˆë‹¤."
@@ -4405,9 +6124,12 @@ msgid "The maximum file size allowed is 200KB."
msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
+msgstr "ì €ìž¥ê³µê°„ì— ì ‘ê·¼í•˜ê¸° 위해 GitLabì´ ì‹œë„í•  횟수"
+
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4419,6 +6141,9 @@ msgstr "개발 ìˆ˜ëª…ì£¼ê¸°ì˜ ë‹¨ê³„."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "ê³„íš ë‹¨ê³„ì—서는 ì´ì „ 단계ì—ì„œ 첫 번째 커밋 ì‹œê°„ì´ í‘œì‹œë©ë‹ˆë‹¤. ì´ ì‹œê°„ì€ ì²« 번째 ì»¤ë°‹ì„ ëˆ„ë¥´ë©´ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "프로ë•ì…˜ 단계ì—서는 문제를 만들고 코드를 프로ë•ì…˜ 환경으로 ë°°í¬í•˜ëŠ” ë° ê±¸ë¦¬ëŠ” ì´ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. ìƒì‚°ì£¼ê¸°ì— 대한 완전한 ì•„ì´ë””어를 ì–»ì€ í›„ì—는 ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
@@ -4428,6 +6153,9 @@ msgstr "ì´ í”„ë¡œì íŠ¸ëŠ” ë¡œê·¸ì¸ í•œ 사용ìžê°€ë§Œ 액세스 í•  수 있ì
msgid "The project can be accessed without any authentication."
msgstr "ì´ í”„ë¡œì íŠ¸ëŠ” ì¸ì¦ì—†ì´ 액세스 í•  수 있습니다."
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "ì´ í”„ë¡œì íŠ¸ì˜ 저장소가 존재하지 않습니다."
@@ -4438,7 +6166,10 @@ msgid "The repository must be accessible over <code>http://</code>, <code>https:
msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
-msgstr "Review 단계ì—서는 머지 리퀘스트를 작성한 후 ë¨¸ì§€í•˜ê¸°ê¹Œì§€ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. ë°ì´í„°ëŠ” 첫 번째 머지 ë¦¬í€˜ìŠ¤íŠ¸ì„ ë¨¸ì§€ í•œ í›„ì— ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
+msgstr "Review 단계ì—서는 머지 리퀘스트(MR)를 작성한 후 ë¨¸ì§€í•˜ê¸°ê¹Œì§€ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. ë°ì´í„°ëŠ” 첫 번째 머지 리퀘스트(MR)ì„ ë¨¸ì§€ í•œ í›„ì— ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
+
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4447,20 +6178,26 @@ msgid "The staging stage shows the time between merging the MR and deploying cod
msgstr "Staging 단계ì—서는 MR 머지과 프로ë•ì…˜ í™˜ê²½ì— ì½”ë“œ ë°°í¬ ì‚¬ì´ì˜ ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. ë°ì´í„°ë¥¼ Production í™˜ê²½ì— ì²˜ìŒ ë°°í¬í•˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
msgid "The testing stage shows the time GitLab CI takes to run every pipeline for the related merge request. The data will automatically be added after your first pipeline finishes running."
-msgstr "테스트 단계ì—서는 GitLab CIê°€ 관련 머지 ë¦¬í€˜ìŠ¤íŠ¸ì„ ìœ„í•´ 모든 파ì´í”„ë¼ì¸ì„ 실행하는 ë° ê±¸ë¦¬ëŠ” ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. 첫 번째 파ì´í”„ë¼ì¸ ì‹¤í–‰ì´ ì™„ë£Œë˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
+msgstr "테스트 단계ì—서는 GitLab CIê°€ 관련 머지 리퀘스트(MR)ì„ ìœ„í•´ 모든 파ì´í”„ë¼ì¸ì„ 실행하는 ë° ê±¸ë¦¬ëŠ” ì‹œê°„ì„ ë³´ì—¬ì¤ë‹ˆë‹¤. 첫 번째 파ì´í”„ë¼ì¸ ì‹¤í–‰ì´ ì™„ë£Œë˜ë©´ ë°ì´í„°ê°€ ìžë™ìœ¼ë¡œ 추가ë©ë‹ˆë‹¤."
msgid "The time in seconds GitLab will keep failure information. When no failures occur during this time, information about the mount is reset."
-msgstr ""
+msgstr "GitLabì´ ì‹¤íŒ¨ 정보를 보관하는 시간(ì´ˆ). ì´ ì‹œê°„ë™ì•ˆ 실패가 ë°œìƒí•˜ì§€ 않으면 ë§ˆìš´íŠ¸ì— ëŒ€í•œ 정보는 리셋ë©ë‹ˆë‹¤."
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
-msgstr ""
+msgstr "GitLabì´ ì €ìž¥ê³µê°„ì— ì ‘ê·¼ì„ ì‹œë„하는 시간(ì´ˆ). ì´ ì‹œê°„ ì´í›„ timeout ì—러가 ë°œìƒí•©ë‹ˆë‹¤."
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "해당 단계ì—ì„œ 수집 í•œ ê° ë°ì´í„° ìž…ë ¥ì— ì†Œìš” ëœ ì‹œê°„"
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "ê°’ì€ ì¼ë ¨ì˜ 관측 ê°’ 중ì ì— 있습니다. 예를 들어, 3, 5, 9 사ì´ì˜ 중간 ê°’ì€ 5입니다. 3, 5, 7, 8 사ì´ì˜ 중간 ê°’ì€ (5 + 7) / 2 = 6입니다."
@@ -4476,12 +6213,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr "git storageì— ì ‘ê·¼í•˜ëŠ”ë° ë¬¸ì œê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤. "
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4503,32 +6234,50 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
msgid "This is a confidential issue."
-msgstr ""
+msgstr "비밀 ì´ìŠˆìž…니다."
msgid "This is the author's first Merge Request to this project."
-msgstr ""
+msgstr "ì´ ì €ìžì˜ ì´ í”„ë¡œì íŠ¸ì— 대한 첫번째 머지 리퀘스트(MR) 입니다."
msgid "This issue is confidential"
msgstr ""
msgid "This issue is confidential and locked."
-msgstr ""
+msgstr "ì´ ì´ìŠˆëŠ” confidential ì´ê³  잠금 ìƒíƒœìž…니다."
msgid "This issue is locked."
-msgstr ""
+msgstr "ì´ ì´ìŠˆëŠ” lock ë˜ì—ˆìŠµë‹ˆë‹¤."
msgid "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
msgstr ""
@@ -4552,7 +6301,7 @@ msgid "This job has not started yet"
msgstr ""
msgid "This job is in pending state and is waiting to be picked by a runner"
-msgstr ""
+msgstr "ì´ ìž‘ì—…ì€ ëŒ€ê¸° ìƒíƒœì´ë©° Runnerê°€ 실행하기를 기다리고 있습니다."
msgid "This job requires a manual action"
msgstr ""
@@ -4561,7 +6310,7 @@ msgid "This means you can not push code until you create an empty repository or
msgstr "즉, 빈 저장소를 만들거나 기존 저장소를 가져올 때까지 코드를 Push 할 수 없습니다."
msgid "This merge request is locked."
-msgstr ""
+msgstr "ì´ ë¨¸ì§€ 리퀘스트(MR)는 잠겨있습니다."
msgid "This option is disabled while you still have unstaged changes"
msgstr ""
@@ -4579,7 +6328,7 @@ msgid "This project does not belong to a group and can therefore not make use of
msgstr ""
msgid "This repository"
-msgstr ""
+msgstr "ì´ ì €ìž¥ì†Œ"
msgid "This source diff could not be displayed because it is too large."
msgstr ""
@@ -4587,6 +6336,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "ì´ìŠˆê°€ 스케줄ë˜ê¸° ì „ì˜ ì‹œê°„"
@@ -4594,7 +6349,10 @@ msgid "Time before an issue starts implementation"
msgstr "ì´ìŠˆê°€ 구현ë˜ê¸° ì „ì˜ ì‹œê°„"
msgid "Time between merge request creation and merge/close"
-msgstr "머지 리퀘스트 ìƒì„±ê³¼ 머지 / 닫기 사ì´ì˜ 시간"
+msgstr "머지 리퀘스트(MR) ìƒì„±ê³¼ 머지 / 닫기 사ì´ì˜ 시간"
+
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
msgid "Time remaining"
msgstr ""
@@ -4606,16 +6364,16 @@ msgid "Time tracking"
msgstr ""
msgid "Time until first merge request"
-msgstr "첫 번째 머지 ë¦¬í€˜ìŠ¤íŠ¸ê¹Œì§€ì˜ ì‹œê°„"
+msgstr "첫 번째 머지 리퀘스트(MR)ê¹Œì§€ì˜ ì‹œê°„"
msgid "TimeTrackingEstimated|Est"
-msgstr ""
+msgstr "Est"
msgid "TimeTracking|Estimated:"
-msgstr ""
+msgstr "ì˜ˆìƒ ì‹œê°„:"
msgid "TimeTracking|Spent"
-msgstr ""
+msgstr "소비ë¨"
msgid "Timeago|%s days ago"
msgstr "%s ì¼ ì „"
@@ -4760,12 +6518,30 @@ msgstr "ì´ˆ"
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4775,33 +6551,60 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
-msgid "Toggle sidebar"
+msgid "Toggle navigation"
msgstr ""
+msgid "Toggle sidebar"
+msgstr "사ì´ë“œë°” 토글"
+
msgid "ToggleButton|Toggle Status: OFF"
-msgstr ""
+msgstr "토글 ìƒíƒœ: OFF"
msgid "ToggleButton|Toggle Status: ON"
-msgstr ""
+msgstr "토글 ìƒíƒœ: ON"
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "시간 합계:"
@@ -4811,9 +6614,18 @@ msgstr "모든 커밋 / ë¨¸ì§€ì˜ ì´ í…ŒìŠ¤íŠ¸ 시간"
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4823,9 +6635,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4866,15 +6690,32 @@ msgid "Unverified"
msgstr ""
msgid "Up to date"
-msgstr ""
+msgstr "최신 ìƒíƒœìž…니다"
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "새 íŒŒì¼ ì—…ë¡œë“œ"
@@ -4882,7 +6723,7 @@ msgid "Upload file"
msgstr "íŒŒì¼ ì—…ë¡œë“œ"
msgid "Upload new avatar"
-msgstr ""
+msgstr "새 아바타 업로드"
msgid "UploadLink|click to upload"
msgstr "업로드하려면 í´ë¦­í•˜ì‹­ì‹œì˜¤."
@@ -4893,18 +6734,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "설정 ì¤‘ì— ë‹¤ìŒ ë“±ë¡ í† í° ì´ìš© : "
msgid "Use your global notification setting"
msgstr "전체 알림 설정 사용"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4912,7 +6771,7 @@ msgid "Variables"
msgstr ""
msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want."
-msgstr ""
+msgstr "변수는 runner를 통해 í™˜ê²½ì— ì ìš©ë©ë‹ˆë‹¤. 변수는 ë³´í˜¸ëœ ë¸Œëžœì¹˜ë‚˜ 태그ì—만 노출하여 보호할 수 있습니다. 비밀번호, 암호키, ë˜ëŠ” ì›í•˜ëŠ”대로 변수를 사용할 수 있습니다."
msgid "Various container registry settings."
msgstr ""
@@ -4923,36 +6782,54 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
msgid "View labels"
-msgstr ""
+msgstr "ë¼ë²¨ë³´ê¸°"
msgid "View log"
msgstr ""
msgid "View open merge request"
-msgstr "열린 머지 리퀘스트보기"
+msgstr "열린 머지 리퀘스트(MR)보기"
msgid "View project labels"
msgstr ""
msgid "View replaced file @ "
-msgstr ""
+msgstr "êµì²´ëœ íŒŒì¼ ë³´ê¸° @ "
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "내부"
@@ -4968,6 +6845,9 @@ msgstr "ì•Œ 수 ì—†ìŒ"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "ì´ ë°ì´í„°ë¥¼ ë³´ê³  싶ì€ê°€ìš”? 관리ìžì—게 액세스 ê¶Œí•œì„ ìš”ì²­í•˜ì„¸ìš”."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "ì´ ë‹¨ê³„ë¥¼ ë³´ì—¬ì£¼ê¸°ì— ì¶©ë¶„í•œ ë°ì´í„°ê°€ 없습니다."
@@ -4980,29 +6860,44 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
-msgid "Wiki"
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
msgstr ""
+msgid "Wiki"
+msgstr "위키"
+
msgid "WikiClone|Clone your wiki"
-msgstr ""
+msgstr "위키 Clone"
msgid "WikiClone|Git Access"
-msgstr ""
+msgstr "Git ì ‘ê·¼"
msgid "WikiClone|Install Gollum"
-msgstr ""
+msgstr "Gollum 설치"
msgid "WikiClone|It is recommended to install %{markdown} so that GFM features render locally:"
-msgstr ""
+msgstr "GFMì´ ë¡œì»¬ì—ì„œ ë Œë”ë§ ë˜ë„ë¡ %{markdown} 설치를 추천합니다."
msgid "WikiClone|Start Gollum and edit locally"
-msgstr ""
+msgstr "Gollumì„ ì‹œìž‘í•˜ê³  로컬 편집"
msgid "WikiEditPageTip|Tip: You can move this page by adding the path to the beginning of the title."
msgstr ""
@@ -5038,37 +6933,37 @@ msgid "WikiEmpty|You must be a project member in order to add wiki pages."
msgstr ""
msgid "WikiHistoricalPage|This is an old version of this page."
-msgstr ""
+msgstr "ì´ íŽ˜ì´ì§€ì˜ old 버전입니다."
msgid "WikiHistoricalPage|You can view the %{most_recent_link} or browse the %{history_link}."
-msgstr ""
+msgstr "%{most_recent_link} ì„ ë³´ê±°ë‚˜ %{history_link} 를 찾아볼 수 있습니다."
msgid "WikiHistoricalPage|history"
-msgstr ""
+msgstr "ì´ë ¥"
msgid "WikiHistoricalPage|most recent version"
-msgstr ""
+msgstr "최신 버전"
msgid "WikiMarkdownDocs|More examples are in the %{docs_link}"
-msgstr ""
+msgstr "ë” ë§Žì€ ì˜ˆì œëŠ” %{docs_link}"
msgid "WikiMarkdownDocs|documentation"
-msgstr ""
+msgstr "문서"
msgid "WikiMarkdownTip|To link to a (new) page, simply type %{link_example}"
-msgstr ""
+msgstr "(새로운) 페ì´ì§€ì— ì—°ê²° 하려면, %{link_example} ë§í¬ë¥¼ 입력하세요."
msgid "WikiNewPagePlaceholder|how-to-setup"
-msgstr ""
+msgstr "설정 방법"
msgid "WikiNewPageTip|Tip: You can specify the full path for the new file. We will automatically create any missing directories."
-msgstr ""
+msgstr "íŒ: 새로운 파ì¼ì— 대한 full path를 지정할 수 있습니다. 존재하지 않는 ë””ë ‰í† ë¦¬ë“¤ì€ ìžë™ì ìœ¼ë¡œ ìƒì„±ë©ë‹ˆë‹¤."
msgid "WikiNewPageTitle|New Wiki Page"
-msgstr ""
+msgstr "새 위키 페ì´ì§€"
msgid "WikiPageConfirmDelete|Are you sure you want to delete this page?"
-msgstr ""
+msgstr "ì´ íŽ˜ì´ì§€ë¥¼ 삭제하시겠습니까?"
msgid "WikiPageConfirmDelete|Delete page"
msgstr ""
@@ -5077,48 +6972,51 @@ msgid "WikiPageConfirmDelete|Delete page %{pageTitle}?"
msgstr ""
msgid "WikiPageConflictMessage|Someone edited the page the same time you did. Please check out %{page_link} and make sure your changes will not unintentionally remove theirs."
-msgstr ""
+msgstr "ë™ì‹œì— 누군가가 ì´ íŽ˜ì´ì§€ë¥¼ 수정했습니다. %{page_link} 페ì´ì§€ë¥¼ ì²´í¬ì•„웃하여 ë‹¹ì‹ ì˜ ìˆ˜ì •ì‚¬í•­ë“¤ì´ ì˜ë„치 않게 다른 ì´ì˜ ìˆ˜ì •ì‚¬í•­ë“¤ì„ ì œê±°í•˜ì§€ ì•Šë„ë¡ í•´ì£¼ì„¸ìš”."
msgid "WikiPageConflictMessage|the page"
-msgstr ""
+msgstr "페ì´ì§€"
msgid "WikiPageCreate|Create %{page_title}"
-msgstr ""
+msgstr "%{page_title} 작성"
msgid "WikiPageEdit|Update %{page_title}"
-msgstr ""
+msgstr "%{page_title} ì—…ë°ì´íŠ¸"
msgid "WikiPage|Page slug"
-msgstr ""
+msgstr "페ì´ì§€ slug"
msgid "WikiPage|Write your content or drag files here…"
msgstr ""
msgid "Wiki|Create Page"
-msgstr ""
+msgstr "페ì´ì§€ 만들기"
msgid "Wiki|Create page"
-msgstr ""
+msgstr "페ì´ì§€ 만들기"
msgid "Wiki|Edit Page"
-msgstr ""
+msgstr "페ì´ì§€ 편집"
msgid "Wiki|More Pages"
-msgstr ""
+msgstr "ë” ë§Žì€ íŽ˜ì´ì§€"
msgid "Wiki|New page"
-msgstr ""
+msgstr "새 페ì´ì§€"
msgid "Wiki|Page history"
-msgstr ""
+msgstr "페ì´ì§€ ì´ë ¥"
msgid "Wiki|Page version"
-msgstr ""
+msgstr "페ì´ì§€ 버전"
msgid "Wiki|Pages"
-msgstr ""
+msgstr "페ì´ì§€"
msgid "Wiki|Wiki Pages"
+msgstr "위키 페ì´ì§€"
+
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
msgstr ""
msgid "Withdraw Access Request"
@@ -5127,6 +7025,15 @@ msgstr "액세스 요청 철회"
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "%{group_name} ê·¸ë£¹ì„ ì œê±°í•˜ë ¤ê³ í•©ë‹ˆë‹¤. \\\"ì •ë§ë¡œ\\\" 확실합니까?"
@@ -5142,6 +7049,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5154,9 +7064,12 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
-msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
+msgid "You can easily contribute to them by requesting to join these groups."
msgstr ""
+msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
+msgstr "Kubernetes í´ëŸ¬ìŠ¤í„°ì— Runner를 쉽게 설치할 수 있습니다. %{link_to_help_page}"
+
msgid "You can move around the graph by using the arrow keys."
msgstr ""
@@ -5169,12 +7082,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
-msgid "You cannot write to this read-only GitLab instance."
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
msgstr ""
+msgid "You cannot write to this read-only GitLab instance."
+msgstr "ì½ê¸° ì „ìš© GitLab ì¸ìŠ¤í„´ìŠ¤ì—는 쓰기가 불가능합니다."
+
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5193,6 +7118,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "프로ì íŠ¸ì— 별표를 표시하려면 ë¡œê·¸ì¸ í•´ì•¼ 합니다."
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "ê¶Œí•œì´ í•„ìš”í•©ë‹ˆë‹¤."
@@ -5223,9 +7154,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5241,6 +7181,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5248,10 +7194,10 @@ msgid "Your changes have been committed. Commit %{commitId} %{commitStats}"
msgstr ""
msgid "Your comment will not be visible to the public."
-msgstr ""
+msgstr "ëŒ“ê¸€ì´ ê³µê°œì— í‘œì‹œë˜ì§€ 않습니다."
msgid "Your groups"
-msgstr ""
+msgstr "ë‹¹ì‹ ì˜ ê·¸ë£¹"
msgid "Your name"
msgstr "ê·€í•˜ì˜ ì´ë¦„"
@@ -5265,18 +7211,238 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+
msgid "assign yourself"
-msgstr ""
+msgstr "ìžì‹ ì„ 담당ìžë¡œ 지정"
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "ì¼"
@@ -5284,9 +7450,23 @@ msgstr[0] "ì¼"
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5296,12 +7476,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5318,9 +7516,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5361,7 +7574,7 @@ msgid "mrWidget|Failed to load deployment statistics"
msgstr ""
msgid "mrWidget|If the %{branch} branch exists in your local repository, you can merge this merge request manually using the"
-msgstr ""
+msgstr "mrWidget %{branch} 브랜치가 로컬 ì €ìž¥ì†Œì— ìžˆìœ¼ë©´ ì´ ë¨¸ì§€ 리퀘스트(MR)를 다ìŒê³¼ ê°™ì´ ìˆ˜ë™ìœ¼ë¡œ 머지할 수 있습니다."
msgid "mrWidget|If the %{missingBranchName} branch exists in your local repository, you can merge this merge request manually using the command line"
msgstr ""
@@ -5381,9 +7594,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5402,6 +7630,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5453,9 +7684,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5475,22 +7703,25 @@ msgid "mrWidget|to be merged automatically when the pipeline succeeds"
msgstr ""
msgid "new merge request"
-msgstr "새 머지 리퀘스트"
+msgstr "새 머지 리퀘스트(MR)"
msgid "notification emails"
msgstr "알림 ì´ë©”ì¼"
msgid "or"
-msgstr ""
+msgstr "ë˜ëŠ”"
msgid "parent"
msgid_plural "parents"
msgstr[0] "부모"
msgid "password"
-msgstr ""
+msgstr "패스워드"
msgid "personal access token"
+msgstr "ê°œì¸ ì—‘ì„¸ìŠ¤ 토í°"
+
+msgid "private key does not match certificate."
msgstr ""
msgid "remaining"
@@ -5499,19 +7730,31 @@ msgstr ""
msgid "remove due date"
msgstr ""
-msgid "source"
+msgid "remove weight"
msgstr ""
+msgid "source"
+msgstr "소스"
+
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
+msgstr "%{slash_command} 소요 ëœ ì‹œê°„ì˜ í•©ê³„ë¥¼ ì—…ë°ì´íŠ¸í•©ë‹ˆë‹¤."
+
+msgid "started"
msgstr ""
msgid "this document"
msgstr ""
-msgid "username"
+msgid "to help your contributors communicate effectively!"
msgstr ""
+msgid "username"
+msgstr "사용ìžëª…"
+
msgid "uses Kubernetes clusters to deploy your code!"
+msgstr "kubernetes í´ëŸ¬ìŠ¤í„°ë¥¼ 사용하여 코드를 ë°°í¬í•©ë‹ˆë‹¤!"
+
+msgid "view it on GitLab"
msgstr ""
msgid "with %{additions} additions, %{deletions} deletions."
diff --git a/locale/nl_NL/gitlab.po b/locale/nl_NL/gitlab.po
index 174fb63c55f..3e1250a3265 100644
--- a/locale/nl_NL/gitlab.po
+++ b/locale/nl_NL/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
@@ -15,12 +13,26 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
-msgid "%d changed file"
-msgid_plural "%d changed files"
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
msgstr[0] ""
msgstr[1] ""
+msgid "%d changed file"
+msgid_plural "%d changed files"
+msgstr[0] "%d gewijzigd bestand"
+msgstr[1] "%d gewijzigde bestanden"
+
msgid "%d commit"
msgid_plural "%d commits"
msgstr[0] "%d commit"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s andere commit is weggelaten om prestatieproblemen te voorkomen."
@@ -77,10 +99,13 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%{count} deelnemer"
+msgstr[1] "%{count} deelnemers"
msgid "%{filePath} deleted"
msgstr ""
@@ -94,11 +119,14 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
-msgid "%{nip_domain} can be used as an alternative to a custom domain."
+msgid "%{name}'s avatar"
msgstr ""
+msgid "%{nip_domain} can be used as an alternative to a custom domain."
+msgstr "%{nip_domain} kan worden gebruikt als een alternatief voor een eigen domein."
+
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
-msgstr ""
+msgstr "%{number_commits_behind} commits achter %{default_branch}, %{number_commits_ahead} commits voor"
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt."
msgstr ""
@@ -117,18 +145,25 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] ""
msgstr[1] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(bekijk de %{link} voor meer info over hoe je het kan installeren)."
-
msgid "+ %{moreCount} more"
msgstr ""
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "Over auto deploy"
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Misbruik rapporten"
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Toegangstokens"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr "Activiteit"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "Changelog toevoegen"
msgid "Add Contribution guide"
msgstr ""
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr "Licentie toevoegen"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Nieuwe map toevoegen"
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr "Uiterlijk"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "Applicaties"
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr ""
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -529,12 +735,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr "Auteur"
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -804,9 +1118,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -828,6 +1148,9 @@ msgstr "Door bestanden bladeren"
msgid "Browse files"
msgstr "Door bestanden bladeren"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "door"
@@ -837,9 +1160,15 @@ msgstr "CI / CD"
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr "Cherry-pick deze commit"
msgid "Cherry-pick this merge request"
msgstr ""
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "geannuleerd"
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,16 +1529,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1185,6 +1568,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1218,6 +1613,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1275,6 +1673,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr ""
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr ""
@@ -1648,6 +2064,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr ""
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr ""
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
@@ -1699,12 +2139,21 @@ msgstr "Maak map aan"
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1744,15 +2196,27 @@ msgstr ""
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr ""
msgid "Cron syntax"
msgstr ""
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr ""
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr ""
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr ""
@@ -1792,6 +2265,9 @@ msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1807,15 +2283,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] ""
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr ""
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr ""
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2112,43 +2678,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
+msgstr ""
+
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr ""
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr ""
@@ -2283,6 +2927,12 @@ msgstr ""
msgid "Find file"
msgstr ""
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr ""
msgid "FirstPushedBy|pushed by"
msgstr ""
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,10 +3247,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr ""
msgid "GoToYourFork|Fork"
msgstr ""
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,30 +3582,83 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr ""
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr ""
msgid "Introducing Cycle Analytics"
msgstr ""
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2668,6 +3737,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr ""
msgid "Leave project"
msgstr ""
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2856,18 +3997,30 @@ msgstr ""
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,16 +4272,16 @@ msgid_plural "New Issues"
msgstr[0] "Nieuwe issue"
msgstr[1] "Nieuwe issues"
-msgid "New Kubernetes Cluster"
+msgid "New Label"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Label"
+msgid "New Snippet"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Snippets"
msgstr ""
msgid "New branch"
@@ -3005,6 +4293,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr ""
@@ -3041,9 +4332,15 @@ msgstr ""
msgid "New tag"
msgstr ""
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr ""
msgid "No schedules"
msgstr ""
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3104,12 +4425,21 @@ msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr ""
@@ -3182,6 +4512,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3191,6 +4524,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr ""
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Geopend"
@@ -3212,6 +4575,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr ""
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3590,9 +5004,27 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -3602,9 +5034,39 @@ msgstr ""
msgid "ProjectLifecycle|Stage"
msgstr ""
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3623,7 +5085,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3650,9 +5139,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3719,6 +5235,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
msgstr ""
-msgid "Re-deploy"
+msgid "Quarters"
+msgstr ""
+
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr ""
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr ""
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr ""
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr ""
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr ""
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr ""
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr ""
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr ""
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] ""
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr ""
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr ""
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr ""
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr ""
@@ -4460,6 +6192,9 @@ msgstr ""
msgid "The project can be accessed without any authentication."
msgstr ""
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr ""
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr ""
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr ""
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr ""
@@ -4628,6 +6390,9 @@ msgstr ""
msgid "Time between merge request creation and merge/close"
msgstr ""
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr "s"
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr ""
@@ -4845,9 +6655,18 @@ msgstr ""
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr ""
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr ""
@@ -5003,6 +6886,9 @@ msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr ""
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr ""
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr ""
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr ""
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] ""
@@ -5320,9 +7493,25 @@ msgstr[1] ""
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/pl_PL/gitlab.po b/locale/pl_PL/gitlab.po
index 0daeb419e55..67c1abe6bf7 100644
--- a/locale/pl_PL/gitlab.po
+++ b/locale/pl_PL/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:01\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
@@ -15,6 +13,24 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:39\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -72,6 +88,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -86,6 +109,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] ""
@@ -99,6 +129,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -118,6 +151,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -143,16 +179,27 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
-msgid "(checkout the %{link} for information on how to install it)."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
msgid "+ %{moreCount} more"
@@ -244,6 +291,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -265,9 +336,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr ""
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -277,9 +357,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -301,12 +390,18 @@ msgstr ""
msgid "Activity"
msgstr ""
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr ""
msgid "Add Contribution guide"
msgstr ""
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -316,6 +411,12 @@ msgstr ""
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr ""
@@ -325,6 +426,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -406,12 +525,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -430,12 +576,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -457,7 +615,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -472,6 +633,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -484,18 +648,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr ""
@@ -511,6 +705,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -520,15 +720,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr ""
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -556,12 +765,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr ""
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -571,12 +789,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -634,6 +876,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -715,6 +963,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -836,6 +1159,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -848,9 +1174,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -872,6 +1204,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr ""
@@ -881,9 +1216,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -911,6 +1252,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -932,6 +1276,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -947,6 +1297,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -992,6 +1348,12 @@ msgstr ""
msgid "Cherry-pick this merge request"
msgstr ""
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -1007,9 +1369,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -1079,12 +1453,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1094,15 +1477,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1112,12 +1504,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1127,9 +1537,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1151,9 +1558,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1181,16 +1585,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1229,6 +1624,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1238,6 +1642,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1262,6 +1669,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1319,6 +1729,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1355,9 +1768,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1472,6 +1882,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1603,7 +2016,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1615,9 +2028,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1669,6 +2091,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1681,6 +2106,9 @@ msgstr ""
msgid "Contribution guide"
msgstr ""
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr ""
@@ -1696,6 +2124,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr ""
@@ -1708,10 +2154,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr ""
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1720,6 +2166,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1732,6 +2181,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
@@ -1747,12 +2199,21 @@ msgstr ""
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1771,6 +2232,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1792,15 +2256,27 @@ msgstr ""
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr ""
msgid "Cron syntax"
msgstr ""
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1816,6 +2292,15 @@ msgstr ""
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr ""
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr ""
@@ -1840,6 +2325,9 @@ msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1855,15 +2343,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] ""
@@ -1997,9 +2503,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr ""
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -2027,9 +2545,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2072,6 +2608,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2084,12 +2623,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr ""
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2108,6 +2662,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2117,6 +2677,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2126,6 +2689,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2135,6 +2701,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2147,9 +2716,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2162,43 +2740,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
+msgstr ""
+
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2219,6 +2827,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2267,6 +2878,9 @@ msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2276,12 +2890,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2324,6 +2974,12 @@ msgstr ""
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr ""
@@ -2333,6 +2989,12 @@ msgstr ""
msgid "Find file"
msgstr ""
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2342,6 +3004,30 @@ msgstr ""
msgid "FirstPushedBy|pushed by"
msgstr ""
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2376,6 +3062,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -2397,6 +3095,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2418,10 +3311,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2433,18 +3344,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr ""
msgid "GoToYourFork|Fork"
msgstr ""
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2454,18 +3380,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2490,9 +3470,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2532,6 +3536,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2605,12 +3615,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2629,30 +3648,85 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr ""
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2677,7 +3751,10 @@ msgstr ""
msgid "Introducing Cycle Analytics"
msgstr ""
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2686,12 +3763,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2722,6 +3805,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2761,12 +3847,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2843,12 +3935,30 @@ msgstr ""
msgid "Leave project"
msgstr ""
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2870,15 +3980,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2888,6 +4022,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2912,18 +4067,30 @@ msgstr ""
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2954,12 +4121,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2984,6 +4253,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
@@ -2996,21 +4268,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -3020,6 +4307,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -3032,6 +4322,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -3042,16 +4344,16 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-msgid "New Kubernetes Cluster"
+msgid "New Label"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Label"
+msgid "New Snippet"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Snippets"
msgstr ""
msgid "New branch"
@@ -3063,6 +4365,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr ""
@@ -3099,9 +4404,15 @@ msgstr ""
msgid "New tag"
msgstr ""
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3126,18 +4437,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr ""
msgid "No schedules"
msgstr ""
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3162,12 +4497,21 @@ msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr ""
@@ -3240,6 +4584,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3249,6 +4596,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr ""
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3258,9 +4614,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr ""
@@ -3270,6 +4647,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr ""
@@ -3279,6 +4662,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3315,6 +4701,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3348,6 +4737,9 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3492,6 +4884,12 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3501,6 +4899,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3510,6 +4917,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3519,6 +4929,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3543,9 +4956,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3573,9 +4992,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3594,6 +5019,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3648,9 +5076,27 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -3660,9 +5106,39 @@ msgstr ""
msgid "ProjectLifecycle|Stage"
msgstr ""
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3681,7 +5157,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3708,9 +5211,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3723,21 +5235,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3762,12 +5277,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3777,6 +5307,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3786,15 +5319,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
msgstr ""
-msgid "Re-deploy"
+msgid "Quarters"
+msgstr ""
+
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr ""
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr ""
@@ -3804,6 +5349,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3855,12 +5403,27 @@ msgstr ""
msgid "Remove project"
msgstr ""
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3870,9 +5433,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr ""
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3894,6 +5463,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3922,13 +5494,22 @@ msgstr ""
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3946,6 +5527,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3955,6 +5551,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3976,6 +5575,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr ""
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -4015,6 +5623,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -4045,12 +5668,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4063,9 +5695,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4090,6 +5728,9 @@ msgstr ""
msgid "Set up Koding"
msgstr ""
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr ""
@@ -4102,9 +5743,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4136,6 +5792,30 @@ msgstr[3] ""
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4148,6 +5828,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4169,6 +5852,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4184,6 +5873,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4226,6 +5918,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4235,6 +5930,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4274,6 +5972,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4346,9 +6047,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4358,9 +6065,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4373,9 +6089,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr ""
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4476,18 +6204,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -4503,7 +6243,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4515,6 +6258,9 @@ msgstr ""
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr ""
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr ""
@@ -4524,6 +6270,9 @@ msgstr ""
msgid "The project can be accessed without any authentication."
msgstr ""
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr ""
@@ -4536,6 +6285,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr ""
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4551,12 +6303,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr ""
@@ -4572,12 +6330,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4599,15 +6351,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4683,6 +6453,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr ""
@@ -4692,6 +6468,9 @@ msgstr ""
msgid "Time between merge request creation and merge/close"
msgstr ""
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4862,12 +6641,30 @@ msgstr ""
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4877,21 +6674,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4904,6 +6725,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr ""
@@ -4913,9 +6737,18 @@ msgstr ""
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4925,9 +6758,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4970,16 +6815,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr ""
@@ -4998,18 +6857,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -5028,15 +6905,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -5058,6 +6947,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr ""
@@ -5073,6 +6968,9 @@ msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr ""
@@ -5085,12 +6983,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5226,12 +7139,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr ""
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
@@ -5247,6 +7172,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5259,6 +7187,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5274,12 +7205,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5298,6 +7241,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr ""
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr ""
@@ -5328,9 +7277,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5346,6 +7304,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5370,18 +7334,241 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] ""
@@ -5392,9 +7579,29 @@ msgstr[3] ""
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5404,12 +7611,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5429,9 +7654,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5492,9 +7732,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5513,6 +7768,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5564,9 +7822,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5607,27 +7862,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/pt_BR/gitlab.po b/locale/pt_BR/gitlab.po
index 05bcae792ce..6d371f8b818 100644
--- a/locale/pt_BR/gitlab.po
+++ b/locale/pt_BR/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -15,11 +13,25 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: pt-BR\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:39\n"
+
+msgid " and"
+msgstr " e"
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] " piorado em %d ponto"
+msgstr[1] " piorado em %d pontos"
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] " melhorado em %d ponto"
+msgstr[1] " melhorado em %d pontos"
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%d arquivo modificado"
+msgstr[1] "%d arquivos modificados"
msgid "%d commit"
msgid_plural "%d commits"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] "%d métrica"
msgstr[1] "%d métricas"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] "%d nova licença"
+msgstr[1] "%d novas licenças"
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] "%d mudança na lista de commit"
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] "%d mudança fora da lista de commit"
msgstr[1] "%d mudanças fora da lista de commit"
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] "%d vulnerabilidade"
+msgstr[1] "%d vulnerabilidades"
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s commit adicional foi omitido para prevenir problemas de performance."
@@ -77,16 +99,19 @@ msgstr "%{actionText} & %{openOrClose} %{noteable}"
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "%{commit_author_link} fez commit à %{commit_timeago}"
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr "%{counter_storage} (%{counter_repositories} repositórios, %{counter_build_artifacts} artefatos de build, %{counter_lfs_objects} LFS)"
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} participante"
msgstr[1] "%{count} participantes"
msgid "%{filePath} deleted"
-msgstr ""
+msgstr "%{filePath} excluído"
msgid "%{group_docs_link_start}Groups%{group_docs_link_end} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
-msgstr ""
+msgstr "%{group_docs_link_start}Grupos%{group_docs_link_end} permitem que você gerencie e colabore em vários projetos. Os membros de um grupo têm acesso a todos os seus projetos."
msgid "%{loadingIcon} Started"
msgstr "%{loadingIcon} Iniciado"
@@ -94,6 +119,9 @@ msgstr "%{loadingIcon} Iniciado"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} está bloqueado pelo usuário do GitLab %{lock_user_id}"
+msgid "%{name}'s avatar"
+msgstr "Avatar de %{name}"
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr "%{nip_domain} pode ser utilizado como um domínio personalizado."
@@ -117,18 +145,25 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] "%{storage_name}: falha na tentativa de acesso ao storage no host:"
msgstr[1] "%{storage_name}: %{failed_attempts} falhas de acesso ao storage:"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] "%{text} %{files}"
+msgstr[1] "%{text} %{files} arquivos"
+
msgid "%{text} is available"
msgstr "%{text} está disponível"
msgid "%{title} changes"
msgstr "Alterações de %{title}"
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] "%{type} detectou 1 vulnerabilidade"
+msgstr[1] "%{type} detectou %{vulnerabilityCount} vulnerabilidades"
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr "%{unstaged} mudanças fora e %{staged} mudanças dentro da lista de commit"
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(veja o %{link} para informações de como instalar)."
-
msgid "+ %{moreCount} more"
msgstr "%{moreCount} mais"
@@ -202,6 +237,30 @@ msgstr "Página não encontrada"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr "Por favor, contacte o administrador do GitLab se você acha que isso é um erro."
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> adicionará \"Por <a href=\"#\">@johnsmith</a>\" a todas as issues e comentários originalmente criados por johnsmith@example.com e definirá <a href=\"#\">@johnsmith</a> como o responsável em todas as issues originalmente atribuídas a johnsmith@example.com."
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr "<strong>%{created_count}</strong> criado(s), <strong>%{accepted_count}</strong> aceito(s)."
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr "<strong>%{created_count}</strong> criado, <strong>%{closed_count}</strong> fechado."
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr "<strong>%{pushes}</strong> pushes, mais que <strong>%{commits}</strong> commits por <strong>%{people}</strong> contribuidores."
+
msgid "<strong>Removes</strong> source branch"
msgstr "<strong>Remover</strong> branch de origem"
@@ -218,16 +277,25 @@ msgid "A project is where you house your files (repository), plan your work (iss
msgstr "Um projeto é onde você armazena seus arquivos (repositório), planeja seu trabalho (issues), e publica sua documentação (wiki), %{among_other_things_link}."
msgid "A regular expression that will be used to find the test coverage output in the job trace. Leave blank to disable"
-msgstr ""
+msgstr "Uma expressão regular que será usada para encontrar a saída do test coverage no rastreador de tarefa. Deixe em branco para desativar"
msgid "A user with write access to the source branch selected this option"
msgstr "Um usuário com permissão de escrita no branch de origem selecionou esta opção"
+msgid "About GitLab"
+msgstr "Sobre o GitLab"
+
+msgid "About GitLab CE"
+msgstr "Sobre o GitLab CE"
+
msgid "About auto deploy"
msgstr "Sobre o deploy automático"
+msgid "About this feature"
+msgstr "Sobre essa funcionalidade"
+
msgid "Abuse Reports"
-msgstr "Relatórios de abuso"
+msgstr "Relatórios de Abuso"
msgid "Abuse reports"
msgstr "Relatórios de abuso"
@@ -235,14 +303,23 @@ msgstr "Relatórios de abuso"
msgid "Accept terms"
msgstr "Aceitar os temos"
+msgid "Accepted MR"
+msgstr "MR aceito"
+
msgid "Access Tokens"
msgstr "Tokens de acesso"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr "Acesso negado! Por favor, verifique se você pode adicionar chaves de deploy neste repositório."
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr "Acesso a '%{classification_label}' não permitido"
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "Os acessos à storages com defeito foram temporariamente desabilitados para permitir a sua remontagem. Redefina as informações de armazenamento depois que o problema foi resolvido para permitir o acesso de novo."
msgid "Access your runner token, customize your pipeline configuration, and view your pipeline status and coverage report."
-msgstr ""
+msgstr "Acesse seu runner token, personalize sua configuração de pipeline e visualize o status do seu pipeline e o relatório de coverage."
msgid "Account"
msgstr "Conta"
@@ -259,12 +336,18 @@ msgstr "Sessões ativas"
msgid "Activity"
msgstr "Atividade"
+msgid "Add"
+msgstr "Adicionar"
+
msgid "Add Changelog"
msgstr "Adicionar registro de mudanças"
msgid "Add Contribution guide"
msgstr "Adicionar Guia de contribuição"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr "Adicione Webhooks de grupo e GitLab Enterprise Edition."
+
msgid "Add Kubernetes cluster"
msgstr "Adicionar cluster Kubernetes"
@@ -274,6 +357,12 @@ msgstr "Adicionar Licença"
msgid "Add Readme"
msgstr "Adicionar leia-me"
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr "Coloque um texto adicional para aparecer em todas as comunicações por email. Limite de %{character_limit} caracteres"
+
+msgid "Add new application"
+msgstr "Adicionar novo aplicativo"
+
msgid "Add new directory"
msgstr "Adicionar novo diretório"
@@ -283,6 +372,24 @@ msgstr "Adicionar reação"
msgid "Add todo"
msgstr "Adicionar tarefa"
+msgid "Add user(s) to the group:"
+msgstr "Adicionar usuário(s) ao grupo:"
+
+msgid "Add users to group"
+msgstr "Adicionar usuários ao grupo"
+
+msgid "Additional text"
+msgstr "Texto adicional"
+
+msgid "Admin Area"
+msgstr "Ãrea do Administrador"
+
+msgid "Admin Overview"
+msgstr "Visão Geral do Administrador"
+
+msgid "Admin area"
+msgstr "Ãrea do administrador"
+
msgid "AdminArea|Stop all jobs"
msgstr "Parar todos os processos"
@@ -353,7 +460,7 @@ msgid "Allow commits from members who can merge to the target branch."
msgstr "Permitir commits de membros que podem fazer merge ao branch de destino."
msgid "Allow public access to pipelines and job details, including output logs and artifacts"
-msgstr ""
+msgstr "Permitir acesso público aos pipelines e detalhes de trabalho, incluindo logs de saída e artefatos"
msgid "Allow rendering of PlantUML diagrams in Asciidoc documents."
msgstr "Permitir renderização de diagramas PlantUML em documentos Asciidoc."
@@ -364,29 +471,59 @@ msgstr "Permitir requisições de hooks e serviços para a rede local."
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Permite adicionar e gerenciar clusters do Kubernetes."
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr "Também chamado de \"Emissor\" ou \"Identificador de confiança em terceiros\""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr "Também chamado de \"URL de serviços terceiros\" ou \"URL de resposta\""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr "Alternativamente, você pode usar um %{personal_access_token_link}. Quando você cria seu Token de Acesso Pessoal, você precisará selecionar o escopo do <code>repositório</code>, para que possamos exibir uma lista de seus repositórios públicos e privados que estão disponíveis para se conectar."
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr "Alternativamente, você pode usar um %{personal_access_token_link}. Quando você cria seu Token de Acesso Pessoal, você precisará selecionar o escopo do <code>repositório</code>, para que possamos exibir uma lista de seus repositórios públicos e privados que estão disponíveis para se importar."
-msgid "An error occured creating the new branch."
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr "Um aplicativo chamado %{link_to_client} está solicitando acesso à sua conta do GitLab."
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
msgstr ""
+msgid "An error accured whilst committing your changes."
+msgstr "Ocorreu um erro ao fazer commit de suas alterações."
+
+msgid "An error has occurred"
+msgstr "Ocorreu um erro"
+
+msgid "An error occured creating the new branch."
+msgstr "Um erro ocorreu ao criar o novo branch."
+
+msgid "An error occured whilst fetching the job trace."
+msgstr "Ocorreu um erro ao carregar o rastro da tarefa."
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr "Ocorreu um erro ao carregar o último pipeline."
+
msgid "An error occured whilst loading all the files."
-msgstr ""
+msgstr "Um erro ocorreu no carregamento de todos os arquivos."
msgid "An error occured whilst loading the file content."
-msgstr ""
+msgstr "Um erro ocorreu no carregamento do conteúdo do arquivo."
msgid "An error occured whilst loading the file."
-msgstr ""
+msgstr "Um erro ocorreu no carregamento do arquivo."
msgid "An error occured whilst loading the merge request changes."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar as alterações do merge request."
msgid "An error occured whilst loading the merge request version data."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar os dados da versão do merge request."
msgid "An error occured whilst loading the merge request."
-msgstr ""
+msgstr "Ocorreu um erro ao carregar as alterações do merge request."
+
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr "Ocorreu um erro ao carregar as tarefas de pipeline."
msgid "An error occurred previewing the blob"
msgstr "Erro ao pré-visualizar o blob"
@@ -394,6 +531,15 @@ msgstr "Erro ao pré-visualizar o blob"
msgid "An error occurred when toggling the notification subscription"
msgstr "Erro ao modificar notificação de assinatura"
+msgid "An error occurred when updating the issue weight"
+msgstr "Ocorreu um erro ao atualizar o peso do issue"
+
+msgid "An error occurred while adding approver"
+msgstr "Ocorreu um erro ao adicionar o aprovador"
+
+msgid "An error occurred while detecting host keys"
+msgstr "Ocorreu um erro ao detectar as chaves do host"
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr "Erro ao ignorar alerta. Atualize a página e tente novamente."
@@ -415,8 +561,11 @@ msgstr "Erro ao recuperar projetos"
msgid "An error occurred while importing project: ${details}"
msgstr "Ocorreu um erro ao importar projeto: ${details}"
-msgid "An error occurred while loading commits"
-msgstr "Erro ao carregar os Commits"
+msgid "An error occurred while initializing path locks"
+msgstr "Ocorreu um erro ao inicializar travas de caminhos"
+
+msgid "An error occurred while loading commit signatures"
+msgstr ""
msgid "An error occurred while loading diff"
msgstr "Erro ao carregar o Diff"
@@ -430,6 +579,9 @@ msgstr "Erro ao carregar o arquivo"
msgid "An error occurred while making the request."
msgstr "Erro ao fazer a requisição."
+msgid "An error occurred while removing approver"
+msgstr "Ocorreu um erro ao remover o aprovador"
+
msgid "An error occurred while rendering KaTeX"
msgstr "Erro ao renderizar o KaTeX"
@@ -442,18 +594,48 @@ msgstr "Erro ao recuperar calendário de atividades"
msgid "An error occurred while retrieving diff"
msgstr "Erro ao recuperar o diff"
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr "Ocorreu um erro ao salvar o status de substituição do LDAP. Por favor, tente novamente."
+
msgid "An error occurred while saving assignees"
msgstr "Erro ao salvar assignees"
+msgid "An error occurred while subscribing to notifications."
+msgstr "Ocorreu um erro ao inscrever às notificações."
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr "Ocorreu um erro ao desinscrever às notificações."
+
msgid "An error occurred while validating username"
msgstr "Erro ao validar o nome de usuário"
msgid "An error occurred. Please try again."
msgstr "Ocorreu um erro. Tente novamente."
+msgid "Anonymous"
+msgstr "Anônimo"
+
+msgid "Anti-spam verification"
+msgstr "Verificação anti-spam"
+
+msgid "Any"
+msgstr "Qualquer um"
+
+msgid "Any Label"
+msgstr "Qualquer Label"
+
msgid "Appearance"
msgstr "Aparência"
+msgid "Application"
+msgstr "Aplicativo"
+
+msgid "Application Id"
+msgstr "ID do aplicativo"
+
+msgid "Application: %{name}"
+msgstr "Aplicativo: %{name}"
+
msgid "Applications"
msgstr "Aplicações"
@@ -469,24 +651,39 @@ msgstr "Projeto arquivado! Repositório e outros recursos de projeto são soment
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Tem certeza que deseja excluir este agendamento de pipeline?"
-msgid "Are you sure you want to remove this identity?"
+msgid "Are you sure you want to lose unsaved changes?"
msgstr ""
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr "Você tem certeza que quer remover %{group_name}?"
+
+msgid "Are you sure you want to remove this identity?"
+msgstr "Você tem certeza de que deseja excluir este item?"
+
msgid "Are you sure you want to reset registration token?"
msgstr "Você tem certeza que quer recriar o token de registro?"
msgid "Are you sure you want to reset the health check token?"
msgstr "Você tem certeza que quer reiniciar o token de status de saúde?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr "Você tem certeza que quer destravar %{path_lock_path}?"
+
msgid "Are you sure?"
msgstr "Você tem certeza?"
msgid "Artifacts"
msgstr "Artefatos"
+msgid "Ascending"
+msgstr "Ascendente"
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr "Solicite a um mantenedor do grupo para configurar um Runner de grupo."
+msgid "Assertion consumer service URL"
+msgstr "URL de serviço do consumidor de asserção"
+
msgid "Assign custom color like #FF0000"
msgstr "Coloque uma cor personalizada, como #FF0000"
@@ -514,12 +711,21 @@ msgstr "Atribuído a mim"
msgid "Assignee"
msgstr "Responsável"
+msgid "Assignee boards not available with your current license"
+msgstr "Quadro de responsáveis não disponível com sua licença atual"
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr "Listas de responsáveis mostram todas as issues atribuídas ao usuário selecionado."
+
msgid "Assignee(s)"
msgstr "Responsável(is)"
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Para anexar arquivo, arraste e solte ou %{upload_link}"
+msgid "Audit Events"
+msgstr "Eventos de Auditoria"
+
msgid "Aug"
msgstr "Ago"
@@ -529,12 +735,36 @@ msgstr "Agosto"
msgid "Authentication Log"
msgstr "Log de autenticação"
+msgid "Authentication log"
+msgstr "Log de autenticação"
+
msgid "Author"
msgstr "Autor"
+msgid "Authorization code:"
+msgstr "Código de autorização:"
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr "A autorização foi concedida digitando seu nome de usuário e senha no aplicativo."
+
+msgid "Authorize"
+msgstr "Autorizar"
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr "Autorizar %{link_to_client} usar sua conta?"
+
+msgid "Authorized At"
+msgstr "Autorizado em"
+
+msgid "Authorized applications (%{size})"
+msgstr "Aplicativos autorizados (%{size})"
+
msgid "Authors: %{authors}"
msgstr "Autores: %{authors}"
+msgid "Auto DevOps"
+msgstr "Auto DevOps"
+
msgid "Auto DevOps enabled"
msgstr "Auto DevOps ativo"
@@ -551,7 +781,7 @@ msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
msgstr "Apps de revisão automática e Auto Deploy precisam de um nome de domínio para que funcione corretamente."
msgid "Auto-cancel redundant, pending pipelines"
-msgstr ""
+msgstr "Cancelar automaticamente os pipelines redundantes pendentes"
msgid "AutoDevOps|Auto DevOps"
msgstr "Auto DevOps"
@@ -592,8 +822,14 @@ msgstr "Foto de perfil será removida. Tem certeza?"
msgid "Average per day: %{average}"
msgstr "Média diária: %{average}"
+msgid "Background Color"
+msgstr "Cor de Fundo"
+
+msgid "Background Jobs"
+msgstr "Tarefas em Segundo Plano"
+
msgid "Background color"
-msgstr ""
+msgstr "Cor do plano de fundo"
msgid "Background jobs"
msgstr "Tarefas em segundo plano"
@@ -671,13 +907,88 @@ msgid "Begin with the selected commit"
msgstr "Comece com o commit selecionado"
msgid "Below are examples of regex for existing tools:"
+msgstr "Abaixo estão exemplos de regex para ferramentas existentes:"
+
+msgid "Below you will find all the groups that are public."
+msgstr "Abaixo você encontrará todos os grupos que são públicos."
+
+msgid "Billing"
+msgstr "Cobrança"
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr "%{group_name} está atualmente no plano %{plan_link}."
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr "Downgrade e upgrade automático para alguns planos ainda não está disponível."
+
+msgid "BillingPlans|Current plan"
+msgstr "Plano atual"
+
+msgid "BillingPlans|Customer Support"
+msgstr "Suporte ao Cliente"
+
+msgid "BillingPlans|Downgrade"
+msgstr "Downgrade"
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr "Saiba mais sobre cada plano lendo nossa %{faq_link}, ou inicie uma avaliação gratuita de 30 dias do GitLab.com Gold."
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr "Saiba mais sobre cada plano lendo nossa %{faq_link}."
+
+msgid "BillingPlans|Manage plan"
+msgstr "Gerenciar plano"
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr "Por favor, entre em contato com %{customer_support_link} para resolver seu caso."
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr "Veja todas as funcionalidades do %{plan_name}"
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr "Esse grupo usa o plano associado com seu grupo pai."
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr "Para gerenciar o plano para esse grupo, visite a seção de cobrança de %{parent_billing_page_link}."
+
+msgid "BillingPlans|Upgrade"
+msgstr "Upgrade"
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr "Você está atualmente no plano %{plan_link}."
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr "Sua avaliação do GitLab.com expirou em %{expiration_date}. %{learn_more_text}"
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr "A sua avaliação Gold irá <strong>expirar após %{expiration_date}</strong>. Você pode saber mais sobre o GitLab.com Gold lendo sobre nossos %{features_link}."
+
+msgid "BillingPlans|features"
+msgstr "recursos"
+
+msgid "BillingPlans|frequently asked questions"
+msgstr "Perguntas frequentes"
+
+msgid "BillingPlans|monthly"
+msgstr "mensalmente"
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr "%{price_per_year} pago anualmente"
+
+msgid "BillingPlans|per user"
+msgstr "por usuário"
+
+msgid "Bitbucket import"
msgstr ""
+msgid "Blog"
+msgstr "Blog"
+
msgid "Boards"
-msgstr ""
+msgstr "Boards"
msgid "Branch %{branchName} was not found in this project's repository."
-msgstr ""
+msgstr "O branch %{branchName} não foi encontrado no repositório deste projeto."
msgid "Branch (%{branch_count})"
msgid_plural "Branches (%{branch_count})"
@@ -792,6 +1103,9 @@ msgstr "Obsoleto"
msgid "Branches|Stale branches"
msgstr "Branches obsoletos"
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr "O brach não pôde ser atualizado automaticamente porque ele divergiu de sua contraparte upstream."
+
msgid "Branches|The default branch cannot be deleted"
msgstr "A branch padrão não pode ser apagada"
@@ -804,9 +1118,15 @@ msgstr "Para evitar perda de dados, considere fazer um merge dessa branch antes
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "Para confirmar, digite %{branch_name_confirmation}:"
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr "Para descartar as alterações locais e sobrescrever o branch com a versão upstream, exclua-o aqui e escolhe 'Atualize agora' acima."
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "Você irá apagar irreparavelmente a branch protegida '%{branch_name}'."
+msgid "Branches|diverged from upstream"
+msgstr "divergido do upstream"
+
msgid "Branches|merged"
msgstr "merge realizado"
@@ -828,6 +1148,9 @@ msgstr "Acessar arquivos"
msgid "Browse files"
msgstr "Navegar pelos arquivos"
+msgid "Business metrics (Custom)"
+msgstr "Métricas de negócios (personalizadas)"
+
msgid "ByAuthor|by"
msgstr "por"
@@ -835,11 +1158,17 @@ msgid "CI / CD"
msgstr "CI / CD"
msgid "CI / CD Settings"
-msgstr ""
+msgstr "Configurações de CI / CD"
+
+msgid "CI/CD"
+msgstr "CI/CD"
msgid "CI/CD configuration"
msgstr "Configuração de CI/CD"
+msgid "CI/CD for external repo"
+msgstr "CI/CD para um repositório externo"
+
msgid "CI/CD settings"
msgstr "Configurações de CI/CD"
@@ -853,20 +1182,23 @@ msgid "CICD|Auto DevOps will automatically build, test, and deploy your applicat
msgstr "Auto DevOps irá automaticamente gerar build, testar e fazer deploy de sua aplicação baseada numa configuração de integração e entrega contínua."
msgid "CICD|Automatic deployment to staging, manual deployment to production"
-msgstr ""
+msgstr "Deploy automático para staging, deploy manual para produção"
msgid "CICD|Continuous deployment to production"
-msgstr ""
+msgstr "Deploy contínuo para produção"
msgid "CICD|Deployment strategy"
-msgstr ""
+msgstr "Estratégia de deploy"
msgid "CICD|Deployment strategy needs a domain name to work correctly."
-msgstr ""
+msgstr "Estratégia de deploy precisa de um nome de domínio para funcionar corretamente."
msgid "CICD|Disable Auto DevOps"
msgstr "Desabilitar DevOps"
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr "Não configure um domínio aqui se você estiver configurando vários clusters de Kubernetes com o Auto DevOps."
+
msgid "CICD|Enable Auto DevOps"
msgstr "Ativar DevOps"
@@ -886,11 +1218,17 @@ msgid "CICD|The Auto DevOps pipeline configuration will be used when there is no
msgstr "As configurações de pipeline do Auto DevOps serão utilizadas quando não existir %{ci_file} no projeto."
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
+msgstr "Você precisa especificar um domínio se você quiser usar Apps de Revisão Automáticos e Estágios de Deploy automáticos."
+
+msgid "Callback URL"
msgstr ""
-msgid "Can't find HEAD commit for this branch"
+msgid "Callback url"
msgstr ""
+msgid "Can't find HEAD commit for this branch"
+msgstr "Não é possível encontrar o commit HEAD para este branch"
+
msgid "Cancel"
msgstr "Cancelar"
@@ -903,6 +1241,12 @@ msgstr "Não pode ser feito o merge automaticamente"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Não se pode modificar um cluster Kubernetes gerenciado"
+msgid "Certificate fingerprint"
+msgstr "Impressão digital do certificado"
+
+msgid "Change Weight"
+msgstr "Alterar Peso"
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr "Altere esse valor para influenciar com que frequência a interface do usuário do GitLab pesquisa atualizações."
@@ -948,6 +1292,12 @@ msgstr "Cherry-pick esse commit"
msgid "Cherry-pick this merge request"
msgstr "Cherry-pick esse merge request"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr "Escolha <strong>Criar arquivo</strong> e aguarde até que o arquivamento seja concluído."
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr "Escolha <strong>Próximo</strong> na parte inferior da página."
+
msgid "Choose File ..."
msgstr "Escolha o arquivo ..."
@@ -955,17 +1305,29 @@ msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to s
msgstr "Escolha a branch/tag (ex: %{master}) ou número do commit (ex: %{sha}) para ver o que mudou ou para criar um merge request."
msgid "Choose any color."
-msgstr ""
+msgstr "Escolha qualquer cor."
msgid "Choose between <code>clone</code> or <code>fetch</code> to get the recent application code"
-msgstr ""
+msgstr "Escolha entre <code>clone</code> ou <code>fetch</code> para obter o código do aplicativo recente"
msgid "Choose file..."
msgstr "Escolha o arquivo..."
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr "Escolha quais grupos você deseja sincronizar nesse nó secundário."
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr "Escolha quais repositórios você deseja se conectar e executar pipelines de CI/CD."
+
msgid "Choose which repositories you want to import."
msgstr "Escolha quais repositórios você deseja importar."
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr "Escolha quais shards você deseja sincronizar nesse nó secundário."
+
msgid "CiStatusLabel|canceled"
msgstr "cancelado"
@@ -979,10 +1341,10 @@ msgid "CiStatusLabel|manual action"
msgstr "ação manual"
msgid "CiStatusLabel|passed"
-msgstr "passou"
+msgstr "bem sucedido"
msgid "CiStatusLabel|passed with warnings"
-msgstr "passou com avisos"
+msgstr "bem sucedido com avisos"
msgid "CiStatusLabel|pending"
msgstr "pendente"
@@ -1009,7 +1371,7 @@ msgid "CiStatusText|manual"
msgstr "manual"
msgid "CiStatusText|passed"
-msgstr "passou"
+msgstr "bem sucedido"
msgid "CiStatusText|pending"
msgstr "pendente"
@@ -1035,12 +1397,21 @@ msgstr "* (Todos os ambientes)"
msgid "CiVariable|All environments"
msgstr "Todos os ambientes"
+msgid "CiVariable|Create wildcard"
+msgstr "Criar curinga"
+
msgid "CiVariable|Error occured while saving variables"
msgstr "Erro ao salvar variáveis"
+msgid "CiVariable|New environment"
+msgstr "Novo ambiente"
+
msgid "CiVariable|Protected"
msgstr "Protegido"
+msgid "CiVariable|Search environments"
+msgstr "Pesquisar ambientes"
+
msgid "CiVariable|Toggle protected"
msgstr "Alternar proteção"
@@ -1050,30 +1421,57 @@ msgstr "Falha na validação"
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr "interruptor da api"
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr "está indisponível: %{reason}"
+
msgid "Clear search input"
msgstr "Limpar campo de pesquisa"
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr "Clique em qualquer <strong>nome de projeto</strong> na lista a seguir para navegar para o milestone do projeto."
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr "Clique no botão <strong>Baixar</strong> e aguarde a conclusão do download."
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr "Clique no botão <strong>Promover</strong> no canto superior direito para promover a um milestone de grupo."
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr "Clique no botão à direita <strong>Selecionar nenhum</strong>, uma vez que só precisamos do \"Google Code Project Hosting\"."
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr "Clique no botão abaixo para iniciar o processo de instalação navegando para a página do Kubernetes"
msgid "Click to expand it."
-msgstr ""
+msgstr "Clique para expandir."
msgid "Click to expand text"
msgstr "Cliquei pra expandir o texto"
+msgid "Client authentication certificate"
+msgstr "Certificado de autenticação do cliente"
+
+msgid "Client authentication key"
+msgstr "Chave de autenticação do cliente"
+
+msgid "Client authentication key password"
+msgstr "Senha da chave de autenticação do cliente"
+
+msgid "Clients"
+msgstr "Clientes"
+
msgid "Clone repository"
msgstr "Clonar repositório"
msgid "Close"
msgstr "Fechar"
+msgid "Closed"
+msgstr "Fechado"
+
+msgid "Closed issues"
+msgstr "Issues Fechadas"
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr "%{appList} foi instalado com sucesso no seu cluster Kubernetes"
@@ -1083,9 +1481,6 @@ msgstr "API URL"
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Adicionar cluster Kubernetes"
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr "Adicionar um cluster Kubernetes existente"
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr "Opções avançadas na integração deste cluster Kubernetes"
@@ -1107,9 +1502,6 @@ msgstr "Certificado CA"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Pacote de autoridade certificadora (Formato PEM)"
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr "Escolha como configurar a integração do cluster Kubernetes"
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr "Escolha qual dos ambientes do seu projeto usará este cluster Kubernetes."
@@ -1137,17 +1529,8 @@ msgstr "Copiar token"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Integração de Clusters | Criar cluster Kubernetes"
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr "Criar cluster Kubernetes no Google Kubernetes Engine"
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr "Criar novo cluster Kubernetes no Google Kubernetes Engine pelo GitLab"
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr "Criar no Google Kubernetes Engine"
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
-msgstr "Insira os detalhes para o cluster Kubernetes existente"
+msgid "ClusterIntegration|Did you know?"
+msgstr "Você sabia?"
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Digite detalhes para seu cluster Kubernetes"
@@ -1156,7 +1539,7 @@ msgid "ClusterIntegration|Environment scope"
msgstr "Escopo de ambiente"
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
-msgstr ""
+msgstr "Cada nova conta no Google Cloud Plataform (GCP) recebe US$300 em créditos na %{sign_up_link}. Em parceria com o Google, o Gitlab pode oferecer um adicional de US$200 para novas contas do GCP para começar a usar a integração GKE do GitLab."
msgid "ClusterIntegration|Fetching machine types"
msgstr "Recuperando tipos de máquina"
@@ -1185,6 +1568,15 @@ msgstr "Projeto do Google Kubernetes Engine"
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
+msgid "ClusterIntegration|Hide"
+msgstr "Ocultar"
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr "Se você está configurando múltiplos clusters e você está usando auto DevOps, %{help_link_start}leia isso primeiro%{help_link_end}."
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr "Para mostrar a saúde do cluster, nós precisamos provisionar seu cluster com Prometheus para coletar os dados necessários."
+
msgid "ClusterIntegration|Ingress"
msgstr "Ingressar"
@@ -1194,6 +1586,9 @@ msgstr "Endereço IP de entrada"
msgid "ClusterIntegration|Install"
msgstr "Instalar"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr "Instalar Prometheus"
+
msgid "ClusterIntegration|Installed"
msgstr "Instalado"
@@ -1218,6 +1613,9 @@ msgstr "Cluter Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Detalhes do cluster Kubernetes"
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr "Saúde do cluster Kubernetes"
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr "Integração com o cluster Kubernetes"
@@ -1246,13 +1644,13 @@ msgid "ClusterIntegration|Kubernetes clusters can be used to deploy applications
msgstr "Cluster Kubernetes podem ser usados para publicar aplicações e permitir app de revisão para esse projeto"
msgid "ClusterIntegration|Learn more about %{help_link_start_machine_type}machine types%{help_link_end} and %{help_link_start_pricing}pricing%{help_link_end}."
-msgstr ""
+msgstr "Saiba mais sobre os %{help_link_start_machine_type}tipos de máquinas%{help_link_end} e seus %{help_link_start_pricing}preços%{help_link_end}."
msgid "ClusterIntegration|Learn more about %{help_link_start}Kubernetes%{help_link_end}."
-msgstr ""
+msgstr "Saiba mais sobre os %{help_link_start}Kubernetes%{help_link_end}."
msgid "ClusterIntegration|Learn more about %{help_link_start}zones%{help_link_end}."
-msgstr ""
+msgstr "Saiba mais sobre as %{help_link_start}zonas%{help_link_end}."
msgid "ClusterIntegration|Learn more about environments"
msgstr "Ler mais sobre ambientes"
@@ -1275,6 +1673,9 @@ msgstr "Gerenciar seu cluster Kubernetes visitando %{link_gke}"
msgid "ClusterIntegration|More information"
msgstr "Mais informações"
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr "Múltiplos clusters Kubernetes estão disponíveis GitLab Enterprise Edition Premium e Ultimate"
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr "Nenhum tipo de máquina corresponde à sua pesquisa"
@@ -1311,9 +1712,6 @@ msgstr "Prometheus"
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr "Leia nosso %{link_to_help_page} em integração de cluter Kubernetes."
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr "Resgatar até $500 em crédito livre no Google Cloud Platform"
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr "Remover integração com o cluster Kubernetes"
@@ -1428,6 +1826,9 @@ msgstr "configurado corretamente"
msgid "ClusterIntegration|sign up"
msgstr "cadastrar"
+msgid "Cohorts"
+msgstr "Cohorts"
+
msgid "Collapse"
msgstr "Recolher"
@@ -1435,10 +1836,10 @@ msgid "Collapse sidebar"
msgstr "Minimizar barra lateral"
msgid "Comment & resolve discussion"
-msgstr ""
+msgstr "Comentar e marcar a discussão como resolvida"
msgid "Comment & unresolve discussion"
-msgstr ""
+msgstr "Comentar e marcar a discussão como não resolvida"
msgid "Comments"
msgstr "Comentários"
@@ -1505,7 +1906,7 @@ msgid "Committed by"
msgstr "Commit feito por"
msgid "Commit…"
-msgstr ""
+msgstr "Commit…"
msgid "Compare"
msgstr "Comparar"
@@ -1555,8 +1956,8 @@ msgstr "Configurar housekeeping e checagens do git nos repositórios."
msgid "Configure limits for web and API requests."
msgstr "Configurar limites para web e requisições para API."
-msgid "Configure push mirrors."
-msgstr ""
+msgid "Configure push and pull mirrors."
+msgstr "Configurar push e pull de espelhamentos."
msgid "Configure storage path and circuit breaker settings."
msgstr "Configurar caminho de armazenamento e circuit breaker."
@@ -1567,9 +1968,18 @@ msgstr "Configurar a forma como o usuário cria uma nova conta."
msgid "Connect"
msgstr "Conectar"
+msgid "Connect all repositories"
+msgstr "Conectar todos repositórios"
+
msgid "Connect repositories from GitHub"
msgstr "Conectar repositórios do GitHub"
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr "Conecte seus repositórios externos e pipelines CI/CD vão ser executados para novos commits. Um projeto GitLab será criado com apenas recursos de CI/CD ativados."
+
+msgid "Connecting..."
+msgstr "Conectando..."
+
msgid "Container Registry"
msgstr "Container Registry"
@@ -1621,11 +2031,14 @@ msgstr "Você pode usar também um %{deploy_token} para acesso somente-leitura Ã
msgid "Continue"
msgstr "Continuar"
+msgid "Continue to the next step"
+msgstr "Continuar para a próxima etapa"
+
msgid "Continuous Integration and Deployment"
msgstr "Integração contínua e Implantação"
msgid "Contribute to GitLab"
-msgstr ""
+msgstr "Contribua para o GitLab"
msgid "Contribution"
msgstr "Contribuições"
@@ -1633,6 +2046,9 @@ msgstr "Contribuições"
msgid "Contribution guide"
msgstr "Guia de contribuição"
+msgid "Contributions per group member"
+msgstr "Contribuições por membro do grupo"
+
msgid "Contributors"
msgstr "Contribuidores"
@@ -1648,6 +2064,24 @@ msgstr "Commits à %{branch_name}, excluindo commits de merge. Limitado à 6000
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr "Por favor, espere um momento, essa página será atualizada automaticamente."
+msgid "Control the display of third party offers."
+msgstr "Controle a exibição de ofertas de terceiros."
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "Controlar a concorrência máxima do enchimento de anexo/LFS para esse nó secundário"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "Controlar a concorrência máxima do enchimento do repositório para esse nó secundário"
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr "Controlar a concorrência máxima de operações de verificação para esse nó Geo"
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr "Copiar chave pública SSH para área de transferência"
+
msgid "Copy URL to clipboard"
msgstr "Copiar URL para área de transferência"
@@ -1660,11 +2094,11 @@ msgstr "Copiar o comando para área de transferência"
msgid "Copy commit SHA to clipboard"
msgstr "Copiar SHA do commit para a área de transferência"
-msgid "Copy file name to clipboard"
-msgstr ""
-
msgid "Copy file path to clipboard"
-msgstr ""
+msgstr "Copiar o local do arquivo para a área de transferência"
+
+msgid "Copy incoming email address to clipboard"
+msgstr "Copiar endereço de e-mail para a área de transferência"
msgid "Copy reference to clipboard"
msgstr "Copiar referência para área de transferência"
@@ -1672,6 +2106,9 @@ msgstr "Copiar referência para área de transferência"
msgid "Copy to clipboard"
msgstr "Copiar para área de transferência"
+msgid "Copy token to clipboard"
+msgstr "Copiar token para a área de transferência"
+
msgid "Create"
msgstr "Criar"
@@ -1684,6 +2121,9 @@ msgstr "Criar uma nova branch"
msgid "Create a new branch and merge request"
msgstr "Criar um novo branch e abrir merge request"
+msgid "Create a new issue"
+msgstr "Criar uma nova issue"
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Crie um token de acesso pessoal na sua conta para dar pull ou push via %{protocol}."
@@ -1691,7 +2131,7 @@ msgid "Create branch"
msgstr "Criar a branch"
msgid "Create commit"
-msgstr ""
+msgstr "Criar commit"
msgid "Create directory"
msgstr "Criar diretório"
@@ -1699,12 +2139,21 @@ msgstr "Criar diretório"
msgid "Create empty repository"
msgstr "Criar repositório vazio"
+msgid "Create epic"
+msgstr "Criar epic"
+
msgid "Create file"
msgstr "Criar arquivo"
+msgid "Create group"
+msgstr "Criar grupo"
+
msgid "Create group label"
msgstr "Criar Label de grupo"
+msgid "Create issue"
+msgstr "Criar issue"
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Criar lista a partir de labels. Issues com labels aparecem nestas listas."
@@ -1723,6 +2172,9 @@ msgstr "Criar nova pasta"
msgid "Create new file"
msgstr "Criar novo arquivo"
+msgid "Create new file or directory"
+msgstr "Criar novo arquivo ou diretório"
+
msgid "Create new label"
msgstr "Criar nova label"
@@ -1744,15 +2196,27 @@ msgstr "criar um token de acesso pessoal"
msgid "Created"
msgstr "Feito"
+msgid "Created At"
+msgstr "Criado em"
+
msgid "Created by me"
msgstr "Criado por mim"
+msgid "Created on:"
+msgstr "Criado em:"
+
+msgid "Creating epic"
+msgstr "Criando epic"
+
msgid "Cron Timezone"
msgstr "Fuso horário do cron"
msgid "Cron syntax"
msgstr "Sintaxe do cron"
+msgid "Current node"
+msgstr "Nó atual"
+
msgid "CurrentUser|Profile"
msgstr "Perfil"
@@ -1760,7 +2224,7 @@ msgid "CurrentUser|Settings"
msgstr "Configurações"
msgid "Custom CI config path"
-msgstr ""
+msgstr "Caminho de configuração do IC personalizado"
msgid "Custom notification events"
msgstr "Eventos de notificação personalizados"
@@ -1768,6 +2232,15 @@ msgstr "Eventos de notificação personalizados"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "Níveis de notificação personalizados são equivalentes a níveis de participação. Com níveis de notificação personalizados você também será notificado sobre eventos selecionados. Para mais informações, visite %{notification_link}."
+msgid "Customize colors"
+msgstr "Personalizar cores"
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "Análise de Ciclo"
@@ -1792,6 +2265,9 @@ msgstr "Homologação"
msgid "CycleAnalyticsStage|Test"
msgstr "Teste"
+msgid "Dashboard"
+msgstr "Dashboard"
+
msgid "DashboardProjects|All"
msgstr "Todos"
@@ -1807,14 +2283,32 @@ msgstr "Dezembro"
msgid "Decline and sign out"
msgstr "Recusar e sair"
+msgid "Default classification label"
+msgstr "Label de classificação padrão"
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr "Padrão: Importar diretamente o endereço de e-mail ou nome de usuário do Google Code"
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr "Padrão: Mapeie uma ID de conta do FogBugz para um nome completo"
+
msgid "Define a custom pattern with cron syntax"
msgstr "Defina um padrão personalizado utilizando a sintaxe do cron"
msgid "Delete"
msgstr "Excluir"
+msgid "Delete Snippet"
+msgstr "Excluir Snippet"
+
msgid "Delete list"
-msgstr ""
+msgstr "Excluir lista"
+
+msgid "Deleted"
+msgstr "Excluído"
+
+msgid "Deny"
+msgstr "Recusar"
msgid "Deploy"
msgid_plural "Deploys"
@@ -1947,9 +2441,21 @@ msgstr "Seu novo token de deploy de projeto foi criado."
msgid "Deprioritize label"
msgstr "Despriorizar label"
+msgid "Descending"
+msgstr "Decrescente"
+
msgid "Description"
msgstr "Descrição"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr "Os modelos de descrição permitem que você defina modelos específicos de contexto para os campos de descrição de merge request e emissão para seu projeto."
+
+msgid "Description:"
+msgstr "Descrição:"
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "Detalhes"
@@ -1957,7 +2463,7 @@ msgid "Diffs|No file name available"
msgstr "Nenhum nome de arquivo disponível"
msgid "Diffs|Something went wrong while fetching diff lines."
-msgstr ""
+msgstr "Algo errado aconteceu ao buscar linhas de comparação."
msgid "Directory name"
msgstr "Nome do diretório"
@@ -1977,9 +2483,27 @@ msgstr "Rejeitar alterações"
msgid "Discard draft"
msgstr "Descartar rascunho"
+msgid "Discover GitLab Geo."
+msgstr "Descubra o GitLab Geo."
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr "Descubra projetos, grupos e snippets. Compartilhe seus projetos com outras pessoas"
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr "Ignorar introdução do Cycle Analytics"
+msgid "Dismiss Merge Request promotion"
+msgstr "Descartar promoção de Merge Request"
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr "Documentação para provedores de identidade populares"
+
msgid "Domain"
msgstr "Domínio"
@@ -2022,6 +2546,9 @@ msgstr "Votos negativos"
msgid "Due date"
msgstr "Validade"
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr "Durante esse processo, você será perguntado por URLs do lado do GitLab. Use as URLs mostradas abaixo."
+
msgid "Each Runner can be in one of the following states:"
msgstr "Cada runner pode estar em um dos seguintes estados:"
@@ -2029,22 +2556,37 @@ msgid "Edit"
msgstr "Alterar"
msgid "Edit Label"
-msgstr ""
+msgstr "Editar Label"
msgid "Edit Pipeline Schedule %{id}"
msgstr "Alterar Agendamento do Pipeline %{id}"
+msgid "Edit Snippet"
+msgstr "Editar Snippet"
+
+msgid "Edit application"
+msgstr "Editar aplicativo"
+
msgid "Edit files in the editor and commit changes here"
msgstr "Alterar arquivos no editor e fazer commit das alterações aqui"
+msgid "Edit group: %{group_name}"
+msgstr "Editar grupo: %{group_name}"
+
msgid "Edit identity for %{user_name}"
-msgstr ""
+msgstr "Editar identidade para %{user_name}"
+
+msgid "Elasticsearch"
+msgstr "Elasticsearch"
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr "Integração com Elasticsearch. Elasticsearch AWS IAM."
msgid "Email"
msgstr "E-mail"
msgid "Email patch"
-msgstr ""
+msgstr "Patch de email"
msgid "Emails"
msgstr "Emails"
@@ -2058,6 +2600,12 @@ msgstr "Ativar"
msgid "Enable Auto DevOps"
msgstr "Ativar Auto DevOps"
+msgid "Enable Pseudonymizer data collection"
+msgstr "Ativar coleção de dados Pseudonymizer"
+
+msgid "Enable SAML authentication for this group"
+msgstr "Ativar autenticação SAML para esse grupo"
+
msgid "Enable Sentry for error reporting and logging."
msgstr "Ativar Sentry para report de erro e log."
@@ -2067,6 +2615,9 @@ msgstr "Habilitar e configurar métricas InfluxDB."
msgid "Enable and configure Prometheus metrics."
msgstr "Ativar e configurar métricas do Prometheus."
+msgid "Enable classification control using an external service"
+msgstr "Ativar controle de classificação usando um serviço externo"
+
msgid "Enable for this project"
msgstr "Ativar para este projeto"
@@ -2076,6 +2627,9 @@ msgstr "Ativar grupo de runners"
msgid "Enable or disable certain group features and choose access levels."
msgstr "Ative ou desative certos tipos de funcionalidades e escolha os níveis de acesso."
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr "Ative ou desative a coleção de dados Pseudonymizer"
+
msgid "Enable or disable version check and usage ping."
msgstr "Ativar ou desativar checagem de versão e uso de ping."
@@ -2085,6 +2639,9 @@ msgstr "Ativar reCAPTCHA ou Akismet e definir seus limites de IP."
msgid "Enable the Performance Bar for a given group."
msgstr "Ative a barra de desempenho para um determinado grupo."
+msgid "Enabled"
+msgstr "Habilitado"
+
msgid "Ends at (UTC)"
msgstr "Termina em (UTC)"
@@ -2097,9 +2654,18 @@ msgstr "Um erro ocorreu ao recuperar ambientes."
msgid "Environments|An error occurred while making the request."
msgstr "Um erro ocorreu ao fazer a requisição."
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr "Commit"
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr "Deploy"
@@ -2112,45 +2678,75 @@ msgstr "Ambientes"
msgid "Environments|Job"
msgstr "Job"
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr "Novo ambiente"
msgid "Environments|No deployments yet"
msgstr "Nenhum deploy"
-msgid "Environments|Open"
-msgstr "Abrir"
+msgid "Environments|No pod name has been specified"
+msgstr "Nenhum nome pod foi especificado"
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr "Abrir ambiente ao vivo"
+
+msgid "Environments|Pod logs from"
+msgstr "Logs de pod de"
-msgid "Environments|Re-deploy"
-msgstr "Refazer"
+msgid "Environments|Re-deploy to environment"
+msgstr ""
msgid "Environments|Read more about environments"
msgstr "Ler mais sobre ambiente"
-msgid "Environments|Rollback"
-msgstr "Rollback"
+msgid "Environments|Rollback environment"
+msgstr ""
msgid "Environments|Show all"
msgstr "Mostrar tudo"
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr "Atualizado"
msgid "Environments|You don't have any environments right now."
msgstr "Você não tem nenhum ambiente."
+msgid "Epic"
+msgstr "Epic"
+
+msgid "Epic will be removed! Are you sure?"
+msgstr "Epic será removido! Tem certeza?"
+
+msgid "Epics"
+msgstr "Epics"
+
+msgid "Epics Roadmap"
+msgstr "Roadmap de epics"
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr "Epics permitem gerenciar seu portfólio de projetos de forma mais eficiente e com menos esforço"
+
msgid "Error Reporting and Logging"
msgstr "Relatório e registro de erros"
-msgid "Error committing changes. Please try again."
-msgstr "Erro ao realizar o commit das alterações. Favor tentar novamente."
+msgid "Error creating epic"
+msgstr "Erro ao criar epic"
msgid "Error fetching contributors data."
msgstr "Erro ao recuperar informações de contribuintes."
-msgid "Error fetching job trace"
-msgstr ""
-
msgid "Error fetching labels."
msgstr "Erro ao carregar labels."
@@ -2169,6 +2765,9 @@ msgstr "Erro ao carregar dados de branch. Por favor, tente novamente."
msgid "Error loading last commit."
msgstr "Erro ao carregar último commit."
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr "Erro ao carregar merge requests."
@@ -2217,21 +2816,60 @@ msgstr "Todos os meses (no dia primeiro às 4:00)"
msgid "Every week (Sundays at 4:00am)"
msgstr "Toda semana (domingos às 4:00)"
+msgid "Everyone can contribute"
+msgstr "Todos podem contribuir"
+
msgid "Expand"
msgstr "Expandir"
msgid "Expand all"
-msgstr ""
+msgstr "Expandir tudo"
msgid "Expand sidebar"
msgstr "Expandir barra lateral"
+msgid "Explore"
+msgstr "Explorar"
+
+msgid "Explore GitLab"
+msgstr "Explorar o GitLab"
+
+msgid "Explore Groups"
+msgstr "Explorar Grupos"
+
+msgid "Explore groups"
+msgstr "Explorar grupos"
+
msgid "Explore projects"
msgstr "Explorar projetos"
msgid "Explore public groups"
msgstr "Explorar grupos públicos"
+msgid "External Classification Policy Authorization"
+msgstr "Autorização de Política de Classificação Externa"
+
+msgid "External authentication"
+msgstr "Autenticação externa"
+
+msgid "External authorization denied access to this project"
+msgstr "Autorização externa negou acesso a este projeto"
+
+msgid "External authorization request timeout"
+msgstr "A requisição de autorização externa esgotou o tempo limite"
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr "Label de classificação"
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr "Label de classificação"
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr "Quando nenhum label de classificação está definido, o label padrão `%{default_label}` será usado."
+
+msgid "Facebook"
+msgstr "Facebook"
+
msgid "Failed"
msgstr "Falha"
@@ -2257,7 +2895,7 @@ msgid "Failure"
msgstr "Falha"
msgid "Faster as it re-uses the project workspace (falling back to clone if it doesn't exist)"
-msgstr ""
+msgstr "Mais rápido, uma vez que reutiliza o espaço de trabalho do projeto (voltando a clonar, se não existir)"
msgid "Feb"
msgstr "Fev"
@@ -2274,6 +2912,12 @@ msgstr "Arquivos"
msgid "Files (%{human_size})"
msgstr "Arquivos (%{human_size})"
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr "Preencha nos campos abaixo, ative o <strong>%{enable_label}</strong> e pressione <strong>%{save_changes}</strong>"
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Filtrar por mensagem de commit"
@@ -2283,6 +2927,12 @@ msgstr "Localizar por caminho"
msgid "Find file"
msgstr "Localizar arquivo"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr "Encontre o arquivo ZIP baixado e extraia-o."
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr "Finalizado"
@@ -2292,15 +2942,39 @@ msgstr "Primeiro"
msgid "FirstPushedBy|pushed by"
msgstr "publicado por"
-msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
+msgid "FogBugz Email"
+msgstr "E-mail do FogBugz"
+
+msgid "FogBugz Import"
msgstr ""
-msgid "For private projects, any member (guest or higher) can view pipelines and access job details (output logs and artifacts)"
+msgid "FogBugz Password"
+msgstr "Senha do FogBugz"
+
+msgid "FogBugz URL"
msgstr ""
-msgid "For public projects, anyone can view pipelines and access job details (output logs and artifacts)"
+msgid "FogBugz import"
msgstr ""
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr "Cor da Fonte"
+
+msgid "Footer message"
+msgstr "Mensagem do Rodapé"
+
+msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
+msgstr "Para projetos internos, qualquer usuário conectado pode visualizar pipelines e acessar detalhes do job (logs de saída e artefatos)"
+
+msgid "For private projects, any member (guest or higher) can view pipelines and access job details (output logs and artifacts)"
+msgstr "Para projetos privados, qualquer membro (guest ou superior) pode visualizar pipelines e acessar detalhes do trabalho (logs de saída e artefatos)"
+
+msgid "For public projects, anyone can view pipelines and access job details (output logs and artifacts)"
+msgstr "Para projetos públicos, qualquer pessoa pode visualizar pipelines e acessar detalhes do trabalho (logs de saída e artefatos)"
+
msgid "Fork"
msgid_plural "Forks"
msgstr[0] "Fork"
@@ -2324,6 +2998,18 @@ msgstr "Erros encontrados em seu .gitlab-ci.yml:"
msgid "From %{provider_title}"
msgstr "De %{provider_title}"
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "Da abertura de tarefas até a implantação para a produção"
@@ -2340,11 +3026,206 @@ msgid "General"
msgstr "Geral"
msgid "General pipelines"
-msgstr ""
+msgstr "Pipelines Gerais"
msgid "Generate a default set of labels"
msgstr "Gerar labels padrão"
+msgid "Geo Nodes"
+msgstr "Nós do Geo"
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr "Geo permite que você replique sua instância do GitLab para outras localizações geográficas."
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr "Nó está falho ou quebrado."
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr "O nó está lento, sobrecarregado ou acabou de se recuperar de uma falta de energia."
+
+msgid "GeoNodes|Checksummed"
+msgstr "Checksum verificado"
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr "Os dados estão desatualizados de %{timeago}"
+
+msgid "GeoNodes|Data replication lag"
+msgstr "Atraso de replicação de dados"
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr "A desabilitação de um nó interrompe o processo de sincronização. Você tem certeza?"
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr "Não corresponde à configuração de armazenamento primário"
+
+msgid "GeoNodes|Failed"
+msgstr "Falhou"
+
+msgid "GeoNodes|Full"
+msgstr "Completo"
+
+msgid "GeoNodes|GitLab version"
+msgstr "Versão do GitLab"
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr "A versão do GitLab não corresponde à versão do nó primário"
+
+msgid "GeoNodes|Health status"
+msgstr "Status de saúde"
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr "O ID do último evento processado por cursor"
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr "O ID do último evento visto do primário"
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr "Aprenda mais sobre progresso de soma de verificação de repositório"
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr "Aprenda mais sobre verificação de repositório"
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr "Aprenda mais sobre progresso de soma de verificação de Wiki"
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr "Aprenda mais sobre verificação de Wiki"
+
+msgid "GeoNodes|Loading nodes"
+msgstr "Carregando nós"
+
+msgid "GeoNodes|Local LFS objects"
+msgstr "Objetos LFS locais"
+
+msgid "GeoNodes|Local attachments"
+msgstr "Anexos locais"
+
+msgid "GeoNodes|Local job artifacts"
+msgstr "Artefatos de tarefa locais"
+
+msgid "GeoNodes|New node"
+msgstr "Novo nó"
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr "Autenticação de Nó foi corrigida com sucesso."
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr "O nó foi removido com sucesso."
+
+msgid "GeoNodes|Not checksummed"
+msgstr "Soma de verificação não conferida"
+
+msgid "GeoNodes|Out of sync"
+msgstr "Fora de sincronia"
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr "A remoção de um nó interrompe o processo de sincronização. Você tem certeza?"
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr "WAL de slots de replicação"
+
+msgid "GeoNodes|Replication slots"
+msgstr "Slots de replicação"
+
+msgid "GeoNodes|Repositories"
+msgstr "Repositórios"
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr "Repositórios com soma de verificação para conferência com suas contrapartes nos nós Secundários"
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr "Repositórios verificados com suas contrapartes no nó Primário"
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr "Progresso de soma de verificação de repositório"
+
+msgid "GeoNodes|Repository verification progress"
+msgstr "Progresso de verificação de repositório"
+
+msgid "GeoNodes|Selective"
+msgstr "Seletivo"
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr "Alguma coisa deu errada ao mudar o status do nó"
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr "Alguma coisa deu errada ao recuperar nós"
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr "Alguma coisa deu errada ao remover nó"
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr "Alguma coisa deu errada ao corrigir nó"
+
+msgid "GeoNodes|Storage config"
+msgstr "Configuração de armazenamento"
+
+msgid "GeoNodes|Sync settings"
+msgstr "Configurações de sincronização"
+
+msgid "GeoNodes|Synced"
+msgstr "Sincronizado"
+
+msgid "GeoNodes|Unused slots"
+msgstr "Slots não usados"
+
+msgid "GeoNodes|Unverified"
+msgstr "Não verificado"
+
+msgid "GeoNodes|Used slots"
+msgstr "Slots usados"
+
+msgid "GeoNodes|Verified"
+msgstr "Verificado"
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr "Progresso de soma de verificação de wiki"
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr "Progresso de verificação de wiki"
+
+msgid "GeoNodes|Wikis"
+msgstr "Wikis"
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr "Checksum realizado nas wikis para verificação com suas contrapartes nos nós secundários"
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr "Wikis verificados com suas contrapartes no nó Primário"
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr "Você tem nós Geo configurados usando uma conexão HTTP insegura. Recomendamos o uso de HTTPS."
+
+msgid "Geo|All projects"
+msgstr "Todos os projetos"
+
+msgid "Geo|File sync capacity"
+msgstr "Capacidade de sincronização de arquivo"
+
+msgid "Geo|Groups to synchronize"
+msgstr "Grupos para sincronizar"
+
+msgid "Geo|Projects in certain groups"
+msgstr "Projetos em certos grupos"
+
+msgid "Geo|Projects in certain storage shards"
+msgstr "Projetos em certos pedaços de armazenamento"
+
+msgid "Geo|Repository sync capacity"
+msgstr "Capacidade de sincronização de repositório"
+
+msgid "Geo|Select groups to replicate."
+msgstr "Selecione grupos para replicar."
+
+msgid "Geo|Shards to synchronize"
+msgstr "Shards para sincronizar"
+
+msgid "Geo|Verification capacity"
+msgstr "Capacidade de verificação"
+
+msgid "Git"
+msgstr "Git"
+
msgid "Git repository URL"
msgstr "URL do repositório Git"
@@ -2355,7 +3236,7 @@ msgid "Git storage health information has been reset"
msgstr "Informações sobre o status de saúde do storage Git foram reiniciadas"
msgid "Git strategy for pipelines"
-msgstr ""
+msgstr "Estratégia Git para pipelines"
msgid "Git version"
msgstr "Versão do Git"
@@ -2366,11 +3247,29 @@ msgstr "Importação do GitHub"
msgid "GitLab CI Linter has been moved"
msgstr "Linter do GitLab CI foi movido"
+msgid "GitLab Geo"
+msgstr "GitLab Geo"
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr "Os GitLab Group Runners podem executar código para todos os projetos neste grupo."
-msgid "GitLab Runner section"
-msgstr "Seção GitLab Runner"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr "URL de logon único do GitLab"
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr "O GitLab executará um trabalho em segundo plano que produzirá CSVs com pseudônimos do banco de dados do GitLab que serão carregados no diretório de armazenamento de objetos configurado."
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr "Gitaly"
@@ -2381,18 +3280,33 @@ msgstr "Servidores Gitaly"
msgid "Gitaly|Address"
msgstr "Endereço"
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr "Voltar"
msgid "Go back"
msgstr "Voltar"
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Ir para seu fork"
msgid "GoToYourFork|Fork"
msgstr "Fork"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Autenticação do Google não está %{link_to_documentation}. Peça ao administrador do Gitlab se você deseja usar esse serviço."
@@ -2402,18 +3316,72 @@ msgstr "Entendi!"
msgid "Graph"
msgstr "Gráfico"
+msgid "Group"
+msgstr "Grupo"
+
msgid "Group CI/CD settings"
msgstr "Configurações de CI/CD do grupo"
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr "ID do grupo"
msgid "Group Runners"
msgstr "Group Runners"
+msgid "Group avatar"
+msgstr "Avatar do grupo"
+
+msgid "Group details"
+msgstr "Detalhes do grupo"
+
+msgid "Group info:"
+msgstr "Info. do grupo:"
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr "Os mantenedores podem registrar grupos de runners em %{link}"
+msgid "Group: %{group_name}"
+msgstr "Grupo: %{group_name}"
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr "A partir de %{dateWord}"
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr "Carregando roadmap"
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr "Alguma coisa deu errada ao recuperar epics"
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr "Desculpe, nenhum epic corresponde à sua pesquisa"
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr "O roadmap mostra o progresso de seus epics ao longo de uma linha do tempo"
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "Para visualizar o roadmap, adicione uma data de início ou término planejada a um dos seus epics nesse grupo ou em seus subgrupos. Na visão mensal, apenas epics no mês passado, no mês atual e nos próximos 5 meses são exibidos &ndash; de %{startDate} a %{endDate}."
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "Para visualizar o roadmap, adicione uma data de início ou término planejada a um dos seus epics nesse grupo ou em seus subgrupos. Na visão trimestral, apenas epics no trimestre passado, no trimestre atual e nos próximos 4 trimestres são exibidos &ndash; de %{startDate} a %{endDate}."
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "Para visualizar o roadmap, adicione uma data de início ou término planejada a um dos seus epics nesse grupo ou em seus subgrupos. Na visão semanal, apenas epics na semana passada, na semana atual e nas próximas 4 semanas são exibidos &ndash; de %{startDate} a %{endDate}."
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "Para ampliar sua pesquisa, alterar ou remover filtros. Na visão mensal, apenas epics no mês passado, no mês atual e nos próximos 5 meses são exibidos &ndash; de %{startDate} a %{endDate}."
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "Para ampliar sua pesquisa, alterar ou remover filtros. Na visão trimestral, apenas epics no trimestre passado, no trimestre atual e nos próximos 4 trimestre são exibidos &ndash; de %{startDate} a %{endDate}."
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "Para ampliar sua pesquisa, alterar ou remover filtros. Na visão semanal, apenas epics na semana passada, na semana atual e nas próximas 4 semanas são exibidos &ndash; de %{startDate} a %{endDate}."
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr "Até %{dateWord}"
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Bloquear compartilhamento de projetos do grupo %{group} com outros grupos"
@@ -2438,8 +3406,32 @@ msgstr "não pode ser desativado quando a configuração \"Travar compartilhamen
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "retirar a trava de compartilhamento de grupo de %{ancestor_group_name}"
+msgid "Groups"
+msgstr "Grupos"
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
-msgstr ""
+msgstr "Grupos também podem ser aninhados criando %{subgroup_docs_link_start}subgrupos%{subgroup_docs_link_end}."
+
+msgid "GroupsDropdown|Frequently visited"
+msgstr "Visitados frequentemente"
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr "Grupos que você visita frequentemente aparecerão aqui"
+
+msgid "GroupsDropdown|Loading groups"
+msgstr "Carregando grupos"
+
+msgid "GroupsDropdown|Search your groups"
+msgstr "Procure seus grupos"
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr "Algo deu errado do nosso lado."
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr "Desculpe, nenhum grupo corresponde à sua pesquisa"
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr "Esse recurso requer um navegador com suporte a localStorage"
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Um grupo é uma coleção de vários projetos."
@@ -2480,6 +3472,12 @@ msgstr "Desculpe, nenhum grupo corresponde à sua pesquisa"
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr "Desculpe, nenhum grupo ou projeto correspondem à sua pesquisa"
+msgid "Have your users email"
+msgstr "Tem o e-mail de seus usuários"
+
+msgid "Header message"
+msgstr "Mensagem de cabeçalho"
+
msgid "Health Check"
msgstr "Status de Saúde"
@@ -2513,7 +3511,7 @@ msgstr[0] "Ocultar valor"
msgstr[1] "Ocultar valores"
msgid "Hide whitespace changes"
-msgstr ""
+msgstr "Ocultar as alterações de espaço em branco"
msgid "History"
msgstr "Histórico"
@@ -2528,7 +3526,7 @@ msgid "I accept the|Terms of Service and Privacy Policy"
msgstr "Termos de Serviço e Política de Privacidade"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgid "IDE|Commit"
msgstr "Commit"
@@ -2546,16 +3544,25 @@ msgid "IDE|Review"
msgstr "Revisar"
msgid "Identifier"
-msgstr ""
+msgstr "Identificador"
msgid "Identities"
-msgstr ""
+msgstr "Identidades"
+
+msgid "Identity provider single sign on URL"
+msgstr "URL de logon único de provedor de identidade"
msgid "If disabled, the access level will depend on the user's permissions in the project."
-msgstr ""
+msgstr "Se desativado, o nível de acesso irá depender das permissões do usuário no projeto."
msgid "If enabled"
-msgstr ""
+msgstr "Se ativado"
+
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr "Se ativado, o acesso aos projetos será validado em um serviço externo usando seu rótulo de classificação."
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr "Se estiver usando o GitHub, você verá os status do pipeline no GitHub para seus commits e pull requests. %{more_info_link}"
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr "Se você já tem arquivos, pode realizar um push usando o %{link_to_cli} abaixo."
@@ -2564,40 +3571,93 @@ msgid "If your HTTP repository is not publicly accessible, add authentication in
msgstr "Se o seu repositório HTTP não estiver acessível publicamente, adicione informações de autenticação à URL:<code>https://username:password@gitlab.company.com/group/project.git</code>."
msgid "ImageDiffViewer|2-up"
-msgstr ""
+msgstr "2-up"
msgid "ImageDiffViewer|Onion skin"
-msgstr ""
+msgstr "Onion skin"
msgid "ImageDiffViewer|Swipe"
-msgstr ""
+msgstr "Deslizar"
msgid "Import"
msgstr "Importar"
+msgid "Import Projects from Gitea"
+msgstr "Importar projetos do Gitea"
+
+msgid "Import all compatible projects"
+msgstr "Importar todos os projetos compatíveis"
+
+msgid "Import all projects"
+msgstr "Importar todos os projetos"
+
msgid "Import all repositories"
msgstr "Importar todos repositórios"
+msgid "Import an exported GitLab project"
+msgstr "Importar um projeto GitLab exportado"
+
msgid "Import in progress"
msgstr "Importação em andamento"
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr "Importar vários repositórios fazendo o upload de um arquivo manifest."
+
+msgid "Import project"
+msgstr "Importar projeto"
+
+msgid "Import projects from Bitbucket"
+msgstr "Importar projetos do Bitbucket"
+
+msgid "Import projects from FogBugz"
+msgstr "Importar projetos do FogBugz"
+
+msgid "Import projects from GitLab.com"
+msgstr "Importar projetos do GitLab.com"
+
+msgid "Import projects from Google Code"
+msgstr "Importar projetos do Google Code"
+
msgid "Import repositories from GitHub"
msgstr "Importar repositórios do GitHub"
msgid "Import repository"
msgstr "Importar repositório"
+msgid "ImportButtons|Connect repositories from"
+msgstr "Conectar repositórios de"
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr "Melhore os quadros de issues com GitLab Enterprise Edition."
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr "Melhore o gerenciamento de issues com o peso de issues e GitLab Enterprise Edition."
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr "Melhore a pesquisa com Advanced Global Search e GitLab Enterprise Edition."
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr "Na próxima etapa, você poderá selecionar os projetos que deseja importar."
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr "Inclua um contrato de Termos de Serviço e uma Política de Privacidade que todos os usuários devem aceitar."
-msgid "Inline"
+msgid "Incompatible Project"
msgstr ""
+msgid "Inline"
+msgstr "Em linha"
+
+msgid "Install GitLab Runner"
+msgstr "Instalar o GitLab Runner"
+
msgid "Install Runner on Kubernetes"
msgstr "Instalar Runner no Kubernates"
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "Instalar um Runner compatível com o GitLab CI"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] "Instância"
+msgstr[1] "Instâncias"
msgid "Instance does not support multiple Kubernetes clusters"
msgstr "A instância não suporta múltiplos clusters Kubernetes"
@@ -2606,7 +3666,7 @@ msgid "Integrations"
msgstr "Integrações"
msgid "Integrations Settings"
-msgstr ""
+msgstr "Configurações de Integrações"
msgid "Interested parties can even contribute by pushing commits if they want to."
msgstr "As partes interessadas podem até contribuir enviando commits, caso queiram."
@@ -2623,8 +3683,11 @@ msgstr "Padrão de intervalo"
msgid "Introducing Cycle Analytics"
msgstr "Apresentando a Análise de Ciclo"
-msgid "Issue Board"
-msgstr ""
+msgid "Issue Boards"
+msgstr "Quadros de issues"
+
+msgid "Issue board focus mode"
+msgstr "Modo de foco no quadro de issues"
msgid "Issue events"
msgstr "Eventos de issue"
@@ -2632,12 +3695,18 @@ msgstr "Eventos de issue"
msgid "IssueBoards|Board"
msgstr "Board"
+msgid "IssueBoards|Boards"
+msgstr "Quadros"
+
msgid "Issues"
msgstr "Issues"
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "Issues podem ser bugs, tarefas ou ideias a serem discutidas. Além disso, issues são pesquisáveis e filtráveis."
+msgid "Issues closed"
+msgstr "Issues fechadas"
+
msgid "Jan"
msgstr "Jan"
@@ -2645,7 +3714,7 @@ msgid "January"
msgstr "Janeiro"
msgid "Job"
-msgstr ""
+msgstr "Trabalho"
msgid "Job has been erased"
msgstr "O job foi apagado"
@@ -2668,6 +3737,9 @@ msgstr "Junho"
msgid "Koding"
msgstr "Koding"
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -2693,7 +3765,7 @@ msgid "Kubernetes service integration has been deprecated. %{deprecated_message_
msgstr "Integração de serviço Kubernetes foi depreciada. %{deprecated_message_content} seus clusters Kubernetes usando a nova página <a href=\"%{url}\"/>Clusters Kubernetes</a>"
msgid "LFS"
-msgstr ""
+msgstr "LFS"
msgid "LFSStatus|Disabled"
msgstr "Desabilitado"
@@ -2705,7 +3777,10 @@ msgid "Label"
msgstr "Label"
msgid "Label actions dropdown"
-msgstr ""
+msgstr "Dropdown de ações de etiqueta"
+
+msgid "Label lists show all issues with the selected label."
+msgstr "Listas de etiquetas mostram todas as issues com a etiqueta selecionada."
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr "%{firstLabelName} +%{remainingLabelCount} mais"
@@ -2713,6 +3788,9 @@ msgstr "%{firstLabelName} +%{remainingLabelCount} mais"
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr "%{labelsString} e %{remainingLabelCount} mais"
+msgid "LabelSelect|Labels"
+msgstr "Etiquetas"
+
msgid "Labels"
msgstr "Etiquetas"
@@ -2723,7 +3801,7 @@ msgid "Labels can be applied to issues and merge requests to categorize them."
msgstr "Labels podem ser aplicadas a issues e merge requests para categorizá-los."
msgid "Labels can be applied to issues and merge requests."
-msgstr ""
+msgstr "Etiquetas podem ser aplicadas a issues e merge requests."
msgid "Labels|<span>Promote label</span> %{labelTitle} <span>to Group Label?</span>"
msgstr "<span>Promover label</span> %{labelTitle} <span>para Label do Grupo?</span>"
@@ -2787,12 +3865,30 @@ msgstr "Sair do grupo"
msgid "Leave project"
msgstr "Sair do projeto"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr "Licença"
+
+msgid "LinkedIn"
+msgstr "LinkedIn"
+
msgid "List"
msgstr "Lista"
+msgid "List Your Gitea Repositories"
+msgstr "Listar os seus Repositórios do Gitea"
+
+msgid "List available repositories"
+msgstr "Listar repositórios disponíveis"
+
msgid "List your GitHub repositories"
msgstr "Listar os seus repositórios no GitHub"
+msgid "Loading contribution stats for group members"
+msgstr "Carregando estados de contribuição para membros de grupo"
+
msgid "Loading the GitLab IDE..."
msgstr "Carregando IDE do GitLab..."
@@ -2814,15 +3910,39 @@ msgstr "Travar para projetos existentes"
msgid "Locked"
msgstr "Bloqueado"
+msgid "Locked Files"
+msgstr "Arquivos travados"
+
msgid "Locked to current projects"
msgstr "Travado para projetos existentes"
-msgid "Login"
-msgstr "Entrar"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr "Travas possibilitam travar um arquivo ou uma pasta específica."
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr "Faça com que todos em sua equipe sejam mais produtivos, independentemente da localização deles. O GitLab Geo cria espelhos somente leitura de sua instância do GitLab para que você possa reduzir o tempo necessário para clonar e buscar grandes repositórios."
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr "Gerenciar acesso"
msgid "Manage all notifications"
msgstr "Gerenciar todas as notificações"
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr "Gerencie aplicativos que podem utilizar o GitLab como um provedor OAuth e aplicativos que você autorizou a utilizar sua conta."
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr "Gerencie aplicativos que você autorizou a utilizar sua conta."
+
msgid "Manage group labels"
msgstr "Gerenciar Labels de grupo"
@@ -2832,6 +3952,27 @@ msgstr "Gerenciar etiquetas"
msgid "Manage project labels"
msgstr "Gerenciar Labels de projetos"
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr "Gerencie a qualidade de membros do seu grupo ao adicionar outro nível de segurança com o SAML."
+
+msgid "Manifest"
+msgstr "Manifesto"
+
+msgid "Manifest file import"
+msgstr "Importação de arquivo de manifesto"
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr "Mar"
@@ -2856,18 +3997,30 @@ msgstr "Mediana"
msgid "Members"
msgstr "Membros"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr "Membros serão encaminhados quando fizerem login no seu grupo. Obtenha isso pelo seu provedor de identidade, também chamado de \"SSO Service Location\", \"SAM Token Issuance Endpoint\", ou \"SAML 2.0/W-Federation URL\"."
+
+msgid "Merge Request"
+msgstr "Merge Request"
+
msgid "Merge Request:"
msgstr "Merge Request:"
msgid "Merge Requests"
msgstr "Merge Requests"
+msgid "Merge Requests created"
+msgstr "Merge Requests criadas"
+
msgid "Merge events"
msgstr "Eventos de merge"
msgid "Merge request"
msgstr "Merge requests"
+msgid "Merge request approvals"
+msgstr "Aprovações de merge request"
+
msgid "Merge requests"
msgstr "Merge requests"
@@ -2875,22 +4028,22 @@ msgid "Merge requests are a place to propose changes you've made to a project an
msgstr "A tela de Merge request é um lugar para propor mudanças em um projeto e discutir essas mudanças com outros"
msgid "MergeRequests|Resolve this discussion in a new issue"
-msgstr ""
+msgstr "Resolver essa discussão em um novo issue"
msgid "MergeRequests|Saving the comment failed"
-msgstr ""
+msgstr "Falha ao salvar comentário"
msgid "MergeRequests|Toggle comments for this file"
-msgstr ""
+msgstr "Ativar/desativar comentários para este arquivo"
msgid "MergeRequests|Updating discussions failed"
-msgstr ""
+msgstr "A atualização de discussões falhou"
msgid "MergeRequests|View file @ %{commitId}"
-msgstr ""
+msgstr "Visualizar o arquivo @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
-msgstr ""
+msgstr "Ver arquivo substituído @ %{commitId}"
msgid "Merged"
msgstr "Merge realizado"
@@ -2898,12 +4051,114 @@ msgstr "Merge realizado"
msgid "Messages"
msgstr "Mensagens"
+msgid "Metrics"
+msgstr "Métricas"
+
msgid "Metrics - Influx"
msgstr "Métricas - Influx"
msgid "Metrics - Prometheus"
msgstr "Métricas - Prometheus"
+msgid "Metrics|Business"
+msgstr "Negócios"
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr "Confira a documentação de CI/CD sobre como implantar em um ambiente"
+
+msgid "Metrics|Create metric"
+msgstr "Criar métricas"
+
+msgid "Metrics|Edit metric"
+msgstr "Editar métricas"
+
+msgid "Metrics|Environment"
+msgstr "Ambiente"
+
+msgid "Metrics|For grouping similar metrics"
+msgstr "Para agrupar métricas similares"
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr "Rotula do eixo vertical do gráfico. Geralmente, o tipo da unidade que está sendo mapeada. O eixo horizontal (eixo X) representa sempre o tempo."
+
+msgid "Metrics|Learn about environments"
+msgstr "Aprenda sobre ambientes"
+
+msgid "Metrics|Legend label (optional)"
+msgstr "Rótulo de legenda (opcional)"
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr "Deve ser uma consulta PromQL válida."
+
+msgid "Metrics|Name"
+msgstr "Nome"
+
+msgid "Metrics|New metric"
+msgstr "Nova métrica"
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr "Sistema"
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr "Tipo"
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr "Usado como um título para o gráfico"
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr "Milestone"
@@ -2928,6 +4183,9 @@ msgstr "Promover Milestone %{milestoneTitle} de projeto para Milestone de grupo?
msgid "Milestones|Promote Milestone"
msgstr "Promover Milestone"
+msgid "Milestones|This action cannot be reversed."
+msgstr "Essa ação não pode ser revertida."
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "adicione uma chave SSH"
@@ -2940,21 +4198,36 @@ msgstr "Fechar"
msgid "Monitoring"
msgstr "Monitoramento"
+msgid "Months"
+msgstr "Meses"
+
+msgid "More"
+msgstr "Mais"
+
msgid "More actions"
msgstr "Mais ações"
+msgid "More info"
+msgstr "Mais informações"
+
msgid "More information"
msgstr "Mais informações"
msgid "More information is available|here"
msgstr "Mais informações estão disponíveis|aqui"
+msgid "Most stars"
+msgstr "Mais estrelas"
+
msgid "Move"
msgstr "Mover"
msgid "Move issue"
msgstr "Mover issue"
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr "Nome"
@@ -2964,6 +4237,9 @@ msgstr "Nome da nova label"
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr "Nome:"
+
msgid "Nav|Help"
msgstr "Ajuda"
@@ -2976,6 +4252,18 @@ msgstr "Entrar / Registar"
msgid "Nav|Sign out and sign in with a different account"
msgstr "Saia e faça login com uma conta diferente"
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,18 +4272,18 @@ msgid_plural "New Issues"
msgstr[0] "Nova Issue"
msgstr[1] "Novas Issues"
-msgid "New Kubernetes Cluster"
-msgstr "Novo cluster Kubernetes"
-
-msgid "New Kubernetes cluster"
-msgstr "Novo cluster Kubernetes"
-
msgid "New Label"
msgstr ""
msgid "New Pipeline Schedule"
msgstr "Novo Agendamento de Pipeline"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "Novo branch"
@@ -3005,6 +4293,9 @@ msgstr "Novo branch indisponível"
msgid "New directory"
msgstr "Novo diretório"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "Novo arquivo"
@@ -3041,9 +4332,15 @@ msgstr "Novo subgrupo"
msgid "New tag"
msgstr "Nova tag"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr "Não"
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr "Sem responsável"
@@ -3063,23 +4360,47 @@ msgid "No file chosen"
msgstr "Nenhum arquivo escolhido"
msgid "No files found"
-msgstr ""
+msgstr "Nenhum arquivo encontrado"
msgid "No files found."
msgstr "Nenhum arquivo encontrado."
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr "Nenhum merge requests encontrado"
msgid "No messages were logged"
msgstr "Nenhuma mensagem foi registrada"
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "Nenhum repositório"
msgid "No schedules"
msgstr "Nenhum agendamento"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "Nenhum"
@@ -3104,12 +4425,21 @@ msgstr "Dados insuficientes"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Observe que o branch master é automaticamente protegido. %{link_to_protected_branches}"
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "Nota: Como administrador, você pode configurar o %{github_integration_link}, que permitirá o login via GitHub e permitirá a importação de repositórios sem gerar um Token de Acesso Pessoal."
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "Nota: Considere pedir ao seu administrador do GitLab para configurar %{github_integration_link}, o que permitirá o login via GitHub e permitir a importação de repositórios sem gerar um Token de Acesso Pessoal."
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "Eventos de notificação"
@@ -3182,6 +4512,9 @@ msgstr "Novembro"
msgid "Number of access attempts"
msgstr "Número de tentativas de acesso"
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr "Out"
@@ -3191,6 +4524,15 @@ msgstr "Outubro"
msgid "OfSearchInADropdown|Filter"
msgstr "Filtrar"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr "Configurações de integração on-line do IDE."
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Somente membros do projeto podem comentar."
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr "Abrir no Xcode"
+msgid "Open sidebar"
+msgstr "Abrir barra lateral"
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr "Aberto"
+
+msgid "Opened MR"
+msgstr "MR Aberto"
+
+msgid "Opened issues"
+msgstr "Issues abertas"
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Aberto"
@@ -3212,6 +4575,12 @@ msgstr "Abrir em nova janela"
msgid "Operations"
msgstr "Operações"
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "Opções"
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr "Outros Labels"
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr "Caso contrário, é recomendado que você inicie com uma das opções abaixo."
@@ -3255,6 +4627,9 @@ msgid "Password"
msgstr "Senha"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
+msgstr "Cole a sua chave SSH pública, que geralmente é encontrada no arquivo '~/.ssh/id_rsa.pub' e começa com 'ssh-rsa'. Não use a sua chave SSH privada."
+
+msgid "Path:"
msgstr ""
msgid "Pause"
@@ -3290,6 +4665,9 @@ msgstr "Agendamento da Pipeline"
msgid "Pipeline Schedules"
msgstr "Agendamentos da Pipeline"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr "com etapas"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr "PlantUML"
@@ -3443,6 +4827,15 @@ msgstr "Iniciar"
msgid "Please accept the Terms of Service before continuing."
msgstr "Por favor, aceite os Termos de Serviço antes de continuar."
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "Por favor selecione pelo menos um filtro para ver os resultados"
@@ -3450,6 +4843,9 @@ msgid "Please solve the reCAPTCHA"
msgstr "Por favor, resolva o reCAPTCHA"
msgid "Please try again"
+msgstr "Por favor, tente novamente"
+
+msgid "Please wait while we connect to your repository. Refresh at will."
msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
@@ -3461,6 +4857,9 @@ msgstr "Preferências"
msgid "Preferences|Navigation theme"
msgstr "Tema de navegação"
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr "Priorizar"
@@ -3485,9 +4884,15 @@ msgstr "Projetos privados podem ser criados em seu namespace pessoal com:"
msgid "Profile"
msgstr "Perfil"
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr "Conta agendada para remoção."
+msgid "Profiles|Add key"
+msgstr "Adicionar chave"
+
msgid "Profiles|Change username"
msgstr "Alterar nome de usuário"
@@ -3515,9 +4920,15 @@ msgstr "Nome de usuário inválido"
msgid "Profiles|Path"
msgstr "Caminho"
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr "Isso não se parece com uma chave pública SSH, você tem certeza que gostaria de adicioná-la?"
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Escreva %{confirmationValue} para confirmar:"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr "Geralmente se inicia com \"ssh-rsa …\""
+
msgid "Profiles|Update username"
msgstr "Atualizar nome de usuário"
@@ -3536,6 +4947,9 @@ msgstr "Você precisa delegar outro usuário para ser dono ou apagar esses grupo
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "Sua conta é atualmente proprietária dos seguintes grupos:"
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr "sua conta"
@@ -3590,9 +5004,27 @@ msgstr "O link para a exportação do projeto expirou. Favor gerar uma nova expo
msgid "Project export started. A download link will be sent by email."
msgstr "Exportação do projeto iniciada. Um link para baixá-la será enviado por email."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "Inscreva-se"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Nome"
@@ -3602,9 +5034,39 @@ msgstr "Nunca"
msgid "ProjectLifecycle|Stage"
msgstr "Etapa"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr "Usuários só podem fazer push para este repositório com commits que contenham um de seus e-mails verificados."
+
msgid "Projects"
msgstr "Projetos"
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "Visitados frequentemente"
@@ -3623,8 +5085,35 @@ msgstr "Algo deu errado do nosso lado."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "Desculpe, nenhum projeto corresponde a sua pesquisa"
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr "Esta funcionalidade necessita de suporte à localStorage do navegador"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
+msgstr ""
msgid "PrometheusDashboard|Time"
msgstr "Tempo"
@@ -3650,9 +5139,18 @@ msgstr "Por padrão, Prometheus escuta em 'http://localhost:9090'. Não é recom
msgid "PrometheusService|Common metrics"
msgstr "Métricas comuns"
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "Encontrando e configurando métricas..."
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "Instale o Prometheus nos clusters"
@@ -3665,21 +5163,24 @@ msgstr "Configuração manual"
msgid "PrometheusService|Metrics"
msgstr "Métricas"
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr "Variável de ambiente ausente"
msgid "PrometheusService|More information"
msgstr "Mais informações"
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr "URL da API base do Prometheus. como http://prometheus.example.com/"
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr "Prometheus está sendo automaticamente gerenciado nos seus clusters"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr "Serviço de monitoramento de tempo-de-série"
@@ -3702,6 +5203,18 @@ msgid "Promote to Group Milestone"
msgstr "Promover para Milestone de Grupo"
msgid "Promote to group label"
+msgstr "Promover para etiqueta de grupo"
+
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
msgstr ""
msgid "Protip:"
@@ -3710,6 +5223,9 @@ msgstr "Dicas:"
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "Público - O grupo e seus projetos podem ser visualizados por todos sem autenticação."
@@ -3717,6 +5233,9 @@ msgid "Public - The project can be accessed without any authentication."
msgstr "Público - O projeto pode ser acessado sem nenhuma autenticação."
msgid "Public pipelines"
+msgstr "Pipelines públicos"
+
+msgid "Push Rules"
msgstr ""
msgid "Push events"
@@ -3728,15 +5247,27 @@ msgstr "Fazer push do projeto por linha de comando"
msgid "Push to create a project"
msgstr "Push para criar um projeto"
-msgid "Quick actions can be used in the issues description and comment boxes."
-msgstr "Ações rápidas podem ser usadas nas descrições das issues e nas caixas de comentário."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
-msgid "Re-deploy"
+msgid "Quarters"
msgstr ""
+msgid "Quick actions can be used in the issues description and comment boxes."
+msgstr "Ações rápidas podem ser usadas nas descrições das issues e nas caixas de comentário."
+
msgid "Read more"
msgstr "Leia mais"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "Leia-me"
@@ -3746,6 +5277,9 @@ msgstr "Recursos em tempo real"
msgid "Reference:"
msgstr "Referência:"
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr "Registrar/Login"
@@ -3797,12 +5331,27 @@ msgstr "Remover prioridade"
msgid "Remove project"
msgstr "Remover projeto"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr "Repositório"
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr "Manutenção do repositório"
@@ -3812,9 +5361,15 @@ msgstr "Espelhamento do repositório"
msgid "Repository storage"
msgstr "Armazenamento do Repositório"
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "Solicitar acesso"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "Exija que todos os usuários aceitem Termos de Serviço e Política de Privacidade quando acessarem o GitLab."
@@ -3836,6 +5391,9 @@ msgstr "Resolver conflitos na branch de origem"
msgid "Resolve discussion"
msgstr "Resolver discussão"
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr "Continuar"
@@ -3862,13 +5420,22 @@ msgstr "Reverter esse merge request"
msgid "Review"
msgstr "Revisar"
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr "Revisão"
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr "Revisando (merge request !%{mergeRequestId})"
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr "Os corredores podem ser colocados em usuários, servidores e até mesmo
msgid "Running"
msgstr "Executando"
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr "Chaves SSH"
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr "Salvar alterações"
@@ -3916,6 +5501,15 @@ msgstr "Agendamentos"
msgid "Scheduling Pipelines"
msgstr "Agendando pipelines"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr "Rolar até o final"
@@ -3955,6 +5549,21 @@ msgstr "Segundos antes de redefinir as informações de falha"
msgid "Seconds to wait for a storage access attempt"
msgstr "Segundo de espera para tentativa de acesso ao storage"
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr "Selecionar"
@@ -3985,12 +5594,21 @@ msgstr "Selecione projeto e zona para escolher o tipo de máquina"
msgid "Select project to choose zone"
msgstr "Selecione o projeto para escolher a zona"
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr "Selecionar branch de origem"
msgid "Select target branch"
msgstr "Selecionar branch de destino"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr "Enviar e-mail"
@@ -4003,9 +5621,15 @@ msgstr "Setembro"
msgid "Server version"
msgstr "Versão do servidor"
+msgid "Service Desk"
+msgstr "Balcão de Atendimento"
+
msgid "Service Templates"
msgstr "Modelos de serviço"
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr "Expiração de sessão, limite de projetos e tamanho de anexo."
@@ -4030,6 +5654,9 @@ msgstr "Configurar CI/CD"
msgid "Set up Koding"
msgstr "Configurar Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "defina uma senha"
@@ -4042,9 +5669,24 @@ msgstr "Configurar um Runner específico automaticamente"
msgid "Share"
msgstr "Compartilhar"
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr "Runners Compartilhados"
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr "Exibir comando"
@@ -4074,6 +5716,30 @@ msgstr[1] "Mostrando %d eventos"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr "Sair"
@@ -4086,6 +5752,9 @@ msgstr "Restrições de cadastro"
msgid "Size and domain settings for static websites"
msgstr "Configurações de tamanho e domínio para sites estáticos"
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr "Algo deu errado ao alternar o botão"
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr "Algo deu errado ao recuperar os projetos."
@@ -4114,7 +5789,7 @@ msgid "Something went wrong while fetching the registry list."
msgstr "Algo deu errado ao recuperar a lista de registro."
msgid "Something went wrong while reopening the %{issuable}. Please try again later"
-msgstr ""
+msgstr "Alguma coisa deu errado ao reabrir o %{issuable}. Por favor, tente novamente depois"
msgid "Something went wrong while resolving this discussion. Please try again."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr "Algo deu errado. Por favor, tente novamente."
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr "Ordenar por"
@@ -4164,6 +5842,9 @@ msgstr "Últimos atualizados"
msgid "SortOptions|Least popular"
msgstr "Menos populares"
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr "Milestone"
@@ -4173,6 +5854,9 @@ msgstr "Milestone de fim mais longo"
msgid "SortOptions|Milestone due soon"
msgstr "Milestone de fim mais próximo"
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr "Mais populares"
@@ -4212,6 +5896,9 @@ msgstr "Iniciar mais tarde"
msgid "SortOptions|Start soon"
msgstr "Iniciar mais próximo"
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr "Origem"
@@ -4240,13 +5927,13 @@ msgid "Squash commits"
msgstr "Squash commits"
msgid "Stage"
-msgstr ""
+msgstr "Colocar na lista para commit"
msgid "Stage & Commit"
-msgstr ""
+msgstr "Colocar na lista para commit e fazer commit"
msgid "Stage all changes"
-msgstr ""
+msgstr "Colocar tudo na lista para commit"
msgid "Stage changes"
msgstr "Mudanças na lista de commit"
@@ -4255,13 +5942,13 @@ msgid "Staged"
msgstr "Na lista para commit"
msgid "Staged %{type}"
-msgstr ""
+msgstr "%{type} na lista para commit"
msgid "Star a label to make it a priority label. Order the prioritized labels to change their relative priority, by dragging."
msgstr "Coloque uma estrela em um label para dar prioridade. Altere a ordem das labels priorizadas arrastando-as para alterar sua prioridade."
msgid "StarProject|Star"
-msgstr "Marcar"
+msgstr "Marcar como favorito"
msgid "Starred Projects"
msgstr "Projetos favoritos"
@@ -4284,9 +5971,15 @@ msgstr "Iniciado"
msgid "Starts at (UTC)"
msgstr "Começa em (UTC)"
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr "Status"
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr "Parar este ambiente"
@@ -4296,9 +5989,18 @@ msgstr "Parado"
msgid "Storage"
msgstr "Armazenamento"
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr "Subgrupos"
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr "Inscrever-se"
@@ -4311,9 +6013,21 @@ msgstr "Inscrever-se no nível do projeto"
msgid "Switch branch/tag"
msgstr "Trocar branch/tag"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr "Hooks do sistema"
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] "Tag (%{tag_count})"
@@ -4412,18 +6126,30 @@ msgstr "Termos de Serviço e Política de Privacidade"
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "Issue Tracker é o lugar para adicionar coisas que precisam ser melhoradas ou resolvidas em um projeto"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "Issue Tracker é o lugar para adicionar coisas que precisam ser melhoradas ou resolvidas em um projeto. Você precisa se registrar ou fazer login para criar alguma Issue para este projeto."
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "A etapa de codificação mostra o tempo desde a entrega do primeiro commit até a criação do merge request. Os dados serão automaticamente adicionados aqui desde o momento de criação do merge request."
msgid "The collection of events added to the data gathered for that stage."
msgstr "A coleção de eventos adicionados aos dados coletados para essa etapa."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "O relacionamento como fork foi removido."
@@ -4439,8 +6165,11 @@ msgstr "O tamanho máximo do arquivo é de 200KB."
msgid "The number of attempts GitLab will make to access a storage."
msgstr "O número de tentativas que gitlab fará para acessar um storage."
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
-msgstr "O número de falhas para que o GitLab desabilite o acesso ao storage. O número de falhas pode ser redefinido na interface do administrador: %{link_to_health_page} ou %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
+msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
msgstr ""
@@ -4451,6 +6180,9 @@ msgstr "A fase do ciclo de vida do desenvolvimento."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "A etapa de planejamento mostra o tempo do passo anterior até a publicação de seu primeiro conjunto de mudanças. Este tempo será adicionado automaticamente assim que você enviar seu primeiro conjunto de mudanças."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "A etapa de produção mostra o tempo total que leva entre criar uma issue e implantar o código em produção. Os dados serão adicionados automaticamente assim que você completar todo o ciclo de produção."
@@ -4460,6 +6192,9 @@ msgstr "O projeto pode ser acessado por qualquer usuário autenticado."
msgid "The project can be accessed without any authentication."
msgstr "O projeto pode ser acessado sem a necessidade de autenticação."
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "Não existe repositório para este projeto."
@@ -4472,6 +6207,9 @@ msgstr "O repositório deve ser acessível por <code>http://</code>, <code>https
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "A etapa de revisão mostra o tempo de criação de uma solicitação de incorporação até sua aceitação. Os dados serão automaticamente adicionados depois que sua primeira solicitação de incorporação for aceita."
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr "Tempo em segundos para o GitLab manter as informações de falha. Se nen
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr "Tempo em segundos que o GitLab tentará acessar o storage. Depois desse tempo, um erro de tempo excedido será disparado."
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
-msgstr "O tempo em segundos entre as verificações de armazenamento. Quando uma verificação anterior foi concluída ainda, o GitLab pulará uma verificação."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
+msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "O tempo necessário por cada entrada de dados reunida por essa etapa."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "O valor situado no ponto médio de uma série de valores observados. Ex., entre 3, 5, 9, a mediana é 5. Entre 3, 5, 7, 8, a mediana é (5+7)/2 = 6."
@@ -4500,7 +6244,7 @@ msgid "There are no issues to show"
msgstr "Não há issues para mostrar"
msgid "There are no labels yet"
-msgstr ""
+msgstr "Não há etiquetas ainda"
msgid "There are no merge requests to show"
msgstr "Não há merge requests pra mostrar"
@@ -4508,12 +6252,6 @@ msgstr "Não há merge requests pra mostrar"
msgid "There are problems accessing Git storage: "
msgstr "Há problemas para acessar o storage Git: "
-msgid "There was an error loading jobs"
-msgstr "Ocorreu um erro ao carregar tarefas"
-
-msgid "There was an error loading latest pipeline"
-msgstr "Ocorreu um erro ao carregar o pipeline mais recente"
-
msgid "There was an error loading users activity calendar."
msgstr "Erro ao carregar calendário de atividades."
@@ -4535,15 +6273,33 @@ msgstr "Erro ao se anular a inscrição dessa label."
msgid "They can be managed using the %{link}."
msgstr "Eles podem ser gerenciados usando o %{link}."
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr "Esta instância do GitLab ainda não fornece nenhum Runner compartilhado. Os administradores da instância podem registrar os Runners compartilhados na área de administração."
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr "Esse diretório"
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr "Este grupo não fornece nenhum grupo de Runners ainda."
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr "Esses e-mails se tornam automaticamente issues (com os comentários se tornando a conversa por e-mail) listados aqui."
+
msgid "Time before an issue gets scheduled"
msgstr "Tempo até que uma issue seja agendada"
@@ -4628,6 +6390,9 @@ msgstr "Tempo até que uma issue comece a ser implementado"
msgid "Time between merge request creation and merge/close"
msgstr "Tempo entre a criação da solicitação de incorporação e a aceitação/fechamento"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr "Tempo restante"
@@ -4650,7 +6415,7 @@ msgid "TimeTracking|Spent"
msgstr "Gasto"
msgid "Timeago|%s days ago"
-msgstr "%s dias"
+msgstr "%s dias atrás"
msgid "Timeago|%s days remaining"
msgstr "%s dias restantes"
@@ -4662,13 +6427,13 @@ msgid "Timeago|%s hours remaining"
msgstr "%s horas restantes"
msgid "Timeago|%s minutes ago"
-msgstr "%s minutos"
+msgstr "%s minutos atrás"
msgid "Timeago|%s minutes remaining"
msgstr "%s minutos restantes"
msgid "Timeago|%s months ago"
-msgstr "%s meses"
+msgstr "%s meses atrás"
msgid "Timeago|%s months remaining"
msgstr "%s meses restantes"
@@ -4680,13 +6445,13 @@ msgid "Timeago|%s seconds remaining"
msgstr "%s segundos restantes"
msgid "Timeago|%s weeks ago"
-msgstr "%s semanas"
+msgstr "%s semanas atrás"
msgid "Timeago|%s weeks remaining"
msgstr "%s semanas restantes"
msgid "Timeago|%s years ago"
-msgstr "%s anos"
+msgstr "%s anos atrás"
msgid "Timeago|%s years remaining"
msgstr "%s anos restantes"
@@ -4794,10 +6559,28 @@ msgstr "s"
msgid "Tip:"
msgstr "Dica:"
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr "Para o GitLab"
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
+msgstr "Para adicionar uma chave SSH, você precisa %{generate_link_start}gerar uma%{link_end} ou usar uma %{existing_link_start}chave existente%{link_end}."
+
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
msgstr ""
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
@@ -4809,21 +6592,45 @@ msgstr "Para importar repositórios do GitHub, primeiro você precisa autorizar
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Para importar um repositório SVN, confira %{svn_link}."
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr "Para começar a servir suas tarefas, você pode adicionar Runners ao seu grupo"
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr "Para validar suas configurações de CI do GitLab, vá para 'CI/CD → Pipelines' dentro do seu projeto e clique no botão 'CI Lint'."
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr "Pendente"
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr "Alternar barra lateral"
msgid "Toggle discussion"
msgstr "Alternar discussão"
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr "Ativar/Desativar barra lateral"
@@ -4836,6 +6643,9 @@ msgstr "Mudar Status: Ligado"
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr "Contribuições totais"
+
msgid "Total Time"
msgstr "Tempo Total"
@@ -4845,9 +6655,18 @@ msgstr "Tempo de teste total para todos os commits/merges"
msgid "Total: %{total}"
msgstr "Total: %{total}"
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr "Acompanhe o tempo com ações rápidas"
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr "Acionar esta ação manual"
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr "Tente novamente"
+msgid "Turn on Service Desk"
+msgstr "Ativar o Balcão de Atendimento"
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr "Não é possível carregar o diff. %{button_try_again}"
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr "Desbloquear"
@@ -4870,7 +6701,7 @@ msgid "Unresolve discussion"
msgstr "Reabrir discussão"
msgid "Unstage all changes"
-msgstr ""
+msgstr "Retirar tudo da lista para commit"
msgid "Unstage changes"
msgstr "Retirar mudanças da lista de commit"
@@ -4879,13 +6710,13 @@ msgid "Unstaged"
msgstr "Fora da lista de commit"
msgid "Unstaged %{type}"
-msgstr ""
+msgstr "%{type} fora da lista para commit"
msgid "Unstaged and staged %{type}"
-msgstr ""
+msgstr "%{type} dentro e fora da lista para commit"
msgid "Unstar"
-msgstr "Desmarcar"
+msgstr "Desmarcar como favorito"
msgid "Unsubscribe"
msgstr "Cancelar inscrição"
@@ -4902,14 +6733,30 @@ msgstr "Não verificado"
msgid "Up to date"
msgstr "Atualizado"
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr "Atualize o nome do seu grupo, descrição, avatar e outras configurações gerais."
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr "Aprimore seu plano para ativar a Pesquisa Global Avançada."
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr "Aprimore seu plano para ativar a Análise de Contribuição."
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "Enviar Novo Arquivo"
@@ -4928,18 +6775,36 @@ msgstr "Votos positivos"
msgid "Usage statistics"
msgstr "Estatísticas de uso"
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr "Use o Balcão de Atendimento para se conectar com seus usuários (por exemplo, para oferecer suporte ao cliente) por email dentro do GitLab"
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr "Use milestones de grupo para gerenciar problemas de vários projetos no mesmo milestone."
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "Use o seguinte token de registro durante a configuração:"
msgid "Use your global notification setting"
msgstr "Utilizar configuração de notificação global"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr "Configurações do Usuário"
+
msgid "User and IP Rate Limits"
msgstr "Limites de Taxa de Usuário e IP"
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr "Várias configurações de email."
msgid "Various settings that affect GitLab performance."
msgstr "Várias configurações que afetam o desempenho do GitLab."
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr "Verificado"
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr "Ver arquivo @ "
msgid "View group labels"
msgstr "Visualizar labels do grupo"
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr "Visualizar tarefas"
@@ -4988,6 +6865,12 @@ msgstr "Ver arquivo substituído @ "
msgid "Visibility and access controls"
msgstr "Visibilidade e controles de acesso"
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Interno"
@@ -5003,6 +6886,9 @@ msgstr "Desconhecido"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Precisa visualizar os dados? Solicite acesso ao administrador."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "Esta etapa não possui dados suficientes para exibição."
@@ -5015,12 +6901,27 @@ msgstr "IDE Web"
msgid "Web terminal"
msgstr "Terminal Web"
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr "Webhooks permitem que você acione uma URL se, por exemplo, um novo código for pushado ou se uma nova issue for criada. Você pode configurar os webhooks para interagir com eventos específicos como pushes, issues ou merge requests. Webhooks de grupos serão aplicados para todos os projetos em um grupo, permitindo que você padronize o funcionamento em todo o grupo."
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr "Quando um runner está bloqueado, não pode ser atribuído a outros projetos"
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr "Quando ativado, os usuários não podem usar o GitLab até que os termos tenham sido aceitos."
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr "Ao deixar o URL em branco, a classificação das etiquetas ainda podem ser especificadas sem desativar os recursos do projeto ou executar verificações de autorização externas."
+
msgid "Wiki"
msgstr "Wiki"
@@ -5055,7 +6956,7 @@ msgid "WikiEmptyIssueMessage|issue tracker"
msgstr "issue tracker"
msgid "WikiEmpty|A wiki is where you can store all the details about your project. This can include why you've created it, its principles, how to use it, and so on."
-msgstr ""
+msgstr "Um wiki é onde você pode armazenar todos os detalhes sobre o seu projeto. Isso pode incluir por que você criou, seus princípios, como usá-lo e assim por diante."
msgid "WikiEmpty|Create your first page"
msgstr "Crie sua primeira página"
@@ -5156,12 +7057,24 @@ msgstr "Páginas"
msgid "Wiki|Wiki Pages"
msgstr "Páginas Wiki"
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "Remover Requisição de Acesso"
msgid "Yes"
msgstr "Sim"
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Você vai remover %{group_name}. Grupos removidos NÃO PODEM ser restaurados! Você está ABSOLUTAMENTE certo?"
@@ -5177,6 +7090,9 @@ msgstr "Você irá transferir %{project_full_name} para outro proprietário. Tem
msgid "You are on a read-only GitLab instance."
msgstr "Você está em uma instância somente-leitura do GitLab."
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr "Você também pode marcar uma label para torná-la uma label de priorida
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr "Você também pode testar o seu .gitlab-ci.yml no %{linkStart}Lint%{linkEnd}"
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr "Você pode instalar facilmente um Runner em um cluster Kubernetes. %{link_to_help_page}"
@@ -5204,12 +7123,24 @@ msgstr "Você só pode editar arquivos quando estiver em um branch"
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Você pode resolver o conflito de merge usando o modo Interativo, escolhendo os botões %{use_ours} ou %{use_theirs} ou editando os arquivos diretamente. Confirme essas alterações em %{branch_name}"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr "Você não pode escrever nesta instância somente-leitura do GitLab."
msgid "You do not have any assigned merge requests"
msgstr "Você não atribuiu nenhum merge request"
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr "Você não tem permissão"
@@ -5228,6 +7159,12 @@ msgstr "Você deve ter o acesso de mantenedor para apagar um bloqueio"
msgid "You must sign in to star a project"
msgstr "Você deve estar autenticado para marcar um projeto"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "Você precisa de permissão."
@@ -5258,9 +7195,18 @@ msgstr "Você não poderá fazer push ou pull do código via SSH enquanto não a
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "Você precisará usar nomes de branch diferentes para obter uma comparação válida."
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr "Você está recebendo este e-mail devido à sua conta no %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr "Seus Grupos"
@@ -5276,6 +7222,12 @@ msgstr "Atividade dos seus projetos"
msgid "Your Todos"
msgstr "Seus lembretes"
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr "Você pode fazer commit de suas alterações para %{branch_name} porque um merge request está aberto."
@@ -5300,18 +7252,239 @@ msgstr "atrás"
msgid "among other things"
msgstr "entre outras coisas"
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr "atribuir a si mesmo"
msgid "branch name"
msgstr "nome da branch"
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr "na pipeline"
+
msgid "command line instructions"
msgstr "instruções da linha de comando"
msgid "connecting"
msgstr "conectando"
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "dia"
@@ -5320,9 +7493,25 @@ msgstr[1] "dias"
msgid "deploy token"
msgstr "token de deploy"
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr "desabilitado"
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr "habilitado"
@@ -5332,12 +7521,30 @@ msgstr "%{slash_command} irá atualizar o tempo estimado com o último comando."
msgid "for this project"
msgstr "para este projeto"
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr "importando"
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "merge request"
@@ -5355,9 +7562,24 @@ msgstr "%{metricsLinkStart} Memória %{metricsLinkEnd} uso %{emphasisStart} aume
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr "%{metricsLinkStart} Memória %{metricsLinkEnd} uso é %{emphasisStart} inalterado %{emphasisEnd} em %{memoryFrom}MB"
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr "Permite commits de membros que podem fazer merge ao branch de destino"
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr "Cancelar merge request automático"
@@ -5418,9 +7640,24 @@ msgstr "Falha ao fazer merge."
msgid "mrWidget|Merge locally"
msgstr "Fazer merge localmente"
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr "Merge realizado por"
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr "Abrir na Web IDE"
+
msgid "mrWidget|Plain diff"
msgstr "Diff em texto"
@@ -5439,6 +7676,9 @@ msgstr "Remover branch de origem"
msgid "mrWidget|Remove source branch"
msgstr "Remover branch de origem"
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr "Solicitar merge"
@@ -5490,9 +7730,6 @@ msgstr "Esse merge request está em processamento"
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr "Este projeto está arquivado, a escrita foi desativada"
-msgid "mrWidget|Web IDE"
-msgstr "IDE Web"
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr "Você pode fazer merge manualmente usando o"
@@ -5531,27 +7768,42 @@ msgstr "senha"
msgid "personal access token"
msgstr "token de acesso pessoal"
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr "restante"
msgid "remove due date"
msgstr "remover a data de vencimento"
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr "origem"
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr "%{slash_command} irá atualizar a soma do tempo gasto."
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr "este documento"
+msgid "to help your contributors communicate effectively!"
+msgstr "para ajudar seus contribuintes à se comunicar de maneira eficaz!"
+
msgid "username"
msgstr "nome do usuário"
msgid "uses Kubernetes clusters to deploy your code!"
msgstr "use clusters Kubernetes para deploy do seu código!"
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr "com %{additions} adições, %{deletions} remoções."
diff --git a/locale/ru/gitlab.po b/locale/ru/gitlab.po
index d2c990ec220..e5627672761 100644
--- a/locale/ru/gitlab.po
+++ b/locale/ru/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -15,6 +13,24 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:39\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -72,6 +88,13 @@ msgstr[1] "%d метрики"
msgstr[2] "%d метрик"
msgstr[3] "%d метрик"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] "%d запиÑанное изменение"
@@ -86,6 +109,13 @@ msgstr[1] "%d не запиÑанных изменений"
msgstr[2] "%d не запиÑанных изменений"
msgstr[3] "%d не запиÑанных изменений"
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s дополнительный коммит был пропущен Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью."
@@ -99,6 +129,9 @@ msgstr "%{actionText} & %{openOrClose} %{noteable}"
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "%{commit_author_link} Ñоздан %{commit_timeago}"
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} учаÑтник"
@@ -118,6 +151,9 @@ msgstr "%{loadingIcon} Запущено"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} заблокирован пользователем GitLab %{lock_user_id}"
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr "%{nip_domain} может иÑпользоватьÑÑ ÐºÐ°Ðº альтернатива пользовательÑкому домену."
@@ -143,18 +179,29 @@ msgstr[1] "%{storage_name}: %{failed_attempts} неудачные попытки
msgstr[2] "%{storage_name}: %{failed_attempts} неудачных попыток доÑтупа к хранилищу:"
msgstr[3] "%{storage_name}: %{failed_attempts} неудачных попыток доÑтупа к хранилищу:"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{text} is available"
msgstr "%{text} доÑтупен"
msgid "%{title} changes"
msgstr "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %{title}"
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr "%{unstaged} не зафикÑированных и %{staged} зафикÑированных изменений"
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(перейдите по ÑÑылке %{link} Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ об уÑтановке)."
-
msgid "+ %{moreCount} more"
msgstr "+ ещё %{moreCount}"
@@ -244,6 +291,30 @@ msgstr "Страница Ðе Ðайдена"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr "<strong>УдалÑет</strong> иÑходную ветку"
@@ -265,9 +336,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr "Пользователь Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸ÐµÐ¼ на запиÑÑŒ в ветку иÑточника выбрал Ñтот вариант"
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "Об автоматичеÑком развёртывании"
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Отчёты о Жалобах"
@@ -277,9 +357,18 @@ msgstr ""
msgid "Accept terms"
msgstr "ПринÑÑ‚ÑŒ уÑловиÑ"
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Токены ДоÑтупа"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "ДоÑтуп к вышедшим из ÑÑ‚Ñ€Ð¾Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°Ð¼ временно отключен Ð´Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² целÑÑ… воÑÑтановлениÑ. СброÑьте информацию о хранилищах поÑле уÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ñ‹, чтобы разрешить доÑтуп."
@@ -301,12 +390,18 @@ msgstr "Ðктивные ÑеÑÑии"
msgid "Activity"
msgstr "ÐктивноÑÑ‚ÑŒ"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "Добавить Журнал Изменений"
msgid "Add Contribution guide"
msgstr "Добавить РуководÑтво учаÑтника"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr "Добавить Kubernetes клаÑтер"
@@ -316,15 +411,39 @@ msgstr "Добавить Лицензию"
msgid "Add Readme"
msgstr "Добавить Информацию"
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Добавить новый каталог"
msgid "Add reaction"
-msgstr ""
+msgstr "Добавить реакцию"
msgid "Add todo"
msgstr "Добавить в дела"
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "ОÑтановить вÑе заданиÑ"
@@ -406,12 +525,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "ПозволÑет добавлÑÑ‚ÑŒ и управлÑÑ‚ÑŒ клаÑтерами Kubernetes."
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -430,12 +576,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr "Произошла ошибка при предварительном проÑмотре объекта"
msgid "An error occurred when toggling the notification subscription"
msgstr "Произошла ошибка при переключении подпиÑки на оповещениÑ"
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr "При отключении Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð¾ÑˆÐ»Ð° ошибка. Обновите Ñтраницу и повторите попытку."
@@ -457,8 +615,11 @@ msgstr "Произошла ошибка при получении ÑпиÑка Ð
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
-msgstr "Произошла ошибка при загрузке коммитов"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
+msgstr ""
msgid "An error occurred while loading diff"
msgstr "Произошла ошибка при загрузке различий"
@@ -472,6 +633,9 @@ msgstr "Произошла ошибка при загрузке файла"
msgid "An error occurred while making the request."
msgstr "Произошла ошибка при выполнении запроÑа."
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr "Произошла ошибка при рендеринге KaTeX"
@@ -484,18 +648,48 @@ msgstr "Произошла ошибка при получении календа
msgid "An error occurred while retrieving diff"
msgstr "Произошла ошибка при получении различий"
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr "Произошла ошибка при Ñохранении ответÑтвенных"
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr "Произошла ошибка при проверке имени пользователÑ"
msgid "An error occurred. Please try again."
msgstr "Произошла ошибка. ПожалуйÑта, попробуйте Ñнова."
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr "Оформление"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "ПриложениÑ"
@@ -511,6 +705,12 @@ msgstr "Ðрхивный проект! Репозиторий и другие Ñ€
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить Ñто раÑпиÑание Ñборочной линии?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -520,15 +720,24 @@ msgstr "Ð’Ñ‹ уверены, что хотите ÑброÑить Ñтот реÐ
msgid "Are you sure you want to reset the health check token?"
msgstr "Ð’Ñ‹ уверены, что хотите ÑброÑить Ñтот токен проверки работоÑпоÑобноÑти?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr "Вы уверены?"
msgid "Artifacts"
msgstr "Ðртефакты"
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr "Ðазначьте пользовательÑкий цвет, например #FF0000"
@@ -551,17 +760,26 @@ msgid "Assigned to :name"
msgstr "Ðазначено на :name"
msgid "Assigned to me"
-msgstr ""
+msgstr "Ðазначить мне"
msgid "Assignee"
msgstr "ОтветÑтвенный"
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr "ОтветÑтвенный(ные)"
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Приложить файл через drag &amp; drop или %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr "Ðвг."
@@ -571,12 +789,36 @@ msgstr "ÐвгуÑÑ‚"
msgid "Authentication Log"
msgstr "Журнал аутентификации"
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr "Ðвтор"
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr "Ðвторы: %{authors}"
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr "Auto DevOps включен"
@@ -634,6 +876,12 @@ msgstr "Ðватар будет удален. Ð’Ñ‹ уверены?"
msgid "Average per day: %{average}"
msgstr "Ð’ Ñреднем за день: %{average}"
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -715,6 +963,81 @@ msgstr "Ðачать Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ коммита"
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr "ДоÑки"
@@ -836,6 +1159,9 @@ msgstr "ЗаÑтаревшие"
msgid "Branches|Stale branches"
msgstr "ЗаÑтаревшие ветки"
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr "Ветка \"по умолчанию\" не может быть удалена"
@@ -848,9 +1174,15 @@ msgstr "Чтобы избежать потери данных, раÑÑмотрÐ
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ, введите %{branch_name_confirmation}:"
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ безвозвратно удалить защищённую ветку %{branch_name}."
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr "влита"
@@ -872,6 +1204,9 @@ msgstr "ПроÑмотр файлов"
msgid "Browse files"
msgstr "ПроÑмотр файлов"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "по автору"
@@ -881,9 +1216,15 @@ msgstr "CI / CD"
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ CI/CD"
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr "ÐаÑтройки CI/CD"
@@ -911,6 +1252,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr "Отключить Auto DevOps"
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr "Включить Auto DevOps"
@@ -932,6 +1276,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -947,6 +1297,12 @@ msgstr "Ðет возможноÑти объединить автоматичеÑ
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Ðевозможно изменить управлÑемый клаÑтер Kubernetes"
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr "Измените Ñто значение, чтобы уÑтановить как чаÑто GitLab UI запрашивает обновлениÑ."
@@ -992,6 +1348,12 @@ msgstr "Подобрать в Ñтом коммите"
msgid "Cherry-pick this merge request"
msgstr "Подобрать Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr "Выберите Файл..."
@@ -999,7 +1361,7 @@ msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to s
msgstr "Выберите ветку/тег (например, %{master}) или введите коммит (например, %{sha}), чтобы увидеть, что изменилоÑÑŒ или Ñоздать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние."
msgid "Choose any color."
-msgstr ""
+msgstr "Выберите любой цвет."
msgid "Choose between <code>clone</code> or <code>fetch</code> to get the recent application code"
msgstr ""
@@ -1007,9 +1369,21 @@ msgstr ""
msgid "Choose file..."
msgstr "Выберите файл..."
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr "Выберите, какие репозитории вы хотите импортировать."
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "отменено"
@@ -1079,12 +1453,21 @@ msgstr " * (Ð’Ñе Ñреды)"
msgid "CiVariable|All environments"
msgstr "Ð’Ñе Ñреды"
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr "Произошла ошибка при Ñохранении переменных"
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr "Защищено"
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr "Включить защиту"
@@ -1094,15 +1477,24 @@ msgstr "Проверка не удалаÑÑŒ"
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr "CircuitBreaker API"
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr "ОчиÑтить Ñтроку поиÑка"
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr "Выберите из ÑпиÑка любой <strong>проект</strong>, чтобы перейти к Ñтапу проекта."
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr "Ðажмите кнопку ниже, чтобы начать процеÑÑ ÑƒÑтановки, Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð½Ð° Ñтраницу Kubernetes"
@@ -1112,12 +1504,30 @@ msgstr ""
msgid "Click to expand text"
msgstr "Ðажмите, чтобы раÑкрыть текÑÑ‚"
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr "Клонировать репозиторий"
msgid "Close"
msgstr "Закрыть"
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr "%{appList} уÑпешно уÑтановлены на вашем клаÑтере Kubernetes"
@@ -1127,9 +1537,6 @@ msgstr "ÐÐ´Ñ€ÐµÑ API"
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Добавить клаÑтер Kubernetes"
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr "Добавить ÑущеÑтвующий клаÑтер Kubernetes"
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr "Дополнительные опции Ð´Ð»Ñ Ñтой интеграции Ñ ÐºÐ»Ð°Ñтером Kubernetes"
@@ -1151,9 +1558,6 @@ msgstr "Сертификат удоÑтоверÑющего центра"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Комплект Ñертификатов удоÑтоверÑющего центра (формат PEM)"
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr "Выберите ÑпоÑоб наÑтройки интеграции Ñ ÐºÐ»Ð°Ñтером Kubernetes"
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr "Выберите, какие Ñреды вашего проекта будут иÑпользовать Ñтот клаÑтер Kubernetes."
@@ -1181,17 +1585,8 @@ msgstr "Скопировать Токен"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Создать клаÑтер Kubernetes"
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr "Создать клаÑтер при помощи Google Kubernetes Engine"
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr "Создайте новый клаÑтер Kubernetes в Google Kubernetes Engine прÑмо из GitLab"
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr "Создать в Google Kubernetes Engine"
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
-msgstr "Укажите параметры ÑущеÑтвующего клаÑтера Kubernetes"
+msgid "ClusterIntegration|Did you know?"
+msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Введите ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ вашем клаÑтере Kubernetes"
@@ -1229,6 +1624,15 @@ msgstr "Проект Google Kubernetes Engine"
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr "Ingress"
@@ -1238,6 +1642,9 @@ msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ingress"
msgid "ClusterIntegration|Install"
msgstr "УÑтановить"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr "УÑтановлен"
@@ -1251,10 +1658,10 @@ msgid "ClusterIntegration|Integration status"
msgstr " Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ð¸"
msgid "ClusterIntegration|Jupyter Hostname"
-msgstr ""
+msgstr "Ð˜Ð¼Ñ Ñ…Ð¾Ñта ÑервиÑа Jupyter"
msgid "ClusterIntegration|JupyterHub"
-msgstr ""
+msgstr "Хаб ÑервиÑа Jupyter"
msgid "ClusterIntegration|Kubernetes cluster"
msgstr "КлаÑтер Kubernetes"
@@ -1262,6 +1669,9 @@ msgstr "КлаÑтер Kubernetes"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ клаÑтере Kubernetes"
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr "Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ ÐºÐ»Ð°Ñтера Kubernetes"
@@ -1319,6 +1729,9 @@ msgstr "УправлÑйте вашему клаÑтером Kubernetes, перÐ
msgid "ClusterIntegration|More information"
msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr "Ðет типов машин, ÑоответÑтвующих вашему поиÑковому запроÑу"
@@ -1355,9 +1768,6 @@ msgstr "Prometheus"
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr "Прочтите нашу документацию %{link_to_help_page} по интеграции клаÑтера Kubernetes."
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr "Получите до $500 беÑплатного кредита Ð´Ð»Ñ Google Cloud Platform"
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr "Удалить интеграцию клаÑтера Kubernetes"
@@ -1472,6 +1882,9 @@ msgstr "правильно наÑтроен"
msgid "ClusterIntegration|sign up"
msgstr "зарегиÑтрироватьÑÑ"
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr "Свернуть"
@@ -1553,7 +1966,7 @@ msgid "Committed by"
msgstr "ЗафикÑировано автором"
msgid "Commit…"
-msgstr ""
+msgstr "Коммит…"
msgid "Compare"
msgstr "Сравнить"
@@ -1603,7 +2016,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr "ÐаÑтройка ограничений Ð´Ð»Ñ Web и API запроÑов."
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1615,9 +2028,18 @@ msgstr ""
msgid "Connect"
msgstr "Подключить"
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr "Подключить репозитории Ñ GitHub"
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr "РееÑÑ‚Ñ€ Контейнеров"
@@ -1669,6 +2091,9 @@ msgstr "Ð’Ñ‹ также можете иÑпользовать %{deploy_token} д
msgid "Continue"
msgstr "Продолжить"
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "ÐÐµÐ¿Ñ€ÐµÑ€Ñ‹Ð²Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Ð¸ развертывание"
@@ -1681,6 +2106,9 @@ msgstr "УчаÑтие"
msgid "Contribution guide"
msgstr "РуководÑтво учаÑтника"
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr "УчаÑтники"
@@ -1696,6 +2124,24 @@ msgstr "Коммиты в %{branch_name}, за иÑключением комми
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr "ПожалуйÑта подождите, Ñта Ñтраница автоматичеÑки обновитÑÑ Ð¿Ð¾ готовноÑти."
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr "Копировать URL в буфер обмена"
@@ -1708,10 +2154,10 @@ msgstr "Копировать команду в буфер обмена"
msgid "Copy commit SHA to clipboard"
msgstr "Копировать SHA коммита в буфер обмена"
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1720,6 +2166,9 @@ msgstr "Скопировать ÑÑылку в буфер обмена"
msgid "Copy to clipboard"
msgstr "Скопировать в буфер обмена"
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr "Создать"
@@ -1732,6 +2181,9 @@ msgstr "Создать новую ветку"
msgid "Create a new branch and merge request"
msgstr "Создать новую ветку и Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Создать личный токен на аккаунте Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отправки через %{protocol}."
@@ -1747,12 +2199,21 @@ msgstr "Создать каталог"
msgid "Create empty repository"
msgstr "Создать пуÑтой репозиторий"
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr "Создать файл"
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr "Создать метку группы"
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Создать ÑпиÑок из меток. ОбÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ñ Ñтой меткой поÑвлÑÑŽÑ‚ÑÑ Ð² Ñтом ÑпиÑке."
@@ -1771,6 +2232,9 @@ msgstr "Создать новый каталог"
msgid "Create new file"
msgstr "Создать новый файл"
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr "Создать новую метку"
@@ -1792,7 +2256,16 @@ msgstr "Ñоздать перÑональный токен доÑтупа"
msgid "Created"
msgstr "Создан"
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
+msgstr "Создано мной"
+
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
msgstr ""
msgid "Cron Timezone"
@@ -1801,6 +2274,9 @@ msgstr "Ð’Ñ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð·Ð¾Ð½Ð° Cron"
msgid "Cron syntax"
msgstr "СинтакÑÐ¸Ñ Cron"
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr "Профиль"
@@ -1816,6 +2292,15 @@ msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð½Ð°Ñтраиваемых уведомлений"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "ÐаÑтраиваемые уровни уведомлений аналогичны уровню уведомлений в ÑоответÑтвии Ñ ÑƒÑ‡Ð°Ñтием. С наÑтраиваемыми уровнÑми уведомлений вы также будете получать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ выбранных ÑобытиÑÑ…. Чтобы узнать больше, поÑмотрите %{notification_link}."
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "Ðналитика Цикла"
@@ -1840,6 +2325,9 @@ msgstr "Приёмка"
msgid "CycleAnalyticsStage|Test"
msgstr "ТеÑтирование"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr "Ð’Ñе"
@@ -1855,13 +2343,31 @@ msgstr "Декабрь"
msgid "Decline and sign out"
msgstr "Отклонить и выйти"
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "Определить наÑтраиваемый шаблон Ñ ÑинтакÑиÑом cron"
msgid "Delete"
msgstr "Удалить"
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
+msgstr "Удалить ÑпиÑок"
+
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
msgstr ""
msgid "Deploy"
@@ -1997,9 +2503,21 @@ msgstr "Создан новый токен Ð´Ð»Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr "ОпиÑание"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
@@ -2027,9 +2545,27 @@ msgstr "Отменить изменениÑ"
msgid "Discard draft"
msgstr "Удалить черновик"
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr "Отключить блок Ð²Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² Ðналитику Цикла"
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr "Домен"
@@ -2072,6 +2608,9 @@ msgstr "ГолоÑа \"против\""
msgid "Due date"
msgstr "Плановый Ñрок"
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2084,12 +2623,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr "Изменить раÑпиÑание Ñборочной линии %{id}"
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr "Редактируйте файлы в редакторе и зафикÑируйте Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð´ÐµÑÑŒ"
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr "Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°"
@@ -2108,6 +2662,12 @@ msgstr "Включить"
msgid "Enable Auto DevOps"
msgstr "Включить Auto DevOps"
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr "Включить Sentry Ð´Ð»Ñ Ð¾Ñ‚Ñ‡ÐµÑ‚Ð¾Ð² об ошибках и журналированиÑ."
@@ -2117,6 +2677,9 @@ msgstr "Включить и наÑтроить метрики InfluxDB."
msgid "Enable and configure Prometheus metrics."
msgstr "Включить и наÑтроить метрики Prometheus."
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr "Включить Ð´Ð»Ñ Ñтого проекта"
@@ -2126,6 +2689,9 @@ msgstr "Включить групповые обработчики заданиÐ
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2135,6 +2701,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr "Включите панель производительноÑти Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ группы."
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr "ЗаканчиваетÑÑ Ð² (UTC)"
@@ -2147,9 +2716,18 @@ msgstr "Произошла ошибка при получении окружен
msgid "Environments|An error occurred while making the request."
msgstr "Произошла ошибка во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа."
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr "Коммит"
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr "Развертывание"
@@ -2162,45 +2740,75 @@ msgstr "ОкружениÑ"
msgid "Environments|Job"
msgstr "Задание"
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr "Ðовое окружение"
msgid "Environments|No deployments yet"
msgstr "Еще нет развертываний"
-msgid "Environments|Open"
-msgstr "Открыть"
+msgid "Environments|No pod name has been specified"
+msgstr ""
-msgid "Environments|Re-deploy"
-msgstr "Переразвернуть"
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
+msgstr ""
msgid "Environments|Read more about environments"
msgstr "Подробнее об окружениÑÑ…"
-msgid "Environments|Rollback"
-msgstr "Откатить"
+msgid "Environments|Rollback environment"
+msgstr ""
msgid "Environments|Show all"
msgstr "Показать вÑе"
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr "Обновлено"
msgid "Environments|You don't have any environments right now."
msgstr "Ð’Ñ‹ пока не наÑтроили ни одного окружениÑ."
+msgid "Epic"
+msgstr ""
+
+msgid "Epic will be removed! Are you sure?"
+msgstr ""
+
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
msgid "Error Reporting and Logging"
msgstr "Отчеты об ошибках и журналирование"
-msgid "Error committing changes. Please try again."
-msgstr "Ошибка при Ñохранении изменений. ПожалуйÑта, попробуйте еще раз."
+msgid "Error creating epic"
+msgstr ""
msgid "Error fetching contributors data."
msgstr "Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… учаÑтников."
-msgid "Error fetching job trace"
-msgstr ""
-
msgid "Error fetching labels."
msgstr "Ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ðº."
@@ -2219,6 +2827,9 @@ msgstr "Ошибка загрузки данных ветки. ПожалуйÑÑ
msgid "Error loading last commit."
msgstr "Ошибка загрузки поÑледнего коммита."
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2267,21 +2878,60 @@ msgstr "ЕжемеÑÑчно (каждое 1-е чиÑло в 4:00)"
msgid "Every week (Sundays at 4:00am)"
msgstr "Еженедельно (по воÑкреÑениÑм в 4:00)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr "Развернуть"
msgid "Expand all"
-msgstr ""
+msgstr "Развернуть вÑе"
msgid "Expand sidebar"
msgstr "Развернуть боковую панель"
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr "Обзор проектов"
msgid "Explore public groups"
msgstr "ИÑÑледовать публичные группы"
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr "Ðеудачно"
@@ -2324,6 +2974,12 @@ msgstr "Файлы"
msgid "Files (%{human_size})"
msgstr "Файлов (%{human_size})"
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Фильтр по комментариÑми к коммитам"
@@ -2333,6 +2989,12 @@ msgstr "ПоиÑк по пути"
msgid "Find file"
msgstr "Ðайти файл"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr "Завершено"
@@ -2342,6 +3004,30 @@ msgstr "Первый"
msgid "FirstPushedBy|pushed by"
msgstr "отправлено автором"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2376,6 +3062,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr "Из %{provider_title}"
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "От ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð¾ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ в рабочей Ñреде"
@@ -2397,6 +3095,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr "Создать Ñтандартный набор меток"
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ð¸Ñ Git"
@@ -2418,11 +3311,29 @@ msgstr "Импорт из GitHub"
msgid "GitLab CI Linter has been moved"
msgstr "GitLab CI Linter перемещен"
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr "Групповые Обработчики Заданий (GitLab Group Runners) могут выполнÑÑ‚ÑŒ код Ð´Ð»Ñ Ð²Ñех проектов в Ñтой группе."
-msgid "GitLab Runner section"
-msgstr "Ð¡ÐµÐºÑ†Ð¸Ñ Gitlab Runner"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr "Gitaly"
@@ -2433,18 +3344,33 @@ msgstr "Серверы Gitaly"
msgid "Gitaly|Address"
msgstr ""
-msgid "Go Back"
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
msgstr ""
+msgid "Go Back"
+msgstr "ВернутьÑÑ Ð½Ð°Ð·Ð°Ð´"
+
msgid "Go back"
msgstr "ВернутьÑÑ"
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Перейти к вашему ответвлению"
msgid "GoToYourFork|Fork"
msgstr "Ответвление"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Google не %{link_to_documentation}. ПопроÑите Ñвоего админиÑтратора GitLab, еÑли вы хотите воÑпользоватьÑÑ Ñтим ÑервиÑом."
@@ -2454,18 +3380,72 @@ msgstr "ПонÑтно!"
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr "Групповые Обработчики Заданий (GitLab Group Runner)"
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Запретить публикацию проектов из %{group} в других группах"
@@ -2490,9 +3470,33 @@ msgstr "не может быть отменена до тех пор пока г
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "удалить возможноÑÑ‚ÑŒ поделитьÑÑ Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð²Ð¾Ð¹ блокировкой из %{ancestor_group_name}"
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Группа - Ñто набор из неÑкольких проектов."
@@ -2532,6 +3536,12 @@ msgstr "К Ñожалению, по вашему запроÑу групп не
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr "К Ñожалению, по вашему запроÑу групп или проектов не найдено"
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr "Проверка работоÑпоÑобноÑти"
@@ -2582,7 +3592,7 @@ msgid "I accept the|Terms of Service and Privacy Policy"
msgstr ""
msgid "ID"
-msgstr ""
+msgstr "ID"
msgid "IDE|Commit"
msgstr "Коммит"
@@ -2605,12 +3615,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr "ЕÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ файлы иÑходных кодов вы можете отправить их Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑÑылки %{link_to_cli} ниже."
@@ -2629,29 +3648,84 @@ msgstr ""
msgid "Import"
msgstr "Импортировать"
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr "Импортировать вÑе репозитории"
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr "ВыполнÑетÑÑ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚"
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr "Импорт репозиториев из GitHub"
msgid "Import repository"
msgstr "Импорт репозиториÑ"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
+msgid "Install GitLab Runner"
+msgstr ""
+
msgid "Install Runner on Kubernetes"
msgstr "УÑтановить Runner на Kubernetes"
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "УÑтановите Gitlab Runner ÑовмеÑтимый Ñ Gitlab CI"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
msgid "Instance does not support multiple Kubernetes clusters"
msgstr "ЭкземплÑÑ€ не поддерживает неÑколько клаÑтеров Kubernetes"
@@ -2677,7 +3751,10 @@ msgstr "Шаблон интервала"
msgid "Introducing Cycle Analytics"
msgstr "Внедрение Цикла Ðналитик"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2686,12 +3763,18 @@ msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ð±Ñуждений"
msgid "IssueBoards|Board"
msgstr "ДоÑка"
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr "ОбÑуждениÑ"
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "ОбÑуждениÑми могут быть ошибки, задачи или идеи. Также, по обÑуждениÑм можно выполнÑÑ‚ÑŒ поиÑк и отбор."
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr "Янв."
@@ -2722,6 +3805,9 @@ msgstr "Июнь"
msgid "Koding"
msgstr "Koding"
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -2761,12 +3847,18 @@ msgstr "Метка"
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr "%{firstLabelName} + ещё %{remainingLabelCount}"
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr "%{labelsString} и еще %{remainingLabelCount} других"
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr "Метки"
@@ -2843,12 +3935,30 @@ msgstr "Покинуть группу"
msgid "Leave project"
msgstr "Покинуть проект"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr "СпиÑок"
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr "СпиÑок ваших репозиториев на GitHub"
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr "Загрузка GitLab IDE..."
@@ -2870,15 +3980,39 @@ msgstr ""
msgid "Locked"
msgstr "Заблокировано"
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
-msgstr "Войти"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr ""
msgid "Manage all notifications"
msgstr "Управление уведомлениÑми"
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr "Управление метками группы"
@@ -2888,6 +4022,27 @@ msgstr "Управление метками"
msgid "Manage project labels"
msgstr "Управление метками проекта"
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr "Мар."
@@ -2912,18 +4067,30 @@ msgstr "Среднее"
msgid "Members"
msgstr "УчаÑтники"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние:"
msgid "Merge Requests"
msgstr "ЗапроÑÑ‹ на СлиÑние"
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ ÑлиÑний"
msgid "Merge request"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr "ЗапроÑÑ‹ на ÑлиÑние"
@@ -2954,12 +4121,114 @@ msgstr "Слито"
msgid "Messages"
msgstr "СообщениÑ"
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr "Метрики - Influx"
msgid "Metrics - Prometheus"
msgstr "Метрики - Prometheus"
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr "Этап"
@@ -2984,6 +4253,9 @@ msgstr "ПовыÑить %{milestoneTitle} до группового Ñтапа?
msgid "Milestones|Promote Milestone"
msgstr "ПовыÑить Ñтап"
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "добавить ключ SSH"
@@ -2996,21 +4268,36 @@ msgstr "Закрыть"
msgid "Monitoring"
msgstr "Мониторинг"
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
msgid "More information is available|here"
msgstr "Больше информации доÑтупно|тут"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr "ПеремеÑтить"
msgid "Move issue"
msgstr "ПеремеÑтить обÑуждение"
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr "ИмÑ"
@@ -3020,6 +4307,9 @@ msgstr "Ðазвать новую метку"
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Помощь"
@@ -3032,6 +4322,18 @@ msgstr "Вход / РегиÑтрациÑ"
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -3042,18 +4344,18 @@ msgstr[1] "Ðовых ОбÑуждениÑ"
msgstr[2] "Ðовых ОбÑуждений"
msgstr[3] "Ðовые ОбÑуждениÑ"
-msgid "New Kubernetes Cluster"
-msgstr ""
-
-msgid "New Kubernetes cluster"
-msgstr ""
-
msgid "New Label"
-msgstr ""
+msgstr "ÐÐ¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°"
msgid "New Pipeline Schedule"
msgstr "Ðовое РаÑпиÑание Сборочной Линии"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ‚ÐºÐ°"
@@ -3063,6 +4365,9 @@ msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ‚ÐºÐ° недоÑтупна"
msgid "New directory"
msgstr "Ðовый каталог"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "Ðовый файл"
@@ -3099,9 +4404,15 @@ msgstr "ÐÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð³Ñ€ÑƒÐ¿Ð¿Ð°"
msgid "New tag"
msgstr "Ðовый тег"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr "Ðет"
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr "Ðет ответÑтвенного"
@@ -3126,18 +4437,42 @@ msgstr ""
msgid "No files found."
msgstr "Файлы не найдены."
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "Ðет репозиториÑ"
msgid "No schedules"
msgstr "Ðет раÑпиÑаний"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "ПуÑто"
@@ -3162,12 +4497,21 @@ msgstr "ÐедоÑтаточно данных"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Обратите внимание, что маÑтер ветка автоматичеÑки защищена. %{link_to_protected_branches}"
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ ÑобытиÑÑ…"
@@ -3240,6 +4584,9 @@ msgstr "ÐоÑбрь"
msgid "Number of access attempts"
msgstr "КоличеÑтво попыток доÑтупа"
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr "Окт."
@@ -3249,6 +4596,15 @@ msgstr "ОктÑбрь"
msgid "OfSearchInADropdown|Filter"
msgstr "Фильтр"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3258,7 +4614,28 @@ msgstr ""
msgid "Only project members can comment."
msgstr "Только учаÑтники проекта могут оÑтавлÑÑ‚ÑŒ комментарии."
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
+msgstr "Открыть в Xcode"
+
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
msgstr ""
msgid "OpenedNDaysAgo|Opened"
@@ -3270,6 +4647,12 @@ msgstr "ОткроетÑÑ Ð² новом окне"
msgid "Operations"
msgstr "Операции"
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "ÐаÑтройки"
@@ -3279,6 +4662,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr "Ð’ противном Ñлучае рекомендуетÑÑ Ð½Ð°Ñ‡Ð°Ñ‚ÑŒ Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из перечиÑленных ниже вариантов."
@@ -3315,6 +4701,9 @@ msgstr "Пароль"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr "ПриоÑтановить"
@@ -3348,6 +4737,9 @@ msgstr "РаÑпиÑание Сборочной Линии"
msgid "Pipeline Schedules"
msgstr "РаÑпиÑÐ°Ð½Ð¸Ñ Ð¡Ð±Ð¾Ñ€Ð¾Ñ‡Ð½Ñ‹Ñ… Линий"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3492,6 +4884,12 @@ msgstr "Ñо ÑтадиÑми"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr "PlantUML"
@@ -3501,6 +4899,15 @@ msgstr "ЗапуÑк"
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "ПожалуйÑта, выберите по крайней мере один фильтр, чтобы увидеть результаты"
@@ -3508,6 +4915,9 @@ msgid "Please solve the reCAPTCHA"
msgstr "ПожалуйÑта, решите reCAPTCHA"
msgid "Please try again"
+msgstr "ПожалуйÑта, попробуйте ещё раз"
+
+msgid "Please wait while we connect to your repository. Refresh at will."
msgstr ""
msgid "Please wait while we import the repository for you. Refresh at will."
@@ -3519,6 +4929,9 @@ msgstr "ПредпочтениÑ"
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3543,9 +4956,15 @@ msgstr "Личные проекты могут быть Ñозданы в ваш
msgid "Profile"
msgstr "Профиль"
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr "Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ запланирована к удалению."
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr "Изменить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
@@ -3573,9 +4992,15 @@ msgstr "Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
msgid "Profiles|Path"
msgstr "Путь"
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Введите значение %{confirmationValue} Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ:"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr "Обновить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
@@ -3594,6 +5019,9 @@ msgstr "Перед удалением учётной запиÑи, вам нео
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "Ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ ÑвлÑетÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ Ñледующих групп:"
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr "ваша ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ"
@@ -3648,9 +5076,27 @@ msgstr "ИÑтек Ñрок дейÑÑ‚Ð²Ð¸Ñ ÑÑылки на проект. СÐ
msgid "Project export started. A download link will be sent by email."
msgstr "Ðачат ÑкÑпорт проекта. СÑылка Ð´Ð»Ñ ÑÐºÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ отправлена по Ñлектронной почте."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "ПодпиÑатьÑÑ"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "Ðаименование"
@@ -3660,9 +5106,39 @@ msgstr "Ðикогда"
msgid "ProjectLifecycle|Stage"
msgstr "Этап"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr "Проекты"
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "ЧаÑто поÑещаемые"
@@ -3681,8 +5157,35 @@ msgstr "У Ð½Ð°Ñ Ñ‡Ñ‚Ð¾-то пошло не так."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "К Ñожалению, по вашему запроÑу проекты не найдены"
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr "Эта функциональноÑÑ‚ÑŒ требует поддержки localStorage в вашем браузере"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
+msgstr ""
msgid "PrometheusDashboard|Time"
msgstr "ВремÑ"
@@ -3708,9 +5211,18 @@ msgstr "По умолчанию, Prometheus запуÑкаетÑÑ Ð¿Ð¾ адре
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "Определение и наÑтройка метрик..."
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3723,21 +5235,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr "Метрики"
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr "Пропущена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ"
msgid "PrometheusService|More information"
msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr "Базовый Ð°Ð´Ñ€ÐµÑ Prometheus API, например http://prometheus.example.com/"
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr "Служба мониторинга временных Ñ€Ñдов"
@@ -3751,7 +5266,7 @@ msgid "PrometheusService|Waiting for your first deployment to an environment to
msgstr ""
msgid "Promote"
-msgstr ""
+msgstr "ПовыÑить"
msgid "Promote these project milestones into a group milestone."
msgstr ""
@@ -3762,10 +5277,25 @@ msgstr "ПовыÑить до Группового Этапа"
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr "ПодÑказка:"
msgid "Provider"
+msgstr "Провайдер"
+
+msgid "Pseudonymizer data collection"
msgstr ""
msgid "Public - The group and any public projects can be viewed without any authentication."
@@ -3777,6 +5307,9 @@ msgstr "Публичный - ДоÑтуп к проекту возможен бÐ
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr "Ð¡Ð¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸"
@@ -3786,15 +5319,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
-msgstr "БыÑтрые дейÑÑ‚Ð²Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ иÑпользоватьÑÑ Ð² опиÑании обÑуждений и комментариÑÑ…."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
-msgid "Re-deploy"
+msgid "Quarters"
msgstr ""
+msgid "Quick actions can be used in the issues description and comment boxes."
+msgstr "БыÑтрые дейÑÑ‚Ð²Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ иÑпользоватьÑÑ Ð² опиÑании обÑуждений и комментариÑÑ…."
+
msgid "Read more"
msgstr "Подробнее"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "ИнÑтрукциÑ"
@@ -3804,6 +5349,9 @@ msgstr ""
msgid "Reference:"
msgstr "СÑылка:"
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ / Вход"
@@ -3855,12 +5403,27 @@ msgstr ""
msgid "Remove project"
msgstr "Удалить проект"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr "Репозиторий"
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3870,9 +5433,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3894,6 +5463,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr "Закрыть диÑкуÑÑию"
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3922,13 +5494,22 @@ msgstr "Отменить Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3946,6 +5527,21 @@ msgstr "Обработчики заданий могут запуÑкатьÑÑ
msgid "Running"
msgstr "ВыполнÑетÑÑ"
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr "SSH Ключи"
@@ -3955,6 +5551,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr "Сохранить изменениÑ"
@@ -3976,6 +5575,15 @@ msgstr "РаÑпиÑаниÑ"
msgid "Scheduling Pipelines"
msgstr "Планирование Сборочных Линий"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3995,7 +5603,7 @@ msgid "Search files"
msgstr ""
msgid "Search for projects, issues, etc."
-msgstr ""
+msgstr "ПоиÑк проектов, обÑуждений и Ñ‚.д."
msgid "Search merge requests"
msgstr ""
@@ -4015,6 +5623,21 @@ msgstr "Секунд до очиÑтки информации о ÑбоÑÑ…"
msgid "Seconds to wait for a storage access attempt"
msgstr "Секунд задержки между попытками доÑтупа к хранилищу"
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -4037,7 +5660,7 @@ msgid "Select branch/tag"
msgstr "Выбрать ветку/тег"
msgid "Select project"
-msgstr ""
+msgstr "Выбрать проект"
msgid "Select project and zone to choose machine type"
msgstr ""
@@ -4045,12 +5668,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr "Выбор целевой ветки"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr "Отправить Ñлектронное пиÑьмо"
@@ -4063,9 +5695,15 @@ msgstr "СентÑбрь"
msgid "Server version"
msgstr "ВерÑÐ¸Ñ Ñервера"
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr "Шаблоны Служб"
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4090,6 +5728,9 @@ msgstr "ÐаÑтройка CI/CD"
msgid "Set up Koding"
msgstr "ÐаÑтройка Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "уÑтановите пароль"
@@ -4102,9 +5743,24 @@ msgstr "ÐаÑтроить конкретный обработчик заданÐ
msgid "Share"
msgstr "ПоделитьÑÑ"
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr "Общие обработчики заданий"
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr "Показать команду"
@@ -4136,6 +5792,30 @@ msgstr[3] "Показано %d Ñобытий"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr "Выйти"
@@ -4148,6 +5828,9 @@ msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтрации"
msgid "Size and domain settings for static websites"
msgstr "ÐаÑтройки размера и доменных имён Ð´Ð»Ñ ÑтатичеÑких веб-Ñайтов"
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4169,6 +5852,12 @@ msgstr "Что-то пошло не так при переключении кнÐ
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr "Что-то пошло не так при получении проектов."
@@ -4184,6 +5873,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr "Произошла ошибка. Попробуйте позже."
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr "Сортировать по"
@@ -4226,6 +5918,9 @@ msgstr "ПоÑледние обновлённые"
msgid "SortOptions|Least popular"
msgstr "Ðаименее популÑрный"
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr "Веха"
@@ -4235,6 +5930,9 @@ msgstr "Веха, наÑÑ‚ÑƒÐ¿Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð¾Ð·Ð´Ð½ÐµÐµ"
msgid "SortOptions|Milestone due soon"
msgstr "Веха, наÑÑ‚ÑƒÐ¿Ð°ÑŽÑ‰Ð°Ñ Ñ€Ð°Ð½ÑŒÑˆÐµ"
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr "Ðаиболее популÑрный"
@@ -4274,6 +5972,9 @@ msgstr "Ðачатые позже"
msgid "SortOptions|Start soon"
msgstr "Ðачатые недавно"
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr "ИÑточник"
@@ -4346,9 +6047,15 @@ msgstr "Запущен"
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr "СтатуÑ"
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr "ОÑтановить Ñту Ñреду"
@@ -4358,12 +6065,21 @@ msgstr "ОÑтановлен"
msgid "Storage"
msgstr "Хранилище"
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr "Подгруппы"
-msgid "Subscribe"
+msgid "Submit as spam"
msgstr ""
+msgid "Submit search"
+msgstr ""
+
+msgid "Subscribe"
+msgstr "ПодпиÑатьÑÑ"
+
msgid "Subscribe at group level"
msgstr ""
@@ -4373,9 +6089,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "Переключить ветка/тег"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr "СиÑтемные Обработчики"
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] "Тег (%{tag_count})"
@@ -4476,18 +6204,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "Трекер обÑуждений - Ñто меÑто, где можно добавить вещи, которые необходимо улучшить или решить в проекте"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Этап напиÑÐ°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð° показывает Ð²Ñ€ÐµÐ¼Ñ Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ коммита до ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа на ÑлиÑние. Данные автоматичеÑки добавÑÑ‚ÑÑ Ñюда поÑле того, как вы Ñоздать Ñвой первый Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние."
msgid "The collection of events added to the data gathered for that stage."
msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ñобытий добавленных в данные Ñобранные Ð´Ð»Ñ Ñтого Ñтапа."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "СвÑзь Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ удалена."
@@ -4503,8 +6243,11 @@ msgstr "МакÑимально допуÑтимый размер файла Ñо
msgid "The number of attempts GitLab will make to access a storage."
msgstr "КоличеÑтво попыток, которые GitLab будет предпринимать Ð´Ð»Ñ Ð´Ð¾Ñтупа к хранилищу."
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
-msgstr "КоличеÑтво Ñбоев, поÑле которого Gitlab полноÑтью прекратит доÑтуп к хранилищу. Изменение Ñчётчика \"количеÑтво Ñбоев\" может быть произведено через админиÑтративный интерфейÑ: %{link_to_health_page} или при помощи API %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
+msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
msgstr ""
@@ -4515,6 +6258,9 @@ msgstr "Фаза жизненного цикла разработки."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "Этап Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ предыдущего шага до отправки первого коммита. ДобавлÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, как только отправите Ñвой первый коммит."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "ПроизводÑтвенный Ñтап показывает общее Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñозданием обÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸ развертыванием кода в продуктивной Ñреде. Данные будут автоматичеÑки добавлены поÑле полного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ¸."
@@ -4524,6 +6270,9 @@ msgstr "ДоÑтуп к проекту возможен любым зарегиÑ
msgid "The project can be accessed without any authentication."
msgstr "ДоÑтуп к проекту возможен без какой-либо проверки подлинноÑти."
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "Репозиторий Ð´Ð»Ñ Ñтого проекта не ÑущеÑтвует."
@@ -4536,6 +6285,9 @@ msgstr "Репозиторий должен быть доÑтупен через
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "Этап обзора показывает Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа ÑлиÑÐ½Ð¸Ñ Ð´Ð¾ его выполнениÑ. Данные будут автоматичеÑки добавлены поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ запроÑа на ÑлиÑние."
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4551,12 +6303,18 @@ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð² Ñекундах, в течение которого GitLa
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð² Ñекундах в течении которого GitLab будет пытатьÑÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ доÑтуп к хранилищу. ПоÑле Ñтого времени будет зафикÑирована ошибка Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ ожиданиÑ."
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "ВремÑ, затраченное каждым Ñлементом, Ñобранным на Ñтом Ñтапе."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "Среднее значение в Ñ€Ñду. Пример: между 3, 5, 9, Ñреднее 5, между 3, 5, 7, 8, Ñреднее (5+7)/2 = 6."
@@ -4572,12 +6330,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr "Проблемы Ñ Ð´Ð¾Ñтупом к Git хранилищу: "
-msgid "There was an error loading jobs"
-msgstr "Ошибка загрузки фоновых заданий"
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4599,15 +6351,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr "Этот ÑкземплÑÑ€ GitLab пока не предоÑтавлÑет никаких общих обработчиков заданий. ÐдминиÑтраторы ÑкземплÑров могут региÑтрировать общие обработчики заданий в Ñекции админиÑтрированиÑ."
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr "Этот каталог"
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr "Эта группа пока не Ñодержит групповых обработчики заданий."
@@ -4683,6 +6453,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´Ð¾ начала Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÑƒÐ¶Ð´ÐµÐ½Ð¸Ñ Ð² планировщик"
@@ -4692,6 +6468,9 @@ msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð´Ð¾ начала работы над обÑуждением"
msgid "Time between merge request creation and merge/close"
msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñозданием запроÑа ÑлиÑÐ½Ð¸Ñ Ð¸ ÑлиÑнием / закрытием"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4862,12 +6641,30 @@ msgstr "Ñ"
msgid "Tip:"
msgstr "Совет:"
-msgid "To GitLab"
+msgid "Title"
msgstr ""
+msgid "To GitLab"
+msgstr "Ð’ GitLab"
+
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4877,21 +6674,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr "Чтобы начать выполнÑÑ‚ÑŒ Ñвои заданиÑ, вы можете добавить обработчик заданий в вашу группу"
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr "Дела"
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr "Переключить боковую панель"
@@ -4904,6 +6725,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "Общее времÑ"
@@ -4913,9 +6737,18 @@ msgstr "Общее Ð²Ñ€ÐµÐ¼Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð¸ÐºÑаций/ÑлиÑ
msgid "Total: %{total}"
msgstr "Ð’Ñего: %{total}"
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr "ЗапуÑтить Ñто дейÑтвие вручную"
@@ -4925,9 +6758,21 @@ msgstr ""
msgid "Try again"
msgstr "Попробовать Ñнова"
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr "Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ отличиÑ. %{button_try_again}"
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr "Разблокировать"
@@ -4970,16 +6815,30 @@ msgstr "Ðеподтверждено"
msgid "Up to date"
msgstr "Ðктуальный"
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "Загрузить новый файл"
@@ -4998,23 +6857,41 @@ msgstr "ГолоÑа \"за\""
msgid "Usage statistics"
msgstr "СтатиÑтика иÑпользованиÑ"
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "ИÑпользуйте Ñледующий токен региÑтрации в процеÑÑе уÑтановки:"
msgid "Use your global notification setting"
msgstr "ИÑпользуютÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ‹Ð¹ наÑтройки уведомлений"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
-msgid "Users"
+msgid "User map"
msgstr ""
+msgid "Users"
+msgstr "Пользователи"
+
msgid "Variables"
-msgstr ""
+msgstr "Переменные"
msgid "Variables are applied to environments via the runner. They can be protected by only exposing them to protected branches or tags. You can use variables for passwords, secret keys, or whatever you want."
msgstr "Переменные применÑÑŽÑ‚ÑÑ Ðº Ñреде через обработчики заданий. Их можно защитить, Ð´ÐµÐ»Ð°Ñ Ð¸Ñ… доÑтупными только защищенным ветвÑм или меткам. Ð’Ñ‹ можете иÑпользовать переменные Ð´Ð»Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¹, Ñекретных ключей и прочего."
@@ -5028,15 +6905,27 @@ msgstr "Различные наÑтройки Ñлектронной почты.
msgid "Various settings that affect GitLab performance."
msgstr "Различные наÑтройки, которые влиÑÑŽÑ‚ на производительноÑÑ‚ÑŒ GitLab."
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr "Проверено"
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr "ПроÑмотр файла @ "
msgid "View group labels"
msgstr "ПроÑмотр меток группы"
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -5058,6 +6947,12 @@ msgstr "ПроÑмотр заменённого файла @ "
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Ограниченный"
@@ -5073,6 +6968,9 @@ msgstr "Ðе определен"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Хотите увидеть данные? ОбратитеÑÑŒ к админиÑтратору за доÑтупом."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ Ñтапу отÑутÑтвует."
@@ -5080,17 +6978,32 @@ msgid "We want to be sure it is you, please confirm you are not a robot."
msgstr "Мы хотим быть уверены, что Ñто вы, пожалуйÑта, подтвердите, что вы не робот."
msgid "Web IDE"
-msgstr "Веб-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ IDE"
+msgstr "Web IDE"
msgid "Web terminal"
msgstr "Web терминал"
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr "Когда процеÑÑ Runner заблокирован, он не может быть назначен другим проектам"
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr "Wiki"
@@ -5128,10 +7041,10 @@ msgid "WikiEmpty|A wiki is where you can store all the details about your projec
msgstr ""
msgid "WikiEmpty|Create your first page"
-msgstr ""
+msgstr "Создать вашу первую Ñтраницу"
msgid "WikiEmpty|Suggest wiki improvement"
-msgstr ""
+msgstr "Предложить улучшение Wiki"
msgid "WikiEmpty|The wiki lets you write documentation for your project"
msgstr ""
@@ -5226,12 +7139,24 @@ msgstr "Страницы"
msgid "Wiki|Wiki Pages"
msgstr "Вики Страницы"
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "Отменить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ñтупа"
msgid "Yes"
msgstr "Да"
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ удалить %{group_name}. Удаленные группы ÐЕ МОГУТ быть воÑÑтановлены! Ð’Ñ‹ ÐБСОЛЮТÐО уверены?"
@@ -5247,6 +7172,9 @@ msgstr "Ð’Ñ‹ ÑобираетеÑÑŒ передать проект %{project_full
msgid "You are on a read-only GitLab instance."
msgstr "Ð’Ñ‹ иÑпользуете GitLab в режиме только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ."
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5259,6 +7187,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5274,12 +7205,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr "Ð’Ñ‹ не можете запиÑывать на Ñтот ÑкземплÑÑ€ \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" клаÑтера GitLab."
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5298,6 +7241,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "Ðеобходимо войти, чтобы оценить проект"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "Вам нужно разрешение."
@@ -5328,9 +7277,18 @@ msgstr "Ð’Ñ‹ не Ñможете работать Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð¾Ð¼ через
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼ нужно иÑпользовать разные имена веток."
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr "Ð’Ñ‹ получили Ñто Ñлектронное пиÑьмо из Ñвоей учетной запиÑи %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr "Ваши Группы"
@@ -5346,6 +7304,12 @@ msgstr "ÐктивноÑÑ‚ÑŒ в ваших проектов"
msgid "Your Todos"
msgstr "Ваши дела"
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5370,18 +7334,241 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "assign yourself"
msgstr "назначить ÑебÑ"
msgid "branch name"
msgstr "Ð¸Ð¼Ñ Ð²ÐµÑ‚Ð²Ð¸"
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "день"
@@ -5392,11 +7579,31 @@ msgstr[3] "дней"
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
+msgstr "отключено"
+
+msgid "done"
msgstr ""
msgid "enabled"
-msgstr ""
+msgstr "включено"
msgid "estimateCommand|%{slash_command} will update the estimated time with the latest command."
msgstr ""
@@ -5404,12 +7611,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑлиÑние"
@@ -5429,9 +7654,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr "Отменить автоматичеÑкое ÑлиÑние"
@@ -5492,9 +7732,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5513,6 +7768,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5564,9 +7822,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5607,27 +7862,42 @@ msgstr "пароль"
msgid "personal access token"
msgstr "токен Ð´Ð»Ñ Ð¿ÐµÑ€Ñонального доÑтупа"
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr "оÑталоÑÑŒ"
msgid "remove due date"
msgstr "убрать плановый Ñрок"
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr "иÑходный текÑÑ‚"
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr "Ñтот документ"
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/tr_TR/gitlab.po b/locale/tr_TR/gitlab.po
index 6cdfa33b8ae..e145780c68f 100644
--- a/locale/tr_TR/gitlab.po
+++ b/locale/tr_TR/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:01\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
@@ -15,6 +13,20 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:39\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
+msgstr[1] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -56,6 +68,11 @@ msgid_plural "%d metrics"
msgstr[0] ""
msgstr[1] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -66,6 +83,11 @@ msgid_plural "%d unstaged changes"
msgstr[0] ""
msgstr[1] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] ""
@@ -77,6 +99,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} katılımcı"
@@ -94,6 +119,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -117,16 +145,23 @@ msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts
msgstr[0] ""
msgstr[1] ""
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
-msgid "%{unstaged} unstaged and %{staged} staged changes"
-msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
-msgid "(checkout the %{link} for information on how to install it)."
+msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
msgid "+ %{moreCount} more"
@@ -202,6 +237,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -223,9 +282,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr ""
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr "Kötüye Kullanım Raporları"
@@ -235,9 +303,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr "Erişim anahtarları"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr ""
@@ -259,12 +336,18 @@ msgstr ""
msgid "Activity"
msgstr "Etkinlik"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "DeÄŸiÅŸiklik Bilgisi Ekle"
msgid "Add Contribution guide"
msgstr "Katkı kılavuzu ekle"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -274,6 +357,12 @@ msgstr "Lisans Ekle"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Yeni dizin ekle"
@@ -283,6 +372,24 @@ msgstr ""
msgid "Add todo"
msgstr "Yapılacaklara Ekle"
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "Tüm işleri durdur"
@@ -364,12 +471,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "Kubernetes kümelerini eklemeye ve yönetmenize olanak tanır."
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -388,12 +522,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -415,7 +561,10 @@ msgstr "Projeler yüklenirken bir hata oluştu"
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -430,6 +579,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr "KaTeX'i iÅŸlerken bir hata oluÅŸtu"
@@ -442,18 +594,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr "Değişiklikler yüklenirken bir hata oluştu"
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr "Kullanıcı adı doğrulanırken bir hata oluştu"
msgid "An error occurred. Please try again."
msgstr "Bir hata oluştu. Lütfen tekrar deneyin."
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr "Görünüm"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "Uygulamalar"
@@ -469,6 +651,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr ""
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -478,15 +666,24 @@ msgstr ""
msgid "Are you sure you want to reset the health check token?"
msgstr ""
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr "Emin misiniz?"
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr "#FF0000 gibi özel renk ata"
@@ -514,12 +711,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Sürükleyip bırakarak bir dosya ekle veya %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr "AÄŸustos"
@@ -529,12 +735,36 @@ msgstr "AÄŸustos"
msgid "Authentication Log"
msgstr "Kimlik Doğrulama Günlüğü"
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr "Yazar"
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr "Yazarlar: %{authors}"
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -592,6 +822,12 @@ msgstr "Avatar kaldırılacak. Emin misiniz?"
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -673,6 +909,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -792,6 +1103,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -804,9 +1118,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -828,6 +1148,9 @@ msgstr ""
msgid "Browse files"
msgstr ""
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr ""
@@ -837,9 +1160,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -867,6 +1196,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -888,6 +1220,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -903,6 +1241,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -948,6 +1292,12 @@ msgstr ""
msgid "Cherry-pick this merge request"
msgstr ""
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -963,9 +1313,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr ""
@@ -1035,12 +1397,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1050,15 +1421,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1068,12 +1448,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1083,9 +1481,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1107,9 +1502,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1137,16 +1529,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1185,6 +1568,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1194,6 +1586,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1218,6 +1613,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1275,6 +1673,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1311,9 +1712,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1428,6 +1826,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1555,7 +1956,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1567,9 +1968,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1621,6 +2031,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1633,6 +2046,9 @@ msgstr ""
msgid "Contribution guide"
msgstr ""
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr ""
@@ -1648,6 +2064,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr ""
@@ -1660,10 +2094,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr ""
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1672,6 +2106,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1684,6 +2121,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr ""
@@ -1699,12 +2139,21 @@ msgstr ""
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1723,6 +2172,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1744,15 +2196,27 @@ msgstr ""
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr ""
msgid "Cron syntax"
msgstr ""
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1768,6 +2232,15 @@ msgstr ""
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr ""
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr ""
@@ -1792,6 +2265,9 @@ msgstr ""
msgid "CycleAnalyticsStage|Test"
msgstr ""
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1807,15 +2283,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr ""
msgid "Delete"
msgstr ""
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] ""
@@ -1947,9 +2441,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr ""
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr ""
@@ -1977,9 +2483,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -2022,6 +2546,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2034,12 +2561,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr ""
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2058,6 +2600,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2067,6 +2615,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2076,6 +2627,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2085,6 +2639,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2097,9 +2654,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2112,43 +2678,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
+msgstr ""
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
+msgstr ""
+
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2169,6 +2765,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2217,6 +2816,9 @@ msgstr ""
msgid "Every week (Sundays at 4:00am)"
msgstr ""
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2226,12 +2828,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2274,6 +2912,12 @@ msgstr ""
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr ""
@@ -2283,6 +2927,12 @@ msgstr ""
msgid "Find file"
msgstr ""
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2292,6 +2942,30 @@ msgstr ""
msgid "FirstPushedBy|pushed by"
msgstr ""
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2324,6 +2998,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr ""
@@ -2345,6 +3031,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2366,10 +3247,28 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
msgstr ""
msgid "Gitaly"
@@ -2381,18 +3280,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr ""
msgid "GoToYourFork|Fork"
msgstr ""
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2402,18 +3316,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2438,9 +3406,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2480,6 +3472,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr ""
@@ -2551,12 +3549,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2575,30 +3582,83 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr ""
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
-msgid "Install Runner on Kubernetes"
+msgid "Install GitLab Runner"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
+msgid "Install Runner on Kubernetes"
msgstr ""
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2623,7 +3683,10 @@ msgstr ""
msgid "Introducing Cycle Analytics"
msgstr ""
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2632,12 +3695,18 @@ msgstr ""
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2668,6 +3737,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2707,12 +3779,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2787,12 +3865,30 @@ msgstr ""
msgid "Leave project"
msgstr ""
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2814,15 +3910,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2832,6 +3952,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2856,18 +3997,30 @@ msgstr ""
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr ""
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2898,12 +4051,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2928,6 +4183,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr ""
@@ -2940,21 +4198,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr ""
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2964,6 +4237,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2976,6 +4252,18 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
+msgstr ""
+
msgid "New Identity"
msgstr ""
@@ -2984,16 +4272,16 @@ msgid_plural "New Issues"
msgstr[0] ""
msgstr[1] ""
-msgid "New Kubernetes Cluster"
+msgid "New Label"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Pipeline Schedule"
msgstr ""
-msgid "New Label"
+msgid "New Snippet"
msgstr ""
-msgid "New Pipeline Schedule"
+msgid "New Snippets"
msgstr ""
msgid "New branch"
@@ -3005,6 +4293,9 @@ msgstr ""
msgid "New directory"
msgstr ""
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr ""
@@ -3041,9 +4332,15 @@ msgstr ""
msgid "New tag"
msgstr ""
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3068,18 +4365,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr ""
msgid "No schedules"
msgstr ""
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3104,12 +4425,21 @@ msgstr ""
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr ""
@@ -3182,6 +4512,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3191,6 +4524,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr ""
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3200,9 +4542,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr ""
@@ -3212,6 +4575,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr ""
@@ -3221,6 +4590,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3257,6 +4629,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3290,6 +4665,9 @@ msgstr ""
msgid "Pipeline Schedules"
msgstr ""
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3434,6 +4812,12 @@ msgstr ""
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3443,6 +4827,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3452,6 +4845,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3461,6 +4857,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3485,9 +4884,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3515,9 +4920,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3536,6 +4947,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3590,9 +5004,27 @@ msgstr ""
msgid "Project export started. A download link will be sent by email."
msgstr ""
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr ""
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr ""
@@ -3602,9 +5034,39 @@ msgstr ""
msgid "ProjectLifecycle|Stage"
msgstr ""
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3623,7 +5085,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3650,9 +5139,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3665,21 +5163,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3704,12 +5205,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3719,6 +5235,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr ""
@@ -3728,15 +5247,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
+msgstr ""
+
+msgid "Quarters"
msgstr ""
-msgid "Re-deploy"
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr ""
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr ""
@@ -3746,6 +5277,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3797,12 +5331,27 @@ msgstr ""
msgid "Remove project"
msgstr ""
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr ""
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3812,9 +5361,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr ""
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3836,6 +5391,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3862,13 +5420,22 @@ msgstr ""
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3886,6 +5453,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3895,6 +5477,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3916,6 +5501,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr ""
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3955,6 +5549,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3985,12 +5594,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr ""
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -4003,9 +5621,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4030,6 +5654,9 @@ msgstr ""
msgid "Set up Koding"
msgstr ""
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr ""
@@ -4042,9 +5669,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4074,6 +5716,30 @@ msgstr[1] ""
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4086,6 +5752,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4107,6 +5776,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4122,6 +5797,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4164,6 +5842,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4173,6 +5854,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4212,6 +5896,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4284,9 +5971,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4296,9 +5989,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4311,9 +6013,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr ""
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4412,18 +6126,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr ""
msgid "The collection of events added to the data gathered for that stage."
msgstr ""
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr ""
@@ -4439,7 +6165,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4451,6 +6180,9 @@ msgstr ""
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr ""
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr ""
@@ -4460,6 +6192,9 @@ msgstr ""
msgid "The project can be accessed without any authentication."
msgstr ""
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr ""
@@ -4472,6 +6207,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr ""
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4487,12 +6225,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr ""
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr ""
@@ -4508,12 +6252,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr ""
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4535,15 +6273,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4619,6 +6375,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr ""
@@ -4628,6 +6390,9 @@ msgstr ""
msgid "Time between merge request creation and merge/close"
msgstr ""
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4794,12 +6559,30 @@ msgstr ""
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4809,21 +6592,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4836,6 +6643,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr ""
@@ -4845,9 +6655,18 @@ msgstr ""
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4857,9 +6676,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4902,14 +6733,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr ""
@@ -4928,18 +6775,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr ""
msgid "Use your global notification setting"
msgstr ""
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4958,15 +6823,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4988,6 +6865,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr ""
@@ -5003,6 +6886,9 @@ msgstr ""
msgid "Want to see the data? Please ask an administrator for access."
msgstr ""
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr ""
@@ -5015,12 +6901,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5156,12 +7057,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr ""
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr ""
@@ -5177,6 +7090,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5189,6 +7105,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5204,12 +7123,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5228,6 +7159,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr ""
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr ""
@@ -5258,9 +7195,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5276,6 +7222,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5300,18 +7252,239 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] ""
@@ -5320,9 +7493,25 @@ msgstr[1] ""
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5332,12 +7521,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5355,9 +7562,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5418,9 +7640,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5439,6 +7676,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5490,9 +7730,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5531,27 +7768,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/uk/gitlab.po b/locale/uk/gitlab.po
index 087d5a7a764..d7a4fb0d6b7 100644
--- a/locale/uk/gitlab.po
+++ b/locale/uk/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 18:01\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Ukrainian\n"
"Language: uk_UA\n"
@@ -15,13 +13,31 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:41\n"
+
+msgid " and"
+msgstr " Ñ–"
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] " погіршилоÑÑ Ð½Ð° %d одиницю"
+msgstr[1] " погіршилоÑÑ Ð½Ð° %d одиниць"
+msgstr[2] " погіршилоÑÑ Ð½Ð° %d одиниць"
+msgstr[3] " погіршилоÑÑ Ð½Ð° %d одиниць"
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] " покращилоÑÑ Ð½Ð° %d одиницю"
+msgstr[1] " покращилоÑÑ Ð½Ð° %d одиниць"
+msgstr[2] " покращилоÑÑ Ð½Ð° %d одиниць"
+msgstr[3] " покращилоÑÑ Ð½Ð° %d одиниць"
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "%d змінений файл"
+msgstr[1] "%d змінених файли"
+msgstr[2] "%d змінених файлів"
+msgstr[3] "%d змінених файлів"
msgid "%d commit"
msgid_plural "%d commits"
@@ -72,6 +88,13 @@ msgstr[1] "%d метрики"
msgstr[2] "%d метрик"
msgstr[3] "%d метрик"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] "%d нова ліцензіÑ"
+msgstr[1] "%d нових ліцензій"
+msgstr[2] "%d нових ліцензій"
+msgstr[3] "%d нових ліцензій"
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] "%d проіндекÑована зміна"
@@ -86,6 +109,13 @@ msgstr[1] "%d неіндекÑовані зміни"
msgstr[2] "%d неіндекÑованих змін"
msgstr[3] "%d неіндекÑованих змін"
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] "%d вразливіÑÑ‚ÑŒ"
+msgstr[1] "%d вразливоÑтей"
+msgstr[2] "%d вразливоÑтей"
+msgstr[3] "%d вразливоÑтей"
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "%s доданий коміт був виключений Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼ із продуктивніÑÑ‚ÑŽ."
@@ -99,6 +129,9 @@ msgstr "%{actionText} Ñ– %{openOrClose} %{noteable}"
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "%{commit_author_link} закомітив %{commit_timeago}"
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} учаÑтник"
@@ -107,10 +140,10 @@ msgstr[2] "%{count} учаÑтників"
msgstr[3] "%{count} учаÑтників"
msgid "%{filePath} deleted"
-msgstr ""
+msgstr "%{filePath} видалено"
msgid "%{group_docs_link_start}Groups%{group_docs_link_end} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
-msgstr ""
+msgstr "%{group_docs_link_start}Групи%{group_docs_link_end} дозволÑÑŽÑ‚ÑŒ вам керувати Ñ– взаємодіÑти між кількома проектами. Члени групи мають доÑтуп до уÑÑ–Ñ… Ñ—Ñ— проектів."
msgid "%{loadingIcon} Started"
msgstr "%{loadingIcon} Початок"
@@ -118,6 +151,9 @@ msgstr "%{loadingIcon} Початок"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} заблоковано кориÑтувачем GitLab %{lock_user_id}"
+msgid "%{name}'s avatar"
+msgstr "Ðватар %{name}"
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr "%{nip_domain} може бути викориÑтана Ñк альтернатива влаÑному домену."
@@ -143,18 +179,29 @@ msgstr[1] "%{storage_name}: %{failed_attempts} невдалі Ñпроби доÑ
msgstr[2] "%{storage_name}: %{failed_attempts} невдалих Ñпроб доÑтупу до Ñховища:"
msgstr[3] "%{storage_name}: %{failed_attempts} невдалих Ñпроб доÑтупу до Ñховища:"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
+
msgid "%{text} is available"
msgstr "%{text} доÑтупний"
msgid "%{title} changes"
msgstr "%{title} зміни"
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] "%{type} виÑвило 1 вразливіÑÑ‚ÑŒ"
+msgstr[1] "%{type} виÑвило %{vulnerabilityCount} вразливоÑтей"
+msgstr[2] "%{type} виÑвило %{vulnerabilityCount} вразливоÑтей"
+msgstr[3] "%{type} виÑвило %{vulnerabilityCount} вразливоÑтей"
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr "%{unstaged} неіндекÑованих та %{staged} проіндекÑованих змін"
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(перейдіть за поÑиланнÑм %{link} Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— ÑтоÑовно вÑтановленнÑ)."
-
msgid "+ %{moreCount} more"
msgstr "+ ще %{moreCount}"
@@ -244,6 +291,30 @@ msgstr "Сторінка не знайдена"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr "Будь лаÑка, звернітьÑÑ Ð´Ð¾ адмініÑтратора GitLab, Ñкщо ви вважаєте, що це помилка."
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr "<strong>%{created_count}</strong> Ñтворено, <strong>%{accepted_count}</strong> прийнÑто."
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr "<strong>%{created_count}</strong> Ñтворено, <strong>%{closed_count}</strong> закрито."
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr "<strong>ВидалÑÑ”</strong> гілку-джерело"
@@ -265,9 +336,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr "КориÑтувач із правом запиÑу в гілку-джерело вибрав цей варіант"
+msgid "About GitLab"
+msgstr "Про GitLab"
+
+msgid "About GitLab CE"
+msgstr "Про GitLab CE"
+
msgid "About auto deploy"
msgstr "Про авто розгортаннÑ"
+msgid "About this feature"
+msgstr "Про цю функцію"
+
msgid "Abuse Reports"
msgstr "Звіти про зловживаннÑ"
@@ -277,9 +357,18 @@ msgstr "Звіти про зловживаннÑ"
msgid "Accept terms"
msgstr "ПрийнÑти умови"
+msgid "Accepted MR"
+msgstr "ЗаÑтоÑований запит на злиттÑ"
+
msgid "Access Tokens"
msgstr "Токени доÑтупу"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr "ДоÑтуп до \"%{classification_label}\" заборонено"
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "ДоÑтуп до Ñховищ, що вийшли з ладу, тимчаÑово прибраний Ð·Ð°Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ. ПіÑÐ»Ñ Ð²Ð¸Ñ€Ñ–ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ обнуліть інформацію Ñховища Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾Ñтупу."
@@ -301,12 +390,18 @@ msgstr "Ðктивні ÑеÑÑ–Ñ—"
msgid "Activity"
msgstr "ÐктивніÑÑ‚ÑŒ"
+msgid "Add"
+msgstr "Додати"
+
msgid "Add Changelog"
msgstr "Додати ÑпиÑок змін"
msgid "Add Contribution guide"
msgstr "Додати керівництво Ð´Ð»Ñ ÑƒÑ‡Ð°Ñників"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr "Додайте групові веб-гуки та GitLab Enterprise Edition."
+
msgid "Add Kubernetes cluster"
msgstr "Додати Kubernetes-клаÑтер"
@@ -316,6 +411,12 @@ msgstr "Додати ліцензію"
msgid "Add Readme"
msgstr "Додати інÑтрукцію"
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr "Створіть додатковий текÑÑ‚, Ñкий буде приÑутній у вÑÑ–Ñ… повідомленнÑÑ… електронної пошти. МакÑимальна кількіÑÑ‚ÑŒ Ñимволів — %{character_limit}"
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "Додати новий каталог"
@@ -325,6 +426,24 @@ msgstr "Додати реакцію"
msgid "Add todo"
msgstr "Додати задачу"
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr "Додати кориÑтувача до групи"
+
+msgid "Additional text"
+msgstr "Додатковий текÑÑ‚"
+
+msgid "Admin Area"
+msgstr "ОблаÑÑ‚ÑŒ адмініÑтратора"
+
+msgid "Admin Overview"
+msgstr "ОглÑд адмініÑтратора"
+
+msgid "Admin area"
+msgstr "ОблаÑÑ‚ÑŒ адмініÑтратора"
+
msgid "AdminArea|Stop all jobs"
msgstr "Зупинити вÑÑ– завданнÑ"
@@ -406,20 +525,47 @@ msgstr "Дозволити запити до локальної мережі Ñ–Ð
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "ДозволÑÑ” додавати та керувати клаÑтерами Kubernetes."
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr "Також відомий Ñк «Емітент» або «Ідентифікатор довіри перевірÑючої Ñторони»"
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr "Також називаєтьÑÑ \"URL-адреÑа Ñлужби перевірÑючої Ñторони\" або \"URL-адреÑа відповіді\""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr "Крім того, ви можете викориÑтовувати %{personal_access_token_link}. Коли ви Ñтворюватимете Ñвій перÑональний токен доÑтупу, вам потрібно буде вибрати облаÑÑ‚ÑŒ дії <code>repo</code>, щоб ми могли відобразити ÑпиÑок ваших публічних та приватних репозиторіїв, доÑтупних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ."
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr "Крім того, ви можете викориÑтовувати %{personal_access_token_link}. Коли ви Ñтворюватимете Ñвій перÑональний токен доÑтупу, вам потрібно буде вибрати облаÑÑ‚ÑŒ <code>repo</code>, щоб ми могли відобразити ÑпиÑок ваших публічних та приватних репозиторіїв, доÑтупних Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ."
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
+msgstr "Помилка при Ñтворенні нової гілки."
+
+msgid "An error occured whilst fetching the job trace."
msgstr ""
-msgid "An error occured whilst loading all the files."
+msgid "An error occured whilst fetching the latest pipline."
msgstr ""
+msgid "An error occured whilst loading all the files."
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при завантаженні вÑÑ–Ñ… файлів."
+
msgid "An error occured whilst loading the file content."
-msgstr ""
+msgstr "Помилка при завантаженні вміÑту файлу."
msgid "An error occured whilst loading the file."
-msgstr ""
+msgstr "Помилка при завантаженні файлу."
msgid "An error occured whilst loading the merge request changes."
msgstr ""
@@ -430,12 +576,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ переглÑду об'єкта"
msgid "An error occurred when toggling the notification subscription"
msgstr "Виникла помилка під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ підпиÑки на ÑповіщеннÑ"
+msgid "An error occurred when updating the issue weight"
+msgstr "Збій під Ñ‡Ð°Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°Ð³Ð¸ проблеми"
+
+msgid "An error occurred while adding approver"
+msgstr "Помилка при додаванні учаÑника Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ"
+
+msgid "An error occurred while detecting host keys"
+msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при виÑвленні ключів хоÑта"
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr "Помилка при відхиленні попередженнÑ. Оновіть Ñторінку та Ñпробуйте знову."
@@ -457,8 +615,11 @@ msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні проектів
msgid "An error occurred while importing project: ${details}"
msgstr "При імпортуванні проекту ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: ${details}"
-msgid "An error occurred while loading commits"
-msgstr "Помилка при завантажені комітів"
+msgid "An error occurred while initializing path locks"
+msgstr "Помилка при ініціалізації Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¸Ñ… шлÑхів"
+
+msgid "An error occurred while loading commit signatures"
+msgstr ""
msgid "An error occurred while loading diff"
msgstr "Помилка при завантаженні разниці (diff)"
@@ -472,6 +633,9 @@ msgstr "Помилка при завантаженні файлу"
msgid "An error occurred while making the request."
msgstr "Помилка при Ñтворенні запиту."
+msgid "An error occurred while removing approver"
+msgstr "Помилка при видаленні учаÑника Ð´Ð»Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ"
+
msgid "An error occurred while rendering KaTeX"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при рендерингу KaTeX"
@@ -484,18 +648,48 @@ msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні календар
msgid "An error occurred while retrieving diff"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° при отриманні різниці"
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr "Помилка при збереженні ÑтатуÑу Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ LDAP. Будь лаÑка, Ñпробуйте ще раз."
+
msgid "An error occurred while saving assignees"
msgstr "Помилка при збереженні виконавців"
+msgid "An error occurred while subscribing to notifications."
+msgstr "Помилка при підпиÑці на ÑповіщеннÑ."
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr "Помилка при відпиÑці від Ñповіщень."
+
msgid "An error occurred while validating username"
msgstr "СталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ імені кориÑтувача"
msgid "An error occurred. Please try again."
msgstr "СталаÑÑŒ помилка. Спробуйте ще раз."
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr "Будь-Ñка мітка"
+
msgid "Appearance"
msgstr "Зовнішній виглÑд"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "ЗаÑтоÑунки"
@@ -511,6 +705,12 @@ msgstr "Ðрхівований проект! Репозиторій та іншÑ
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "Ви впевнені, що хочете видалити цей розклад Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð°?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -520,15 +720,24 @@ msgstr "Ви впевнені, що бажаєте перегенерувати
msgid "Are you sure you want to reset the health check token?"
msgstr "Ви впевнені, що Ви хочете перегенерувати цей ключ перевірки працездатноÑÑ‚Ñ–?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr "Ви впевнені, що хочете розблокувати %{path_lock_path}?"
+
msgid "Are you sure?"
msgstr "Ви впевнені?"
msgid "Artifacts"
msgstr "Ðртефакти"
+msgid "Ascending"
+msgstr "За зроÑтаннÑм"
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr "ПопроÑÑ–Ñ‚ÑŒ керівника групи, щоб налаштувати груповий Runner."
+msgid "Assertion consumer service URL"
+msgstr "URL-адреÑа Ñлужби обробника тверджень"
+
msgid "Assign custom color like #FF0000"
msgstr "Призначити влаÑний колір типу #FF0000"
@@ -556,12 +765,21 @@ msgstr "Призначено мені"
msgid "Assignee"
msgstr "Виконавець"
+msgid "Assignee boards not available with your current license"
+msgstr "Дошки виконавців не доÑтупні з вашою поточною ліцензією"
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr "СпиÑки виконавців показують уÑÑ– проблеми, призначені вибраному кориÑтувачу."
+
msgid "Assignee(s)"
msgstr "Виконавець(ці)"
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "Прикріпити файл за допомогою перетÑÐ³ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr "Ñерп."
@@ -571,12 +789,36 @@ msgstr "Ñерпень"
msgid "Authentication Log"
msgstr "Журнал автентифікації"
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr "Ðвтор"
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr "Ðвтори: %{authors}"
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr "Auto DevOps увімкнено"
@@ -634,6 +876,12 @@ msgstr "Ðватар буде видалено. Ви впевнені?"
msgid "Average per day: %{average}"
msgstr "Ð’ Ñередньому за день: %{average}"
+msgid "Background Color"
+msgstr "Колір фону"
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr "Колір фону"
@@ -715,6 +963,81 @@ msgstr "Почати із виділеного коміту"
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr "Білінг"
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr "%{group_name} зараз має план %{plan_link}."
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr "Ðвтоматичні Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð¾ деÑких планів зараз не доÑтупні."
+
+msgid "BillingPlans|Current plan"
+msgstr "Поточний план"
+
+msgid "BillingPlans|Customer Support"
+msgstr "Служба підтримки"
+
+msgid "BillingPlans|Downgrade"
+msgstr "Понизити"
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про кожен план, читаючи наш %{faq_link}."
+
+msgid "BillingPlans|Manage plan"
+msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ð»Ð°Ð½Ð¾Ð¼"
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr "Будь лаÑка, в цьому випадку зв'ÑжітьÑÑ Ð· %{customer_support_link}."
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr "ПодивітьÑÑ Ð²ÑÑ– можливоÑÑ‚Ñ– %{plan_name}"
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr "Ð¦Ñ Ð³Ñ€ÑƒÐ¿Ð° викориÑтовує план, пов'Ñзаний з батьківÑькою групою."
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr "Ð”Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ð»Ð°Ð½Ð¾Ð¼ цієї групи відвідайте Ñекцію оплати %{parent_billing_page_link}."
+
+msgid "BillingPlans|Upgrade"
+msgstr "Підвищити"
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr "Зараз ви викориÑтовуєте план %{plan_link}."
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr "ЧаÑÑ‚Ñ– питаннÑ"
+
+msgid "BillingPlans|monthly"
+msgstr "щоміÑÑцÑ"
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr "ОплачуєтьÑÑ Ñ‰Ð¾Ñ€Ñ–Ñ‡Ð½Ð¾ %{price_per_year}"
+
+msgid "BillingPlans|per user"
+msgstr "За кориÑтувача"
+
+msgid "Bitbucket import"
+msgstr "Імпорт з Bitbucket"
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr "Дошки"
@@ -836,6 +1159,9 @@ msgstr "ЗаÑтарілі"
msgid "Branches|Stale branches"
msgstr "ЗаÑтарілі гілки"
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr "Гілка не може бути оновлена автоматично, тому що вона має розбіжноÑÑ‚Ñ– із upstream."
+
msgid "Branches|The default branch cannot be deleted"
msgstr "Гілка \"за замовчуваннÑм\" не може бути видалена"
@@ -848,9 +1174,15 @@ msgstr "Щоб уникнути втрати даних, розглÑньте м
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ, введіть %{branch_name_confirmation}:"
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr "Щоб відхилити локальні зміни Ñ– перезапиÑати гілку верÑією з upstream, видаліть Ñ—Ñ— тут Ñ– виберіть \"Оновити зараз\" вище."
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "Ви збираєтеÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ захищену гілку %{branch_name}."
+msgid "Branches|diverged from upstream"
+msgstr "розходитьÑÑ Ð· upstream"
+
msgid "Branches|merged"
msgstr "злита"
@@ -872,6 +1204,9 @@ msgstr "ПереглÑд файлів"
msgid "Browse files"
msgstr "ПереглÑд файлів"
+msgid "Business metrics (Custom)"
+msgstr "Ð‘Ñ–Ð·Ð½ÐµÑ Ð¼ÐµÑ‚Ñ€Ð¸ÐºÐ¸ (ВлаÑні)"
+
msgid "ByAuthor|by"
msgstr "від"
@@ -879,11 +1214,17 @@ msgid "CI / CD"
msgstr "CI / CD"
msgid "CI / CD Settings"
-msgstr ""
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI/CD"
+
+msgid "CI/CD"
+msgstr "CI/CD"
msgid "CI/CD configuration"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI/CD"
+msgid "CI/CD for external repo"
+msgstr "CI/CD Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ репозиторіÑ"
+
msgid "CI/CD settings"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI/CD"
@@ -911,6 +1252,9 @@ msgstr "Ðеобхідно вказати доменне Ñ–Ð¼â€™Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€
msgid "CICD|Disable Auto DevOps"
msgstr "Вимкнути Auto DevOps"
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr "Ðе вказуйте тут домен, Ñкщо ви налаштовуєте декілька клаÑтерів Kubernetes за допомогою Auto DevOps."
+
msgid "CICD|Enable Auto DevOps"
msgstr "Увімкнути Auto DevOps"
@@ -932,6 +1276,12 @@ msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñƒ Auto DevOps буде заÑÑ‚Ð
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr "Вам потрібно вказати домен, Ñкщо ви хочете викориÑтовувати Auto Review Apps та Auto Deploy."
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -947,6 +1297,12 @@ msgstr "Ðеможливо злити автоматично"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "Ðеможливо змінити керований клаÑтер Kubernetes"
+msgid "Certificate fingerprint"
+msgstr "Відбиток Ñертифіката"
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr "Змініть це значеннÑ, щоб вплинути на чаÑтоту Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñу GitLab."
@@ -992,6 +1348,12 @@ msgstr "Вибрати (cherry-pick) цей коміт"
msgid "Cherry-pick this merge request"
msgstr "Вибрати (cherry-pick) цей запит на злиттÑ"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr "Виберіть файл ..."
@@ -1007,9 +1369,21 @@ msgstr ""
msgid "Choose file..."
msgstr "Виберіть файл..."
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr "Виберіть групи Ð´Ð»Ñ Ñинхронізації на цей вторинний вузол."
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr "Виберіть, Ñкі репозиторії ви хочете підключити Ñ– запуÑтити конвеєри CI/CD."
+
msgid "Choose which repositories you want to import."
msgstr "Виберіть, Ñкі репозиторії ви хочете імпортувати."
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr "Виберіть Ñегменти Ð´Ð»Ñ Ñинхронізації на цей вторинний вузол."
+
msgid "CiStatusLabel|canceled"
msgstr "ÑкаÑовано"
@@ -1079,12 +1453,21 @@ msgstr "* (Ð’ÑÑ– Ñередовища)"
msgid "CiVariable|All environments"
msgstr "Ð’ÑÑ– Ñередовища"
+msgid "CiVariable|Create wildcard"
+msgstr "Створити шаблон"
+
msgid "CiVariable|Error occured while saving variables"
msgstr "Помилка при збереженні змінних"
+msgid "CiVariable|New environment"
+msgstr "Ðове Ñередовище"
+
msgid "CiVariable|Protected"
msgstr "Захищений"
+msgid "CiVariable|Search environments"
+msgstr "Пошук Ñередовищ"
+
msgid "CiVariable|Toggle protected"
msgstr "Ввімкнути/вимкнути захиÑÑ‚"
@@ -1094,30 +1477,57 @@ msgstr "Перевірка невдала"
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr "circuitbreaker api"
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr "не доÑтупно: %{reason}"
+
msgid "Clear search input"
msgstr "ОчиÑтити поле вводу"
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr "Клікніть по будь-Ñкому <strong>імені проекту</strong> зі ÑпиÑку нижче Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб перейти до етапу проекту."
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr "ÐатиÑніть кнопку <strong>ПеренеÑти</strong> у правому верхному куті щоб перенеÑти етап на рівень групи."
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr "ÐатиÑніть кнопку нижче, щоб розпочати Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²ÑтановленнÑ, перейшовши на Ñторінку Kubernetes"
msgid "Click to expand it."
-msgstr ""
+msgstr "ÐатиÑніть, щоб розгорнути його."
msgid "Click to expand text"
msgstr "ÐатиÑніть, щоб розгорнути текÑÑ‚"
+msgid "Client authentication certificate"
+msgstr "Сертифікат автентифікації клієнта"
+
+msgid "Client authentication key"
+msgstr "Ключ автентифікації клієнта"
+
+msgid "Client authentication key password"
+msgstr "Пароль ключа аутентифікації клієнта"
+
+msgid "Clients"
+msgstr "Клієнти"
+
msgid "Clone repository"
msgstr "Клонувати репозиторій"
msgid "Close"
msgstr "Закрити"
+msgid "Closed"
+msgstr "Закрито"
+
+msgid "Closed issues"
+msgstr "Закриті проблеми"
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr "%{appList} були уÑпішно вÑтановлені на ваш Kubernetes-клаÑтер"
@@ -1127,9 +1537,6 @@ msgstr "API URL"
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "Додати Kubernetes клаÑтер"
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr "Додати Ñ–Ñнуючий Kubernetes-клаÑтер"
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr "Детальні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— із цим Kubernetes-клаÑтером"
@@ -1151,9 +1558,6 @@ msgstr "Сертифікат центру Ñертифікації"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "Ðабір Ñертифікатів (формат PEM)"
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr "Виберіть ÑпоÑіб Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— із Kubernetes-клаÑтером"
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr "Виберіть Ñкі з Ñередовищ вашого проекту викориÑтовуватимуть цей Kubernetes-клаÑтер."
@@ -1181,17 +1585,8 @@ msgstr "Скопіювати Токен"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "Створити Kubernetes-клаÑтер"
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr "Створити Kubernetes-клаÑтер на Google Kubernetes Engine"
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr "Створити Kubernetes-клаÑтер на Google Kubernetes Engine прÑмо із GitLab"
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr "Створити в Google Kubernetes Engine"
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
-msgstr "Вкажіть параметри Ñ–Ñнуючого клаÑтера Kubernetes"
+msgid "ClusterIntegration|Did you know?"
+msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "Введіть параметри вашого Kubernetes-клаÑтера"
@@ -1229,6 +1624,15 @@ msgstr "проекті Google Kubernetes Engine"
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr "Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб показати працездатніÑÑ‚ÑŒ клаÑтера, нам потрібно буде забезпечити ваш клаÑтер з Prometheus Ð´Ð»Ñ Ð·Ð±Ð¾Ñ€Ñƒ необхідних даних."
+
msgid "ClusterIntegration|Ingress"
msgstr "Ingress"
@@ -1238,6 +1642,9 @@ msgstr "Ingress IP-адреÑа"
msgid "ClusterIntegration|Install"
msgstr "Ð’Ñтановити"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr "Ð’Ñтановити Prometheus"
+
msgid "ClusterIntegration|Installed"
msgstr "Ð’Ñтановлений"
@@ -1262,6 +1669,9 @@ msgstr "Kubernetes-клаÑтер"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Параметри Kubernetes-клаÑтера"
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr "Стан Kubernetes-клаÑтера"
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ–Ð· Kubernetes-клаÑтером"
@@ -1319,6 +1729,9 @@ msgstr "Керуйте вашим Kubernetes-клаÑтером за допомÐ
msgid "ClusterIntegration|More information"
msgstr "Додаткова інформаціÑ"
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr "Декілька Kubernetes-клаÑтерів доÑтупні в GitLab Enterprise Edition Premium та Ultimate"
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr "Жоден тип машин не відповідає вашому пошуку"
@@ -1355,9 +1768,6 @@ msgstr "Prometheus"
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr "ПереглÑньте нашу %{link_to_help_page} про інтеграцію із Kubernetes."
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr "Отримайте до $500 на Ñвій рахунок Google Cloud Platform"
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr "Відалити інтеграцію із Kubernetes-клаÑтером"
@@ -1472,6 +1882,9 @@ msgstr "правильно налаштований"
msgid "ClusterIntegration|sign up"
msgstr "зареєÑтрувати"
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr "Згорнути"
@@ -1479,10 +1892,10 @@ msgid "Collapse sidebar"
msgstr "Згорнути бокову панель"
msgid "Comment & resolve discussion"
-msgstr ""
+msgstr "Залишити коментар Ñ– завершити обговореннÑ"
msgid "Comment & unresolve discussion"
-msgstr ""
+msgstr "Залишити коментар Ñ– повторно відкрити обговореннÑ"
msgid "Comments"
msgstr "Коментарі"
@@ -1603,7 +2016,7 @@ msgstr "Ðалаштувати автоматичні перевірки git Ñ–
msgid "Configure limits for web and API requests."
msgstr "Ðалаштуйте Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²ÐµÐ± та API запитів."
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1615,9 +2028,18 @@ msgstr "Ðалаштувати ÑпоÑіб ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸ÑтувÐ
msgid "Connect"
msgstr "Підключити"
+msgid "Connect all repositories"
+msgstr "Підключити вÑÑ– репозиторії"
+
msgid "Connect repositories from GitHub"
msgstr "Підключити репозиторії з GitHub"
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr "З'єднаннÑ..."
+
msgid "Container Registry"
msgstr "РеєÑÑ‚Ñ€ Контейнерів"
@@ -1669,6 +2091,9 @@ msgstr "Ви також можете викориÑтовувати %{deploy_tok
msgid "Continue"
msgstr "Продовжити"
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "Безперервна Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ñ‚Ð° розгортаннÑ"
@@ -1681,6 +2106,9 @@ msgstr "ВнеÑок"
msgid "Contribution guide"
msgstr "ІнÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ Ð´Ð»Ñ ÑƒÑ‡Ð°Ñників"
+msgid "Contributions per group member"
+msgstr "КількіÑÑ‚ÑŒ внеÑків на кожного учаÑника групи"
+
msgid "Contributors"
msgstr "УчаÑники"
@@ -1696,6 +2124,24 @@ msgstr "Коміти в %{branch_name}, за винÑтком комітів зÐ
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr "Будь лаÑка, зачекайте, Ñ†Ñ Ñторінка автоматично оновитьÑÑ, коли буде готова."
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "Задати макÑимальну кількіÑÑ‚ÑŒ потоків Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ LFS/вкладень Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вторинного вузла"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "Задати макÑимальну кількіÑÑ‚ÑŒ потоків Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð² Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ вторинного вузла"
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr "Ð’Ñтановіть макÑимальну кількіÑÑ‚ÑŒ паралельних операцій перевірки Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Geo-вузла"
+
+msgid "ConvDev Index"
+msgstr "Ð†Ð½Ð´ÐµÐºÑ ConvDev"
+
+msgid "Copy SSH public key to clipboard"
+msgstr "Скопіюйте відкритий SSH-ключ в буфер обміну"
+
msgid "Copy URL to clipboard"
msgstr "Скопіювати URL в буфер обміну"
@@ -1708,11 +2154,11 @@ msgstr "Скопіювати команду в буфер обміну"
msgid "Copy commit SHA to clipboard"
msgstr "Скопіювати ідентифікатор в буфер обміну"
-msgid "Copy file name to clipboard"
-msgstr ""
-
msgid "Copy file path to clipboard"
-msgstr ""
+msgstr "Скопіювати шлÑÑ… до файлу в буфер обміну"
+
+msgid "Copy incoming email address to clipboard"
+msgstr "Копіювати адреÑу електронної пошти у буфер обміну"
msgid "Copy reference to clipboard"
msgstr "Скопіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² буфер обміну"
@@ -1720,6 +2166,9 @@ msgstr "Скопіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² буфер обміну"
msgid "Copy to clipboard"
msgstr "Копіювати в буфер обміну"
+msgid "Copy token to clipboard"
+msgstr "Скопіювати токен в буфер обміну"
+
msgid "Create"
msgstr "Створити"
@@ -1732,6 +2181,9 @@ msgstr "Створити нову гілку"
msgid "Create a new branch and merge request"
msgstr "Створити нову гілку Ñ– запит на злиттÑ"
+msgid "Create a new issue"
+msgstr "Створити нову проблему"
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "Створіть токен доÑтупу Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ аккаунта, щоб відправлÑти та отримувати через %{protocol}."
@@ -1747,12 +2199,21 @@ msgstr "Створити каталог"
msgid "Create empty repository"
msgstr "Створити порожній репозиторій"
+msgid "Create epic"
+msgstr "Створити епік"
+
msgid "Create file"
msgstr "Створити файл"
+msgid "Create group"
+msgstr "Створити групу"
+
msgid "Create group label"
msgstr "Створити мітку групи"
+msgid "Create issue"
+msgstr "Створити проблему"
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "Створити ÑпиÑок на оÑнові міток. Ð’ ньому будуть проблеми з такими мітками."
@@ -1771,6 +2232,9 @@ msgstr "Створити новий каталог"
msgid "Create new file"
msgstr "Створити новий файл"
+msgid "Create new file or directory"
+msgstr "Створити новий файл чи папку"
+
msgid "Create new label"
msgstr "Створити нову мітку"
@@ -1792,15 +2256,27 @@ msgstr "Створити токен Ð´Ð»Ñ Ð¾ÑобиÑтого доÑтупу"
msgid "Created"
msgstr "Створено"
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr "Створено мною"
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐµÐ¿Ñ–ÐºÑƒ"
+
msgid "Cron Timezone"
msgstr "ЧаÑовий поÑÑ Cron"
msgid "Cron syntax"
msgstr "СинтакÑÐ¸Ñ Cron"
+msgid "Current node"
+msgstr "Поточний вузол"
+
msgid "CurrentUser|Profile"
msgstr "Профіль"
@@ -1808,7 +2284,7 @@ msgid "CurrentUser|Settings"
msgstr "ÐалаштуваннÑ"
msgid "Custom CI config path"
-msgstr ""
+msgstr "КориÑтувацький шлÑÑ… до CI config"
msgid "Custom notification events"
msgstr "КориÑтувацькі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ про події"
@@ -1816,6 +2292,15 @@ msgstr "КориÑтувацькі Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "Спеціальні рівні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñпівпадають з рівнем учаÑÑ‚Ñ–. За допомогою Ñпеціальних рівнів Ñповіщень ви також отримуватимете ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ вибрані події. Щоб дізнатиÑÑŒ більше, переглÑньте %{notification_link}."
+msgid "Customize colors"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñ–Ð²"
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "Ðналіз циклу"
@@ -1840,6 +2325,9 @@ msgstr "Staging"
msgid "CycleAnalyticsStage|Test"
msgstr "ТеÑтуваннÑ"
+msgid "Dashboard"
+msgstr "Панель керуваннÑ"
+
msgid "DashboardProjects|All"
msgstr "Ð’ÑÑ–"
@@ -1855,15 +2343,33 @@ msgstr "грудень"
msgid "Decline and sign out"
msgstr "Відхити та вийти"
+msgid "Default classification label"
+msgstr "Мітка клаÑифікації за замовчуваннÑм"
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "Визначте влаÑний шаблон за допомогою ÑинтакÑиÑу cron"
msgid "Delete"
msgstr "Видалити"
+msgid "Delete Snippet"
+msgstr "Видалити Ñніпет"
+
msgid "Delete list"
msgstr "Видалити ÑпиÑок"
+msgid "Deleted"
+msgstr "Видалено"
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "РозгортаннÑ"
@@ -1997,9 +2503,21 @@ msgstr "Створено ваш новий токен Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð
msgid "Deprioritize label"
msgstr "Зменшити пріоритет мітки"
+msgid "Descending"
+msgstr "За ÑпаданнÑм"
+
msgid "Description"
msgstr "ОпиÑ"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr "Шаблони опиÑу дозволÑÑŽÑ‚ÑŒ визначити конкретні шаблони обговорень та запитів на Ð·Ð»Ð¸Ð²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ проекту."
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "Деталі"
@@ -2027,9 +2545,27 @@ msgstr "Відхилити зміни"
msgid "Discard draft"
msgstr "Видалити чернетку"
+msgid "Discover GitLab Geo."
+msgstr "Відкрийте GitLab Geo."
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr "Відхилити блок вÑтупу до Ðналитики Циклу"
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð´Ð»Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ… провайдерів ідентифікації"
+
msgid "Domain"
msgstr "Домен"
@@ -2072,6 +2608,9 @@ msgstr "Дизлайки"
msgid "Due date"
msgstr "Запланована дата завершеннÑ"
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr "Під Ñ‡Ð°Ñ Ñ†ÑŒÐ¾Ð³Ð¾ процеÑу вам буде запропоновано вказати URL-адреÑи з боку GitLab. ВикориÑтовуйте URL-адреÑи, показані нижче."
+
msgid "Each Runner can be in one of the following states:"
msgstr "Кожен Runner може бути в одному із таких Ñтанів:"
@@ -2084,12 +2623,27 @@ msgstr "Редагувати мітку"
msgid "Edit Pipeline Schedule %{id}"
msgstr "Редагувати Розклад Конвеєра %{id}"
+msgid "Edit Snippet"
+msgstr "Редагувати Ñніпет"
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr "Редагуйте файли в редакторі і закомітьте зміни тут"
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr "Elasticsearch"
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr "Ð†Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ Ð· Elasticsearch. Elasticsearch AWS IAM."
+
msgid "Email"
msgstr "Електронна пошта"
@@ -2108,6 +2662,12 @@ msgstr "Увімкнути"
msgid "Enable Auto DevOps"
msgstr "Увімкнути Auto DevOps"
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr "Увімкнути Sentry Ð´Ð»Ñ Ð·Ð²Ñ–Ñ‚Ñ–Ð² про помилки та логуваннÑ."
@@ -2117,6 +2677,9 @@ msgstr "Включити і налаштувати метрики InfluxDB."
msgid "Enable and configure Prometheus metrics."
msgstr "Включити і налаштувати метрики Prometheus."
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr "Увімкнути Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту"
@@ -2126,6 +2689,9 @@ msgstr "Увімкнути групові Runner'и"
msgid "Enable or disable certain group features and choose access levels."
msgstr "Увімкніть або вимкніть певні функції групи та виберіть рівні доÑтупу."
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr "Увімкнути чи вимкнути перевірку верÑÑ–Ñ— та надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… про викориÑтаннÑ."
@@ -2135,6 +2701,9 @@ msgstr "Увімкнути reCAPTCHA або Akismet та вÑтановити о
msgid "Enable the Performance Bar for a given group."
msgstr "Увімкнути панель продуктивноÑÑ‚Ñ– Ð´Ð»Ñ Ð´Ð°Ð½Ð¾Ñ— групи."
+msgid "Enabled"
+msgstr "Увімкнено"
+
msgid "Ends at (UTC)"
msgstr "ЗавершуєтьÑÑ Ð¾ (за Грінвічем)"
@@ -2147,9 +2716,18 @@ msgstr "Виникла помилка при завантаженні Ñеред
msgid "Environments|An error occurred while making the request."
msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr "Коміт"
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr "РозгортаннÑ"
@@ -2162,45 +2740,75 @@ msgstr "Середовища"
msgid "Environments|Job"
msgstr "ЗавданнÑ"
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr "Ðове Ñередовище"
msgid "Environments|No deployments yet"
msgstr "Ще немає розгортань"
-msgid "Environments|Open"
-msgstr "Відкрити"
+msgid "Environments|No pod name has been specified"
+msgstr ""
-msgid "Environments|Re-deploy"
-msgstr "Повторно розгорнути"
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
+msgstr ""
msgid "Environments|Read more about environments"
msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ñередовища"
-msgid "Environments|Rollback"
-msgstr "Відкотити"
+msgid "Environments|Rollback environment"
+msgstr ""
msgid "Environments|Show all"
msgstr "Показати вÑÑ–"
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr "Оновлено"
msgid "Environments|You don't have any environments right now."
msgstr "Ви поки не налаштували жодного Ñередовища."
+msgid "Epic"
+msgstr "Епік"
+
+msgid "Epic will be removed! Are you sure?"
+msgstr "Епік буде видалено! Ви впевнені?"
+
+msgid "Epics"
+msgstr "Епіки"
+
+msgid "Epics Roadmap"
+msgstr "План-графік епіків"
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr "Епіки дозволÑÑŽÑ‚ÑŒ керувати вашим портфелем проектів ефективніше та з меншими зуÑиллÑми"
+
msgid "Error Reporting and Logging"
msgstr "Звіти про помилки та логуваннÑ"
-msgid "Error committing changes. Please try again."
-msgstr "Помилка при коміті змін. Будь лаÑка, Ñпробуйте пізніше."
+msgid "Error creating epic"
+msgstr ""
msgid "Error fetching contributors data."
msgstr "Помилка Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… учаÑників."
-msgid "Error fetching job trace"
-msgstr "Помилка при отриманні журнала завданнÑ"
-
msgid "Error fetching labels."
msgstr "Помилка Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ñ–Ñ‚Ð¾Ðº."
@@ -2219,6 +2827,9 @@ msgstr "Помилка при завантаженні даних про гілÐ
msgid "Error loading last commit."
msgstr "Помилка при завантаженні оÑтаннього коміту."
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr "Помилка при завантаженні запитів на злиттÑ."
@@ -2267,21 +2878,60 @@ msgstr "Кожен міÑÑць (1-го чиÑла о 4:00 ранку)"
msgid "Every week (Sundays at 4:00am)"
msgstr "Ð©Ð¾Ñ‚Ð¸Ð¶Ð½Ñ (в неділю о 4:00 ранку)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr "Розгорнути"
msgid "Expand all"
-msgstr ""
+msgstr "Розгорнути вÑе"
msgid "Expand sidebar"
msgstr "Розгорніть бічну панель"
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr "ОглÑд груп"
+
msgid "Explore projects"
msgstr "ОглÑд проектів"
msgid "Explore public groups"
msgstr "ПереглÑнути публічні групи"
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ"
+
+msgid "External authorization denied access to this project"
+msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½Ð¸Ð»Ð° доÑтуп до цього проекту"
+
+msgid "External authorization request timeout"
+msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на зовнішню авторизацію"
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr "Мітка клаÑифікації"
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr "Мітка клаÑифікації"
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr "Якщо клаÑифікаційну мітку не вÑтановлено, викориÑтовуватиметьÑÑ Ñтандартна мітка `%{default_label}`."
+
+msgid "Facebook"
+msgstr "Facebook"
+
msgid "Failed"
msgstr "Ðевдало"
@@ -2324,6 +2974,12 @@ msgstr "Файли"
msgid "Files (%{human_size})"
msgstr "Файли (%{human_size})"
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr "Заповніть Ð¿Ð¾Ð»Ñ Ð½Ð¸Ð¶Ñ‡Ðµ, увімкніть <strong>%{enable_label}</strong> та натиÑніть <strong>%{save_changes}</strong>"
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "Фільтрувати за коміт-повідомленнÑм"
@@ -2333,6 +2989,12 @@ msgstr "Пошук по шлÑху"
msgid "Find file"
msgstr "Знайти файл"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr "Завершено"
@@ -2342,6 +3004,30 @@ msgstr "Перший"
msgid "FirstPushedBy|pushed by"
msgstr "відправлено"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr "Імпорт з FogBugz"
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr "Імпорт з FogBugz"
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr "Колір шрифту"
+
+msgid "Footer message"
+msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð² футері"
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2376,6 +3062,18 @@ msgstr "Знайдено помилки у вашому .gitlab-ci.yml:"
msgid "From %{provider_title}"
msgstr "З %{provider_title}"
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "З моменту ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ до Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð½Ð° production"
@@ -2392,11 +3090,206 @@ msgid "General"
msgstr "Загальні"
msgid "General pipelines"
-msgstr ""
+msgstr "Загальні конвеєри"
msgid "Generate a default set of labels"
msgstr "Створити Ñтандартний набір міток"
+msgid "Geo Nodes"
+msgstr "Гео-Вузли"
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr "Geo дозволÑÑ” вам реплікувати ваш інÑÑ‚Ð°Ð½Ñ GitLab у інших географічних локаціÑÑ…."
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr "Вузол не працює або зламаний."
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr "Вузол працює повільно, перевантажений або тільки що відновивÑÑ Ð¿Ñ–ÑÐ»Ñ Ð·Ð±Ð¾ÑŽ."
+
+msgid "GeoNodes|Checksummed"
+msgstr "Із контрольною Ñумою"
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr "Дані заÑтаріли на %{timeago}"
+
+msgid "GeoNodes|Data replication lag"
+msgstr "Затримка реплікації даних"
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr "Ð’Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ð° зупинÑÑ” Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронізації. Ви впевнені?"
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr "Ðе відповідає оÑновній конфігурації Ñховища"
+
+msgid "GeoNodes|Failed"
+msgstr "Ðевдало"
+
+msgid "GeoNodes|Full"
+msgstr "Повний"
+
+msgid "GeoNodes|GitLab version"
+msgstr "ВерÑÑ–Ñ GitLab"
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr "ВерÑÑ–Ñ GitLab не відповідає верÑÑ–Ñ— оÑновного вузла"
+
+msgid "GeoNodes|Health status"
+msgstr "Стан працездатноÑÑ‚Ñ–"
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr "ОÑтанній ідентифікатор події, оброблений курÑором"
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr "ОÑтанній ідентифікатор події, видимий з оÑновного"
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ñтан обчиÑÐ»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми репозиторію"
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про перевірку репозиторію"
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про Ñтан обчиÑÐ»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми wiki"
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про перевірку wiki"
+
+msgid "GeoNodes|Loading nodes"
+msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ñ–Ð²"
+
+msgid "GeoNodes|Local LFS objects"
+msgstr "Локальні LFS-об’єкти"
+
+msgid "GeoNodes|Local attachments"
+msgstr "Локальні додатки"
+
+msgid "GeoNodes|Local job artifacts"
+msgstr "Ðртефакти локальних завдань"
+
+msgid "GeoNodes|New node"
+msgstr "Ðовий вузол"
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr "Ðутентифікацію вузла уÑпішно полагоджено."
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr "Вузол уÑпішно видалено."
+
+msgid "GeoNodes|Not checksummed"
+msgstr "Без контрольної Ñуми"
+
+msgid "GeoNodes|Out of sync"
+msgstr "РозÑинхронізовані"
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²ÑƒÐ·Ð»Ð° зупинÑÑ” Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронізації. Ви впевнені?"
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr "Слот реплікації WAL"
+
+msgid "GeoNodes|Replication slots"
+msgstr "Слоти реплікації"
+
+msgid "GeoNodes|Repositories"
+msgstr "Репозиторії"
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr "Контрольні Ñуми репозиторіїв обчиÑлено Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ñ—Ñ… копій на вторинних вузлах"
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr "Репозиторії перевірено із їхніми копіÑми на первинному вузлі"
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr "Стан обчиÑÐ»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми репозиторію"
+
+msgid "GeoNodes|Repository verification progress"
+msgstr "Стан перевірки репозиторію"
+
+msgid "GeoNodes|Selective"
+msgstr "Вибіркові"
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr "Проблема при зміні ÑтатуÑа вузла"
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr "Проблема при отриманні вузлів"
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr "Проблема при видаленні вузла"
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr "Проблема при полагодженні вузла"
+
+msgid "GeoNodes|Storage config"
+msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñховища"
+
+msgid "GeoNodes|Sync settings"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації"
+
+msgid "GeoNodes|Synced"
+msgstr "Синхронізовано"
+
+msgid "GeoNodes|Unused slots"
+msgstr "ÐевикориÑтані Ñлоти"
+
+msgid "GeoNodes|Unverified"
+msgstr "Ðепідтверджені"
+
+msgid "GeoNodes|Used slots"
+msgstr "ВикориÑтані Ñлоти"
+
+msgid "GeoNodes|Verified"
+msgstr "Підтверджені"
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr "Стан обчиÑÐ»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми wiki"
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr "Стан перевірки wiki"
+
+msgid "GeoNodes|Wikis"
+msgstr "Wiki"
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr "Контрольні Ñуми wiki обчиÑлено Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ñ—Ñ… копій на вторинних вузлах"
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr "Wiki перевірено із їхніми копіÑми на первинному вузлі"
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr "Ви налаштували Geo-вузли через незахищене HTTP-з’єднаннÑ. Ми рекомендуємо викориÑтовувати HTTPS."
+
+msgid "Geo|All projects"
+msgstr "Ð’ÑÑ– проекти"
+
+msgid "Geo|File sync capacity"
+msgstr "ПропуÑкна здатніÑÑ‚ÑŒ Ñинхронізації файлів"
+
+msgid "Geo|Groups to synchronize"
+msgstr "Групи Ð´Ð»Ñ Ñинхронізації"
+
+msgid "Geo|Projects in certain groups"
+msgstr "Проекти в певних групах"
+
+msgid "Geo|Projects in certain storage shards"
+msgstr "Проекти в певних Ñегментах Ñховищ"
+
+msgid "Geo|Repository sync capacity"
+msgstr "ПропуÑкна здатніÑÑ‚ÑŒ Ñинхронізації репозиторіїв"
+
+msgid "Geo|Select groups to replicate."
+msgstr "Виберіть групи Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—."
+
+msgid "Geo|Shards to synchronize"
+msgstr "Сегменти Ð´Ð»Ñ Ñинхронізації"
+
+msgid "Geo|Verification capacity"
+msgstr "ПропуÑкна здатніÑÑ‚ÑŒ перевірки"
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr "URL Git-репозиторіÑ"
@@ -2418,11 +3311,29 @@ msgstr "GitHub-імпорт"
msgid "GitLab CI Linter has been moved"
msgstr "GitLab CI Linter був перенеÑений"
+msgid "GitLab Geo"
+msgstr "GitLab Geo"
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr "Групові Runner'и Gitlab можуть виконувати код Ð´Ð»Ñ ÑƒÑÑ–Ñ… проектів у цій групі."
-msgid "GitLab Runner section"
-msgstr "Розділ GitLab Runner"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr "URL єдиного входу GitLab"
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr "Gitaly"
@@ -2433,18 +3344,33 @@ msgstr "Сервери Gitaly"
msgid "Gitaly|Address"
msgstr "ÐдреÑа"
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr "ПовернутиÑÑ"
msgid "Go back"
msgstr "ПовернутиÑÑ"
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "Перейти до вашого форку"
msgid "GoToYourFork|Fork"
msgstr "Форк"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Google не %{link_to_documentation}. ПопроÑÑ–Ñ‚ÑŒ Ñвого адмініÑтратора GitLab, Ñкщо ви хочете ÑкориÑтатиÑÑ Ñ†Ð¸Ð¼ ÑервіÑом."
@@ -2454,18 +3380,72 @@ msgstr "Зрозуміло!"
msgid "Graph"
msgstr "Графік"
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI/CD групи"
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr "Ідентифікатор групи"
msgid "Group Runners"
msgstr "Групові Runner'и"
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr "Керівники групи можуть зареєÑтрувати групові runner'и через %{link}"
+msgid "Group: %{group_name}"
+msgstr "Група: %{group_name}"
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr "Від %{dateWord}"
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð»Ð°Ð½Ñƒ-графіку"
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr "Проблема при завантаженні епіків"
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr "Вибачте, жоден епік не задовольнÑÑ” критеріÑм вашого пошуку"
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr "План-графік епіків відображає Ñтан ваших епіків у чаÑÑ–"
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду плану-графіку додайте заплановані дати початку та Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ одного з ваших епіків у цій групі або Ñ—Ñ— підгрупах. При поміÑÑчному переглÑді показуютьÑÑ Ð»Ð¸ÑˆÐµ епіки за попередній, поточний та наÑтупні 5 міÑÑців: від %{startDate} до %{endDate}."
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду плану-графіку додайте заплановані дати початку та Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ одного з ваших епіків у цій групі або Ñ—Ñ— підгрупах. При поквартальному переглÑді показуютьÑÑ Ð»Ð¸ÑˆÐµ епіки за попередній, поточний та наÑтупні 4 квартали: від %{startDate} до %{endDate}."
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr "До %{dateWord}"
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "Заборонити Ñпільний доÑтуп до проекту в рамках %{group} з іншими групами"
@@ -2490,9 +3470,33 @@ msgstr "не може бути ÑкаÑовано поки \"БлокуваннÑ
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "Видалити Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñпільного доÑтупу з іншими групами з %{ancestor_group_name}"
+msgid "Groups"
+msgstr "Групи"
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "Група — набір із декількох проектів."
@@ -2532,6 +3536,12 @@ msgstr "Ðа жаль жодна группа не задовольнÑÑ” пар
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr "Ðа жаль жодна группа чи проект не задовольнÑÑ” параметрам вашого запиту"
+msgid "Have your users email"
+msgstr "Електронна пошта Ð´Ð»Ñ Ð·Ð²ÐµÑ€Ñ‚Ð°Ð½ÑŒ кориÑтувачів"
+
+msgid "Header message"
+msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°"
+
msgid "Health Check"
msgstr "Перевірка ПрацездатноÑÑ‚Ñ–"
@@ -2605,12 +3615,21 @@ msgstr "Ідентифікатор"
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr "URL єдиного входу провайдера ідентифікації"
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr "Якщо це дозволено, доÑтуп до проектів буде перевірÑтиÑÑ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾ÑŽ Ñлужбою з викориÑтаннÑм Ñ—Ñ… мітки клаÑифікації."
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr "При викориÑтанні GitHub, ви побачите ÑтатуÑи конвеєрів Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð² Ñ– запитів на злиттÑ. %{more_info_link}"
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr "Якщо у Ð²Ð°Ñ ÑƒÐ¶Ðµ Ñ” файли, ви можете відправити Ñ—Ñ… за допомогою %{link_to_cli} нижче."
@@ -2629,29 +3648,84 @@ msgstr "Ðакладені (проведеннÑ)"
msgid "Import"
msgstr "Імпорт"
+msgid "Import Projects from Gitea"
+msgstr "Імпортувати проекти з Gitea"
+
+msgid "Import all compatible projects"
+msgstr "Імпорт вÑÑ–Ñ… ÑуміÑних проектів"
+
+msgid "Import all projects"
+msgstr "Імпортувати вÑÑ– проекти"
+
msgid "Import all repositories"
msgstr "Імпорт вÑÑ–Ñ… репозиторіїв"
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr "Імпорт триває"
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr "Імпорт репозиторіїв з GitHub"
msgid "Import repository"
msgstr "Імпорт репозиторію"
+msgid "ImportButtons|Connect repositories from"
+msgstr "Підключити репозиторії із"
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr "Покращити дошки обговорень за допомогою верÑÑ–Ñ— GitLab Enterprise Edition."
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr "Покращити ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°Ð¼Ð¸ з можливіÑÑ‚ÑŽ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð°Ð³Ð¸ проблеми за допомогою GitLab Enterprise Edition."
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr "Покращити пошук за допомогою розширеного глобального пошук в верÑÑ–Ñ— GitLab Enterprise Edition."
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr "Включити угоду про Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ñлуг та правила конфіденційноÑÑ‚Ñ–, Ñкі повинні прийнÑти вÑÑ– кориÑтувачі."
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
+msgstr "Вбудований"
+
+msgid "Install GitLab Runner"
msgstr ""
msgid "Install Runner on Kubernetes"
msgstr "Ð’Ñтановити Runner на Kubernetes"
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "Ð’Ñтановіть Runner, ÑуміÑний з GitLab CI"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] "ІнÑтанÑ"
+msgstr[1] "ІнÑтанÑів"
+msgstr[2] "ІнÑтанÑів"
+msgstr[3] "ІнÑтанÑів"
msgid "Instance does not support multiple Kubernetes clusters"
msgstr "Цей інÑÑ‚Ð°Ð½Ñ Ð½Ðµ підтримує декілька Kubernetes-клаÑтерів"
@@ -2660,7 +3734,7 @@ msgid "Integrations"
msgstr "Інтеграції"
msgid "Integrations Settings"
-msgstr ""
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ—"
msgid "Interested parties can even contribute by pushing commits if they want to."
msgstr "Зацікавлені Ñторони за бажаннÑм можуть навіть робити внеÑки шлÑхом Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ–Ð²."
@@ -2677,21 +3751,30 @@ msgstr "Шаблон інтервалу"
msgid "Introducing Cycle Analytics"
msgstr "ПредÑтавлÑємо аналітику циклу"
-msgid "Issue Board"
+msgid "Issue Boards"
msgstr ""
+msgid "Issue board focus mode"
+msgstr "Режим фокуÑÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð´Ð¾ÑˆÐºÐ¸ обговорень"
+
msgid "Issue events"
msgstr "Проблеми"
msgid "IssueBoards|Board"
msgstr "Дошка"
+msgid "IssueBoards|Boards"
+msgstr "Дошки"
+
msgid "Issues"
msgstr "Проблеми"
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "Проблеми можуть бути помилками, завданнÑми чи ідеÑми Ð´Ð»Ñ Ð¾Ð±Ð³Ð¾Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ. Крім того, проблеми доÑтупні Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ та фільтруваннÑ."
+msgid "Issues closed"
+msgstr "Проблеми закриті"
+
msgid "Jan"
msgstr "Ñіч."
@@ -2699,7 +3782,7 @@ msgid "January"
msgstr "Ñічень"
msgid "Job"
-msgstr ""
+msgstr "ЗавданнÑ"
msgid "Job has been erased"
msgstr "Ð—Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ Ñтерте"
@@ -2722,6 +3805,9 @@ msgstr "червень"
msgid "Koding"
msgstr "Koding"
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -2761,12 +3847,18 @@ msgstr "Мітка"
msgid "Label actions dropdown"
msgstr "Випадаючий ÑпиÑок дій із мітками"
+msgid "Label lists show all issues with the selected label."
+msgstr "Ð’ ÑпиÑках на оÑнові міток відображаютьÑÑ Ð»Ð¸ÑˆÐµ Ñ‚Ñ– проблеми, Ñкі мають вибрану мітку."
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr "%{firstLabelName} + %{remainingLabelCount} ще"
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr "%{labelsString} і %{remainingLabelCount} ще"
+msgid "LabelSelect|Labels"
+msgstr "Мітки"
+
msgid "Labels"
msgstr "Мітки"
@@ -2843,12 +3935,30 @@ msgstr "Залишити групу"
msgid "Leave project"
msgstr "Залишити проект"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr "ЛіцензіÑ"
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr "СпиÑок"
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr "СпиÑок ваших репозиторіїв GitHub"
+msgid "Loading contribution stats for group members"
+msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÑтатиÑтики учаÑників групи"
+
msgid "Loading the GitLab IDE..."
msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ IDE GitLab..."
@@ -2870,15 +3980,39 @@ msgstr "Закріпити за поточними проектами"
msgid "Locked"
msgstr "Заблоковано"
+msgid "Locked Files"
+msgstr "Заблоковані файли"
+
msgid "Locked to current projects"
msgstr "Закріплено за поточними проектами"
-msgid "Login"
-msgstr "Вхід"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути заÑтоÑоване до конкретного файлу або директорії."
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr "Зробіть кожного учаÑника команди більш продуктивним незалежно від його міÑцезнаходженнÑ. GitLab Geo Ñтворює копії \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" вашого GitLab Ñервера, щоб Ñкоротити Ñ‡Ð°Ñ Ð´Ð»Ñ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ з великих репозиторіїв."
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr ""
msgid "Manage all notifications"
msgstr "Керувати вÑіма ÑповіщеннÑми"
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ°Ð¼Ð¸ групи"
@@ -2888,6 +4022,27 @@ msgstr "Керувати мітками"
msgid "Manage project labels"
msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ°Ð¼Ð¸ проекту"
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr "Керуйте членÑтвом у вашій групі додаючи ще один рівень безпеки із SAML."
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr "бер."
@@ -2912,18 +4067,30 @@ msgstr "Медіана"
msgid "Members"
msgstr "КориÑтувачі"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr "УчаÑники будуть перенаправлені Ñюди, коли будуть заходити до вашої групи. Отримайте його від Ñвого провайдера ідентифікації, де вона також може називатиÑÑ \"SSO Service Location\", \"SAML Token Issuance Endpoint\", або \"SAML 2.0/W-Federation URL\"."
+
+msgid "Merge Request"
+msgstr "Запит на злиттÑ"
+
msgid "Merge Request:"
msgstr "Запит на злиттÑ:"
msgid "Merge Requests"
msgstr "Запити на злиттÑ"
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr "Події злиттÑ"
msgid "Merge request"
msgstr "Запит на злиттÑ"
+msgid "Merge request approvals"
+msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² на злиттÑ"
+
msgid "Merge requests"
msgstr "Запити на злиттÑ"
@@ -2943,7 +4110,7 @@ msgid "MergeRequests|Updating discussions failed"
msgstr ""
msgid "MergeRequests|View file @ %{commitId}"
-msgstr ""
+msgstr "ПереглÑнути файл @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
msgstr ""
@@ -2954,12 +4121,114 @@ msgstr "Злито"
msgid "Messages"
msgstr "ПовідомленнÑ"
+msgid "Metrics"
+msgstr "Метрики"
+
msgid "Metrics - Influx"
msgstr "Метрики - Influx"
msgid "Metrics - Prometheus"
msgstr "Метрики - Prometheus"
+msgid "Metrics|Business"
+msgstr "БізнеÑ"
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr "Створити метрику"
+
+msgid "Metrics|Edit metric"
+msgstr "Редагувати метрику"
+
+msgid "Metrics|Environment"
+msgstr "Середовище"
+
+msgid "Metrics|For grouping similar metrics"
+msgstr "Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð´Ñ–Ð±Ð½Ð¸Ñ… метрик"
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr "Ðазва вертикальної оÑÑ– графіка. Зазвичай це — одиниці вимірюваннÑ. Горизонтальна віÑÑŒ (віÑÑŒ X) завжди відображає чаÑ."
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr "Заголовок легенди (необов’Ñзковий)"
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr "Має бути коректним запитом PromQL."
+
+msgid "Metrics|Name"
+msgstr "Ім'Ñ"
+
+msgid "Metrics|New metric"
+msgstr "Ðова метрика"
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ð¿Ð¾ запитам Prometheus"
+
+msgid "Metrics|Query"
+msgstr "Запит"
+
+msgid "Metrics|Response"
+msgstr "Відповідь"
+
+msgid "Metrics|System"
+msgstr "СиÑтема"
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr "Тип"
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr "Одиниці вимірюваннÑ"
+
+msgid "Metrics|Used as a title for the chart"
+msgstr "ВикориÑтовуєтьÑÑ Ñк заголовок графіка"
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr "ВикориÑтовуєтьÑÑ, Ñкщо запит повертає єдину поÑлідовніÑÑ‚ÑŒ. Якщо ж він повертає декілька, Ñ—Ñ… назви берутьÑÑ Ñ–Ð· відповіді."
+
+msgid "Metrics|Y-axis label"
+msgstr "Ðазва оÑÑ– Y"
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr "напр. HTTP-запити"
+
+msgid "Metrics|e.g. Requests/second"
+msgstr "напр. запитів/Ñек"
+
+msgid "Metrics|e.g. Throughput"
+msgstr "напр. пропуÑкна здатніÑÑ‚ÑŒ"
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr "напр. rate(http_requests_total[5m])"
+
+msgid "Metrics|e.g. req/sec"
+msgstr "напр. зап/Ñек"
+
msgid "Milestone"
msgstr "Етап"
@@ -2984,6 +4253,9 @@ msgstr "ПеренеÑти %{milestoneTitle} на рівень групи?"
msgid "Milestones|Promote Milestone"
msgstr "ПеренеÑти етап"
+msgid "Milestones|This action cannot be reversed."
+msgstr "Цю дію не можна ÑкаÑувати."
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "не додаÑте SSH ключ"
@@ -2996,21 +4268,36 @@ msgstr "Закрити"
msgid "Monitoring"
msgstr "Моніторинг"
+msgid "Months"
+msgstr "МіÑÑці"
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr "Додаткові дії"
+msgid "More info"
+msgstr "Детальніше"
+
msgid "More information"
msgstr "Детальніше"
msgid "More information is available|here"
msgstr "тут"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr "ПереміÑтити"
msgid "Move issue"
msgstr "ПереміÑтити проблему"
+msgid "Multiple issue boards"
+msgstr "Кілька дошок обговореннÑ"
+
msgid "Name"
msgstr "Ім’Ñ"
@@ -3020,6 +4307,9 @@ msgstr "Ðазвіть нову мітку"
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr "Допомога"
@@ -3032,9 +4322,21 @@ msgstr "Увійти / зареєÑтруватиÑÑ"
msgid "Nav|Sign out and sign in with a different account"
msgstr "Вийти із зайти під інший обліковим запиÑом"
-msgid "New Identity"
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr "Ðовий"
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
msgstr ""
+msgid "New Identity"
+msgstr "Ðова ідентичніÑÑ‚ÑŒ"
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "Ðова проблема"
@@ -3042,18 +4344,18 @@ msgstr[1] "Ðові проблеми"
msgstr[2] "Ðових проблем"
msgstr[3] "Ðових проблем"
-msgid "New Kubernetes Cluster"
-msgstr "Ðовий Kubernetes-клаÑтер"
-
-msgid "New Kubernetes cluster"
-msgstr "Ðовий Kubernetes-клаÑтер"
-
msgid "New Label"
-msgstr ""
+msgstr "Ðова мітка"
msgid "New Pipeline Schedule"
msgstr "Ðовий розклад Конвеєра"
+msgid "New Snippet"
+msgstr "Ðовий Ñніпет"
+
+msgid "New Snippets"
+msgstr "Ðові Ñніпети"
+
msgid "New branch"
msgstr "Ðова гілка"
@@ -3063,6 +4365,9 @@ msgstr "Ðова гілка недоÑтупна"
msgid "New directory"
msgstr "Ðовий каталог"
+msgid "New epic"
+msgstr "Ðовий епік"
+
msgid "New file"
msgstr "Ðовий файл"
@@ -3070,7 +4375,7 @@ msgid "New group"
msgstr "Ðова група"
msgid "New identity"
-msgstr ""
+msgstr "Ðова ідентичніÑÑ‚ÑŒ"
msgid "New issue"
msgstr "Ðова проблема"
@@ -3099,9 +4404,15 @@ msgstr "Ðова підгрупа"
msgid "New tag"
msgstr "Ðовий тег"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr "ÐÑ–"
+msgid "No Label"
+msgstr "Без Мітки"
+
msgid "No assignee"
msgstr "Ðемає виконавцÑ"
@@ -3121,23 +4432,47 @@ msgid "No file chosen"
msgstr "Файл не вибрано"
msgid "No files found"
-msgstr ""
+msgstr "Ðе знайдено жодного файлу"
msgid "No files found."
msgstr "Ðе знайдено жодного файлу."
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr "Ðе знайдено жодного запиту на злиттÑ"
msgid "No messages were logged"
msgstr "Ðемає повідомлень у журналі"
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "Ðемає репозиторію"
msgid "No schedules"
msgstr "Ðемає розкладів"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "Ðемає"
@@ -3162,12 +4497,21 @@ msgstr "ÐедоÑтатньо даних"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "Майте на увазі, що гілка master захищена автоматично. %{link_to_protected_branches}"
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "Примітка: Ñк адмініÑтратор ви можете налаштувати %{github_integration_link}, що дозволить входити через GitHub Ñ– імпортувати репозиторії без ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾ÑобиÑтого токену доÑтупу."
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "Примітка: звернітьÑÑ Ð´Ð¾ вашого адмініÑтратора GitLab, щоб налаштувати %{github_integration_link}, Ñкий дозволить входити за допомогою GitHub та імпортувати репозиторії без генерації перÑонального токена доÑтупу."
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ події"
@@ -3240,6 +4584,9 @@ msgstr "лиÑтопад"
msgid "Number of access attempts"
msgstr "КількіÑÑ‚ÑŒ Ñпроб доÑтупу"
+msgid "OK"
+msgstr "OK"
+
msgid "Oct"
msgstr "жовт."
@@ -3249,18 +4596,48 @@ msgstr "жовтень"
msgid "OfSearchInADropdown|Filter"
msgstr "Фільтр"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ñ–Ñ— із онлайн IDE."
msgid "Only comments from the following commit are shown below"
-msgstr ""
+msgstr "Ðижче наведено лише коментарі з наÑтупного коміту"
msgid "Only project members can comment."
msgstr "Тільки учаÑники проекту можуть залишати коментарі."
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr "Відкрити"
+
msgid "Open in Xcode"
msgstr "Відкрити в Xcode"
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr "Відкрито"
+
+msgid "Opened MR"
+msgstr "Відкритий запит на злиттÑ"
+
+msgid "Opened issues"
+msgstr "Відкриті проблеми"
+
msgid "OpenedNDaysAgo|Opened"
msgstr "Відкрито"
@@ -3270,15 +4647,24 @@ msgstr "ВідкриваєтьÑÑ Ñƒ новому вікні"
msgid "Operations"
msgstr "Операції"
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "Параметри"
msgid "Or you can choose one of the suggested colors below"
-msgstr ""
+msgstr "Ðбо ви можете вибрати один із запропонованих нижче кольорів"
msgid "Other Labels"
msgstr "Інші мітки"
+msgid "Other information"
+msgstr "Інша інформаціÑ"
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr "Ð’ іншому разі рекомендуєтьÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ з одного з наведених нижче варіантів."
@@ -3315,6 +4701,9 @@ msgstr "Пароль"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr "Призупинити"
@@ -3348,6 +4737,9 @@ msgstr "Розклад Конвеєра"
msgid "Pipeline Schedules"
msgstr "Розклади Конвеєрів"
+msgid "Pipeline quota"
+msgstr "Квота на конвеєри"
+
msgid "Pipeline triggers"
msgstr ""
@@ -3492,6 +4884,12 @@ msgstr "зі ÑтадіÑми"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr "Запланована дата завершеннÑ"
+
+msgid "Planned start date"
+msgstr "Запланована дата початку"
+
msgid "PlantUML"
msgstr "PlantUML"
@@ -3501,6 +4899,15 @@ msgstr "Відтворити"
msgid "Please accept the Terms of Service before continuing."
msgstr "Будь лаÑка, Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¹Ð¼Ñ–Ñ‚ÑŒ умови Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ñлуг."
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "Будь лаÑка виберіть хоча б один фільтр, щоб побачити результати"
@@ -3508,7 +4915,10 @@ msgid "Please solve the reCAPTCHA"
msgstr "Будь лаÑка, пройдіть reCAPTCHA"
msgid "Please try again"
-msgstr ""
+msgstr "Будь лаÑка, Ñпробуйте ще раз"
+
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr "Будь лаÑка, почекайте поки ми з’єднуємоÑÑ Ñ–Ð· вашим репозиторієм. Оновлюйте Ñторінку за бажаннÑм."
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "Будь лаÑка, почекайте поки ми імпортуємо ваш репозиторій. Оновлюйте Ñторінку за бажаннÑм."
@@ -3519,6 +4929,9 @@ msgstr "ÐалаштуваннÑ"
msgid "Preferences|Navigation theme"
msgstr "Тема навігації"
+msgid "Primary"
+msgstr "Головний"
+
msgid "Prioritize"
msgstr "Пріоритизувати"
@@ -3543,9 +4956,15 @@ msgstr "Приватні проекти можуть бути Ñтворені Ñ
msgid "Profile"
msgstr "Профіль"
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr "Обліковий Ð·Ð°Ð¿Ð¸Ñ Ð·Ð°Ð¿Ð»Ð°Ð½Ð¾Ð²Ð°Ð½Ð¸Ð¹ Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ."
+msgid "Profiles|Add key"
+msgstr "Додати ключ"
+
msgid "Profiles|Change username"
msgstr "Змінити ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
@@ -3573,9 +4992,15 @@ msgstr "Ðеправильне ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "Profiles|Path"
msgstr "ШлÑÑ…"
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "Введіть ваш %{confirmationValue} Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ:"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr "Оновити ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
@@ -3594,6 +5019,9 @@ msgstr "Вам необхідно змінити влаÑника або видÐ
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "Ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ñ” влаÑником в цих групах:"
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr "ваш обліковий запиÑ"
@@ -3648,9 +5076,27 @@ msgstr "ЗакінчивÑÑ Ñ‚ÐµÑ€Ð¼Ñ–Ð½ дії поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° проÐ
msgid "Project export started. A download link will be sent by email."
msgstr "Розпочато екÑпорт проекту. ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÑÐºÐ°Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ надіÑлана електронною поштою."
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "ПідпиÑатиÑÑ"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr "Дозволено Ñтворювати проекти"
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr "ЗахиÑÑ‚ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñ–Ð² за замовчуваннÑм"
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr "Розробники + керівники"
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr "Керівники"
+
+msgid "ProjectCreationLevel|No one"
+msgstr "Ðіхто"
+
msgid "ProjectFileTree|Name"
msgstr "Ім'Ñ"
@@ -3660,9 +5106,39 @@ msgstr "Ðіколи"
msgid "ProjectLifecycle|Stage"
msgstr "СтадіÑ"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr "ЗвернітьÑÑ Ð´Ð¾ адмініÑтратора, щоб змінити це налаштуваннÑ."
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr "Помилка при захиÑÑ‚Ñ– тегу"
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr "Помилка при оновленні тегу!"
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr "Тільки підпиÑані коміти можуть бути надіÑлані в цей репозиторій."
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr "Цей параметр заÑтоÑовуєтьÑÑ Ð½Ð° рівні Ñервера та може бути перевизначений адмініÑтратором."
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr "Цей параметр заÑтоÑовуєтьÑÑ Ð½Ð° рівні Ñервера, але його було перевизначено Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту."
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr "Цей параметр буде заÑтоÑовано до вÑÑ–Ñ… проектів, Ñкщо адмініÑтратор не змінить його."
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr "КориÑтувачі можуть відправлÑти в цей репозиторій лише Ñ‚Ñ– коміти, Ñкі міÑÑ‚ÑÑ‚ÑŒ одну із їхніх підтверджених Ð°Ð´Ñ€ÐµÑ ÐµÐ»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð¾Ñ— пошти."
+
msgid "Projects"
msgstr "Проекти"
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "ЧаÑто відвідувані"
@@ -3681,8 +5157,35 @@ msgstr "ЩоÑÑŒ пішло не так з нашого боку."
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "Ðа жаль, по вашоу запиту проектів не знайдено"
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” підтримки localStorage вашим браузером"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
+msgstr ""
msgid "PrometheusDashboard|Time"
msgstr "ЧаÑ"
@@ -3708,9 +5211,18 @@ msgstr "За замовчуваннÑм, Prometheus запуÑкаєтьÑÑ Ð·Ð
msgid "PrometheusService|Common metrics"
msgstr "Загальні метрики"
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr "Загальні метрики автоматично збираютьÑÑ Ð½Ð° оÑнові набору метрик від популÑрних екÑпортерів."
+
+msgid "PrometheusService|Custom metrics"
+msgstr "ВлаÑні метрики"
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "Пошук та Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ñ€Ð¸Ðº..."
+msgid "PrometheusService|Finding custom metrics..."
+msgstr "Пошук влаÑних метрик..."
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "Ð’Ñтановити Prometheus на клаÑтери"
@@ -3723,21 +5235,24 @@ msgstr "Ручні налаштуваннÑ"
msgid "PrometheusService|Metrics"
msgstr "Метрики"
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr "Пропущена змінна Ñередовища"
msgid "PrometheusService|More information"
msgstr "Додаткова інформаціÑ"
+msgid "PrometheusService|New metric"
+msgstr "Ðова метрика"
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr "Базова адреÑа Prometheus API, наприклад http://prometheus.example.com/"
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr "Prometheus автоматично налаштований на ваших клаÑтерах"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr "Ці метрики будуть збиратиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ піÑÐ»Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð² ÑкомуÑÑŒ Ñеридовищі"
+
msgid "PrometheusService|Time-series monitoring service"
msgstr "Ð¡ÐµÑ€Ð²Ñ–Ñ Ð¼Ð¾Ð½Ñ–Ñ‚Ð¾Ñ€Ð¸Ð½Ð³Ñƒ чаÑових Ñ€Ñдів"
@@ -3762,10 +5277,25 @@ msgstr "ПеренеÑти Етап на рівень групи"
msgid "Promote to group label"
msgstr "ПеренеÑти мітку на рівень групи"
+msgid "Promotions|Don't show me this again"
+msgstr "Більше не показувати це"
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr "Епіки дозволÑÑŽÑ‚ÑŒ вам більш ефективно та з меншими зуÑиллÑми керувати портфелÑми проектів, відÑлідковуючи групи Ñпоріднених питань у етапах та проектах."
+
+msgid "Promotions|This feature is locked."
+msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¾Ð²Ð°Ð½Ð°."
+
+msgid "Promotions|Upgrade plan"
+msgstr "Перейти на вищий тарифний план"
+
msgid "Protip:"
msgstr "Підказка:"
msgid "Provider"
+msgstr "ПоÑтачальник"
+
+msgid "Pseudonymizer data collection"
msgstr ""
msgid "Public - The group and any public projects can be viewed without any authentication."
@@ -3775,7 +5305,10 @@ msgid "Public - The project can be accessed without any authentication."
msgstr "Публічний — проект может переглÑдатиÑÑ Ð±ÐµÐ· автентифікації."
msgid "Public pipelines"
-msgstr ""
+msgstr "Публічні конвеєри"
+
+msgid "Push Rules"
+msgstr "Push-правила"
msgid "Push events"
msgstr "Події Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ (push)"
@@ -3786,15 +5319,27 @@ msgstr "Виконати push проекту за допомогою команÐ
msgid "Push to create a project"
msgstr "ÐатиÑніть, щоб Ñтворити проект"
-msgid "Quick actions can be used in the issues description and comment boxes."
-msgstr "Швидкі дії можна викориÑтовувати в опиÑах проблем Ñ– коментарÑÑ…."
+msgid "PushRule|Committer restriction"
+msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ñ–Ñ‚Ñ‚ÐµÑ€Ð°"
+
+msgid "Pushed"
+msgstr "Відправлено"
-msgid "Re-deploy"
+msgid "Pushes"
msgstr ""
+msgid "Quarters"
+msgstr "Квартали"
+
+msgid "Quick actions can be used in the issues description and comment boxes."
+msgstr "Швидкі дії можна викориÑтовувати в опиÑах проблем Ñ– коментарÑÑ…."
+
msgid "Read more"
msgstr "Докладніше"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "ІнÑтрукціÑ"
@@ -3804,6 +5349,9 @@ msgstr "Фунції реального чаÑу"
msgid "Reference:"
msgstr "ПоÑиланнÑ:"
+msgid "Refresh"
+msgstr "Оновити"
+
msgid "Register / Sign In"
msgstr "ЗареєÑтруватиÑÑ / Увійти"
@@ -3811,7 +5359,7 @@ msgid "Register and see your runners for this group."
msgstr "ЗареєÑтруйте Ñ– переглÑдайте ваші Runner’и Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— групи."
msgid "Register and see your runners for this project."
-msgstr ""
+msgstr "ЗареєÑтруйте Ñ– переглÑдайте ваші Runner’и Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту."
msgid "Registry"
msgstr "РеєÑÑ‚Ñ€"
@@ -3855,12 +5403,27 @@ msgstr "Видалити пріоритет"
msgid "Remove project"
msgstr "Видалити проект"
+msgid "Repair authentication"
+msgstr "Відновити аутентифікацію"
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr "Репозиторії по URL"
+
msgid "Repository"
msgstr "Репозиторій"
msgid "Repository Settings"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ"
+
+msgid "Repository URL"
msgstr ""
+msgid "Repository has no locks."
+msgstr "Репозиторій не має блокувань."
+
msgid "Repository maintenance"
msgstr "ОбÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–ÑŽ"
@@ -3870,9 +5433,15 @@ msgstr "Дзеркало репозиторію"
msgid "Repository storage"
msgstr "Сховище репозиторію"
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr "Вибрати"
+
msgid "Request Access"
msgstr "Запит доÑтупу"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "Вимагати від уÑÑ–Ñ… кориÑтувачів приймати умови Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ð¾Ñлуг та політику конфіденційноÑÑ‚Ñ–, коли вони отримують доÑтуп до GitLab."
@@ -3894,6 +5463,9 @@ msgstr "Вирішити конфлікти у гілці-джерелі"
msgid "Resolve discussion"
msgstr "Завершити обговореннÑ"
+msgid "Response metrics (Custom)"
+msgstr "Метрики відповідей (ВлаÑні)"
+
msgid "Resume"
msgstr "Продовжити"
@@ -3922,17 +5494,26 @@ msgstr "Ðнулювати цей запит на злиттÑ"
msgid "Review"
msgstr "ОглÑд"
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr "ПереглÑте Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ñ–Ð² поÑлуг у вашому провайдері ідентифікації — в такому разі GitLab Ñ” \"провайдером поÑлуг\" або \"довірÑючою Ñтороною\"."
+
msgid "Reviewing"
msgstr "ЗатвердженнÑ"
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ (запиту на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ !%{mergeRequestId})"
-msgid "Rollback"
+msgid "Revoke"
msgstr ""
+msgid "Roadmap"
+msgstr "План-графік"
+
+msgid "Run CI/CD pipelines for external repositories"
+msgstr "ЗапуÑтити CI/CD конвеєри Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… репозиторіїв"
+
msgid "Runner token"
-msgstr ""
+msgstr "Токен Runner'а"
msgid "Runners"
msgstr "Runner'и"
@@ -3946,15 +5527,33 @@ msgstr "Runner’и можуть розміщуватиÑÑ Ñƒ різних ко
msgid "Running"
msgstr "ВиконуєтьÑÑ"
+msgid "SAML SSO"
+msgstr "Єдиний вхід SAML"
+
+msgid "SAML SSO for %{group_name}"
+msgstr "Єдиний вхід SAML Ð´Ð»Ñ %{group_name}"
+
+msgid "SAML Single Sign On"
+msgstr "Єдиний вхід SAML"
+
+msgid "SAML Single Sign On Settings"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ”Ð´Ð¸Ð½Ð¾Ð³Ð¾ входу SAML"
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr "Відбиток SHA1 Ñертифікату Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¾ÐºÐµÐ½Ñ–Ð² SAML. Отримайте його від провайдера ідентифікації, де він також може називатиÑÑ \"Thumbprint\"."
+
msgid "SSH Keys"
msgstr "Ключі SSH"
msgid "SSL Verification"
-msgstr ""
+msgstr "Перевірка SSL"
msgid "Save"
msgstr "Зберегти"
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr "Зберегти зміни"
@@ -3976,6 +5575,15 @@ msgstr "Розклади"
msgid "Scheduling Pipelines"
msgstr "ÐŸÐ»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ñ–Ð²"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr "Тематичні дошки проблем"
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr "Прокрутити вниз"
@@ -4015,6 +5623,21 @@ msgstr "КількіÑÑ‚ÑŒ Ñекунд до ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–
msgid "Seconds to wait for a storage access attempt"
msgstr "КількіÑÑ‚ÑŒ Ñекунд Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ повторною Ñпробою доÑтупу до Ñховища даних"
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr "Панель безпеки"
+
+msgid "Security report"
+msgstr "Звіт про безпеку"
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr "Вибрати"
@@ -4045,12 +5668,21 @@ msgstr "Вибрати проект та зону Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ типу Ð
msgid "Select project to choose zone"
msgstr "Вибрати проект Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ зони"
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr "Виберіть гілку-джерело"
msgid "Select target branch"
msgstr "Вибір цільової гілки"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr "Вибіркова ÑинхронізаціÑ"
+
msgid "Send email"
msgstr "ÐадіÑлати лиÑта"
@@ -4063,9 +5695,15 @@ msgstr "вереÑень"
msgid "Server version"
msgstr "ВерÑÑ–Ñ Ñервера"
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr "Шаблони ÑервіÑів"
+msgid "Service URL"
+msgstr "URL ÑервіÑу"
+
msgid "Session expiration, projects limit and attachment size."
msgstr "Термін дії ÑеÑÑ–Ñ—, проектні ліміти та розміри вкладень."
@@ -4090,6 +5728,9 @@ msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ CI/CD"
msgid "Set up Koding"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr "Ðалаштуйте твердженнÑ/атрибути (email, ім'Ñ, прізвище) Ñ– NameID відповідно до %{docsLinkStart} документації %{icon}%{docsLinkEnd}"
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "вÑтановити пароль"
@@ -4102,9 +5743,24 @@ msgstr "Ðвтоматично налаштувати Ñпецифічний run
msgid "Share"
msgstr "ПоділитиÑÑ"
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr "ПоділітьÑÑ <strong>%{sso_label}</strong> із учаÑниками Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, щоб вони могли увійти до вашої групи через провайдера ідентифікації"
+
msgid "Shared Runners"
msgstr "Загальні Runner'и"
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr "При обнуленні хвилин конвеєрів Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проÑтору імен, кількіÑÑ‚ÑŒ вже викориÑтаних хвилин буде дорівнювати 0."
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr "Скинути хвилини в конвеєрі"
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr "Обнулити викориÑтані хвилини в конвеєрі"
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr "Показати команду"
@@ -4112,7 +5768,7 @@ msgid "Show complete raw log"
msgstr "Показати повний неформатований журнал"
msgid "Show latest version"
-msgstr ""
+msgstr "Показати оÑтанню верÑÑ–ÑŽ"
msgid "Show latest version of the diff"
msgstr ""
@@ -4136,6 +5792,30 @@ msgstr[3] "Показано %d подій"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr "Змінити вагу"
+
+msgid "Sidebar|None"
+msgstr "Ðемає"
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr "Дозволені лише цифри"
+
+msgid "Sidebar|Weight"
+msgstr "Вага"
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr "Увійти в %{group_name}"
+
+msgid "Sign in with Single Sign-On"
+msgstr "Увійти за допомогою єдиного входу"
+
msgid "Sign out"
msgstr "Вийти"
@@ -4148,6 +5828,9 @@ msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації"
msgid "Size and domain settings for static websites"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ та домену Ð´Ð»Ñ Ñтатичних веб-Ñайтів"
+msgid "Slack application"
+msgstr "заÑтоÑунок Slack"
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4167,7 +5850,13 @@ msgid "Something went wrong when toggling the button"
msgstr "Помилка при перемиканні кнопки"
msgid "Something went wrong while closing the %{issuable}. Please try again later"
-msgstr ""
+msgstr "Помилка при закритті %{issuable}. Будь лаÑка, Ñпробуйте пізніше"
+
+msgid "Something went wrong while fetching assignees list"
+msgstr "Помилка при отриманні ÑпиÑку виконавців"
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr "Помилка при завантаженні внеÑків учаÑників групи"
msgid "Something went wrong while fetching the projects."
msgstr "ЩоÑÑŒ пішло не так під Ñ‡Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ñ–Ð²"
@@ -4176,14 +5865,17 @@ msgid "Something went wrong while fetching the registry list."
msgstr "ЩоÑÑŒ пішло не так при отриманні ÑпиÑку із реєÑтру."
msgid "Something went wrong while reopening the %{issuable}. Please try again later"
-msgstr ""
+msgstr "Помилка при повторному відкритті %{issuable}. Будь лаÑка, Ñпробуйте пізніше"
msgid "Something went wrong while resolving this discussion. Please try again."
-msgstr ""
+msgstr "Помилка при завершенні обговореннÑ. Будь лаÑка, Ñпробуйте пізніше."
msgid "Something went wrong. Please try again."
msgstr "ЩоÑÑŒ пішло не так. Будь лаÑка Ñпробуйте ще раз."
+msgid "Sorry, no epics matched your search"
+msgstr "Вибачте, жоден епік не задовольнÑÑ” критеріÑм вашого пошуку"
+
msgid "Sort by"
msgstr "Сортувати за"
@@ -4226,6 +5918,9 @@ msgstr "ОÑтанній оновлений"
msgid "SortOptions|Least popular"
msgstr "Ðайменш популÑрний"
+msgid "SortOptions|Less weight"
+msgstr "Менша вага"
+
msgid "SortOptions|Milestone"
msgstr "Етап"
@@ -4235,6 +5930,9 @@ msgstr "Етап запланований на пізніше"
msgid "SortOptions|Milestone due soon"
msgstr "Етап запланований незабаром"
+msgid "SortOptions|More weight"
+msgstr "Більша вага"
+
msgid "SortOptions|Most popular"
msgstr "Ðайбільш популÑрний"
@@ -4274,6 +5972,9 @@ msgstr "Розпочатий пізніше"
msgid "SortOptions|Start soon"
msgstr "Розпочатий нещодавно"
+msgid "SortOptions|Weight"
+msgstr "Вага"
+
msgid "Source"
msgstr "Джерело"
@@ -4346,9 +6047,15 @@ msgstr "Запущений"
msgid "Starts at (UTC)"
msgstr "ПочинаєтьÑÑ Ð¾ (за Грінвічем)"
+msgid "State your message to activate"
+msgstr "Залиште Ñвоє Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ—"
+
msgid "Status"
msgstr "СтатуÑ"
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr "Зупинити це Ñередовище"
@@ -4358,9 +6065,18 @@ msgstr "Зупинено"
msgid "Storage"
msgstr "Сховище"
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr "Підгрупи"
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr "ПідпиÑатиÑÑ"
@@ -4373,9 +6089,21 @@ msgstr "ПідпиÑатиÑÑ Ð½Ð° рівні проекту"
msgid "Switch branch/tag"
msgstr "Перейти в гілку/тег"
+msgid "Sync information"
+msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñинхронізацію"
+
msgid "System Hooks"
msgstr "СиÑтемні гуки"
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr "Заголовок Ñ– футер ÑиÑтеми:"
+
+msgid "System metrics (Custom)"
+msgstr "СиÑтемні метрики (ВлаÑні)"
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] "Тег (%{tag_count})"
@@ -4476,18 +6204,30 @@ msgstr "Правилами кориÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑервіÑом Ñ– полі
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr "ДÑкую! Більше не показувати це повідомленнÑ"
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "Трекер проблем — це міÑце, де можна додати речі, Ñкі потрібно покращити або розв’Ñзати в проекті"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "Трекер проблем — це міÑце, де можна додати речі, Ñкі потрібно покращити або розв’Ñзати в проекті. Ви можете зареєÑтруватиÑÑ Ð°Ð±Ð¾ увійти, щоб Ñтворювати проблеми в цьому проекті."
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ ÐапиÑÐ°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ показує Ñ‡Ð°Ñ Ð²Ñ–Ð´ першого коміту до ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ на злиттÑ. Дані будуть автоматично додані піÑÐ»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ першого запиту на злиттÑ."
msgid "The collection of events added to the data gathered for that stage."
msgstr "ÐšÐ¾Ð»ÐµÐºÑ†Ñ–Ñ Ð¿Ð¾Ð´Ñ–Ð¹ додана до даних, зібраних Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— Ñтадії."
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "Зв'Ñзок форку видалено."
@@ -4503,8 +6243,11 @@ msgstr "МакÑимальний розмір файлу — 200 Кб."
msgid "The number of attempts GitLab will make to access a storage."
msgstr "КількіÑÑ‚ÑŒ Ñпроб, Ñкі зробить GitLab Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу до Ñховища даних."
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
-msgstr "КількіÑÑ‚ÑŒ збоїв піÑÐ»Ñ Ñкої Gitlab повніÑÑ‚ÑŽ заблокує доÑтуп до Ñховища данних. Лічильник кількоÑÑ‚Ñ– збоїв можна буде обнулити в інтерфейÑÑ– адмініÑтратора (%{link_to_health_page}), або через %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
+msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
msgstr ""
@@ -4515,6 +6258,9 @@ msgstr "Фаза життєвого циклу розробки."
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ ÐŸÐ»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶Ð°Ñ” Ñ‡Ð°Ñ Ð²Ñ–Ð´ попереднього кроку до першого коміту. ДодаєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾, Ñк тільки відправитьÑÑ Ð¿ÐµÑ€ÑˆÐ¸Ð¹ коміт."
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ Production показує загальний Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ ÑтвореннÑм проблеми та розгортаннÑм коду у production. Дані будуть автоматично додані піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð½Ð¾Ñ— ідеї до production циклу."
@@ -4524,6 +6270,9 @@ msgstr "ДоÑтуп до проекту можливий будь-Ñким за
msgid "The project can be accessed without any authentication."
msgstr "ДоÑтуп до проекту можливий без будь-Ñкої перевірки автентичноÑÑ‚Ñ–."
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "Репозиторій Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту не Ñ–Ñнує."
@@ -4536,6 +6285,9 @@ msgstr "Репозиторій має бути доÑтупним через <co
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "Ð¡Ñ‚Ð°Ð´Ñ–Ñ Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾ÐºÐ°Ð·ÑƒÑ” Ñ‡Ð°Ñ Ð²Ñ–Ð´ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ про об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð¾ його виконаннÑ. Дані будуть автоматично додані піÑÐ»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ запиту на злиттÑ."
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr "План-графік показує Ñтан ваших епіків у чаÑÑ–"
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4551,12 +6303,18 @@ msgstr "КількіÑÑ‚ÑŒ Ñекунд, протÑгом Ñкої GitLab збе
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr "КількіÑÑ‚ÑŒ Ñекунд, протÑгом Ñкої GitLab намагатиметьÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ доÑтуп до Ñховища даних. По завершенню цього періоду буде згенерована помилка про Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð»Ñ–Ð¼Ñ–Ñ‚Ñƒ чаÑу."
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
-msgstr "Ð§Ð°Ñ Ñƒ Ñекундах між перевірками Ñховища. Якщо Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ° іще на завершена, GitLab пропуÑтить наÑтупну."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
+msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "ЧаÑ, витрачений на кожен елемент, зібраний на цій Ñтадії."
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "Середнє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² Ñ€Ñдку. Приклад: між 3, 5, 9, Ñередніми 5, між 3, 5, 7, 8, Ñередніми (5 + 7) / 2 = 6."
@@ -4572,12 +6330,6 @@ msgstr "Ðемає запитів на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð
msgid "There are problems accessing Git storage: "
msgstr "Є проблеми з доÑтупом до Ñховища git: "
-msgid "There was an error loading jobs"
-msgstr "Помилка при завантаженні завдань"
-
-msgid "There was an error loading latest pipeline"
-msgstr "Помилка при завантаженні оÑтаннього конвеєру"
-
msgid "There was an error loading users activity calendar."
msgstr "Помилка при завантаженні ÐºÐ°Ð»ÐµÐ½Ð´Ð°Ñ€Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾ÑÑ‚Ñ– кориÑтувачів."
@@ -4599,15 +6351,33 @@ msgstr "Помилка при відпиÑці від цієї мітки."
msgid "They can be managed using the %{link}."
msgstr "Ðими можна керувати за допомогою %{link}."
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr "Цей інÑÑ‚Ð°Ð½Ñ GitLab ще немає загальних Runner'ів. ÐдмініÑтратори можуть Ñ—Ñ… зареєÑтрувати у Ñпеціальному розділі конфігурації."
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr "Цей каталог"
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr "Ð¦Ñ Ð³Ñ€ÑƒÐ¿Ð° ще не має жодного групового Runner’а."
@@ -4683,6 +6453,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "Ð§Ð°Ñ Ð´Ð¾ початку потраплÑÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð¸ в планувальник"
@@ -4692,6 +6468,9 @@ msgstr "Ð§Ð°Ñ Ð´Ð¾ початку роботи над проблемою"
msgid "Time between merge request creation and merge/close"
msgstr "Ð§Ð°Ñ Ð¼Ñ–Ð¶ ÑтвореннÑм запиту Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ– його виконаннÑм або закриттÑм"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr "ЗалишилоÑÑ Ñ‡Ð°Ñу"
@@ -4840,7 +6619,7 @@ msgid "Timeago|right now"
msgstr "зараз"
msgid "Timeout"
-msgstr ""
+msgstr "Ð§Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ"
msgid "Time|hr"
msgid_plural "Time|hrs"
@@ -4862,12 +6641,30 @@ msgstr "Ñекунд(а)"
msgid "Tip:"
msgstr "Порада:"
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr "Ð’ GitLab"
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð² з GitHub, ви можете викориÑтовувати %{personal_access_token_link}. Коли ви Ñтворюватимете ваш перÑональний токен доÑтупу, вам потрібно буде вибрати облаÑÑ‚ÑŒ дії <code>repo</code>, щоб ми могли відобразити ÑпиÑок ваших публічних та приватних репозиторіїв, доÑтупних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ."
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr "Ð”Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð² з GitHub, ви Ñпочатку повинні дозволити Gitlab доÑтуп до ÑпиÑку ваших репозиторіїв на GitHub:"
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr "Ð”Ð»Ñ Ð¿Ñ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ SVN-репозиторію, переглÑньте %{svn_link}."
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr "Ð”Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð¾Ð·Ð¸Ñ‚Ð¾Ñ€Ñ–Ñ—Ð² з GitHub, ви можете викориÑтовувати %{personal_access_token_link}. Коли ви Ñтворюватимете ваш перÑональний токен доÑтупу, вам потрібно буде вибрати облаÑÑ‚ÑŒ дії <code>repo</code>, щоб ми могли відобразити ÑпиÑок ваших публічних та приватних репозиторіїв, доÑтупних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ."
@@ -4877,21 +6674,45 @@ msgstr "Ð”Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ репозиторіїв з GitHub, ви ÑпочÐ
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "Ð”Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ SVN-репозиторію, переглÑньте %{svn_link}."
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr "Щоб викориÑтовувати лише функції CI/CD Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ репозиторію, виберіть <strong>CI/CD Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ репозиторію</strong>."
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr "Щоб налаштувати аутентифікацію SAML Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— групи через провайдера ідентифікації такої Ñк Azure, Okta, Onelogin, Ping Identity або вашого влаÑного поÑтачальника SAML 2.0:"
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr "Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¸Ñ… завдань ви можете додати Runner’и до вашої групи"
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr "Щоб перевірити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ GitLab CI, перейдіть до \"CI / CD → Конвеєри\" у вашому проекті та натиÑніть кнопку \"Перевірка конфігурації (CI Lint)\"."
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду плану-графіку додайте заплановані дати початку та Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ одного з ваших епіків у цій групі або Ñ—Ñ— підгрупах. ВідображаютьÑÑ Ð»Ð¸ÑˆÐµ епіки за попередні та наÑтупні 3 міÑÑці."
+
+msgid "To widen your search, change or remove filters."
+msgstr "Щоб розширити пошук, змініть або видаліть фільтри."
+
msgid "Todo"
msgstr "Задача"
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr "Перемикач бічної панелі"
msgid "Toggle discussion"
msgstr "Перемикач диÑкуÑÑ–Ñ—"
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr "Перемикач бічної панелі"
@@ -4904,6 +6725,9 @@ msgstr "Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ñ‡Ð°: УВІМКÐЕÐО"
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr "Загальна кількіÑÑ‚ÑŒ внеÑків"
+
msgid "Total Time"
msgstr "Загальний чаÑ"
@@ -4913,9 +6737,18 @@ msgstr "Загальний чаÑ, щоб перевірити вÑÑ– коміт
msgid "Total: %{total}"
msgstr "Ð’Ñього: %{total}"
+msgid "Track activity with Contribution Analytics."
+msgstr "ВідÑтежувати активніÑÑ‚ÑŒ за допомогою аналітики учаÑників."
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr "ВідÑтежуйте групи проблем зі Ñпільною темою з різних проектів та етапів"
+
msgid "Track time with quick actions"
msgstr "ВідÑтежуйте Ñ‡Ð°Ñ Ð·Ð° допомогою швидких дій"
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr "ЗапуÑтити цю ручну дію"
@@ -4925,9 +6758,21 @@ msgstr ""
msgid "Try again"
msgstr "Спробуйте ще раз"
+msgid "Turn on Service Desk"
+msgstr "Ввімкнути Service Desk"
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr "Ðеможливо завантажити порівнÑÐ½Ð½Ñ (diff). %{button_try_again}"
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr "Ðеможливо увійти до групи за допомогою SAML через \"%{reason}\""
+
+msgid "Unknown"
+msgstr "Ðевідомо"
+
msgid "Unlock"
msgstr "Розблокувати"
@@ -4970,16 +6815,30 @@ msgstr "Ðепідтверджено"
msgid "Up to date"
msgstr "Ðктуальний"
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr "Оновіть Ñ–Ð¼â€™Ñ Ð³Ñ€ÑƒÐ¿Ð¸, опиÑ, аватар та інші загальні налаштуваннÑ."
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr "Перейдіть на вищий тарифний план щоб активувати Покращений Глобальний Пошук."
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr "Перейдіть на вищий тарифний план Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— Ðналітики учаÑників."
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr "Перейдіть на вищий тарифний план щоб активувати групові веб-гуки."
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr "Перейдіть на вищий тарифний план щоб активувати вагу обговорень проблем."
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr "Перейдіть на вищий тарифний план щоб покращити дошки обговорень."
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "Завантажити новий файл"
@@ -4998,18 +6857,36 @@ msgstr "Лайки"
msgid "Usage statistics"
msgstr "СтатиÑтика викориÑтаннÑ"
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr "ВикориÑтовуйте Service Desk Ð´Ð»Ñ Ð·Ð²â€™Ñзку з вашими кориÑтувачами (наприклад, щоб запропонувати клієнтÑьку підтримку) через електронну пошту безпоÑередньо із GitLab"
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr "ВикориÑтовуйте групові етапи, щоб керувати у одному етапі проблеми з різних проектів."
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "ВикориÑтовувати токен під Ñ‡Ð°Ñ ÑƒÑтановки:"
msgid "Use your global notification setting"
msgstr "ВикориÑтовуютьÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ñ– Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr "ВикориÑтовуєтьÑÑ ÑƒÑ‡Ð°Ñниками Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñƒ у вашу групу в GitLab"
+
+msgid "User Settings"
+msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
+
msgid "User and IP Rate Limits"
msgstr "Ліміти чаÑтоти Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів та IP"
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr "КориÑтувачі"
@@ -5028,15 +6905,27 @@ msgstr "Різноманітні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ð¸."
msgid "Various settings that affect GitLab performance."
msgstr "Різноманітні налаштуваннÑ, що впливають на продуктивніÑÑ‚ÑŒ GitLab."
+msgid "Verification information"
+msgstr "Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ перевірку"
+
msgid "Verified"
msgstr "Підтверджено"
+msgid "View epics list"
+msgstr "ПереглÑнути ÑпиÑок епіків"
+
msgid "View file @ "
msgstr "ПереглÑд файла @ "
msgid "View group labels"
msgstr "ПереглÑнути мітки групи"
+msgid "View issue"
+msgstr "ПереглÑнути проблему"
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr "ПереглÑнути завданнÑ"
@@ -5058,6 +6947,12 @@ msgstr "ПереглÑд заміненого файлу @ "
msgid "Visibility and access controls"
msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑ‚Ñ– та доÑтупу"
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "Внутрішній"
@@ -5073,6 +6968,9 @@ msgstr "Ðевідомий"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "Хочете побачити дані? Будь лаÑка, попроÑить у адмініÑтратора доÑтуп."
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "Ми не маємо доÑтатньо даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ†Ñ–Ñ”Ñ— Ñтадії."
@@ -5085,12 +6983,27 @@ msgstr "Веб-IDE"
msgid "Web terminal"
msgstr "Веб-термінал"
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr "Веб-гук дозволÑÑ” вам викликати URL Ñкщо, наприклад, був відправлений новий код або Ñтворено нову проблему. Ви можете налаштувати його так, щоб він реагував на певні події (відправки коду, проблеми або запити на злиттÑ). Групові веб-гуки заÑтоÑовуютьÑÑ Ð´Ð¾ вÑÑ–Ñ… проектів в групі Ñ– дозволÑÑŽÑ‚ÑŒ вам Ñтандартизувати Ñ—Ñ… Ð´Ð»Ñ Ð²Ñієї вашої групи."
+
+msgid "Weeks"
+msgstr "Тижні"
+
+msgid "Weight"
+msgstr "Вага"
+
+msgid "Weight %{weight}"
+msgstr "Вага %{weight}"
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr "Коли runner закріплений (за проектами), його не можна викориÑтовувати в інших проектах"
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr "Якщо увімкнено, кориÑтувачі не можуть викориÑтовувати GitLab, поки вони не приймуть умови."
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr "Якщо залишити URL порожнім, можна вÑтановлювати мітки клаÑифікації без Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹ проекту та Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ñ— авторизації."
+
msgid "Wiki"
msgstr "Wiki"
@@ -5226,12 +7139,24 @@ msgstr "Сторінки"
msgid "Wiki|Wiki Pages"
msgstr "Wiki-Ñторінки"
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr "З аналітикою контриб’юторів ви може вивчати активніÑÑ‚ÑŒ в обговореннÑÑ…, запитах на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ñ– подій відправки коду Ð´Ð»Ñ Ð²Ð°ÑˆÐ¾Ñ— організації Ñ– Ñ—Ñ— учаÑників."
+
msgid "Withdraw Access Request"
msgstr "СкаÑувати запит доÑтупу"
msgid "Yes"
msgstr "Так"
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "Ви хочете видалити %{group_name}. Видалені групи ÐЕ МОЖÐРбуду відновити! Ви ÐБСОЛЮТÐО впевнені?"
@@ -5247,6 +7172,9 @@ msgstr "Ви збираєтеÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ проект %{project_full_n
msgid "You are on a read-only GitLab instance."
msgstr "Ви знаходитеÑÑ Ð½Ð° інÑтанÑÑ– Gitlab \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\"."
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr "Ви знаходитеÑÑŒ на вторинному <b>лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ</b> Geo-вузлі. Якщо ви хочете внеÑти будь-Ñкі зміни, ви повинні відвідати %{primary_node}."
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5259,6 +7187,9 @@ msgstr "Ви можете додати мітку в обрані, щоб зро
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr "Ви також можете перевірити Ñвій .gitlab-ci.yml за допомогою %{linkStart}Lint%{linkEnd}"
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr "Ви можете легко вÑтановити Runner на клаÑтері Kubernetes. %{link_to_help_page}"
@@ -5274,12 +7205,24 @@ msgstr "Ви можете редагувати файли, лише перебу
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "Ви можете розв’Ñзати цей конфлікт Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð·Ð° допомогою інтерактивного режиму (викориÑтовуючи кнопки %{use_ours} та %{use_theirs}), або безпоÑередньо редагуючи файли. Закомітити зміни у %{branch_name}"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr "Ви не можете запиÑувати на вторинні інÑтанÑи \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" GitLab Geo. Будь лаÑка викориÑтовуйте %{link_to_primary_node}."
+
msgid "You cannot write to this read-only GitLab instance."
msgstr "Ви не можете запиÑувати на цей \"тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\" інÑÑ‚Ð°Ð½Ñ GitLab."
msgid "You do not have any assigned merge requests"
msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” призначених запитів на злиттÑ"
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” необхідних прав доÑтупу, щоб перевизначити Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронізації LDAP-груп."
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr "У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” прав доÑтупу"
@@ -5298,6 +7241,12 @@ msgstr "Ви повинні мати доÑтуп керівника Ð´Ð»Ñ Ð¿Ñ€
msgid "You must sign in to star a project"
msgstr "Ðеобхідно увійти, щоб оцінити проект"
+msgid "You need a different license to enable FileLocks feature"
+msgstr "Ð”Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— функції Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¤Ð°Ð¹Ð»Ñ–Ð² вам потрібна інша ліцензіÑ"
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "Вам потрібен дозвіл"
@@ -5328,9 +7277,18 @@ msgstr "Ви не зможете відправлÑти та отримуватÐ
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "Вам необхідно викориÑтовувати різні імена гілок Ð´Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ порівнÑннÑ."
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr "Ви отримали це Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· ваш обліковий Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr "Ваші групи"
@@ -5346,6 +7304,12 @@ msgstr "ÐктивніÑÑ‚ÑŒ ваших проектів"
msgid "Your Todos"
msgstr "Ваші Задачі"
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr "Ваші зміни можуть бути закомічені до %{branch_name}, оÑкільки запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸Ð¹."
@@ -5370,18 +7334,241 @@ msgstr "тому"
msgid "among other things"
msgstr "тощо"
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] "та 1 виправлена вразливіÑÑ‚ÑŒ"
+msgstr[1] "Ñ– %d виправлених вразливоÑтей"
+msgstr[2] "Ñ– %d виправлених вразливоÑтей"
+msgstr[3] "Ñ– %d виправлених вразливоÑтей"
+
msgid "assign yourself"
msgstr "призначити Ñебе"
msgid "branch name"
msgstr "ім'Ñ Ð³Ñ–Ð»ÐºÐ¸"
+msgid "by"
+msgstr "від"
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr "%{linkStartTag}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² %{linkEndTag}"
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr "%{linkStartTag}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про DAST%{linkEndTag}"
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr "%{linkStartTag}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей%{linkEndTag}"
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr "%{linkStartTag}ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про SAST%{linkEndTag}"
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr "%{vulnerability} впливає на %{namespace}."
+
+msgid "ciReport|%{packagesString} and "
+msgstr "%{packagesString} та "
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr "%{packagesString} та %{lastPackage}"
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr "%{remainingPackagesCount} більше"
+
+msgid "ciReport|%{reportName} is loading"
+msgstr "%{reportName} завантажуєтьÑÑ"
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr "%{reportName} видав помилку при завантаженні результатів"
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr "%{type} не виÑвило нових вразливоÑтей"
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr "%{type} не виÑвило вразливоÑтей"
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr "%{type} не виÑвив вразливоÑтей"
+
+msgid "ciReport|Class"
+msgstr "КлаÑ"
+
+msgid "ciReport|Code quality"
+msgstr "ЯкіÑÑ‚ÑŒ коду"
+
+msgid "ciReport|Confidence"
+msgstr "ВпевненіÑÑ‚ÑŒ"
+
+msgid "ciReport|Container scanning detected"
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² виÑвило"
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² виÑвлÑÑ” відомі вразливоÑÑ‚Ñ– у ваших Docker образах."
+
+msgid "ciReport|Container scanning is loading"
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² завантажуєтьÑÑ"
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ñ–Ð² видало помилку при завантаженні результатів"
+
+msgid "ciReport|DAST detected"
+msgstr "DAST виÑвив"
+
+msgid "ciReport|DAST is loading"
+msgstr "DAST завантажуєтьÑÑ"
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr "DAST видав помилку при завантаженні результатів"
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей виÑвлÑÑ” відомі вразливоÑÑ‚Ñ– у залежноÑÑ‚ÑÑ… вашого коду."
+
+msgid "ciReport|Dependency scanning detected"
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей виÑвило"
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей завантажуєтьÑÑ"
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¾Ñтей видало помилку при завантаженні результатів"
+
+msgid "ciReport|Description"
+msgstr "ОпиÑ"
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr "Відхилити вразливіÑÑ‚ÑŒ"
+
+msgid "ciReport|Dismissed by"
+msgstr "Відхилено"
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr "Динамічне теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ заÑтоÑунків (DAST) виÑвлÑÑ” відомі вразливоÑÑ‚Ñ– у вашому веб-заÑтоÑунку."
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr "Помилка при завантаженні звіту %{reportName}"
+
+msgid "ciReport|File"
+msgstr "Файл"
+
+msgid "ciReport|Fixed:"
+msgstr "Виправлено:"
+
+msgid "ciReport|Identifiers"
+msgstr "Ідентифікатори"
+
+msgid "ciReport|Instances"
+msgstr "ІнÑтанÑи"
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr "ДізнайтеÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про білий ÑпиÑок"
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñми виÑвило %{licenseInfo}"
+
+msgid "ciReport|License management detected no new licenses"
+msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñми не виÑвило нових ліцензій"
+
+msgid "ciReport|Links"
+msgstr "ПоÑиланнÑ"
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr "Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð²Ñ–Ñ‚Ñƒ %{reportName}"
+
+msgid "ciReport|Method"
+msgstr "СпоÑіб"
+
+msgid "ciReport|Namespace"
+msgstr "ПроÑÑ‚Ñ–Ñ€ імен"
+
+msgid "ciReport|No changes to code quality"
+msgstr "Ðемає змін у ÑкоÑÑ‚Ñ– коду"
+
+msgid "ciReport|No changes to performance metrics"
+msgstr "Ðемає змін у показниках продуктивноÑÑ‚Ñ–"
+
+msgid "ciReport|Performance metrics"
+msgstr "Показники продуктивноÑÑ‚Ñ–"
+
+msgid "ciReport|Revert dismissal"
+msgstr "Відмінити відхиленнÑ"
+
+msgid "ciReport|SAST detected"
+msgstr "SAST виÑвив"
+
+msgid "ciReport|SAST is loading"
+msgstr "SAST завантажуєтьÑÑ"
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr "SAST видав помилку при завантаженні результатів"
+
+msgid "ciReport|Security scanning"
+msgstr "Перевірка безпеки"
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr "Помилка при завантаженні результатів перевірки безпеки"
+
+msgid "ciReport|Security scanning is loading"
+msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ завантажуєтьÑÑ"
+
+msgid "ciReport|Severity"
+msgstr "СерйозніÑÑ‚ÑŒ"
+
+msgid "ciReport|Solution"
+msgstr "РішеннÑ"
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr "Статичне теÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸ заÑтоÑунків (SAST) виÑвлÑÑ” відомі вразливоÑÑ‚Ñ– у вашому коді."
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr "Помилка при Ñтворенні проблеми. Будь лаÑка Ñпробуйте знову."
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr "Помилка при відхиленні вразливоÑÑ‚Ñ–. Будь лаÑка, Ñпробуйте знову."
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr "Помилка при завантаженні звіту DAST"
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr "Помилка при завантаженні звіту SAST"
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr "Помилка при завантаженні звіту по Ñкануванню контейнерів"
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr "Помилка при завантаженні звіту по Ñкануванню залежноÑтей"
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr "Ðезатверджені вразливоÑÑ‚Ñ– (червоні) можуть бути відмічені Ñк затверджені."
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr "Оновити %{name} з %{version} до %{fixed}."
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr "немає вразливоÑтей"
+
+msgid "ciReport|on pipeline"
+msgstr "в конвеєрі"
+
msgid "command line instructions"
msgstr "інÑтрукції Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð³Ð¾ Ñ€Ñдка"
msgid "connecting"
msgstr "з'єднаннÑ"
+msgid "could not read private key, is the passphrase correct?"
+msgstr "неможливо зчитати приватний ключ, чи є пароль правильним?"
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "день"
@@ -5392,9 +7579,29 @@ msgstr[3] "днів"
msgid "deploy token"
msgstr "токен Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ"
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] "виÑвлено %d виправлену вразливіÑÑ‚ÑŒ"
+msgstr[1] "виÑвлено %d виправлених вразливоÑтей"
+msgstr[2] "виÑвлено %d виправлених вразливоÑтей"
+msgstr[3] "виÑвлено %d виправлених вразливоÑтей"
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] "виÑвлено %d нову вразливіÑÑ‚ÑŒ"
+msgstr[1] "виÑвлено %d нових вразливоÑтей"
+msgstr[2] "виÑвлено %d нових вразливоÑтей"
+msgstr[3] "виÑвлено %d нових вразливоÑтей"
+
+msgid "detected no vulnerabilities"
+msgstr "не виÑвило вразливоÑтей"
+
msgid "disabled"
msgstr "вимкнено"
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr "увімкнено"
@@ -5404,12 +7611,30 @@ msgstr "%{slash_command} перезезапиÑує запланований чÐ
msgid "for this project"
msgstr "Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ проекту"
+msgid "here"
+msgstr "тут"
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr "імпорт"
+msgid "is invalid because there is downstream lock"
+msgstr "неправильний через наÑвніÑÑ‚ÑŒ блокувань на нижчих рівнÑÑ…"
+
+msgid "is invalid because there is upstream lock"
+msgstr "неправильний через наÑвніÑÑ‚ÑŒ блокувань на вищих рівнÑÑ…"
+
+msgid "is not a valid X509 certificate."
+msgstr "не відповідний Ñертифікат X509."
+
msgid "latest version"
msgstr "оÑÑ‚Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ"
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr "заблоковано %{path_lock_user_name} %{created_at}"
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "запит на злиттÑ"
@@ -5429,9 +7654,24 @@ msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ %{metricsLinkStart} пам’ÑÑ‚Ñ– %{metricsLi
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ %{metricsLinkStart} пам’ÑÑ‚Ñ– %{metricsLinkEnd} %{emphasisStart} не змінилоÑÑ %{emphasisEnd} %{memoryFrom}Мб"
+msgid "mrWidget|Add approval"
+msgstr "Додати затвердженнÑ"
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr "ДозволÑÑ” коміти від учаÑників, Ñкі можуть зливати до цільової гілки"
+msgid "mrWidget|An error occured while removing your approval."
+msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð°ÑˆÐ¾Ð³Ð¾ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°."
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr "Затвердити"
+
+msgid "mrWidget|Approved by"
+msgstr "Затверджено"
+
msgid "mrWidget|Cancel automatic merge"
msgstr "СкаÑувати автоматичне злиттÑ"
@@ -5492,9 +7732,24 @@ msgstr "Ð—Ð»Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¾Ð¹ÑˆÐ»Ð¾ невдало."
msgid "mrWidget|Merge locally"
msgstr "Злити локально"
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr "Злито"
+msgid "mrWidget|No Approval required"
+msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ потрібне"
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr "Ð—Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ðµ Ñ” обов’Ñзковим; але ви вÑе одно можете це зробити"
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr "ПроÑте порівнÑÐ½Ð½Ñ (diff)"
@@ -5513,6 +7768,9 @@ msgstr "Видалити гілку-джерело"
msgid "mrWidget|Remove source branch"
msgstr "Видалити гілку-джерело"
+msgid "mrWidget|Remove your approval"
+msgstr "Видалити ваше затвердженнÑ"
+
msgid "mrWidget|Request to merge"
msgstr "Запит на злиттÑ"
@@ -5564,9 +7822,6 @@ msgstr "Запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð² процеÑÑ– виконаннÑ"
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr "Цей проект заархівований, доÑтуп до запиÑу було відключено"
-msgid "mrWidget|Web IDE"
-msgstr "Веб-IDE"
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr "Ви можете прийнÑти цей запит на Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð²Ñ€ÑƒÑ‡Ð½Ñƒ за допомогою"
@@ -5607,27 +7862,42 @@ msgstr "пароль"
msgid "personal access token"
msgstr "оÑобиÑтий токен доÑтупу"
+msgid "private key does not match certificate."
+msgstr "приватний ключ не відповідає Ñертифікату."
+
msgid "remaining"
msgstr "залишилоÑÑŒ"
msgid "remove due date"
msgstr "видалити заплановану дату завершеннÑ"
+msgid "remove weight"
+msgstr "видалити вагу"
+
msgid "source"
msgstr "джерело"
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr "%{slash_command} оновлює Ñуму витраченого чаÑу."
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr "цей документ"
+msgid "to help your contributors communicate effectively!"
+msgstr "щоб допомогти вашим контриб’юторам ефективно ÑпілкуватиÑÑ!"
+
msgid "username"
msgstr "ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача"
msgid "uses Kubernetes clusters to deploy your code!"
msgstr "викориÑтовує клаÑтери Kubernetes Ð´Ð»Ñ Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð´Ñƒ!"
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr "з %{additions} додаваннÑми Ñ– %{deletions} видаленнÑми."
diff --git a/locale/zh_CN/gitlab.po b/locale/zh_CN/gitlab.po
index cf9a8a37638..07537eda598 100644
--- a/locale/zh_CN/gitlab.po
+++ b/locale/zh_CN/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -15,10 +13,22 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr "和"
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] " ä¸‹é™ %d 点"
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] " æ高 %d 点"
msgid "%d changed file"
msgid_plural "%d changed files"
-msgstr[0] ""
+msgstr[0] "%d 个已更改的文件"
msgid "%d commit"
msgid_plural "%d commits"
@@ -38,7 +48,7 @@ msgstr[0] "%d 个议题"
msgid "%d layer"
msgid_plural "%d layers"
-msgstr[0] "%d 层"
+msgstr[0] "%d 个层"
msgid "%d merge request"
msgid_plural "%d merge requests"
@@ -46,35 +56,46 @@ msgstr[0] "%d 个åˆå¹¶è¯·æ±‚"
msgid "%d metric"
msgid_plural "%d metrics"
-msgstr[0] "%d 指标"
+msgstr[0] "%d 个指标"
+
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] "%d 个新许å¯è¯"
msgid "%d staged change"
msgid_plural "%d staged changes"
-msgstr[0] "%d个已暂存的修改"
+msgstr[0] "%d 个已暂存的修改"
msgid "%d unstaged change"
msgid_plural "%d unstaged changes"
-msgstr[0] "%d个未暂存的修改"
+msgstr[0] "%d 个未暂存的修改"
+
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] "%d 个æ¼æ´ž"
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "为æ高页é¢åŠ è½½é€Ÿåº¦åŠæ€§èƒ½ï¼Œå·²çœç•¥äº† %s 次æ交。"
msgid "%{actionText} & %{openOrClose} %{noteable}"
-msgstr "%{actionText} & %{openOrClose} %{noteable}"
+msgstr "%{actionText} 和 %{openOrClose} %{noteable}"
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "ç”± %{commit_author_link} æ交于 %{commit_timeago}"
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} ä½å‚与者"
msgid "%{filePath} deleted"
-msgstr ""
+msgstr "%{filePath} 已删除"
msgid "%{group_docs_link_start}Groups%{group_docs_link_end} allow you to manage and collaborate across multiple projects. Members of a group have access to all of its projects."
-msgstr ""
+msgstr "%{group_docs_link_start}群组%{group_docs_link_end} å…许您管ç†ã€å作多个项目。群组的æˆå‘˜å¯ä»¥è®¿é—®ç¾¤ç»„下的所有项目。"
msgid "%{loadingIcon} Started"
msgstr "%{loadingIcon} 已开始"
@@ -82,17 +103,20 @@ msgstr "%{loadingIcon} 已开始"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} 被GitLab用户 %{lock_user_id} é”定"
+msgid "%{name}'s avatar"
+msgstr "%{name} 的头åƒ"
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr "%{nip_domain} å¯ä»¥æ›¿ä»£è‡ªå®šä¹‰åŸŸä½¿ç”¨ã€‚"
msgid "%{number_commits_behind} commits behind %{default_branch}, %{number_commits_ahead} commits ahead"
-msgstr "%{number_commits_behind} 个è½åŽ %{default_branch} 分支的æ交, %{number_commits_ahead} 早超å‰çš„æ交"
+msgstr "%{number_commits_behind} 个è½åŽ %{default_branch} 分支的æ交, %{number_commits_ahead} 个超å‰çš„æ交"
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will allow access on the next attempt."
msgstr "已失败 %{number_of_failures} 次/最多å…许失败失败 %{maximum_failures} 次,GitLab 将继续é‡è¯•ã€‚"
msgid "%{number_of_failures} of %{maximum_failures} failures. GitLab will not retry automatically. Reset storage information when the problem is resolved."
-msgstr "已失败 %{number_of_failures} 次/最多å…许失败 %{maximum_failures} 次,GitLab ä¸ä¼šç»§ç»­è‡ªåŠ¨é‡è¯•ã€‚请在问题解决åŽé‡ç½®å­˜å‚¨è¿è¡ŒçŠ¶å†µä¿¡æ¯ã€‚"
+msgstr "已失败 %{number_of_failures} 次/最多å…许失败 %{maximum_failures} 次,GitLab å°†ä¸å†è‡ªåŠ¨é‡è¯•ã€‚请在问题解决åŽæ‰‹åŠ¨é‡ç½®å­˜å‚¨ç©ºé—´ä¿¡æ¯ã€‚"
msgid "%{openOrClose} %{noteable}"
msgstr "%{openOrClose} %{noteable}"
@@ -104,18 +128,23 @@ msgid "%{storage_name}: failed storage access attempt on host:"
msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:"
msgstr[0] "%{storage_name}:已 %{failed_attempts} 次å°è¯•è®¿é—®å­˜å‚¨å¤±è´¥ï¼š"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+
msgid "%{text} is available"
msgstr "%{text}å¯ç”¨"
msgid "%{title} changes"
msgstr "%{title}更改"
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] "%{type}检测到%{vulnerabilityCount}个æ¼æ´ž"
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr "%{unstaged}个未暂存的更改åŠ%{staged}个已暂存的更改"
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(如需了解更多的安装信æ¯ï¼Œè¯·æŸ¥çœ‹ %{link})"
-
msgid "+ %{moreCount} more"
msgstr "+ 其余 %{moreCount} 项"
@@ -181,6 +210,30 @@ msgstr "页é¢æœªæ‰¾åˆ°"
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr "如果您觉得这是一个错误的æ示信æ¯ï¼Œè¯·è”系您的 GitLab 管ç†å‘˜ã€‚"
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr "已创建 <strong>%{created_count}</strong> 个, 已关闭 <strong>%{accepted_count}</strong> 个。"
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr "已创建 <strong>%{created_count}</strong> 个, 已关闭 <strong>%{closed_count}</strong> 个。"
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr "<strong>%{pushes}</strong> 个推é€ï¼Œè¶…å‰ <strong>%{people}</strong> å贡献者的 <strong>%{commits}</strong> 个æ交。"
+
msgid "<strong>Removes</strong> source branch"
msgstr "<strong>删除</strong>æºåˆ†æ”¯"
@@ -197,14 +250,23 @@ msgid "A project is where you house your files (repository), plan your work (iss
msgstr "项目å¯ä»¥ç”¨äºŽå­˜æ”¾æ–‡ä»¶(仓库),安排计划(议题),并å‘布文档(wiki), %{among_other_things_link}。"
msgid "A regular expression that will be used to find the test coverage output in the job trace. Leave blank to disable"
-msgstr ""
+msgstr "用于在作业跟踪中查找匹é…测试覆盖率输出的正则表达å¼ã€‚留空则ç¦ç”¨"
msgid "A user with write access to the source branch selected this option"
msgstr "具有对æºåˆ†æ”¯çš„写入æƒé™çš„用户选择了此选项"
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "关于自动部署"
+msgid "About this feature"
+msgstr "关于此功能"
+
msgid "Abuse Reports"
msgstr "滥用报告"
@@ -214,14 +276,23 @@ msgstr "滥用报告"
msgid "Accept terms"
msgstr "接å—æ¡æ¬¾"
+msgid "Accepted MR"
+msgstr "接å—åˆå¹¶è¯·æ±‚"
+
msgid "Access Tokens"
msgstr "访问令牌"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr "ä¸å…许访问%{classification_label}"
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "为方便修å¤æŒ‚载问题,访问故障存储已被暂时ç¦ç”¨ã€‚在问题解决åŽè¯·é‡ç½®å­˜å‚¨è¿è¡ŒçŠ¶å†µä¿¡æ¯ï¼Œä»¥å…许å†æ¬¡è®¿é—®ã€‚"
msgid "Access your runner token, customize your pipeline configuration, and view your pipeline status and coverage report."
-msgstr ""
+msgstr "访问您的 runner 令牌,自定义æµæ°´çº¿é…置,以åŠæŸ¥çœ‹æµæ°´çº¿çŠ¶æ€å’Œè¦†ç›–率报告。"
msgid "Account"
msgstr "å¸å·"
@@ -238,12 +309,18 @@ msgstr "活动会è¯"
msgid "Activity"
msgstr "活动"
+msgid "Add"
+msgstr "添加"
+
msgid "Add Changelog"
msgstr "添加更新日志"
msgid "Add Contribution guide"
msgstr "添加贡献指å—"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr "添加组 Webhooks å’Œ GitLab ä¼ä¸šç‰ˆã€‚"
+
msgid "Add Kubernetes cluster"
msgstr "添加 Kubernetes 集群"
@@ -253,6 +330,12 @@ msgstr "添加许å¯è¯"
msgid "Add Readme"
msgstr "添加自述文件"
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr "添加包å«åœ¨æ‰€æœ‰ç”µå­é‚®ä»¶ä¸­çš„附加文本。 长度ä¸è¶…过%{character_limit} 字符"
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "添加目录"
@@ -262,6 +345,24 @@ msgstr "添加回应"
msgid "Add todo"
msgstr "添加待办事项"
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr "附加文本"
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr "åœæ­¢æ‰€æœ‰ä½œä¸š"
@@ -332,7 +433,7 @@ msgid "Allow commits from members who can merge to the target branch."
msgstr "具有åˆå¹¶åˆ°ç›®æ ‡åˆ†æ”¯æƒé™çš„æˆå‘˜å…许æ交"
msgid "Allow public access to pipelines and job details, including output logs and artifacts"
-msgstr ""
+msgstr "å…许所有人访问æµæ°´çº¿å’Œä½œä¸šè¯¦æƒ…,包括输出日志和工件"
msgid "Allow rendering of PlantUML diagrams in Asciidoc documents."
msgstr "å…许在Asciidoc文档中渲染PlantUML图。"
@@ -343,29 +444,59 @@ msgstr "å…许æ¥è‡ªé’©å­å’ŒæœåŠ¡çš„对本地网络的请求。"
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "这里å¯ä»¥æ·»åŠ å’Œç®¡ç† Kubernetes 集群。"
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr "也称为“签å‘者â€æˆ–“ä¾èµ–方信任标识符â€"
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr "也称为“ä¾èµ–æ–¹æœåŠ¡URLâ€æˆ–“回å¤URLâ€"
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr "此外,也å¯ä»¥ä½¿ç”¨ %{personal_access_token_link}。创建 Personal Access Token 时,在范围中需选择 <code>repo</code> ,以便显示å¯ä¾›è¿žæŽ¥çš„公开和ç§æœ‰çš„仓库列表。"
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr "此外,也å¯ä»¥ä½¿ç”¨ %{personal_access_token_link}。创建Personal Access Token时,在范围中需选择 <code>repo</code> ,以便显示å¯ä¾›å¯¼å…¥å…¬å¼€å’Œç§æœ‰çš„仓库列表"
-msgid "An error occured creating the new branch."
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
msgstr ""
-msgid "An error occured whilst loading all the files."
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
msgstr ""
-msgid "An error occured whilst loading the file content."
+msgid "An error accured whilst committing your changes."
+msgstr "æ交更改时å‘生错误。"
+
+msgid "An error has occurred"
msgstr ""
+msgid "An error occured creating the new branch."
+msgstr "创建新分支时å‘生错误。"
+
+msgid "An error occured whilst fetching the job trace."
+msgstr "获å–作业日志时å‘生错误。"
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr "获å–æµæ°´çº¿æ—¶å‘生错误。"
+
+msgid "An error occured whilst loading all the files."
+msgstr "所有文件都无法加载。"
+
+msgid "An error occured whilst loading the file content."
+msgstr "加载文件评论时å‘生错误。"
+
msgid "An error occured whilst loading the file."
-msgstr ""
+msgstr "加载文件时å‘生错误。"
msgid "An error occured whilst loading the merge request changes."
-msgstr ""
+msgstr "加载åˆå¹¶è¯·æ±‚å˜æ›´å†…容时å‘生错误。"
msgid "An error occured whilst loading the merge request version data."
-msgstr ""
+msgstr "加载åˆå¹¶è¯·æ±‚的版本数æ®æ—¶å‘生错误。"
msgid "An error occured whilst loading the merge request."
-msgstr ""
+msgstr "加载åˆå¹¶è¯·æ±‚æ—¶å‘生错误。"
+
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr "加载æµæ°´çº¿ä½œä¸šæ—¶å‘生错误。"
msgid "An error occurred previewing the blob"
msgstr "预览 blob 时出错"
@@ -373,6 +504,15 @@ msgstr "预览 blob 时出错"
msgid "An error occurred when toggling the notification subscription"
msgstr "切æ¢é€šçŸ¥è®¢é˜…æ—¶å‘生错误"
+msgid "An error occurred when updating the issue weight"
+msgstr "更新议题æƒé‡æ—¶å‘生错误"
+
+msgid "An error occurred while adding approver"
+msgstr "添加审批者时出错"
+
+msgid "An error occurred while detecting host keys"
+msgstr "检测主机密钥时å‘生错误"
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr "消除警告时å‘生错误。请刷新页é¢å¹¶å†æ¬¡å°è¯•ã€‚"
@@ -394,8 +534,11 @@ msgstr "获å–项目时å‘生错误"
msgid "An error occurred while importing project: ${details}"
msgstr "在导入项目时å‘生错误:${details}"
-msgid "An error occurred while loading commits"
-msgstr "加载æ交时å‘生错误"
+msgid "An error occurred while initializing path locks"
+msgstr "åˆå§‹åŒ–路径é”æ—¶å‘生错误"
+
+msgid "An error occurred while loading commit signatures"
+msgstr ""
msgid "An error occurred while loading diff"
msgstr "加载差异时å‘生错误"
@@ -409,6 +552,9 @@ msgstr "加载文件时å‘生错误"
msgid "An error occurred while making the request."
msgstr "å‘é€è¯·æ±‚æ—¶å‘生错误。"
+msgid "An error occurred while removing approver"
+msgstr "删除批准者时å‘生错误"
+
msgid "An error occurred while rendering KaTeX"
msgstr "渲染KaTeXæ—¶å‘生错误"
@@ -421,18 +567,48 @@ msgstr "获å–日历活动时å‘生错误"
msgid "An error occurred while retrieving diff"
msgstr "获å–差异时å‘生错误"
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr "ä¿å­˜LDAP覆盖状æ€æ—¶å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
+
msgid "An error occurred while saving assignees"
msgstr "ä¿å­˜è¢«æŒ‡æ´¾äººæ—¶å‡ºçŽ°é”™è¯¯ã€‚"
+msgid "An error occurred while subscribing to notifications."
+msgstr "订阅通知时å‘生错误。"
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr "å–消订阅通知时å‘生错误。"
+
msgid "An error occurred while validating username"
msgstr "验è¯ç”¨æˆ·åæ—¶å‘生错误"
msgid "An error occurred. Please try again."
msgstr "å‘生了错误,请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr "任何标记"
+
msgid "Appearance"
msgstr "外观"
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr "应用程åº"
@@ -448,24 +624,39 @@ msgstr "已归档项目ï¼ä»“库和其他项目资æºå‡ä¸ºåªè¯»"
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "确定è¦åˆ é™¤æ­¤æµæ°´çº¿è®¡åˆ’å—?"
-msgid "Are you sure you want to remove this identity?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
msgstr ""
+msgid "Are you sure you want to remove this identity?"
+msgstr "你确定è¦åˆ é™¤è¿™ä¸ªèº«ä»½æ ‡è¯†å—?"
+
msgid "Are you sure you want to reset registration token?"
msgstr "确定è¦é‡ç½®æ³¨å†Œä»¤ç‰Œå—?"
msgid "Are you sure you want to reset the health check token?"
msgstr "确定è¦é‡ç½®è¿è¡ŒçŠ¶å†µæ£€æŸ¥ä»¤ç‰Œå—?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr "你确定è¦è§£é” %{path_lock_path} å—?"
+
msgid "Are you sure?"
msgstr "确定å—?"
msgid "Artifacts"
msgstr "产物"
+msgid "Ascending"
+msgstr "å‡åºæŽ’列"
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr "请群组维护者é…置一个群组级 Runner。"
+msgid "Assertion consumer service URL"
+msgstr "断言消费者æœåŠ¡ URL"
+
msgid "Assign custom color like #FF0000"
msgstr "分é…自定义颜色,如FF0000"
@@ -493,12 +684,21 @@ msgstr "已分派给我"
msgid "Assignee"
msgstr "指派人"
+msgid "Assignee boards not available with your current license"
+msgstr "当å‰è®¸å¯è¯æ— æ³•ä½¿ç”¨æŒ‡æ´¾çœ‹æ¿"
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr "指派列表显示分é…给选定用户的所有议题。"
+
msgid "Assignee(s)"
msgstr "指派"
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "拖放文件到此处或者 %{upload_link}"
+msgid "Audit Events"
+msgstr "审计事件"
+
msgid "Aug"
msgstr "å…«"
@@ -508,12 +708,36 @@ msgstr "八月"
msgid "Authentication Log"
msgstr "认è¯æ—¥å¿—"
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr "作者"
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr "作者:%{authors}"
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr "å¯ç”¨Auto DevOps"
@@ -530,7 +754,7 @@ msgid "Auto Review Apps and Auto Deploy need a domain name to work correctly."
msgstr "自动审阅程åºå’Œè‡ªåŠ¨éƒ¨ç½²ç¨‹åºéœ€è¦ä¸€ä¸ªåŸŸåæ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
msgid "Auto-cancel redundant, pending pipelines"
-msgstr ""
+msgstr "自动å–消多余的和挂起的æµæ°´çº¿"
msgid "AutoDevOps|Auto DevOps"
msgstr "Auto DevOps"
@@ -571,9 +795,15 @@ msgstr "å³å°†åˆ é™¤å¤´åƒã€‚确定继续å—?"
msgid "Average per day: %{average}"
msgstr "å¹³å‡æ¯å¤©: %{average}"
-msgid "Background color"
+msgid "Background Color"
+msgstr "背景é¡è‰²"
+
+msgid "Background Jobs"
msgstr ""
+msgid "Background color"
+msgstr "背景颜色"
+
msgid "Background jobs"
msgstr "åŽå°ä½œä¸š"
@@ -650,14 +880,89 @@ msgid "Begin with the selected commit"
msgstr "从选定的æ交开始"
msgid "Below are examples of regex for existing tools:"
+msgstr "以下是现有工具的正则表达å¼ç¤ºä¾‹ï¼š"
+
+msgid "Below you will find all the groups that are public."
msgstr ""
-msgid "Boards"
+msgid "Billing"
+msgstr "计费"
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr "%{group_name} 正在使用 %{plan_link} 方案。"
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr "ç›®å‰æ— æ³•è‡ªåŠ¨é™çº§æˆ–å‡çº§åˆ°æŸäº›è®¡åˆ’。"
+
+msgid "BillingPlans|Current plan"
+msgstr "当å‰æ–¹æ¡ˆ"
+
+msgid "BillingPlans|Customer Support"
+msgstr "客户支æŒ"
+
+msgid "BillingPlans|Downgrade"
+msgstr "é™çº§"
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
msgstr ""
-msgid "Branch %{branchName} was not found in this project's repository."
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr "请查阅%{faq_link} 进一步了解æ¯ä¸ªè®¡åˆ’的相关信æ¯ã€‚"
+
+msgid "BillingPlans|Manage plan"
+msgstr "管ç†æ–¹æ¡ˆ"
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr "在这ç§æƒ…况下请è”ç³»%{customer_support_link}。"
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr "查看 %{plan_name} 计划中的功能"
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr "使用与其父项目一致的方案"
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr "访问 %{parent_billing_page_link} 以管ç†è¯¥é¡¹ç›®çš„计费方案。"
+
+msgid "BillingPlans|Upgrade"
+msgstr "å‡çº§"
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr "您目å‰æ­£åœ¨ä½¿ç”¨ %{plan_link} 方案。"
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
msgstr ""
+msgid "BillingPlans|frequently asked questions"
+msgstr "常问问题"
+
+msgid "BillingPlans|monthly"
+msgstr "æ¯æœˆ"
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr "æ¯å¹´æ”¯ä»˜ %{price_per_year}"
+
+msgid "BillingPlans|per user"
+msgstr "æ¯ç”¨æˆ·"
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
+msgid "Boards"
+msgstr "看æ¿"
+
+msgid "Branch %{branchName} was not found in this project's repository."
+msgstr "未在此项目的仓库中找到 %{branchName} 分支。"
+
msgid "Branch (%{branch_count})"
msgid_plural "Branches (%{branch_count})"
msgstr[0] "分支(%{branch_count})"
@@ -770,6 +1075,9 @@ msgstr "éžæ´»è·ƒ"
msgid "Branches|Stale branches"
msgstr "éžæ´»è·ƒåˆ†æ”¯"
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr "分支无法自动æ交,因为与上游分支冲çªã€‚"
+
msgid "Branches|The default branch cannot be deleted"
msgstr "无法删除默认分支"
@@ -782,9 +1090,15 @@ msgstr "为é¿å…æ•°æ®ä¸¢å¤±ï¼Œè¯·åœ¨åˆ é™¤ä¹‹å‰åˆå¹¶æ­¤åˆ†æ”¯ã€‚"
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "请输入 %{branch_name_confirmation} æ¥ç¡®è®¤ï¼š"
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr "è¦æ”¾å¼ƒæœ¬åœ°æ›´æ”¹å¹¶è¦†ç›–上游版本的分支,请在此处将其删除,然åŽé€‰æ‹©ä¸Šé¢çš„“立å³æ›´æ–°â€ã€‚"
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "å°†è¦æ°¸ä¹…删除å—ä¿æŠ¤çš„ %{branch_name} 分支。"
+msgid "Branches|diverged from upstream"
+msgstr "与上游存在差异"
+
msgid "Branches|merged"
msgstr "å·²åˆå¹¶"
@@ -806,6 +1120,9 @@ msgstr "æµè§ˆæ–‡ä»¶"
msgid "Browse files"
msgstr "æµè§ˆæ–‡ä»¶"
+msgid "Business metrics (Custom)"
+msgstr "业务指标(自定义)"
+
msgid "ByAuthor|by"
msgstr "作者:"
@@ -813,11 +1130,17 @@ msgid "CI / CD"
msgstr "CI / CD"
msgid "CI / CD Settings"
-msgstr ""
+msgstr "CI/CD 设置"
+
+msgid "CI/CD"
+msgstr "æŒç»­é›†æˆ/æŒç»­éƒ¨ç½²"
msgid "CI/CD configuration"
msgstr "CI/CD é…ç½®"
+msgid "CI/CD for external repo"
+msgstr "为外部仓库设置的æŒç»­é›†æˆ/æŒç»­éƒ¨ç½²"
+
msgid "CI/CD settings"
msgstr "CI/CD 设置"
@@ -845,6 +1168,9 @@ msgstr "部署策略需è¦ä¸€ä¸ªåŸŸåæ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
msgid "CICD|Disable Auto DevOps"
msgstr "ç¦ç”¨ Auto DevOps"
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr "如果您使用Auto DevOps设置多个Kubernetes群集,请ä¸è¦åœ¨æ­¤å¤„设置域。"
+
msgid "CICD|Enable Auto DevOps"
msgstr "å¯ç”¨Auto DevOps"
@@ -866,9 +1192,15 @@ msgstr "当项目中没有 %{ci_file} 时,将使用 Auto DevOpsæµæ°´çº¿é…ç½®
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr "如需使用自动化应用程åºè¯„审和自动部署,请指定域å。"
-msgid "Can't find HEAD commit for this branch"
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
msgstr ""
+msgid "Can't find HEAD commit for this branch"
+msgstr "无法找到此分支的 HEAD æ交"
+
msgid "Cancel"
msgstr "å–消"
@@ -881,6 +1213,12 @@ msgstr "无法自动åˆå¹¶"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "无法修改托管的 Kubernetes 集群"
+msgid "Certificate fingerprint"
+msgstr "è¯ä¹¦æŒ‡çº¹"
+
+msgid "Change Weight"
+msgstr "更改æƒé‡"
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr "更改此值以影å“GitLab UI拉å–更新的频率。"
@@ -921,10 +1259,16 @@ msgid "Checking branch availability..."
msgstr "正在检查分支的å¯ç”¨æ€§..."
msgid "Cherry-pick this commit"
-msgstr "优选此æ交"
+msgstr "拣选此æ交"
msgid "Cherry-pick this merge request"
-msgstr "优选此åˆå¹¶è¯·æ±‚"
+msgstr "拣选此åˆå¹¶è¯·æ±‚"
+
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
msgid "Choose File ..."
msgstr "选择文件 ……"
@@ -933,17 +1277,29 @@ msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to s
msgstr "选择分支/标签(例如%{master})或输入æ交(例如%{sha})以查看更改内容或创建åˆå¹¶è¯·æ±‚。"
msgid "Choose any color."
-msgstr ""
+msgstr "选择任何颜色。"
msgid "Choose between <code>clone</code> or <code>fetch</code> to get the recent application code"
-msgstr ""
+msgstr "选择 <code>克隆</code> 或 <code>拉å–</code> 以获å–最近的应用程åºä»£ç "
msgid "Choose file..."
msgstr "选择文件..."
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr "选择您希望与此次è¦èŠ‚点åŒæ­¥çš„群组。"
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr "请选择è¦è¿žæŽ¥å¹¶è¿è¡Œ CI/CD æµæ°´çº¿çš„代ç ä»“库。"
+
msgid "Choose which repositories you want to import."
msgstr "选择è¦å¯¼å…¥çš„仓库"
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr "选择è¦åŒæ­¥åˆ°æ­¤æ¬¡èŠ‚点的切片。"
+
msgid "CiStatusLabel|canceled"
msgstr "å·²å–消"
@@ -1013,12 +1369,21 @@ msgstr "* (所有环境)"
msgid "CiVariable|All environments"
msgstr "所有环境"
+msgid "CiVariable|Create wildcard"
+msgstr "创建通é…符"
+
msgid "CiVariable|Error occured while saving variables"
msgstr "ä¿å­˜å˜é‡æ—¶å‘生错误"
+msgid "CiVariable|New environment"
+msgstr "新建环境"
+
msgid "CiVariable|Protected"
msgstr "å—ä¿æŠ¤"
+msgid "CiVariable|Search environments"
+msgstr "æœç´¢çŽ¯å¢ƒ"
+
msgid "CiVariable|Toggle protected"
msgstr "开关ä¿æŠ¤çŠ¶æ€"
@@ -1028,30 +1393,57 @@ msgstr "验è¯å¤±è´¥"
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr "断路器 API"
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr "ä¸å¯ç”¨: %{reason}"
+
msgid "Clear search input"
msgstr "清除æœç´¢è¾“å…¥"
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr "å•å‡»ä¸‹é¢é¡¹ç›®åˆ—表中的任何 <strong>项目å称</strong> 跳转到项目里程碑。"
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr "点击å³ä¸Šè§’çš„ <strong>å‡çº§</strong> 按钮以å‡çº§åˆ°åˆ°ç¾¤ç»„里程碑。"
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr "点击下é¢çš„按钮转到Kubernetes页é¢å¼€å§‹å®‰è£…过程"
msgid "Click to expand it."
-msgstr ""
+msgstr "点击以展开。"
msgid "Click to expand text"
msgstr "点击展开文本"
+msgid "Client authentication certificate"
+msgstr "客户端认è¯è¯ä¹¦"
+
+msgid "Client authentication key"
+msgstr "客户端认è¯å¯†é’¥"
+
+msgid "Client authentication key password"
+msgstr "客户端认è¯å¯†é’¥å¯†ç "
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr "克隆仓库"
msgid "Close"
msgstr "关闭"
+msgid "Closed"
+msgstr "已关闭"
+
+msgid "Closed issues"
+msgstr "已关闭议题"
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr "%{appList} å·²æˆåŠŸå®‰è£…到Kubernetes集群上"
@@ -1061,9 +1453,6 @@ msgstr "API地å€"
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "添加 Kubernetes 集群"
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr "添加现有的Kubernetes集群"
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr "Kubernetes集群集æˆçš„高级选项"
@@ -1085,9 +1474,6 @@ msgstr "CAè¯ä¹¦"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "è¯ä¹¦æŽˆæƒåŒ…(PEMæ ¼å¼)"
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr "选择如何设置Kubernetes集群集æˆ"
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr "请选择使用此Kubernetes集群的环境。"
@@ -1115,17 +1501,8 @@ msgstr "å¤åˆ¶ä»¤ç‰Œ"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "创建Kubernetes集群"
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr "在Google Kubernetes引擎上创建Kubernetes集群"
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr "通过GitLab在Google Kubernetes引擎上创建Kubernetes集群"
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr "在 Google Kubernetes Engine 上创建"
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
-msgstr "输入现有的 Kubernetes 集群详细信æ¯"
+msgid "ClusterIntegration|Did you know?"
+msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "输入Kubernetes集群的详细信æ¯"
@@ -1134,7 +1511,7 @@ msgid "ClusterIntegration|Environment scope"
msgstr "环境范围"
msgid "ClusterIntegration|Every new Google Cloud Platform (GCP) account receives $300 in credit upon %{sign_up_link}. In partnership with Google, GitLab is able to offer an additional $200 for both new and existing GCP accounts to get started with GitLab's Google Kubernetes Engine Integration."
-msgstr ""
+msgstr "æ¯ä¸ªæ–°çš„ Google äº‘å¹³å° (GCP) å¸æˆ·ä½¿ç”¨æ­¤é“¾æŽ¥ %{sign_up_link} å¯ä»¥æ”¶åˆ° 300 美元的赠金。因为与 Google çš„åˆä½œå…³ç³»ï¼ŒGitLab 能够为新的和现有的 GCP å¸æˆ·æä¾›é¢å¤– 200 美元的赠金,以便于开始将 GitLab 集æˆåˆ° Google Kubernetes 引擎。"
msgid "ClusterIntegration|Fetching machine types"
msgstr "正在获å–实例类型"
@@ -1163,6 +1540,15 @@ msgstr "Google Kubernetes Engine 项目"
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr "如果您正在设置多个群集并使用Auto DevOps,请%{help_link_start}先查阅此处%{help_link_end}。"
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr "为了显示集群的å¥åº·çŠ¶å†µï¼Œæ‚¨çš„集群需è¦é…ç½®Prometheus以收集所需的数æ®ã€‚"
+
msgid "ClusterIntegration|Ingress"
msgstr "Ingress"
@@ -1172,6 +1558,9 @@ msgstr "Ingress IP地å€"
msgid "ClusterIntegration|Install"
msgstr "安装"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr "安装Prometheus"
+
msgid "ClusterIntegration|Installed"
msgstr "已安装"
@@ -1196,6 +1585,9 @@ msgstr "Kubernetes 集群"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Kubernetes集群详细信æ¯"
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr "Kubernetes集群è¿è¡ŒçŠ¶å†µ"
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr "Kubernetes集群集æˆ"
@@ -1253,6 +1645,9 @@ msgstr "通过访问 %{link_gke} ç®¡ç† Kubernetes 集群"
msgid "ClusterIntegration|More information"
msgstr "更多信æ¯"
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr "在GitLabä¼ä¸šé«˜çº§å’Œæ——舰版中å¯ä»¥ä½¿ç”¨å¤šä¸ªKubernetes集群"
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr "未找到您æœç´¢çš„实例类型"
@@ -1289,9 +1684,6 @@ msgstr "Prometheus"
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr "请阅读关于Kubernetes集群集æˆçš„%{link_to_help_page}。"
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr "从Google Cloud Platform å…‘æ¢æœ€é«˜$500çš„å…è´¹é¢åº¦"
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr "删除Kubernetes集群集æˆ"
@@ -1406,6 +1798,9 @@ msgstr "正确é…ç½®"
msgid "ClusterIntegration|sign up"
msgstr "注册"
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr "收起"
@@ -1413,10 +1808,10 @@ msgid "Collapse sidebar"
msgstr "折å ä¾§è¾¹æ "
msgid "Comment & resolve discussion"
-msgstr ""
+msgstr "评论并解决讨论"
msgid "Comment & unresolve discussion"
-msgstr ""
+msgstr "评论并将讨论å˜ä¸ºæœªå†³"
msgid "Comments"
msgstr "评论"
@@ -1481,7 +1876,7 @@ msgid "Committed by"
msgstr "æ交者:"
msgid "Commit…"
-msgstr ""
+msgstr "æ交..."
msgid "Compare"
msgstr "比较"
@@ -1531,8 +1926,8 @@ msgstr "在仓库上é…置自动git检查和仓库整ç†ã€‚"
msgid "Configure limits for web and API requests."
msgstr "é…ç½® web å’Œ API 请求é™åˆ¶ã€‚"
-msgid "Configure push mirrors."
-msgstr ""
+msgid "Configure push and pull mirrors."
+msgstr "é…ç½®PushåŠPullé•œåƒ"
msgid "Configure storage path and circuit breaker settings."
msgstr "é…置存储路径åŠæ–­è·¯å™¨è®¾ç½®ã€‚"
@@ -1543,9 +1938,18 @@ msgstr "é…置用户创建新å¸æˆ·çš„æ–¹å¼ã€‚"
msgid "Connect"
msgstr "连接"
+msgid "Connect all repositories"
+msgstr "连接所有仓库"
+
msgid "Connect repositories from GitHub"
msgstr "从 Github 中导入代ç ä»“库"
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr "连接外部仓库åŽï¼Œæ–°æ交将会å¯åŠ¨CI/CDæµæ°´çº¿ã€‚ä»…å¯ç”¨CI/CD功能的Gitlab项目将会被创建。"
+
+msgid "Connecting..."
+msgstr "正在连接..."
+
msgid "Container Registry"
msgstr "容器注册表"
@@ -1597,11 +2001,14 @@ msgstr "您也å¯ä»¥ä½¿ç”¨ %{deploy_token} 以åªè¯»æ–¹å¼è®¿é—®é•œåƒåº“çš„é•œå
msgid "Continue"
msgstr "继续"
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr "æŒç»­é›†æˆå’Œéƒ¨ç½²"
msgid "Contribute to GitLab"
-msgstr ""
+msgstr "为 GitLab æ交贡献"
msgid "Contribution"
msgstr "贡献"
@@ -1609,6 +2016,9 @@ msgstr "贡献"
msgid "Contribution guide"
msgstr "贡献指å—"
+msgid "Contributions per group member"
+msgstr "æ¯å群组æˆå‘˜çš„贡献"
+
msgid "Contributors"
msgstr "贡献者"
@@ -1624,6 +2034,24 @@ msgstr "%{branch_name} 分支上的æ交,ä¸å«åˆå¹¶æ交。é™6000次。"
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr "请ç¨å€™ï¼Œå›¾è¡¨æž„建完æˆåŽé¡µé¢ä¼šè‡ªåŠ¨åˆ·æ–°ã€‚"
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "控制此次è¦èŠ‚点的 åŒæ­¥LFS/附件的最大并å‘"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "控制此次è¦èŠ‚点的åŒæ­¥å­˜å‚¨åº“的最大并å‘"
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr "控制此Geo节点的校验æ“作的最大并å‘性"
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr "å°† SSH 公钥å¤åˆ¶åˆ°å‰ªè´´æ¿"
+
msgid "Copy URL to clipboard"
msgstr "å¤åˆ¶ URL 到剪贴æ¿"
@@ -1636,10 +2064,10 @@ msgstr "将命令å¤åˆ¶åˆ°å‰ªè´´æ¿"
msgid "Copy commit SHA to clipboard"
msgstr "å¤åˆ¶æ交 SHA 的值到剪贴æ¿"
-msgid "Copy file name to clipboard"
-msgstr ""
-
msgid "Copy file path to clipboard"
+msgstr "将文件路径å¤åˆ¶åˆ°å‰ªè´´æ¿"
+
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1648,6 +2076,9 @@ msgstr "将索引å¤åˆ¶åˆ°å‰ªè´´æ¿"
msgid "Copy to clipboard"
msgstr "å¤åˆ¶åˆ°å‰ªè´´æ¿"
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr "创建"
@@ -1660,6 +2091,9 @@ msgstr "创建一个新分支"
msgid "Create a new branch and merge request"
msgstr "创建一个新的分支åŠåˆå¹¶è¯·æ±‚"
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "在å¸æˆ·ä¸Šåˆ›å»ºä¸ªäººè®¿é—®ä»¤ç‰Œï¼Œä»¥é€šè¿‡ %{protocol} æ¥æ‹‰å–或推é€ã€‚"
@@ -1667,7 +2101,7 @@ msgid "Create branch"
msgstr "创建分支"
msgid "Create commit"
-msgstr ""
+msgstr "创建æ交"
msgid "Create directory"
msgstr "创建目录"
@@ -1675,12 +2109,21 @@ msgstr "创建目录"
msgid "Create empty repository"
msgstr "创建空的仓库"
+msgid "Create epic"
+msgstr "创建å²è¯—故事"
+
msgid "Create file"
msgstr "创建文件"
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr "创建群组标记"
+msgid "Create issue"
+msgstr "创建议题"
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "从标记创建列表,å«æœ‰è¯¥æ ‡è®°çš„议题将出现在相应的列中。"
@@ -1699,6 +2142,9 @@ msgstr "创建新目录"
msgid "Create new file"
msgstr "创建新文件"
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr "创建新标记"
@@ -1720,15 +2166,27 @@ msgstr "创建个人访问令牌"
msgid "Created"
msgstr "已创建"
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr "由我创建"
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr "创建å²è¯—故事中"
+
msgid "Cron Timezone"
msgstr "Cron 时区"
msgid "Cron syntax"
msgstr "Cron 语法"
+msgid "Current node"
+msgstr "当å‰èŠ‚点"
+
msgid "CurrentUser|Profile"
msgstr "用户资料"
@@ -1736,7 +2194,7 @@ msgid "CurrentUser|Settings"
msgstr "设置"
msgid "Custom CI config path"
-msgstr ""
+msgstr "自定义CIé…置路径"
msgid "Custom notification events"
msgstr "自定义通知事件"
@@ -1744,6 +2202,15 @@ msgstr "自定义通知事件"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "自定义通知级别继承自å‚与级别。使用自定义通知级别,您会收到å‚与级别åŠé€‰å®šäº‹ä»¶çš„通知。想了解更多信æ¯ï¼Œè¯·æŸ¥çœ‹ %{notification_link}."
+msgid "Customize colors"
+msgstr "自定义颜色"
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "周期分æž"
@@ -1768,6 +2235,9 @@ msgstr "预å‘布"
msgid "CycleAnalyticsStage|Test"
msgstr "测试"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr "所有"
@@ -1783,13 +2253,31 @@ msgstr "å二月"
msgid "Decline and sign out"
msgstr "æ‹’ç»å¹¶é€€å‡º"
+msgid "Default classification label"
+msgstr "默认分类标记"
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "使用 Cron 语法定义自定义模å¼"
msgid "Delete"
msgstr "删除"
+msgid "Delete Snippet"
+msgstr "删除代ç ç‰‡æ®µ"
+
msgid "Delete list"
+msgstr "删除清å•"
+
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
msgstr ""
msgid "Deploy"
@@ -1922,9 +2410,21 @@ msgstr "新项目部署令牌已创建。"
msgid "Deprioritize label"
msgstr "å–消优先标记"
+msgid "Descending"
+msgstr "é™åº"
+
msgid "Description"
msgstr "æè¿°"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr "æ述模æ¿å…许您为项目的问题和åˆå¹¶è¯·æ±‚定义æ述字段的特定模æ¿ã€‚"
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "详情"
@@ -1932,7 +2432,7 @@ msgid "Diffs|No file name available"
msgstr "没有å¯ç”¨çš„文件å"
msgid "Diffs|Something went wrong while fetching diff lines."
-msgstr ""
+msgstr "获å–差异线时å‘生错误。"
msgid "Directory name"
msgstr "目录å称"
@@ -1952,9 +2452,27 @@ msgstr "放弃更改"
msgid "Discard draft"
msgstr "å–消"
+msgid "Discover GitLab Geo."
+msgstr "å‘现GitLab Geo。"
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr "关闭循环分æžä»‹ç»æ¡†"
+msgid "Dismiss Merge Request promotion"
+msgstr "关闭åˆå¹¶è¯·æ±‚推广"
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr "常è§çš„身份验è¯æ供商的相关文档"
+
msgid "Domain"
msgstr "域å"
@@ -1997,6 +2515,9 @@ msgstr "踩"
msgid "Due date"
msgstr "截止日期"
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr "在此过程中,我们会è¦æ±‚您æä¾›æ¥è‡ª GitLab çš„ URL 。请使用下é¢çš„网å€ã€‚"
+
msgid "Each Runner can be in one of the following states:"
msgstr "æ¯ä¸ªRunnerå¯ä»¥å¤„于以下状æ€ä¸­çš„其中一ç§ï¼š"
@@ -2004,22 +2525,37 @@ msgid "Edit"
msgstr "编辑"
msgid "Edit Label"
-msgstr ""
+msgstr "编辑标签"
msgid "Edit Pipeline Schedule %{id}"
msgstr "编辑 %{id} æµæ°´çº¿è®¡åˆ’"
+msgid "Edit Snippet"
+msgstr "编辑代ç ç‰‡æ®µ"
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr "在编辑器中编辑文件并在这里​​æ交å˜æ›´å†…容"
-msgid "Edit identity for %{user_name}"
+msgid "Edit group: %{group_name}"
msgstr ""
+msgid "Edit identity for %{user_name}"
+msgstr "编辑 %{user_name} 的身份信æ¯"
+
+msgid "Elasticsearch"
+msgstr "Elasticsearch"
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr "Elasticsearch集æˆåŠElasticsearch AWS IAM。"
+
msgid "Email"
msgstr "电å­é‚®ä»¶"
msgid "Email patch"
-msgstr ""
+msgstr "电å­é‚®ä»¶è¡¥ä¸"
msgid "Emails"
msgstr "电å­é‚®ä»¶"
@@ -2033,6 +2569,12 @@ msgstr "å¯ç”¨"
msgid "Enable Auto DevOps"
msgstr "å¯ç”¨Auto DevOps"
+msgid "Enable Pseudonymizer data collection"
+msgstr "å¯ç”¨åŒ¿å化的数æ®æ”¶é›†"
+
+msgid "Enable SAML authentication for this group"
+msgstr "为此群组å¯ç”¨ SAML 身份验è¯"
+
msgid "Enable Sentry for error reporting and logging."
msgstr "å¯ç”¨S​​entry进行错误报告和日志记录。"
@@ -2042,6 +2584,9 @@ msgstr "å¯ç”¨å¹¶é…ç½®InfluxDB指标。"
msgid "Enable and configure Prometheus metrics."
msgstr "å¯ç”¨å¹¶é…ç½®Prometheus指标。"
+msgid "Enable classification control using an external service"
+msgstr "使用外部æœåŠ¡å¯ç”¨åˆ†ç±»æŽ§åˆ¶"
+
msgid "Enable for this project"
msgstr "在此项目中å¯ç”¨"
@@ -2051,6 +2596,9 @@ msgstr "å¯ç”¨ç¾¤ç»„Runner"
msgid "Enable or disable certain group features and choose access levels."
msgstr "å¯ç”¨æˆ–ç¦ç”¨éƒ¨åˆ†ç¾¤ç»„功能并选择访问等级。"
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr "å¯ç”¨æˆ–ç¦ç”¨åŒ¿å化数æ®æ”¶é›†."
+
msgid "Enable or disable version check and usage ping."
msgstr "å¯ç”¨æˆ–ç¦ç”¨ç‰ˆæœ¬æ£€æŸ¥åŠä½¿ç”¨ping。"
@@ -2060,6 +2608,9 @@ msgstr "å¯ç”¨reCAPTCHA或Akismet并设置IPé™åˆ¶ã€‚"
msgid "Enable the Performance Bar for a given group."
msgstr "对指定群组å¯ç”¨æ€§èƒ½æ ã€‚"
+msgid "Enabled"
+msgstr "å·²å¯ç”¨"
+
msgid "Ends at (UTC)"
msgstr "结æŸäºŽ(UTC)"
@@ -2072,9 +2623,18 @@ msgstr "获å–环境时å‘生错误。"
msgid "Environments|An error occurred while making the request."
msgstr "å‘é€è¯·æ±‚æ—¶å‘生错误。"
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr "æ交"
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr "部署"
@@ -2087,45 +2647,75 @@ msgstr "环境"
msgid "Environments|Job"
msgstr "作业"
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr "新建环境"
msgid "Environments|No deployments yet"
msgstr "未部署"
-msgid "Environments|Open"
-msgstr "打开"
+msgid "Environments|No pod name has been specified"
+msgstr "未指定podå称"
-msgid "Environments|Re-deploy"
-msgstr "é‡æ–°éƒ¨ç½²"
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr "Pod日志æ¥è‡ªäºŽ"
+
+msgid "Environments|Re-deploy to environment"
+msgstr ""
msgid "Environments|Read more about environments"
msgstr "了解有关环境的更多信æ¯"
-msgid "Environments|Rollback"
-msgstr "还原"
+msgid "Environments|Rollback environment"
+msgstr ""
msgid "Environments|Show all"
msgstr "显示全部"
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr "已更新"
msgid "Environments|You don't have any environments right now."
msgstr "当å‰æœªè®¾ç½®çŽ¯å¢ƒ"
+msgid "Epic"
+msgstr "å²è¯—故事"
+
+msgid "Epic will be removed! Are you sure?"
+msgstr "å²è¯—故事将被删除! 是å¦ç¡®å®šï¼Ÿ"
+
+msgid "Epics"
+msgstr "å²è¯—故事"
+
+msgid "Epics Roadmap"
+msgstr "å²è¯—故事路线图"
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr "利用å²è¯—故事(Epics),产å“线管ç†ä¼šå˜å¾—æ›´è½»æ¾ä¸”更高效"
+
msgid "Error Reporting and Logging"
msgstr "错误报告和日志记录"
-msgid "Error committing changes. Please try again."
-msgstr "æ交更改时出错。请å†è¯•ä¸€æ¬¡ã€‚"
+msgid "Error creating epic"
+msgstr "创建å²è¯—故事时出错"
msgid "Error fetching contributors data."
msgstr "获å–贡献者数æ®æ—¶å‡ºé”™ã€‚"
-msgid "Error fetching job trace"
-msgstr "获å–作业日志时出错"
-
msgid "Error fetching labels."
msgstr "获å–标记时出错。"
@@ -2144,6 +2734,9 @@ msgstr "加载分支数æ®å¤±è´¥ï¼Œè¯·é‡è¯•ã€‚"
msgid "Error loading last commit."
msgstr "加载最åŽä¸€æ¬¡æ交失败。"
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr "加载åˆå¹¶è¯·æ±‚时出错。"
@@ -2192,21 +2785,60 @@ msgstr "æ¯æœˆæ‰§è¡Œï¼ˆæ¯æœˆ 1 日凌晨 4 点)"
msgid "Every week (Sundays at 4:00am)"
msgstr "æ¯å‘¨æ‰§è¡Œï¼ˆå‘¨æ—¥å‡Œæ™¨ 4 点)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr "展开"
msgid "Expand all"
-msgstr ""
+msgstr "展开全部"
msgid "Expand sidebar"
msgstr "展开侧边æ "
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr "æµè§ˆç¾¤ç»„"
+
msgid "Explore projects"
msgstr "查看项目"
msgid "Explore public groups"
msgstr "æœç´¢å…¬å…±ç¾¤ç»„"
+msgid "External Classification Policy Authorization"
+msgstr "外部分类政策授æƒ"
+
+msgid "External authentication"
+msgstr "外部身份验è¯"
+
+msgid "External authorization denied access to this project"
+msgstr "外部授æƒæ‹’ç»è®¿é—®æ­¤é¡¹ç›®"
+
+msgid "External authorization request timeout"
+msgstr "外部授æƒè¯·æ±‚超时"
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr "分类标签"
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr "分类标签"
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr "未设置分类标签的时候,将使用默认的分类标签`%{default_label}`。"
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr "已失败"
@@ -2220,7 +2852,7 @@ msgid "Failed to check related branches."
msgstr "无法检查相关分支。"
msgid "Failed to remove issue from board, please try again."
-msgstr "无法从看æ¿ç§»é™¤é—®é¢˜ï¼Œè¯·é‡è¯•ã€‚"
+msgstr "无法从看æ¿ç§»é™¤è®®é¢˜ï¼Œè¯·é‡è¯•ã€‚"
msgid "Failed to remove the pipeline schedule"
msgstr "无法删除æµæ°´çº¿è®¡åˆ’"
@@ -2232,7 +2864,7 @@ msgid "Failure"
msgstr "失败"
msgid "Faster as it re-uses the project workspace (falling back to clone if it doesn't exist)"
-msgstr ""
+msgstr "速度更快,因其é‡ç”¨äº†é¡¹ç›®çš„工作空间(如果它ä¸å­˜åœ¨ï¼Œå°†å›žé€€åˆ°å…‹éš†ï¼‰"
msgid "Feb"
msgstr "二"
@@ -2249,6 +2881,12 @@ msgstr "文件"
msgid "Files (%{human_size})"
msgstr "文件(%{human_size})"
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr "填写下é¢çš„字段,å¯ç”¨<strong>%{enable_label}</strong>,然åŽç‚¹å‡»<strong>%{save_changes}</strong>"
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "按æ交消æ¯è¿‡æ»¤"
@@ -2258,6 +2896,12 @@ msgstr "按路径查找"
msgid "Find file"
msgstr "查找文件"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr "已完æˆ"
@@ -2267,15 +2911,39 @@ msgstr "首次推é€"
msgid "FirstPushedBy|pushed by"
msgstr "推é€è€…:"
-msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
+msgid "FogBugz Email"
msgstr ""
-msgid "For private projects, any member (guest or higher) can view pipelines and access job details (output logs and artifacts)"
+msgid "FogBugz Import"
msgstr ""
-msgid "For public projects, anyone can view pipelines and access job details (output logs and artifacts)"
+msgid "FogBugz Password"
msgstr ""
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr "字体颜色"
+
+msgid "Footer message"
+msgstr "页脚消æ¯"
+
+msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
+msgstr "对于内部项目,任何已登录的用户都å¯ä»¥æŸ¥çœ‹æµæ°´çº¿å¹¶è®¿é—®ä½œä¸šè¯¦æƒ…(输出日志和工件)"
+
+msgid "For private projects, any member (guest or higher) can view pipelines and access job details (output logs and artifacts)"
+msgstr "对于ç§æœ‰é¡¹ç›®ï¼Œä»»ä½•æˆå‘˜ï¼ˆè®¿å®¢æˆ–更高级别)都å¯ä»¥æŸ¥çœ‹æµæ°´çº¿å¹¶è®¿é—®ä½œä¸šè¯¦æƒ…(输出日志和工件)"
+
+msgid "For public projects, anyone can view pipelines and access job details (output logs and artifacts)"
+msgstr "对于公共项目,任何人都å¯ä»¥æŸ¥çœ‹æµæ°´çº¿å¹¶è®¿é—®ä½œä¸šè¯¦æƒ…(输出日志和工件)"
+
msgid "Fork"
msgid_plural "Forks"
msgstr[0] "派生"
@@ -2298,6 +2966,18 @@ msgstr "在.gitlab-ci.yml中å‘现错误:"
msgid "From %{provider_title}"
msgstr "æ¥è‡ª %{provider_title}"
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "从创建议题到部署至生产环境"
@@ -2314,11 +2994,206 @@ msgid "General"
msgstr "通用"
msgid "General pipelines"
-msgstr ""
+msgstr "一般æµæ°´çº¿"
msgid "Generate a default set of labels"
msgstr "生æˆä¸€ç»„默认的标记"
+msgid "Geo Nodes"
+msgstr "Geo 节点"
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr "Geoå…许您将您的GitLab实例å¤åˆ¶åˆ°å…¶ä»–地ç†ä½ç½®ã€‚"
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr "节点出现故障或æŸå。"
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr "节点è¿è¡Œç¼“æ…¢ã€è¶…è½½, 或者在åœæœºåŽåˆšåˆšæ¢å¤ã€‚"
+
+msgid "GeoNodes|Checksummed"
+msgstr "已校验"
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr "æ•°æ®ä»Ž %{timeago} 起过期"
+
+msgid "GeoNodes|Data replication lag"
+msgstr "æ•°æ®åº“åŒæ­¥æ»žåŽ"
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr "ç¦ç”¨èŠ‚点会åœæ­¢åŒæ­¥ã€‚确定继续?"
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr "与主存储é…ç½®ä¸ä¸€è‡´"
+
+msgid "GeoNodes|Failed"
+msgstr "失败"
+
+msgid "GeoNodes|Full"
+msgstr "全部"
+
+msgid "GeoNodes|GitLab version"
+msgstr "GitLab版本"
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr "GitLab版本与主节点版本ä¸ä¸€è‡´"
+
+msgid "GeoNodes|Health status"
+msgstr "è¿è¡ŒçŠ¶å†µçŠ¶æ€"
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr "游标处ç†çš„最åŽäº‹ä»¶ID"
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr "主节点中最新的事件ID"
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr "了解有关仓库校验和进度的详细信æ¯"
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr "了解更多关于仓库验è¯çš„ä¿¡æ¯"
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr "了解更多关于Wiki验è¯è¿›åº¦çš„ä¿¡æ¯"
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr "了解更多关于Wiki验è¯çš„ä¿¡æ¯"
+
+msgid "GeoNodes|Loading nodes"
+msgstr "载入节点"
+
+msgid "GeoNodes|Local LFS objects"
+msgstr "本地LFS对象"
+
+msgid "GeoNodes|Local attachments"
+msgstr "本地附件"
+
+msgid "GeoNodes|Local job artifacts"
+msgstr "本地作业产物"
+
+msgid "GeoNodes|New node"
+msgstr "新建节点"
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr "æˆåŠŸä¿®å¤èŠ‚点认è¯ã€‚"
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr "æˆåŠŸåˆ é™¤èŠ‚点。"
+
+msgid "GeoNodes|Not checksummed"
+msgstr "未校验"
+
+msgid "GeoNodes|Out of sync"
+msgstr "ä¸åŒæ­¥"
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr "删除节点会åœæ­¢åŒæ­¥ã€‚确定继续?"
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr "å¤åˆ¶æ§½ WAL"
+
+msgid "GeoNodes|Replication slots"
+msgstr "å¤åˆ¶æ§½"
+
+msgid "GeoNodes|Repositories"
+msgstr "仓库"
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr "已计算与主节点对应项验è¯æ ¡éªŒå’Œçš„仓库"
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr "已与主节点上对应项验è¯çš„仓库"
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr "仓库校验和进度"
+
+msgid "GeoNodes|Repository verification progress"
+msgstr "仓库验è¯è¿›åº¦"
+
+msgid "GeoNodes|Selective"
+msgstr "选择性"
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr "更改节点状æ€æ—¶å‘生错误"
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr "读å–节点信æ¯æ—¶å‘生错误"
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr "删除节点时å‘生错误"
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr "ä¿®å¤èŠ‚点时å‘生错误"
+
+msgid "GeoNodes|Storage config"
+msgstr "存储设置"
+
+msgid "GeoNodes|Sync settings"
+msgstr "åŒæ­¥è®¾ç½®"
+
+msgid "GeoNodes|Synced"
+msgstr "å·²åŒæ­¥"
+
+msgid "GeoNodes|Unused slots"
+msgstr "未使用的槽"
+
+msgid "GeoNodes|Unverified"
+msgstr "未验è¯"
+
+msgid "GeoNodes|Used slots"
+msgstr "已使用的槽"
+
+msgid "GeoNodes|Verified"
+msgstr "已验è¯"
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr "Wiki 校验和进度"
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr "Wiki 验è¯è¿›åº¦"
+
+msgid "GeoNodes|Wikis"
+msgstr "Wiki"
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr "已计算与主节点对应项验è¯æ ¡éªŒå’Œçš„Wiki"
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr "已与主节点上对应项验è¯çš„Wiki"
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr "当å‰Geo节点é…置使用ä¸å®‰å…¨çš„HTTP连接, 建议使用HTTPS。"
+
+msgid "Geo|All projects"
+msgstr "所有项目"
+
+msgid "Geo|File sync capacity"
+msgstr "文件åŒæ­¥å®¹é‡"
+
+msgid "Geo|Groups to synchronize"
+msgstr "需åŒæ­¥çš„群组"
+
+msgid "Geo|Projects in certain groups"
+msgstr "指定群组中的项目"
+
+msgid "Geo|Projects in certain storage shards"
+msgstr "特定存储片中的项目"
+
+msgid "Geo|Repository sync capacity"
+msgstr "仓库åŒæ­¥å®¹é‡"
+
+msgid "Geo|Select groups to replicate."
+msgstr "选择è¦å¤åˆ¶çš„群组。"
+
+msgid "Geo|Shards to synchronize"
+msgstr "需åŒæ­¥çš„存储片"
+
+msgid "Geo|Verification capacity"
+msgstr "校验能力"
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr "Git仓库URL"
@@ -2329,7 +3204,7 @@ msgid "Git storage health information has been reset"
msgstr "Git 存储è¿è¡ŒçŠ¶å†µä¿¡æ¯å·²é‡ç½®"
msgid "Git strategy for pipelines"
-msgstr ""
+msgstr "æµæ°´çº¿çš„Gitç­–ç•¥"
msgid "Git version"
msgstr "Git 版本"
@@ -2340,11 +3215,29 @@ msgstr "GitHub导入"
msgid "GitLab CI Linter has been moved"
msgstr "GitLab CI Linter已被转移"
+msgid "GitLab Geo"
+msgstr "GitLab Geo"
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr "Gitlab群组Runnerå¯ä»¥ç”¨æ¥è¿è¡Œç¾¤ç»„内所有项目的代ç ã€‚"
-msgid "GitLab Runner section"
-msgstr "GitLab Runner"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr "GitLab SSO 地å€"
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr "GitLabå°†è¿è¡ŒåŽå°ä»»åŠ¡ï¼Œç”Ÿæˆæ•°æ®åº“的匿å化CSV,并上传到预先设定的对象存储目录。"
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr "Gitaly"
@@ -2355,18 +3248,33 @@ msgstr "GitalyæœåŠ¡å™¨"
msgid "Gitaly|Address"
msgstr "地å€"
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr "返回"
msgid "Go back"
msgstr "返回"
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "跳转到派生项目"
msgid "GoToYourFork|Fork"
msgstr "跳转到派生项目"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Google 身份验è¯ä¸æ˜¯%{link_to_documentation}。如果您想使用此æœåŠ¡ï¼Œè¯·å’¨è¯¢æ‚¨çš„ GitLab 管ç†å‘˜ã€‚"
@@ -2376,18 +3284,72 @@ msgstr "了解ï¼"
msgid "Graph"
msgstr "图表"
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr "群组 CI/CD 设置"
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr "群组 ID"
msgid "Group Runners"
msgstr "群组Runner"
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr "群组维护者å¯ä»¥åœ¨é€šè¿‡ %{link} 注册群组级 Runner"
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr "从 %{dateWord} 起"
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr "载入路线图中"
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr "读å–å²è¯—故事时出错"
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æœç´¢åˆ°ä»»ä½•ç¬¦åˆæ¡ä»¶çš„å²è¯—故事"
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr "路线图显示了å²è¯—故事沿ç€æ—¶é—´çº¿çš„进展情况"
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "如需查看路线图,请将计划的开始或结æŸæ—¥æœŸæ·»åŠ åˆ°å½“å‰ç¾¤ç»„或其å­ç»„中的æŸä¸ªå²è¯—故事。在月视图中,åªæ˜¾ç¤ºä¸Šä¸ªæœˆï¼Œæœ¬æœˆä»¥åŠæŽ¥ä¸‹æ¥5个月的å²è¯—故事&ndash; 从 %{startDate} 至 %{endDate}."
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "如需查看路线图,请将计划的开始或结æŸæ—¥æœŸæ·»åŠ åˆ°å½“å‰ç¾¤ç»„或其å­ç»„中的æŸä¸ªå²è¯—故事。在季度视图中,åªæ˜¾ç¤ºä¸Šä¸ªå­£åº¦ï¼Œæœ¬å­£åº¦ä»¥åŠæŽ¥ä¸‹æ¥4个季度的å²è¯—故事&ndash; 从 %{startDate} 至 %{endDate}."
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "如需查看路线图,请将计划的开始或结æŸæ—¥æœŸæ·»åŠ åˆ°å½“å‰ç¾¤ç»„或其å­ç»„中的æŸä¸ªå²è¯—故事。在周视图中,åªæ˜¾ç¤ºä¸Šå‘¨ï¼Œæœ¬å‘¨ä»¥åŠæŽ¥ä¸‹æ¥å››å‘¨çš„å²è¯—故事&ndash; 从 %{startDate} 至 %{endDate}."
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–删除过滤器。在月视图中,åªæ˜¾ç¤ºä¸Šæœˆï¼Œæœ¬æœˆå’ŒæŽ¥ä¸‹æ¥çš„四个月的å²è¯—故事 &ndash; 从 %{startDate} 到 %{endDate} 。"
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–删除过滤器。在季度视图中,åªæ˜¾ç¤ºä¸Šä¸ªå­£åº¦ï¼Œæœ¬å­£åº¦å’ŒæŽ¥ä¸‹æ¥çš„四个季度的å²è¯—故事 &ndash; 从 %{startDate} 到 %{endDate} 。"
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–删除过滤器。在周视图中,åªæ˜¾ç¤ºä¸Šå‘¨ï¼Œæœ¬å‘¨å’ŒæŽ¥ä¸‹æ¥çš„四周的å²è¯—故事 &ndash; 从 %{startDate} 到 %{endDate} 。"
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr "直到 %{dateWord}"
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "ç¦æ­¢ä¸Žå…¶ä»–群组共享 %{group} 中的项目"
@@ -2412,9 +3374,33 @@ msgstr "无法ç¦ç”¨çˆ¶ç»„的“共享群组é”â€ï¼Œåªæœ‰çˆ¶ç¾¤ç»„的所有者
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "从 %{ancestor_group_name} 中删除共享群组é”"
-msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
+msgid "Groups"
msgstr ""
+msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
+msgstr "也å¯ä»¥é€šè¿‡åˆ›å»º %{subgroup_docs_link_start}å­ç¾¤ç»„æ¥åµŒå¥—群组%{subgroup_docs_link_end}。"
+
+msgid "GroupsDropdown|Frequently visited"
+msgstr "ç»å¸¸è®¿é—®çš„群组"
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr "您ç»å¸¸è®¿é—®çš„群组将出现在这里"
+
+msgid "GroupsDropdown|Loading groups"
+msgstr "加载群组中"
+
+msgid "GroupsDropdown|Search your groups"
+msgstr "æœç´¢æ‚¨çš„群组"
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr "å‘生了内部错误."
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æœç´¢åˆ°ç¬¦åˆæ¡ä»¶çš„群组"
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr "此功能需è¦æµè§ˆå™¨æœ¬åœ°å­˜å‚¨æ”¯æŒ"
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "群组是几个项目的集åˆã€‚"
@@ -2454,6 +3440,12 @@ msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æœç´¢åˆ°ä»»ä½•ç¬¦åˆçš„群组"
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰ä»»ä½•ç¾¤ç»„或项目符åˆæ‚¨çš„æœç´¢"
+msgid "Have your users email"
+msgstr "请让用户å‘é€ç”µå­é‚®ä»¶è‡³"
+
+msgid "Header message"
+msgstr "页头消æ¯"
+
msgid "Health Check"
msgstr "è¿è¡ŒçŠ¶å†µæ£€æŸ¥"
@@ -2486,7 +3478,7 @@ msgid_plural "Hide values"
msgstr[0] "éšè—值"
msgid "Hide whitespace changes"
-msgstr ""
+msgstr "éšè—空白å˜æ›´å†…容"
msgid "History"
msgstr "历å²"
@@ -2501,7 +3493,7 @@ msgid "I accept the|Terms of Service and Privacy Policy"
msgstr "æœåŠ¡æ¡æ¬¾å’Œéšç§æ”¿ç­–"
msgid "ID"
-msgstr ""
+msgstr "ID"
msgid "IDE|Commit"
msgstr "æ交"
@@ -2519,16 +3511,25 @@ msgid "IDE|Review"
msgstr "审阅"
msgid "Identifier"
-msgstr ""
+msgstr "身份标识"
msgid "Identities"
-msgstr ""
+msgstr "身份标识"
+
+msgid "Identity provider single sign on URL"
+msgstr "身份验è¯æ供商å•ç‚¹ç™»å½•URL"
msgid "If disabled, the access level will depend on the user's permissions in the project."
-msgstr ""
+msgstr "如果ç¦ç”¨ï¼Œåˆ™è®¿é—®çº§åˆ«å°†å–决于用户在项目中的æƒé™ã€‚"
msgid "If enabled"
-msgstr ""
+msgstr "如果已å¯ç”¨"
+
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr "如果å¯ç”¨ï¼Œåˆ™ä½¿ç”¨å¤–部æœåŠ¡ä¸Šçš„分类标签æ¥éªŒè¯å¯¹é¡¹ç›®çš„访问æƒé™ã€‚"
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr "如使用 GitHub,GitHubçš„æ交(commits)和拉å–请求(pull request) 页é¢å°†æ˜¾ç¤ºæµæ°´çº¿çŠ¶æ€ã€‚ %{more_info_link}"
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr "如果文件已存在,å¯ä»¥ä½¿ç”¨ä¸‹é¢çš„ %{link_to_cli} 推é€å®ƒä»¬ã€‚"
@@ -2548,29 +3549,81 @@ msgstr "滑动"
msgid "Import"
msgstr "导入"
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr "导入所有仓库"
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr "正在导入"
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr "从 GitHub 导入仓库"
msgid "Import repository"
msgstr "导入仓库"
+msgid "ImportButtons|Connect repositories from"
+msgstr "用以下方å¼è¿žæŽ¥å‚¨å­˜åº“"
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr "使用 GitLab ä¼ä¸šç‰ˆçš„增强议题看æ¿ã€‚"
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr "使用GitLab ä¼ä¸šç‰ˆè®®é¢˜æƒé‡å¸¦æ¥çš„增强议题管ç†åŠŸèƒ½ã€‚"
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr "使用GitLabä¼ä¸šç‰ˆå…¨å±€æœç´¢å¸¦æ¥çš„增强æœç´¢åŠŸèƒ½"
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr "包括所有用户必须接å—çš„æœåŠ¡æ¡æ¬¾å议和éšç§æ”¿ç­–。"
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
+msgstr "内è”"
+
+msgid "Install GitLab Runner"
msgstr ""
msgid "Install Runner on Kubernetes"
msgstr "在Kubernetes上安装Runner"
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "安装一个与 GitLab CI 兼容的 Runner"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] "实例"
msgid "Instance does not support multiple Kubernetes clusters"
msgstr "实例ä¸æ”¯æŒå¤šä¸ªKubernetes集群"
@@ -2579,7 +3632,7 @@ msgid "Integrations"
msgstr "导入所有仓库"
msgid "Integrations Settings"
-msgstr ""
+msgstr "集æˆè®¾ç½®"
msgid "Interested parties can even contribute by pushing commits if they want to."
msgstr "相关人员甚至å¯ä»¥é€šè¿‡æŽ¨é€æ交æ¥ä¸ºé¡¹ç›®ä½œå‡ºè´¡çŒ®ã€‚"
@@ -2596,8 +3649,11 @@ msgstr "循环周期"
msgid "Introducing Cycle Analytics"
msgstr "周期分æžç®€ä»‹"
-msgid "Issue Board"
-msgstr ""
+msgid "Issue Boards"
+msgstr "议题看æ¿"
+
+msgid "Issue board focus mode"
+msgstr "议题看æ¿èšç„¦æ¨¡å¼"
msgid "Issue events"
msgstr "议题事件"
@@ -2605,12 +3661,18 @@ msgstr "议题事件"
msgid "IssueBoards|Board"
msgstr "看æ¿"
+msgid "IssueBoards|Boards"
+msgstr "看æ¿"
+
msgid "Issues"
msgstr "议题"
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "议题å¯ä»¥æ˜¯ç¼ºé™·ï¼Œä»»åŠ¡æˆ–è¦è®¨è®ºçš„想法。此外,å¯ä»¥é€šè¿‡æœç´¢å’Œè¿‡æ»¤æ¥æŸ¥æ‰¾è®®é¢˜ã€‚"
+msgid "Issues closed"
+msgstr "议题已关闭"
+
msgid "Jan"
msgstr "一"
@@ -2618,7 +3680,7 @@ msgid "January"
msgstr "一月"
msgid "Job"
-msgstr ""
+msgstr "作业"
msgid "Job has been erased"
msgstr "作业已被删除"
@@ -2641,6 +3703,9 @@ msgstr "六月"
msgid "Koding"
msgstr "Koding"
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -2666,7 +3731,7 @@ msgid "Kubernetes service integration has been deprecated. %{deprecated_message_
msgstr "KubernetesæœåŠ¡é›†æˆå³å°†è¢«åœç”¨ã€‚ 请使用新的 <a href=\"%{url}\"/>Kubernetes集群</a> 页é¢%{deprecated_message_content} Kubernetes集群"
msgid "LFS"
-msgstr ""
+msgstr "LFS"
msgid "LFSStatus|Disabled"
msgstr "åœç”¨"
@@ -2680,12 +3745,18 @@ msgstr "标记"
msgid "Label actions dropdown"
msgstr "标记æ“作下拉èœå•"
+msgid "Label lists show all issues with the selected label."
+msgstr "标记列表显示具有所选标记的所有议题。"
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr "%{firstLabelName} +%{remainingLabelCount} 更多"
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr "%{labelsString}和 %{remainingLabelCount} 更多"
+msgid "LabelSelect|Labels"
+msgstr "标记"
+
msgid "Labels"
msgstr "标记"
@@ -2759,12 +3830,30 @@ msgstr "退出群组"
msgid "Leave project"
msgstr "退出项目"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr "许å¯è¯"
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr "列表"
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr "列出GitHub仓库"
+msgid "Loading contribution stats for group members"
+msgstr "加载群组æˆå‘˜çš„贡献统计信æ¯"
+
msgid "Loading the GitLab IDE..."
msgstr "加载GitLab IDE..."
@@ -2786,15 +3875,39 @@ msgstr "é”定到当å‰é¡¹ç›®"
msgid "Locked"
msgstr "å·²é”定"
+msgid "Locked Files"
+msgstr "å·²é”定文件"
+
msgid "Locked to current projects"
msgstr "å·²é”定到目å‰çš„项目"
-msgid "Login"
-msgstr "登录"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr "加é”å¯ä»¥é”定特定的文件或文件夹。"
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr "GitLab Geo å¯ä»¥åˆ›å»º GitLab 实例的åªè¯»é•œåƒ, 使得从远端克隆和拉å–大型代ç ä»“库的时间大大缩短,从而æ高团队æˆå‘˜çš„工作效率。"
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr ""
msgid "Manage all notifications"
msgstr "管ç†å…¨éƒ¨é€šçŸ¥"
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr "管ç†ç¾¤ç»„标记"
@@ -2804,6 +3917,27 @@ msgstr "管ç†æ ‡è®°"
msgid "Manage project labels"
msgstr "管ç†é¡¹ç›®æ ‡è®°"
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr "通过SAML管ç†ç¾¤ç»„æˆå‘˜ï¼Œè¿›ä¸€æ­¥æ高安全性。"
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr "三"
@@ -2828,18 +3962,30 @@ msgstr "中ä½æ•°"
msgid "Members"
msgstr "æˆå‘˜"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr "群组在登录您的群组时会跳转到此处。请从您的身份认è¯æ供商处获得该信æ¯ã€‚它å¯èƒ½å«åšâ€œSSOæœåŠ¡ä½ç½®ï¼ˆSSO Service Location)â€ï¼Œâ€œSAML令牌é¢å‘点(SAML Token Issuance Endpoint)â€æˆ–“SAML 2.0/W-Federation URLâ€ã€‚"
+
+msgid "Merge Request"
+msgstr "åˆå¹¶è¯·æ±‚"
+
msgid "Merge Request:"
msgstr "åˆå¹¶è¯·æ±‚:"
msgid "Merge Requests"
msgstr "åˆå¹¶è¯·æ±‚"
+msgid "Merge Requests created"
+msgstr "已创建åˆå¹¶è¯·æ±‚"
+
msgid "Merge events"
msgstr "åˆå¹¶äº‹ä»¶"
msgid "Merge request"
msgstr "åˆå¹¶è¯·æ±‚"
+msgid "Merge request approvals"
+msgstr "åˆå¹¶è¯·æ±‚批准"
+
msgid "Merge requests"
msgstr "åˆå¹¶è¯·æ±‚"
@@ -2847,22 +3993,22 @@ msgid "Merge requests are a place to propose changes you've made to a project an
msgstr "åˆå¹¶è¯·æ±‚用于æ出对项目的更改与他人讨论"
msgid "MergeRequests|Resolve this discussion in a new issue"
-msgstr ""
+msgstr "在新议题中解决此讨论"
msgid "MergeRequests|Saving the comment failed"
-msgstr ""
+msgstr "ä¿å­˜è¯„论失败"
msgid "MergeRequests|Toggle comments for this file"
-msgstr ""
+msgstr "切æ¢æ­¤æ–‡ä»¶çš„讨论"
msgid "MergeRequests|Updating discussions failed"
-msgstr ""
+msgstr "更新讨论失败"
msgid "MergeRequests|View file @ %{commitId}"
-msgstr ""
+msgstr "查看文件 @ %{commitId}"
msgid "MergeRequests|View replaced file @ %{commitId}"
-msgstr ""
+msgstr "查看已替æ¢æ–‡ä»¶ @ %{commitId}"
msgid "Merged"
msgstr "å·²åˆå¹¶"
@@ -2870,12 +4016,114 @@ msgstr "å·²åˆå¹¶"
msgid "Messages"
msgstr "消æ¯"
+msgid "Metrics"
+msgstr "指标"
+
msgid "Metrics - Influx"
msgstr "指标 - Influx"
msgid "Metrics - Prometheus"
msgstr "指标 - Prometheus"
+msgid "Metrics|Business"
+msgstr "业务"
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr "查看有关部署到环境的CI/CD文档"
+
+msgid "Metrics|Create metric"
+msgstr "创建指标"
+
+msgid "Metrics|Edit metric"
+msgstr "编辑指标"
+
+msgid "Metrics|Environment"
+msgstr "环境"
+
+msgid "Metrics|For grouping similar metrics"
+msgstr "用于分组类似指标"
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr "图表纵轴的标签。通常表示绘制å•ä½ã€‚水平轴(X轴)一般表示时间。"
+
+msgid "Metrics|Learn about environments"
+msgstr "了解环境"
+
+msgid "Metrics|Legend label (optional)"
+msgstr "图例标签(å¯é€‰ï¼‰"
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr "必须是有效的 PromQL 查询。"
+
+msgid "Metrics|Name"
+msgstr "å称"
+
+msgid "Metrics|New metric"
+msgstr "创建指标"
+
+msgid "Metrics|No deployed environments"
+msgstr "未部署的环境"
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr "Prometheus查询文档"
+
+msgid "Metrics|Query"
+msgstr "查询"
+
+msgid "Metrics|Response"
+msgstr "å“应"
+
+msgid "Metrics|System"
+msgstr "系统"
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr "获å–环境数æ®æ—¶å‡ºé”™ï¼Œè¯·é‡è¯•"
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr "获å–部署信æ¯æ—¶å‡ºé”™ã€‚"
+
+msgid "Metrics|There was an error getting environments information."
+msgstr "获å–环境信æ¯æ—¶å‡ºé”™ã€‚"
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr "类型"
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr "æ¥è‡ªPrometheus终端节点的æ„外部署数æ®å“应"
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr "æ¥è‡ªPrometheus终端节点的æ„外指标数æ®å“应"
+
+msgid "Metrics|Unit label"
+msgstr "å•ä½æ ‡ç­¾"
+
+msgid "Metrics|Used as a title for the chart"
+msgstr "用作图表的标题"
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr "用于查询返回å•ä¸ªç³»åˆ—时。如果返回多个系列,相应的图例标签将从返回数æ®ä¸­é€‰å–。"
+
+msgid "Metrics|Y-axis label"
+msgstr "Y轴标签"
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr "例如:HTTP 请求"
+
+msgid "Metrics|e.g. Requests/second"
+msgstr "例如:次请求/秒"
+
+msgid "Metrics|e.g. Throughput"
+msgstr "例如:åžåé‡"
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr "例如:速率(5分钟内所有http请求)"
+
+msgid "Metrics|e.g. req/sec"
+msgstr "例如:次请求/秒"
+
msgid "Milestone"
msgstr "里程碑"
@@ -2900,6 +4148,9 @@ msgstr "å°† %{milestoneTitle} å‡çº§ä¸ºç¾¤ç»„里程碑?"
msgid "Milestones|Promote Milestone"
msgstr "å‡çº§é‡Œç¨‹ç¢‘"
+msgid "Milestones|This action cannot be reversed."
+msgstr "该æ“作无法撤销。"
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "新建 SSH 公钥"
@@ -2912,21 +4163,36 @@ msgstr "关闭"
msgid "Monitoring"
msgstr "监控"
+msgid "Months"
+msgstr "月"
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr "更多æ“作"
+msgid "More info"
+msgstr "更多信æ¯"
+
msgid "More information"
msgstr "更多信æ¯"
msgid "More information is available|here"
msgstr "帮助文档"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr "移动"
msgid "Move issue"
msgstr "移动议题"
+msgid "Multiple issue boards"
+msgstr "多é‡è®®é¢˜çœ‹æ¿"
+
msgid "Name"
msgstr "姓å"
@@ -2934,6 +4200,9 @@ msgid "Name new label"
msgstr "命å新标记"
msgid "Name your individual key via a title"
+msgstr "通过标题命å您的个人密钥"
+
+msgid "Name:"
msgstr ""
msgid "Nav|Help"
@@ -2948,25 +4217,37 @@ msgstr "注册/登录"
msgid "Nav|Sign out and sign in with a different account"
msgstr "退出并登录到其他账å·"
-msgid "New Identity"
+msgid "Network"
+msgstr ""
+
+msgid "New"
+msgstr "新增事项"
+
+msgid "New Application"
+msgstr ""
+
+msgid "New Group"
msgstr ""
+msgid "New Identity"
+msgstr "新建身份标识"
+
msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "新建议题"
-msgid "New Kubernetes Cluster"
-msgstr "新建Kubernetes集群"
-
-msgid "New Kubernetes cluster"
-msgstr "新建Kubernetes集群"
-
msgid "New Label"
-msgstr ""
+msgstr "新标签"
msgid "New Pipeline Schedule"
msgstr "创建æµæ°´çº¿è®¡åˆ’"
+msgid "New Snippet"
+msgstr "新建代ç ç‰‡æ®µ"
+
+msgid "New Snippets"
+msgstr "新建代ç ç‰‡æ®µ"
+
msgid "New branch"
msgstr "新建分支"
@@ -2976,6 +4257,9 @@ msgstr "新分支ä¸å¯ç”¨"
msgid "New directory"
msgstr "新建目录"
+msgid "New epic"
+msgstr "新建å²è¯—故事"
+
msgid "New file"
msgstr "新建文件"
@@ -2983,7 +4267,7 @@ msgid "New group"
msgstr "新建群组"
msgid "New identity"
-msgstr ""
+msgstr "新身份标识"
msgid "New issue"
msgstr "新建议题"
@@ -2995,7 +4279,7 @@ msgid "New merge request"
msgstr "新建åˆå¹¶è¯·æ±‚"
msgid "New pipelines will cancel older, pending pipelines on the same branch"
-msgstr ""
+msgstr "æ–°æµæ°´çº¿å°†å–消åŒä¸€åˆ†æ”¯ä¸Šè¾ƒæ—§çš„待处ç†æµæ°´çº¿"
msgid "New project"
msgstr "新建项目"
@@ -3012,9 +4296,15 @@ msgstr "新建å­ç¾¤ç»„"
msgid "New tag"
msgstr "新建标签"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr "å¦"
+msgid "No Label"
+msgstr "无标记"
+
msgid "No assignee"
msgstr "未指派"
@@ -3034,23 +4324,47 @@ msgid "No file chosen"
msgstr "未选定任何文件"
msgid "No files found"
-msgstr ""
+msgstr "沒有找到文件"
msgid "No files found."
msgstr "没有找到文件。"
+msgid "No issues for the selected time period."
+msgstr "所选时间段没有议题。"
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr "所选时间段没有åˆå¹¶è¯·æ±‚。"
+
msgid "No merge requests found"
msgstr "找ä¸åˆ°åˆå¹¶è¯·æ±‚"
msgid "No messages were logged"
msgstr "未记录任何消æ¯"
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr "所选时间段没有推é€ã€‚"
+
msgid "No repository"
msgstr "没有仓库"
msgid "No schedules"
msgstr "没有计划"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "æ— "
@@ -3075,12 +4389,21 @@ msgstr "æ•°æ®ä¸è¶³"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "请注æ„,master分支自动å—ä¿æŠ¤ã€‚%{link_to_protected_branches}"
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr "æ示:作为GitLab管ç†å‘˜ï¼Œå¯ä»¥é…ç½® %{github_integration_link},这将å…许通过GitHub登录并å…许连接Github代ç ä»“库而ä¸éœ€è¦ä¸ªäººè®¿é—®ä»¤ç‰Œã€‚"
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "æ示:作为GitLab管ç†å‘˜ï¼Œå¯ä»¥é…ç½® %{github_integration_link},这将å…许通过GitHub登录并å…许导入Github代ç ä»“库而ä¸éœ€è¦ä¸ªäººè®¿é—®ä»¤ç‰Œã€‚"
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr "æ示:如GitLab管ç†å‘˜é…ç½® %{github_integration_link},将å…许通过GitHub登录并å…许连接Github代ç ä»“库而ä¸éœ€è¦ä¸ªäººè®¿é—®ä»¤ç‰Œã€‚"
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "æ示:如GitLab管ç†å‘˜é…ç½® %{github_integration_link},将å…许通过GitHub登录并å…许导入Github代ç ä»“库而ä¸éœ€è¦ä¸ªäººè®¿é—®ä»¤ç‰Œã€‚"
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "通知事件"
@@ -3153,6 +4476,9 @@ msgstr "å一月"
msgid "Number of access attempts"
msgstr "å°è¯•è®¿é—®æ¬¡æ•°"
+msgid "OK"
+msgstr "确定"
+
msgid "Oct"
msgstr "å"
@@ -3162,18 +4488,48 @@ msgstr "å月"
msgid "OfSearchInADropdown|Filter"
msgstr "过滤"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr "仓库导入åŽï¼Œå¯ä»¥é€šè¿‡ SSH 拉å–é•œåƒã€‚了解更多 %{ssh_link}"
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr "在线IDE集æˆè®¾ç½®ã€‚"
msgid "Only comments from the following commit are shown below"
-msgstr ""
+msgstr "下é¢ä»…显示æ¥è‡ªä»¥ä¸‹æ交的评论"
msgid "Only project members can comment."
msgstr "åªæœ‰é¡¹ç›®æˆå‘˜å¯ä»¥å‘表评论。"
+msgid "Oops, are you sure?"
+msgstr "å•Š~~, 确定å—?"
+
+msgid "Open"
+msgstr "打开"
+
msgid "Open in Xcode"
msgstr "用Xcode打开"
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr "已打开"
+
+msgid "Opened MR"
+msgstr "å¼€å¯çš„åˆå¹¶è¯·æ±‚"
+
+msgid "Opened issues"
+msgstr "å¼€å¯çš„议题"
+
msgid "OpenedNDaysAgo|Opened"
msgstr "创建于"
@@ -3183,15 +4539,24 @@ msgstr "打开一个新窗å£"
msgid "Operations"
msgstr "è¿ç»´"
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "æ“作"
msgid "Or you can choose one of the suggested colors below"
-msgstr ""
+msgstr "或者您å¯ä»¥é€‰æ‹©ä¸‹é¢çš„建议颜色之一"
msgid "Other Labels"
msgstr "其他标记"
+msgid "Other information"
+msgstr "其他信æ¯"
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr "å¦åˆ™ï¼Œå»ºè®®æ‚¨ä»Žä¸‹é¢çš„一个选项开始。"
@@ -3226,6 +4591,9 @@ msgid "Password"
msgstr "密ç "
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
+msgstr "粘贴您的 SSH 公钥,通常包å«åœ¨ '~/.ssh/id_rsa.pub' 文件中,并以 'ssh-rsa' 开头。ä¸è¦ä½¿ç”¨æ‚¨çš„ SSH ç§é’¥ã€‚"
+
+msgid "Path:"
msgstr ""
msgid "Pause"
@@ -3235,7 +4603,7 @@ msgid "Pending"
msgstr "等待中"
msgid "Per job. If a job passes this threshold, it will be marked as failed"
-msgstr ""
+msgstr "æ¯ä¸ªä½œä¸šã€‚如果作业超过此阈值,则会将其标记为失败"
msgid "Perform advanced options such as changing path, transferring, or removing the group."
msgstr "执行高级选项,例如更改路径,移动或删除群组。"
@@ -3261,8 +4629,11 @@ msgstr "æµæ°´çº¿è®¡åˆ’"
msgid "Pipeline Schedules"
msgstr "æµæ°´çº¿è®¡åˆ’"
+msgid "Pipeline quota"
+msgstr "æµæ°´çº¿é…é¢"
+
msgid "Pipeline triggers"
-msgstr ""
+msgstr "æµæ°´çº¿è§¦å‘器"
msgid "PipelineCharts|Failed:"
msgstr "失败:"
@@ -3403,7 +4774,13 @@ msgid "Pipeline|with stages"
msgstr "于阶段"
msgid "Plain diff"
-msgstr ""
+msgstr "文本差异"
+
+msgid "Planned finish date"
+msgstr "计划完æˆæ—¥æœŸ"
+
+msgid "Planned start date"
+msgstr "计划开始日期"
msgid "PlantUML"
msgstr "PlantUML"
@@ -3414,6 +4791,15 @@ msgstr "è¿è¡Œ"
msgid "Please accept the Terms of Service before continuing."
msgstr "请接å—æœåŠ¡æ¡æ¬¾ä»¥ç»§ç»­ã€‚"
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "请至少选择一个过滤器æ¥æŸ¥çœ‹ç»“æžœ"
@@ -3421,7 +4807,10 @@ msgid "Please solve the reCAPTCHA"
msgstr "请填写验è¯ç ã€‚"
msgid "Please try again"
-msgstr ""
+msgstr "请å†è¯•ä¸€æ¬¡"
+
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr "连接代ç ä»“库中,请ç¨å€™ã€‚å¯åœ¨ä»»æ„时刻刷新以获å–当å‰çŠ¶æ€ã€‚"
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "导入代ç ä»“库中,请ç¨å€™ã€‚å¯åœ¨ä»»æ„时刻刷新以获å–当å‰çŠ¶æ€ã€‚"
@@ -3432,6 +4821,9 @@ msgstr "å好设置"
msgid "Preferences|Navigation theme"
msgstr "导航主题"
+msgid "Primary"
+msgstr "主è¦"
+
msgid "Prioritize"
msgstr "优先"
@@ -3456,9 +4848,15 @@ msgstr "ç§æœ‰é¡¹ç›®å¯ä»¥åœ¨ä¸ªäººå称空间中创建:"
msgid "Profile"
msgstr "用户资料"
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr "å¸æˆ·å·²å®‰æŽ’被删除。"
+msgid "Profiles|Add key"
+msgstr "添加密钥"
+
msgid "Profiles|Change username"
msgstr "更改用户å"
@@ -3486,9 +4884,15 @@ msgstr "用户å无效"
msgid "Profiles|Path"
msgstr "路径"
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr "这看起æ¥ä¸åƒ SSH 公钥,确定è¦æ·»åŠ å®ƒå—?"
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "键入您的 %{confirmationValue} 以确认:"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr "通常以“ssh-rsa ...â€å¼€å¤´"
+
msgid "Profiles|Update username"
msgstr "更新用户å"
@@ -3507,6 +4911,9 @@ msgstr "您必须转移所有æƒæˆ–删除这些群组,然åŽæ‰èƒ½åˆ é™¤æ‚¨çš„
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "您的å¸æˆ·ç›®å‰æ˜¯è¿™äº›ç¾¤ç»„的所有者:"
+msgid "Profiles|e.g. My MacBook key"
+msgstr "例如: My MacBook Key"
+
msgid "Profiles|your account"
msgstr "您的å¸æˆ·"
@@ -3561,9 +4968,27 @@ msgstr "项目导出链接已过期。请从项目设置中é‡æ–°ç”Ÿæˆé¡¹ç›®å¯¼
msgid "Project export started. A download link will be sent by email."
msgstr "项目导出已开始。下载链接将通过电å­é‚®ä»¶å‘é€ã€‚"
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "订阅"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr "å…许创建项目"
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr "默认的群组项目创建ä¿æŠ¤"
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr "å¼€å‘人员 + 维护人员"
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr "维护人员"
+
+msgid "ProjectCreationLevel|No one"
+msgstr "ç¦æ­¢"
+
msgid "ProjectFileTree|Name"
msgstr "å称"
@@ -3573,9 +4998,39 @@ msgstr "从未"
msgid "ProjectLifecycle|Stage"
msgstr "阶段"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr "è”系管ç†å‘˜æ›´æ”¹æ­¤è®¾ç½®ã€‚"
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr "ä¿æŠ¤æ ‡ç­¾å¤±è´¥"
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr "更新标签失败ï¼"
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr "åªæœ‰å·²ç­¾ç½²æ交æ‰å¯ä»¥æŽ¨é€åˆ°æ­¤ä»“库。"
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr "此设置已应用于æœåŠ¡å™¨çº§åˆ«ï¼Œå¯ç”±ç®¡ç†å‘˜ä¿®æ”¹ã€‚"
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr "此设置应用于æœåŠ¡å™¨çº§åˆ«ï¼Œä½†å·²è¢«è¯¥é¡¹ç›®è¦†ç›–。"
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr "此设置将应用于所有项目,除éžè¢«ç®¡ç†å‘˜è¦†ç›–。"
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr "用户åªèƒ½é€šè¿‡è‡ªå·±å·²éªŒè¯çš„电å­é‚®ä»¶åœ°å€å°†æ交到此存储库中。"
+
msgid "Projects"
msgstr "项目"
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "ç»å¸¸è®¿é—®"
@@ -3594,8 +5049,35 @@ msgstr "å‘生了内部错误"
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æœç´¢åˆ°ç¬¦åˆæ¡ä»¶çš„项目"
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr "此功能需è¦æµè§ˆå™¨æ”¯æŒ localStorage"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
+msgstr ""
msgid "PrometheusDashboard|Time"
msgstr "时间"
@@ -3621,9 +5103,18 @@ msgstr "默认情况下,Prometheus ä¾¦å¬ â€˜http://localhost:9090’。ä¸å»º
msgid "PrometheusService|Common metrics"
msgstr "常用指标"
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr "常用指标会根æ®åº”用广泛的导出器指标库自动监控。"
+
+msgid "PrometheusService|Custom metrics"
+msgstr "自定义指标"
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "查找和é…置指标..."
+msgid "PrometheusService|Finding custom metrics..."
+msgstr "查找自定义指标..."
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "在群集上安装Prometheus"
@@ -3636,21 +5127,24 @@ msgstr "手动é…ç½®"
msgid "PrometheusService|Metrics"
msgstr "指标"
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr "没有环境å˜é‡"
msgid "PrometheusService|More information"
msgstr "更多的信æ¯"
+msgid "PrometheusService|New metric"
+msgstr "新建指标"
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr "Prometheus API 地å€ï¼Œä¾‹å¦‚ http://prometheus.example.com/"
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr "Prometheus正在被群集自动管ç†"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr "在首次部署到环境之åŽ, 这些指标æ‰ä¼šè¢«ç›‘控"
+
msgid "PrometheusService|Time-series monitoring service"
msgstr "时间åºåˆ—监控æœåŠ¡"
@@ -3675,11 +5169,26 @@ msgstr "å‡çº§åˆ°ç¾¤ç»„里程碑"
msgid "Promote to group label"
msgstr "å‡çº§åˆ°ç¾¤ç»„标记"
+msgid "Promotions|Don't show me this again"
+msgstr "ä¸å†æ˜¾ç¤º"
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr "å²è¯—故事(Epics) 让您å¯ä»¥é€šè¿‡è¿½è¸ªè·¨é¡¹ç›®å’Œé‡Œç¨‹ç¢‘共享主题的问题组,更有效地管ç†é¡¹ç›®ç»„åˆã€‚"
+
+msgid "Promotions|This feature is locked."
+msgstr "此功能已é”定"
+
+msgid "Promotions|Upgrade plan"
+msgstr "å‡çº§è®¢é˜…计划"
+
msgid "Protip:"
msgstr "专家æ示:"
msgid "Provider"
-msgstr ""
+msgstr "æ供者"
+
+msgid "Pseudonymizer data collection"
+msgstr "匿å化数æ®æ”¶é›†"
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "公开 - 群组和任何公共项目å¯ä»¥åœ¨æ²¡æœ‰ä»»ä½•èº«ä»½éªŒè¯çš„情况下查看。"
@@ -3688,7 +5197,10 @@ msgid "Public - The project can be accessed without any authentication."
msgstr "公开 - 无需任何身份验è¯å³å¯è®¿é—®è¯¥é¡¹ç›®ã€‚"
msgid "Public pipelines"
-msgstr ""
+msgstr "公共æµæ°´çº¿"
+
+msgid "Push Rules"
+msgstr "推é€è§„则"
msgid "Push events"
msgstr "推é€äº‹ä»¶"
@@ -3699,15 +5211,27 @@ msgstr "从命令行推é€é¡¹ç›®"
msgid "Push to create a project"
msgstr "通过推é€åˆ›å»ºé¡¹ç›®"
+msgid "PushRule|Committer restriction"
+msgstr "æ交者é™åˆ¶"
+
+msgid "Pushed"
+msgstr "已推é€"
+
+msgid "Pushes"
+msgstr "推é€"
+
+msgid "Quarters"
+msgstr "季度"
+
msgid "Quick actions can be used in the issues description and comment boxes."
msgstr "快速æ“作å¯ç”¨äºŽè®®é¢˜æ述和评论框。"
-msgid "Re-deploy"
-msgstr ""
-
msgid "Read more"
msgstr "进一步了解"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "自述文件"
@@ -3717,6 +5241,9 @@ msgstr "实时功能"
msgid "Reference:"
msgstr "引用:"
+msgid "Refresh"
+msgstr "刷新"
+
msgid "Register / Sign In"
msgstr "注册/登录"
@@ -3724,7 +5251,7 @@ msgid "Register and see your runners for this group."
msgstr "注册并查看当å‰ç¾¤ç»„çš„Runner。"
msgid "Register and see your runners for this project."
-msgstr ""
+msgstr "注册和查看这个项目的 Runner"
msgid "Registry"
msgstr "注册表"
@@ -3768,12 +5295,27 @@ msgstr "删除优先级"
msgid "Remove project"
msgstr "删除项目"
+msgid "Repair authentication"
+msgstr "ä¿®å¤è®¤è¯"
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr "从 URL 导入仓库"
+
msgid "Repository"
msgstr "仓库"
msgid "Repository Settings"
+msgstr "存储库设置"
+
+msgid "Repository URL"
msgstr ""
+msgid "Repository has no locks."
+msgstr "当å‰ä»“库无加é”文件。"
+
msgid "Repository maintenance"
msgstr "仓库维护"
@@ -3783,9 +5325,15 @@ msgstr "仓库镜åƒ"
msgid "Repository storage"
msgstr "仓库存储"
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr "选择"
+
msgid "Request Access"
msgstr "申请æƒé™"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "è¦æ±‚所有用户在访问GitLab时接å—æœåŠ¡æ¡æ¬¾å’Œéšç§æ”¿ç­–。"
@@ -3799,7 +5347,7 @@ msgid "Reset runners registration token"
msgstr "é‡ç½® Runner 注册令牌"
msgid "Resolve all discussions in new issue"
-msgstr ""
+msgstr "在新议题中解决所有讨论"
msgid "Resolve conflicts on source branch"
msgstr "在æºåˆ†æ”¯ä¸Šè§£å†³å†²çª"
@@ -3807,6 +5355,9 @@ msgstr "在æºåˆ†æ”¯ä¸Šè§£å†³å†²çª"
msgid "Resolve discussion"
msgstr "解决讨论"
+msgid "Response metrics (Custom)"
+msgstr "å“应指标(自定义)"
+
msgid "Resume"
msgstr "æ¢å¤"
@@ -3832,17 +5383,26 @@ msgstr "还原此åˆå¹¶è¯·æ±‚"
msgid "Review"
msgstr "审阅"
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr "查看在您的身份验è¯æ供商中é…ç½®æœåŠ¡æ供商的æµç¨‹ - 在这里,GitLab是“æœåŠ¡æ供商â€æˆ–“ä¾èµ–æ–¹â€ã€‚"
+
msgid "Reviewing"
msgstr "审阅中"
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr "审核(åˆå¹¶è¯·æ±‚ !%{mergeRequestId})"
-msgid "Rollback"
+msgid "Revoke"
msgstr ""
+msgid "Roadmap"
+msgstr "路线图"
+
+msgid "Run CI/CD pipelines for external repositories"
+msgstr "使用外部仓库的CI/CDæµæ°´çº¿"
+
msgid "Runner token"
-msgstr ""
+msgstr "Runner 令牌"
msgid "Runners"
msgstr "Runner"
@@ -3856,13 +5416,31 @@ msgstr "Runnerå¯ä»¥æ”¾åœ¨ä¸åŒçš„用户ã€æœåŠ¡å™¨ï¼Œç”šè‡³æœ¬åœ°æœºå™¨ä¸Šã€‚
msgid "Running"
msgstr "è¿è¡Œä¸­"
+msgid "SAML SSO"
+msgstr "SAML SSO(å•ç‚¹ç™»å½•)"
+
+msgid "SAML SSO for %{group_name}"
+msgstr "群组%{group_name} 的 SAML SSO"
+
+msgid "SAML Single Sign On"
+msgstr "SAML å•ç‚¹ç™»å½•"
+
+msgid "SAML Single Sign On Settings"
+msgstr "SAML å•ç‚¹ç™»å½•è®¾ç½®"
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr "SAML令牌签åè¯ä¹¦çš„SHA1指纹。请从身份验è¯æ供商处获å–(也å¯ä»¥è¢«ç§°ä¸ºâ€œæŒ‡çº¹â€ï¼‰ã€‚"
+
msgid "SSH Keys"
msgstr "SSH 密钥"
msgid "SSL Verification"
-msgstr ""
+msgstr "SSL验è¯"
msgid "Save"
+msgstr "ä¿å­˜"
+
+msgid "Save application"
msgstr ""
msgid "Save changes"
@@ -3886,6 +5464,15 @@ msgstr "日程"
msgid "Scheduling Pipelines"
msgstr "æµæ°´çº¿è®¡åˆ’"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr "指定范围的议题看æ¿"
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr "滚动到底部"
@@ -3925,6 +5512,21 @@ msgstr "é‡ç½®å¤±è´¥ä¿¡æ¯ç­‰å¾…时间(秒)"
msgid "Seconds to wait for a storage access attempt"
msgstr "等待存储访问å°è¯•æ—¶é—´(秒)"
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr "安全仪表盘"
+
+msgid "Security report"
+msgstr "安全报告"
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr "监控代ç ä¸­çš„æ¼æ´ž"
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr "æµæ°´çº¿ %{pipelineLink} 已触å‘"
+
msgid "Select"
msgstr "选择"
@@ -3955,12 +5557,21 @@ msgstr "按项目和地域选择实例类型"
msgid "Select project to choose zone"
msgstr "按项目选择地域"
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr "选择æºåˆ†æ”¯"
msgid "Select target branch"
msgstr "选择目标分支"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr "选择性åŒæ­¥"
+
msgid "Send email"
msgstr "å‘é€ç”µå­é‚®ä»¶"
@@ -3973,9 +5584,15 @@ msgstr "ä¹æœˆ"
msgid "Server version"
msgstr "æœåŠ¡å™¨ç‰ˆæœ¬"
+msgid "Service Desk"
+msgstr "æœåŠ¡å°"
+
msgid "Service Templates"
msgstr "æœåŠ¡æ¨¡æ¿"
+msgid "Service URL"
+msgstr "æœåŠ¡ URL"
+
msgid "Session expiration, projects limit and attachment size."
msgstr "会è¯æœ‰æ•ˆæœŸï¼Œé¡¹ç›®é™åˆ¶åŠé™„件大å°ã€‚"
@@ -4000,6 +5617,9 @@ msgstr "é…ç½® CI/CD"
msgid "Set up Koding"
msgstr "设置 Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr "æ ¹æ®%{docsLinkStart}文档%{icon}%{docsLinkEnd}设置断言/属性/声明(email,first_name,last_name)和NameID"
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "设置密ç "
@@ -4012,9 +5632,24 @@ msgstr "自动创建专用Runner"
msgid "Share"
msgstr "分享"
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr "分享<strong>%{sso_label}</strong> 给组员,以便他们å¯ä»¥é€šè¿‡æ‚¨çš„身份æ供商登录您的群组"
+
msgid "Shared Runners"
msgstr "共享Runner"
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr "通过é‡ç½®æ­¤å‘½å空间的æµæ°´çº¿åˆ†é’Ÿæ•°ï¼Œå½“å‰ä½¿ç”¨çš„分钟数将被归零。"
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr "é‡ç½®æµæ°´çº¿åˆ†é’Ÿæ•°"
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr "é‡ç½®å·²ç”¨æµæ°´çº¿åˆ†é’Ÿæ•°"
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr "显示相关命令"
@@ -4022,10 +5657,10 @@ msgid "Show complete raw log"
msgstr "显示完整的原始日志"
msgid "Show latest version"
-msgstr ""
+msgstr "显示最新版本"
msgid "Show latest version of the diff"
-msgstr ""
+msgstr "显示最新版本的差异"
msgid "Show parent pages"
msgstr "查看上级页é¢"
@@ -4034,15 +5669,39 @@ msgid "Show parent subgroups"
msgstr "查看上级å­ç¾¤ç»„"
msgid "Show whitespace changes"
-msgstr ""
+msgstr "显示空白å˜æ›´å†…容"
msgid "Showing %d event"
msgid_plural "Showing %d events"
msgstr[0] "显示 %d 个事件"
msgid "Side-by-side"
+msgstr "并排"
+
+msgid "Sidebar|Change weight"
+msgstr "编辑æƒé‡"
+
+msgid "Sidebar|None"
+msgstr "æ— "
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr "åªå…许使用数字字符"
+
+msgid "Sidebar|Weight"
+msgstr "æƒé‡"
+
+msgid "Sign in"
msgstr ""
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr "登录到 %{group_name}"
+
+msgid "Sign in with Single Sign-On"
+msgstr "使用å•ç‚¹ç™»å½•(SSO)进行登录"
+
msgid "Sign out"
msgstr "退出"
@@ -4055,8 +5714,11 @@ msgstr "注册é™åˆ¶"
msgid "Size and domain settings for static websites"
msgstr "é™æ€ç½‘站的大å°å’ŒåŸŸè®¾ç½®"
+msgid "Slack application"
+msgstr "Slack应用"
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
-msgstr ""
+msgstr "更慢,但能确ä¿é¡¹ç›®å·¥ä½œç©ºé—´ä¸ŽåŽŸå§‹ç‰ˆæœ¬ä¸€è‡´ï¼›å› å…¶å¯¹æ¯ä¸ªä½œä¸šå‡ä»Žå¤´å¼€å§‹å…‹éš†ä»“库"
msgid "Snippets"
msgstr "代ç ç‰‡æ®µ"
@@ -4068,13 +5730,19 @@ msgid "Something went wrong on our end."
msgstr "出错了,抱歉。"
msgid "Something went wrong on our end. Please try again!"
-msgstr ""
+msgstr "æœåŠ¡å™¨ç«¯å‡ºçŽ°é—®é¢˜ï¼Œè¯·é‡è¯•ã€‚"
msgid "Something went wrong when toggling the button"
msgstr "点击按钮时出错"
msgid "Something went wrong while closing the %{issuable}. Please try again later"
-msgstr ""
+msgstr "关闭 %{issuable} 时出错。请ç¨åŽé‡è¯•"
+
+msgid "Something went wrong while fetching assignees list"
+msgstr "获å–指派人列表时å‘生错误"
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr "获å–群组æˆå‘˜è´¡çŒ®æ—¶å‡ºé”™"
msgid "Something went wrong while fetching the projects."
msgstr "拉å–项目时å‘生错误。"
@@ -4083,14 +5751,17 @@ msgid "Something went wrong while fetching the registry list."
msgstr "拉å–注册表列表时å‘生错误。"
msgid "Something went wrong while reopening the %{issuable}. Please try again later"
-msgstr ""
+msgstr "é‡æ–°å¼€å¯ %{issuable} 时出错。请ç¨åŽå†è¯•"
msgid "Something went wrong while resolving this discussion. Please try again."
-msgstr ""
+msgstr "解决当å‰è®¨è®ºæ—¶å‡ºé”™ï¼Œè¯·é‡è¯•ã€‚"
msgid "Something went wrong. Please try again."
msgstr "出现错误。请é‡è¯•ã€‚"
+msgid "Sorry, no epics matched your search"
+msgstr "对ä¸èµ·ï¼Œæ²¡æœ‰æœç´¢åˆ°ä»»ä½•ç¬¦åˆæ¡ä»¶çš„å²è¯—故事"
+
msgid "Sort by"
msgstr "排åº"
@@ -4133,6 +5804,9 @@ msgstr "最近更新"
msgid "SortOptions|Least popular"
msgstr "最ä¸å—欢迎"
+msgid "SortOptions|Less weight"
+msgstr "é™ä½Žæƒé‡"
+
msgid "SortOptions|Milestone"
msgstr "里程碑"
@@ -4142,6 +5816,9 @@ msgstr "里程碑截止日期"
msgid "SortOptions|Milestone due soon"
msgstr "å³å°†æˆªæ­¢çš„里程碑"
+msgid "SortOptions|More weight"
+msgstr "增加æƒé‡"
+
msgid "SortOptions|Most popular"
msgstr "最å—欢迎"
@@ -4181,6 +5858,9 @@ msgstr "ç¨åŽå¼€å§‹"
msgid "SortOptions|Start soon"
msgstr "现在开始"
+msgid "SortOptions|Weight"
+msgstr "æƒé‡"
+
msgid "Source"
msgstr "æº"
@@ -4212,7 +5892,7 @@ msgid "Stage"
msgstr "阶段"
msgid "Stage & Commit"
-msgstr ""
+msgstr "æš‚å­˜ & æ交"
msgid "Stage all changes"
msgstr "暂存全部更改"
@@ -4253,9 +5933,15 @@ msgstr "å·²å¯åŠ¨"
msgid "Starts at (UTC)"
msgstr "开始于(UTC)"
+msgid "State your message to activate"
+msgstr "输入消æ¯ä»¥æ¿€æ´»"
+
msgid "Status"
msgstr "状æ€"
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr "åœæ­¢å½“å‰çŽ¯å¢ƒ"
@@ -4265,9 +5951,18 @@ msgstr "å·²åœæ­¢"
msgid "Storage"
msgstr "存储"
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr "å­ç¾¤ç»„"
+msgid "Submit as spam"
+msgstr "垃圾信æ¯ä¸¾æŠ¥"
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr "订阅"
@@ -4280,9 +5975,21 @@ msgstr "在项目级别订阅"
msgid "Switch branch/tag"
msgstr "切æ¢åˆ†æ”¯/标签"
+msgid "Sync information"
+msgstr "åŒæ­¥ä¿¡æ¯"
+
msgid "System Hooks"
msgstr "系统钩å­"
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr "系统页头和页尾:"
+
+msgid "System metrics (Custom)"
+msgstr "系统指标(自定义)"
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] "标签(%{tag_count})"
@@ -4378,13 +6085,22 @@ msgid "Terms of Service and Privacy Policy"
msgstr "æœåŠ¡æ¡æ¬¾å’Œéšç§æ”¿ç­–"
msgid "Test coverage parsing"
-msgstr ""
+msgstr "测试覆盖率解æž"
+
+msgid "Thanks! Don't show me this again"
+msgstr "ä¸å†æ˜¾ç¤º"
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr "GitLab 中的高级全局æœç´¢åŠŸèƒ½æ˜¯ä¸€ä¸ªå¼ºå¤§ä¸”节çœæ‚¨çš„时间的æœç´¢æœåŠ¡ã€‚您å¯ä»¥æœç´¢å…¶ä»–团队的代ç ä»¥å¸®åŠ©æ‚¨å®Œå–„自己项目中的代ç ã€‚从而é¿å…创建é‡å¤çš„代ç æˆ–浪费时间。"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
-msgstr "议题跟踪用于管ç†éœ€è¦æ”¹è¿›æˆ–者解决的问题"
+msgstr "议题跟踪用于管ç†éœ€æ±‚改进或者解决的问题"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
-msgstr "议题跟踪用于管ç†éœ€è¦æ”¹è¿›æˆ–者解决的问题。请注册或登录åŽä¸ºå½“å‰é¡¹ç›®åˆ›å»ºè®®é¢˜ã€‚"
+msgstr "议题跟踪用于管ç†éœ€æ±‚改进或者解决的问题。请注册或登录åŽä¸ºå½“å‰é¡¹ç›®åˆ›å»ºè®®é¢˜ã€‚"
+
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr "在需è¦ç›¸äº’ TLS 与外部授æƒæœåŠ¡é€šä¿¡æ—¶ä½¿ç”¨çš„ X509 è¯ä¹¦ã€‚如果ä¿ç•™ä¸ºç©º, 则在访问 HTTPS æ—¶ä»ç„¶éªŒè¯æœåŠ¡å™¨è¯ä¹¦ã€‚"
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "ç¼–ç é˜¶æ®µæ¦‚述了从第一次æ交到创建åˆå¹¶è¯·æ±‚的时间。创建第一个åˆå¹¶è¯·æ±‚åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
@@ -4392,6 +6108,9 @@ msgstr "ç¼–ç é˜¶æ®µæ¦‚述了从第一次æ交到创建åˆå¹¶è¯·æ±‚的时间。
msgid "The collection of events added to the data gathered for that stage."
msgstr "与该阶段相关的事件集åˆã€‚"
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr "该连接将在 %{timeout}åŽè¶…时。如仓库导入耗时超过该时间,请使用克隆/推é€ç»„åˆã€‚"
+
msgid "The fork relationship has been removed."
msgstr "派生关系已被删除。"
@@ -4407,11 +6126,14 @@ msgstr "文件大å°é™åˆ¶ä¸º 200KB。"
msgid "The number of attempts GitLab will make to access a storage."
msgstr "GitLab 访问存储的次数。"
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
-msgstr "GitLab 将完全阻止访问存储的故障次数。å¯ä»¥åœ¨ç®¡ç†ç•Œé¢%{link_to_health_page}或使用%{api_documentation_link}é‡ç½®æ•…障次数。"
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
+msgstr "解密ç§é’¥æ‰€éœ€çš„密ç çŸ­è¯­ã€‚该项为å¯é€‰é¡¹, 并且内容被加密存储。"
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
-msgstr ""
+msgstr "CIé…置文件的路径。默认为 <code>.gitlab-ci.yml</code>"
msgid "The phase of the development lifecycle."
msgstr "项目生命周期中的å„个阶段。"
@@ -4419,6 +6141,9 @@ msgstr "项目生命周期中的å„个阶段。"
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "计划阶段概述了从议题添加到日程到推é€é¦–次æ交的时间。当首次推é€æ交åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr "æ供客户端è¯ä¹¦æ—¶ä½¿ç”¨çš„ç§é’¥ã€‚该值被加密存储。"
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "生产阶段概述了从创建一个议题到将代ç éƒ¨ç½²åˆ°ç”Ÿäº§çŽ¯å¢ƒçš„总时间。当完æˆæƒ³æ³•åˆ°éƒ¨ç½²ç”Ÿäº§çš„循环,数æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
@@ -4428,6 +6153,9 @@ msgstr "该项目å…许已登录的用户访问。"
msgid "The project can be accessed without any authentication."
msgstr "该项目å…许任何人访问。"
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr "匿å化数æ®æœé›†å·²ç¦ç”¨ã€‚该功能å¯ç”¨æ—¶ï¼ŒGitLab会è¿è¡ŒåŽå°ä»»åŠ¡ï¼Œç”Ÿæˆæ•°æ®åº“的匿å化CSV,并上传到预先设定的对象存储目录。"
+
msgid "The repository for this project does not exist."
msgstr "此项目的仓库ä¸å­˜åœ¨ã€‚"
@@ -4440,8 +6168,11 @@ msgstr "该仓库必须å¯é€šè¿‡<code>http://</code>, <code>https://</code> 或
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "审阅阶段概述了从创建åˆå¹¶è¯·æ±‚到被åˆå¹¶çš„时间。当创建第一个åˆå¹¶è¯·æ±‚åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr "路线图显示了å²è¯—故事沿ç€æ—¶é—´çº¿çš„进展情况"
+
msgid "The secure token used by the Runner to checkout the project"
-msgstr ""
+msgstr "Runner用于签出项目的安全令牌"
msgid "The staging stage shows the time between merging the MR and deploying code to the production environment. The data will be automatically added once you deploy to production for the first time."
msgstr "预å‘布阶段概述了从åˆå¹¶è¯·æ±‚被åˆå¹¶åˆ°éƒ¨ç½²è‡³ç”Ÿäº§çŽ¯å¢ƒçš„总时间。首次部署到生产环境åŽï¼Œæ•°æ®å°†è‡ªåŠ¨æ·»åŠ åˆ°æ­¤å¤„。"
@@ -4455,12 +6186,18 @@ msgstr "GitLab å°†ä¿æŒå¤±è´¥ä¿¡æ¯çš„时间(秒)。在此期间ä¸å‘生故障
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr "GitLab å°†å°è¯•è®¿é—®å­˜å‚¨çš„时间(秒)。在此时间之åŽå°†å¼•å‘超时错误。"
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
-msgstr "存储检查之间的时间间隔(秒)。如上次检查尚未完æˆï¼ŒGitLab将跳过当å‰æ£€æŸ¥ã€‚"
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
+msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "该阶段æ¯æ¡æ•°æ®æ‰€èŠ±çš„时间"
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "中ä½æ•°æ˜¯ä¸€ä¸ªæ•°åˆ—中最中间的值。例如在 3ã€5ã€9 之间,中ä½æ•°æ˜¯ 5。在 3ã€5ã€7ã€8 之间,中ä½æ•°æ˜¯ (5 + 7)/ 2 = 6。"
@@ -4468,7 +6205,7 @@ msgid "There are no issues to show"
msgstr "当å‰æ— è®®é¢˜"
msgid "There are no labels yet"
-msgstr ""
+msgstr "ç›®å‰è¿˜æ²¡æœ‰æ ‡ç­¾"
msgid "There are no merge requests to show"
msgstr "当å‰æ— åˆå¹¶è¯·æ±‚"
@@ -4476,12 +6213,6 @@ msgstr "当å‰æ— åˆå¹¶è¯·æ±‚"
msgid "There are problems accessing Git storage: "
msgstr "访问 Git 存储时出现问题:"
-msgid "There was an error loading jobs"
-msgstr "加载作业时å‘生错误"
-
-msgid "There was an error loading latest pipeline"
-msgstr "加载最åŽä¸€æ¡æµæ°´çº¿æ—¶å‘生错误"
-
msgid "There was an error loading users activity calendar."
msgstr "加载用户活动日历时出错。"
@@ -4503,15 +6234,33 @@ msgstr "å–消订阅此标记时出错。"
msgid "They can be managed using the %{link}."
msgstr "他们å¯ä»¥é€šè¿‡ %{link} 进行管ç†ã€‚"
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr "æ­¤GitLab实例尚未æ供任何共享Runner。管ç†å‘˜å¯ä»¥åœ¨ç®¡ç†åŒºåŸŸä¸­æ³¨å†Œå…±äº«Runner。"
-msgid "This diff is collapsed."
+msgid "This application was created by %{link_to_owner}."
msgstr ""
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
+msgid "This diff is collapsed."
+msgstr "此差异已折å ã€‚"
+
msgid "This directory"
msgstr "当å‰ç›®å½•"
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr "此群组å…许您使用%{group_name} å•ç‚¹ç™»å½•å¸æˆ·ç™»å½•ã€‚这将会é‡å®šå‘到外部登录页é¢ã€‚"
+
msgid "This group does not provide any group Runners yet."
msgstr "该群组未æ供任何群组Runner。"
@@ -4522,7 +6271,7 @@ msgid "This is the author's first Merge Request to this project."
msgstr "这是作者为当å‰é¡¹ç›®è´¡çŒ®çš„第一个åˆå¹¶è¯·æ±‚。"
msgid "This issue is confidential"
-msgstr "当å‰é—®é¢˜ä¸ºç§å¯†é—®é¢˜"
+msgstr "当å‰è®®é¢˜ä¸ºæœºå¯†è®®é¢˜"
msgid "This issue is confidential and locked."
msgstr "这个是机密且已é”定的议题。"
@@ -4582,10 +6331,16 @@ msgid "This repository"
msgstr "当å‰ä»“库"
msgid "This source diff could not be displayed because it is too large."
-msgstr ""
+msgstr "此代ç å·®å¼‚无法显示,因为它太大了。"
msgid "This user has no identities"
-msgstr ""
+msgstr "该用户没有身份标识"
+
+msgid "This will delete the custom metric, Are you sure?"
+msgstr "æ­¤æ“作将删除自定义指标,确定继续å—?"
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr "这些电å­é‚®ä»¶è‡ªåŠ¨ç”Ÿæˆä¸ºè®®é¢˜(评论生æˆä¸ºç”µå­é‚®ä»¶ä¼šè¯)并在此处列出。"
msgid "Time before an issue gets scheduled"
msgstr "议题被列入日程表的时间"
@@ -4596,6 +6351,9 @@ msgstr "开始进行编ç å‰çš„时间"
msgid "Time between merge request creation and merge/close"
msgstr "从创建åˆå¹¶è¯·æ±‚到被åˆå¹¶æˆ–关闭的时间"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr "GitLab等待外部æœåŠ¡çš„å“应时间(秒)。当æœåŠ¡æ²¡æœ‰åŠæ—¶å“应时,访问将被拒ç»ã€‚"
+
msgid "Time remaining"
msgstr "剩余时间:"
@@ -4744,7 +6502,7 @@ msgid "Timeago|right now"
msgstr "ç«‹å³"
msgid "Timeout"
-msgstr ""
+msgstr "超时"
msgid "Time|hr"
msgid_plural "Time|hrs"
@@ -4760,10 +6518,28 @@ msgstr "秒"
msgid "Tip:"
msgstr "æ示:"
+msgid "Title"
+msgstr "标题"
+
msgid "To GitLab"
msgstr "到GitLab"
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
+msgstr "è¦æ·»åŠ ä¸€ä¸ª SSH 密钥, æ‚¨éœ€è¦ %{generate_link_start} 生æˆä¸€ä¸ª %{link_end} 或使用一个 %{existing_link_start} 现有的 key%{link_end}。"
+
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr "å¯ä»¥ä½¿ç”¨ %{personal_access_token_link} 连接GitHub仓库。当创建个人访问令牌时,需è¦é€‰æ‹© <code>repo</code> 范围,以显示å¯ä¾›è¿žæŽ¥çš„公共和ç§æœ‰çš„仓库列表。"
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr "è¦è¿žæŽ¥GitHub存储库,首先需è¦æŽˆæƒGitLab访问列表中的GitHub仓库:"
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr "如è¦è¿žæŽ¥SVN仓库,请查看 %{svn_link}。"
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
msgstr ""
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
@@ -4775,21 +6551,45 @@ msgstr "è¦å¯¼å…¥GitHub仓库,首先需è¦æŽˆæƒGitLab访问列表中的GitHub
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "è¦å¯¼å…¥SVN仓库,请查看 %{svn_link}。"
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr "è¦ä»…为外部仓库使用CI / CD功能时,请选择</strong>使用外部仓库è¿è¡ŒCI/CD<strong>。"
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr "通过Azure,Okta,Onelogin,Ping Identity或自定义SAML 2.0等身份验è¯ç¨‹åºä¸ºæ‚¨çš„群组设置SAML身份验è¯ï¼š"
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr "è¦å¼€å§‹æ‰§è¡Œä»»åŠ¡ï¼Œè¯·æŠŠRunner加到群组中"
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr "如需验è¯GitLab CI设置,请访问当å‰é¡¹ç›®çš„'CI/CD → æµæ°´çº¿',然åŽç‚¹å‡»'CI Lint'按钮。"
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr "如需查看路线图,请将计划的开始或结æŸæ—¥æœŸæ·»åŠ åˆ°å½“å‰ç¾¤ç»„或其å­ç»„中的æŸä¸ªå²è¯—故事。åªæ˜¾ç¤ºè¿‡åŽ»3个月和接下æ¥3个月的å²è¯—故事。"
+
+msgid "To widen your search, change or remove filters."
+msgstr "需è¦æ‰©å¤§æœç´¢èŒƒå›´ï¼Œè¯·æ›´æ”¹æˆ–移除过滤æ¡ä»¶ã€‚"
+
msgid "Todo"
msgstr "待办事项"
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr "切æ¢ä¾§è¾¹æ "
msgid "Toggle discussion"
msgstr "开关讨论"
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr "切æ¢è¾¹æ "
@@ -4800,7 +6600,10 @@ msgid "ToggleButton|Toggle Status: ON"
msgstr "切æ¢çŠ¶æ€ï¼šå¼€å¯"
msgid "Too many changes to show."
-msgstr ""
+msgstr "è¦æ˜¾ç¤ºçš„å˜æ›´å¤ªå¤šã€‚"
+
+msgid "Total Contributions"
+msgstr "贡献总计"
msgid "Total Time"
msgstr "总时间"
@@ -4811,21 +6614,42 @@ msgstr "所有æ交和åˆå¹¶çš„总测试时间"
msgid "Total: %{total}"
msgstr "总计:%{total}"
+msgid "Track activity with Contribution Analytics."
+msgstr "通过贡献度分æžäº†è§£ç”¨æˆ·æ´»è·ƒåº¦ã€‚"
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr "在ä¸åŒé¡¹ç›®å’Œé‡Œç¨‹ç¢‘中跟踪具有åŒä¸€ä¸»é¢˜çš„议题组"
+
msgid "Track time with quick actions"
msgstr "使用快æ·æ“作æ¥ç»Ÿè®¡å·¥æ—¶"
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr "触å‘此手动æ“作"
msgid "Triggers can force a specific branch or tag to get rebuilt with an API call. These tokens will impersonate their associated user including their access to projects and their project permissions."
-msgstr ""
+msgstr "触å‘器å¯ä»¥é€šè¿‡ API 调用使特定的分支或标记被é‡æ–°æž„建,这些 token å¯ä»£è¡¨ä¸Žå…¶å…³è”的用户(包括该用户对项目的访问æƒé™ï¼‰"
msgid "Try again"
msgstr "请é‡è¯•"
+msgid "Turn on Service Desk"
+msgstr "å¯ç”¨æœåŠ¡å°"
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr "无法加载差异。 %{button_try_again}"
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr "由于\"%{reason}\"的原因,您暂时ä¸èƒ½è¿›å…¥é…置了SAML 的群组"
+
+msgid "Unknown"
+msgstr "未知的"
+
msgid "Unlock"
msgstr "解é”"
@@ -4868,13 +6692,30 @@ msgstr "未验è¯"
msgid "Up to date"
msgstr "已是最新"
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr "更新您的群组å称ã€è¯´æ˜Žã€å¤´åƒä»¥åŠå…¶å®ƒé€šç”¨è®¾ç½®ã€‚"
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr "å‡çº§æ‚¨çš„订阅计划以å¯ç”¨é«˜çº§å…¨å±€æœç´¢ã€‚"
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr "å‡çº§æ‚¨çš„订阅计划以å¯ç”¨è´¡çŒ®åˆ†æžã€‚"
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr "å‡çº§æ‚¨çš„订阅计划以激活Group Webhooks 。"
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr "å‡çº§æ‚¨çš„订阅计划以激活议题æƒé‡ã€‚"
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr "å‡çº§æ‚¨çš„订阅计划以使用增强的议题看æ¿ã€‚"
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "上传新文件"
@@ -4893,21 +6734,39 @@ msgstr "顶"
msgid "Usage statistics"
msgstr "使用情况统计"
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr "在GitLab内部使用æœåŠ¡å°é€šè¿‡ç”µå­é‚®ä»¶ä¸Žç”¨æˆ·è”系(例如æ供客户支æŒï¼‰"
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr "使用群组里程碑å¯ä»¥ç»Ÿä¸€ç®¡ç†å¤šä¸ªé¡¹ç›®ä¸­åŒä¸€é‡Œç¨‹ç¢‘的议题。"
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "在安装过程中使用以下注册令牌:"
msgid "Use your global notification setting"
msgstr "使用全局通知设置"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr "ä¾›æˆå‘˜ç™»å½•æ‚¨çš„GitLab群组"
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr "用户和IP频率é™åˆ¶"
-msgid "Users"
+msgid "User map"
msgstr ""
+msgid "Users"
+msgstr "用户"
+
msgid "Variables"
msgstr "å˜é‡"
@@ -4923,15 +6782,27 @@ msgstr "电å­é‚®ä»¶ç›¸å…³è®¾ç½®"
msgid "Various settings that affect GitLab performance."
msgstr "å½±å“GitLab性能相关设置。"
+msgid "Verification information"
+msgstr "验è¯ä¿¡æ¯"
+
msgid "Verified"
msgstr "已验è¯"
+msgid "View epics list"
+msgstr "查看å²è¯—故事列表"
+
msgid "View file @ "
msgstr "æµè§ˆæ–‡ä»¶ @ "
msgid "View group labels"
msgstr "查看群组标记"
+msgid "View issue"
+msgstr "查看议题"
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr "查看作业"
@@ -4953,6 +6824,12 @@ msgstr "查看替æ¢æ–‡ä»¶ @ "
msgid "Visibility and access controls"
msgstr "å¯è§æ€§ä¸Žè®¿é—®æŽ§åˆ¶"
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "内部"
@@ -4968,6 +6845,9 @@ msgstr "未知"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "æƒé™ä¸è¶³ã€‚如需查看相关数æ®ï¼Œè¯·å‘管ç†å‘˜ç”³è¯·æƒé™ã€‚"
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "该阶段的数æ®ä¸è¶³ï¼Œæ— æ³•æ˜¾ç¤ºã€‚"
@@ -4980,12 +6860,27 @@ msgstr "Web IDE"
msgid "Web terminal"
msgstr "Web终端"
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr "如果有新的推é€æˆ–新的议题,Webhook将自动触å‘您设置URL。 您å¯ä»¥é…ç½® Webhook æ¥ç›‘å¬ç‰¹å®šäº‹ä»¶ï¼Œå¦‚推é€ã€è®®é¢˜æˆ–åˆå¹¶è¯·æ±‚。 群组 Webhook 适用于群组中的所有项目,便于您在整个群组中标准化webhook功能。"
+
+msgid "Weeks"
+msgstr "星期"
+
+msgid "Weight"
+msgstr "æƒé‡"
+
+msgid "Weight %{weight}"
+msgstr "æƒé‡ %{weight}"
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr "当Runner被é”定时,ä¸èƒ½å°†å…¶åˆ†é…给其他项目"
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr "该项å¯ç”¨åŽï¼Œç”¨æˆ·åœ¨æŽ¥å—æ¡æ¬¾è¢«å‰å°†ä¸èƒ½ä½¿ç”¨GitLab。"
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr "å°†URLä¿ç•™ä¸ºç©ºç™½æ—¶ï¼Œä»å¯æŒ‡å®šåˆ†ç±»æ ‡ç­¾ï¼Œè€Œæ— éœ€ç¦ç”¨è·¨é¡¹ç›®åŠŸèƒ½æˆ–执行外部授æƒæ£€æŸ¥ã€‚"
+
msgid "Wiki"
msgstr "Wiki"
@@ -5121,12 +7016,24 @@ msgstr "页é¢"
msgid "Wiki|Wiki Pages"
msgstr "Wiki 页é¢"
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr "通过贡献分æžï¼Œæ‚¨å¯ä»¥ä»Žæ€»ä½“上了解您的组织åŠå…¶æˆå‘˜çš„议题〠åˆå¹¶è¯·æ±‚和推é€æ´»åŠ¨çš„情况。"
+
msgid "Withdraw Access Request"
msgstr "å–消æƒé™ç”³è¯·"
msgid "Yes"
msgstr "是"
+msgid "Yes, add it"
+msgstr "是的,添加它"
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "å³å°†åˆ é™¤ %{group_name}。已删除的群组无法æ¢å¤ï¼ç¡®å®šç»§ç»­å—?"
@@ -5142,8 +7049,11 @@ msgstr "å°†è¦æŠŠ %{project_full_name} 转移给å¦ä¸€ä¸ªæ‰€æœ‰è€…。确定执è¡
msgid "You are on a read-only GitLab instance."
msgstr "当å‰æ­£åœ¨è®¿é—®åªè¯» GitLab 实例。"
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr "当å‰æ­£åœ¨è®¿é—®Geo次è¦(åªè¯») 节点。如需进行任何写入æ“作,必须访问%{primary_node}。"
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
-msgstr ""
+msgstr "您å¯ä»¥ %{linkStart}查看BLOB%{linkEnd} 代替。"
msgid "You can also create a project from the command line."
msgstr "您也å¯ä»¥é€šè¿‡å‘½ä»¤è¡Œæ¥åˆ›å»ºæ–°é¡¹ç›®ã€‚"
@@ -5154,6 +7064,9 @@ msgstr "å¯ä»¥é€šè¿‡ä¸ºæ ‡è®°è®¾ç½®æ˜Ÿæ ‡æ¥æ高其优先级。"
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr "您也å¯ä»¥é€šè¿‡%{linkStart}Lint%{linkEnd}测试.gitlab-ci.yml"
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr "å¯ä»¥è½»æ¾åœ°åœ¨Kubernetes集群上安装Runner。 %{link_to_help_page}"
@@ -5169,12 +7082,24 @@ msgstr "åªèƒ½åœ¨åˆ†æ”¯ä¸Šç¼–辑文件"
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "您å¯ä»¥ä½¿ç”¨äº¤äº’模å¼ï¼Œé€šè¿‡é€‰æ‹© %{use_ours} 或 %{use_theirs} 按钮æ¥è§£å†³åˆå¹¶å†²çªã€‚也å¯ä»¥é€šè¿‡ç›´æŽ¥ç¼–辑文件æ¥è§£å†³åˆå¹¶å†²çªã€‚然åŽå°†è¿™äº›æ›´æ”¹æ交到 %{branch_name}"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr "您ä¸èƒ½å†™å…¥åªè¯»çš„æ¬¡è¦ GitLab Geo 实例。请改用%{link_to_primary_node}。"
+
msgid "You cannot write to this read-only GitLab instance."
msgstr "您ä¸èƒ½å†™å…¥è¿™ä¸ªåªè¯»çš„ GitLab 实例。"
msgid "You do not have any assigned merge requests"
msgstr "没有任何指派给您的åˆå¹¶è¯·æ±‚"
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr "您没有正确的æƒé™æ¥æ›´æ”¹LDAP组åŒæ­¥ä¸­çš„设置。"
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr "没有æƒé™"
@@ -5193,6 +7118,12 @@ msgstr "必须拥有维护者æƒé™æ‰èƒ½å¼ºåˆ¶åˆ é™¤é”"
msgid "You must sign in to star a project"
msgstr "必须登录æ‰èƒ½å¯¹é¡¹ç›®åŠ æ˜Ÿæ ‡"
+msgid "You need a different license to enable FileLocks feature"
+msgstr "需è¦ä½¿ç”¨ä¸Žå½“å‰ä¸åŒçš„许å¯(license) æ‰èƒ½å¯ç”¨FileLocks功能"
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr "您需è¦git-lfs版本 %{min_git_lfs_version} (或更高版本)æ‰èƒ½ç»§ç»­ã€‚请访问https://git-lfs.github.com"
+
msgid "You need permission."
msgstr "需è¦ç›¸å…³çš„æƒé™ã€‚"
@@ -5223,9 +7154,18 @@ msgstr "在您的个人资料中添加SSH密钥之å‰ï¼Œæ‚¨ä¸èƒ½é€šè¿‡SSHæ¥æ‹‰
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "需è¦ä½¿ç”¨ä¸åŒçš„分支æ‰èƒ½è¿›è¡Œæœ‰æ•ˆçš„比较。"
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr "您收到这å°ç”µå­é‚®ä»¶æ˜¯å› ä¸ºä½ åœ¨ %{host} 拥有å¸æˆ·ã€‚ %{manage_notifications_link} &middot; %{help_link}"
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr "您的群组"
@@ -5241,6 +7181,12 @@ msgstr "您的项目活动"
msgid "Your Todos"
msgstr "您的待办事项"
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr "åˆå¹¶è¯·æ±‚已开å¯ï¼Œå¯ä»¥æ交å˜æ›´åˆ°%{branch_name}。"
@@ -5265,18 +7211,238 @@ msgstr "å‰"
msgid "among other things"
msgstr "åŠå…¶ä»–功能"
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] "åŠ%d个已修å¤çš„æ¼æ´ž"
+
msgid "assign yourself"
msgstr "分é…给自己"
msgid "branch name"
msgstr "分支å称"
+msgid "by"
+msgstr "æ¥è‡ª"
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr "%{linkStartTag}了解更多有关容器安全扫æçš„ä¿¡æ¯ %{linkEndTag}"
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr "%{linkStartTag}了解更多有关DAST %{linkEndTag}çš„ä¿¡æ¯"
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr "%{linkStartTag}了解更多有关ä¾èµ–项扫æçš„ä¿¡æ¯ %{linkEndTag}"
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr "%{linkStartTag}了解更多有关SAST %{linkEndTag}çš„ä¿¡æ¯"
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr "ciReport|%{namespace} å— %{vulnerability} å½±å“。"
+
+msgid "ciReport|%{packagesString} and "
+msgstr "%{packagesString} 和"
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr "%{packagesString} 和 %{lastPackage}"
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr "还有%{remainingPackagesCount} 个"
+
+msgid "ciReport|%{reportName} is loading"
+msgstr "%{reportName} 加载中"
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr "加载%{reportName} 时出错"
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr "%{type} 未å‘现新的安全æ¼æ´ž"
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr "%{type} 未å‘现安全æ¼æ´ž"
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr "%{type} 未å‘现安全æ¼æ´ž"
+
+msgid "ciReport|Class"
+msgstr "ç±»"
+
+msgid "ciReport|Code quality"
+msgstr "代ç è´¨é‡"
+
+msgid "ciReport|Confidence"
+msgstr "置信水平"
+
+msgid "ciReport|Container scanning detected"
+msgstr "容器安全扫æ检测到"
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr "容器扫æå¯ä»¥æ£€æµ‹Dockeré•œåƒä¸­ä¸­å·²çŸ¥çš„安全æ¼æ´žã€‚"
+
+msgid "ciReport|Container scanning is loading"
+msgstr "容器安全扫æ加载中"
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr "加载容器扫æ结果时出错"
+
+msgid "ciReport|DAST detected"
+msgstr "DAST检测到"
+
+msgid "ciReport|DAST is loading"
+msgstr "DAST加载中"
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr "加载DAST结果时出错"
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr "ä¾èµ–项扫æå¯ä»¥æ£€æµ‹æºä»£ç ä¾èµ–项中已知的æ¼æ´žã€‚"
+
+msgid "ciReport|Dependency scanning detected"
+msgstr "ä¾èµ–关系扫æ检测到"
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr "ä¾èµ–项扫æ加载中"
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr "加载ä¾èµ–项扫æ结果时出错"
+
+msgid "ciReport|Description"
+msgstr "说明"
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr "忽略æ¼æ´ž"
+
+msgid "ciReport|Dismissed by"
+msgstr "忽略æ“作æ¥è‡ª"
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr "动æ€åº”用程åºå®‰å…¨æµ‹è¯•ï¼ˆDAST)å¯æ£€æµ‹Web应用程åºä¸­çš„已知æ¼æ´žã€‚"
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr "无法加载 %{reportName} 报告"
+
+msgid "ciReport|File"
+msgstr "文件"
+
+msgid "ciReport|Fixed:"
+msgstr "已修å¤:"
+
+msgid "ciReport|Identifiers"
+msgstr "标识符"
+
+msgid "ciReport|Instances"
+msgstr "实例"
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr "了解有关安全报告(Alpha)的更多信æ¯ã€‚"
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr "了解更多关于白åå•çš„ä¿¡æ¯"
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr "许å¯è¯ç®¡ç†æ£€æµ‹åˆ° %{licenseInfo}"
+
+msgid "ciReport|License management detected no new licenses"
+msgstr "许å¯è¯ç®¡ç†æœªæ£€æµ‹åˆ°æ–°çš„许å¯è¯"
+
+msgid "ciReport|Links"
+msgstr "链接"
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr "载入%{reportName} 报告"
+
+msgid "ciReport|Method"
+msgstr "方法"
+
+msgid "ciReport|Namespace"
+msgstr "命å空间"
+
+msgid "ciReport|No changes to code quality"
+msgstr "代ç è´¨é‡æ— å˜åŒ–"
+
+msgid "ciReport|No changes to performance metrics"
+msgstr "性能指标无å˜åŒ–"
+
+msgid "ciReport|Performance metrics"
+msgstr "性能指标"
+
+msgid "ciReport|Revert dismissal"
+msgstr "å–消忽略"
+
+msgid "ciReport|SAST detected"
+msgstr "SAST检测到"
+
+msgid "ciReport|SAST is loading"
+msgstr "SAST加载中"
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr "加载SAST结果时出错"
+
+msgid "ciReport|Security scanning"
+msgstr "安全扫æ"
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr "安全扫æ无法加载任何结果"
+
+msgid "ciReport|Security scanning is loading"
+msgstr "安全扫æ加载中"
+
+msgid "ciReport|Severity"
+msgstr "严é‡æ€§"
+
+msgid "ciReport|Solution"
+msgstr "解决方案"
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr "é™æ€åº”用安全测试(SAST)å¯ä»¥æ£€æµ‹æºä»£ç ä¸­å·²çŸ¥çš„æ¼æ´žã€‚"
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr "创建议题时å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr "忽略此æ¼æ´žæ—¶å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr "加载 DAST 报告时出错"
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr "加载SAST报告时出错"
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr "加载容器扫æ报告时出错"
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr "加载ä¾èµ–项扫æ报告时出错"
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr "å–消忽略æ“作时å‘生错误。请å†è¯•ä¸€æ¬¡ã€‚"
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr "未批准的æ¼æ´ž (红色) å¯ä»¥æ ‡è®°ä¸ºå·²æ‰¹å‡†ã€‚"
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr "å°† %{name} 从 %{version} å‡çº§åˆ° %{fixed}。"
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr "未检测到安全æ¼æ´ž"
+
+msgid "ciReport|on pipeline"
+msgstr "于æµæ°´çº¿"
+
msgid "command line instructions"
msgstr "命令行指å—"
msgid "connecting"
msgstr "连接中"
+msgid "could not read private key, is the passphrase correct?"
+msgstr "无法读å–ç§é’¥ï¼Œå¯†ç çŸ­è¯­æ˜¯å¦æ­£ç¡®ï¼Ÿ"
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "天"
@@ -5284,9 +7450,23 @@ msgstr[0] "天"
msgid "deploy token"
msgstr "部署令牌"
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] "检测到%d个安全æ¼æ´žå·²ä¿®å¤"
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] "检测到%d个新的安全æ¼æ´ž"
+
+msgid "detected no vulnerabilities"
+msgstr "未检测到安全æ¼æ´ž"
+
msgid "disabled"
msgstr "å·²ç¦ç”¨"
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr "å·²å¯ç”¨"
@@ -5296,11 +7476,29 @@ msgstr "最åŽä¸€æ¬¡%{slash_command} 命令将更新预计时间。"
msgid "for this project"
msgstr "对于这个项目"
+msgid "here"
+msgstr "此处"
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr "导入中"
+msgid "is invalid because there is downstream lock"
+msgstr "因下游é”定而无效"
+
+msgid "is invalid because there is upstream lock"
+msgstr "因上游é”定而无效"
+
+msgid "is not a valid X509 certificate."
+msgstr "ä¸æ˜¯æœ‰æ•ˆçš„X509è¯ä¹¦ã€‚"
+
msgid "latest version"
-msgstr ""
+msgstr "最新版本"
+
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr "被 %{path_lock_user_name} 在 %{created_at} é”定"
msgid "merge request"
msgid_plural "merge requests"
@@ -5318,9 +7516,24 @@ msgstr "%{metricsLinkStart} 内存 %{metricsLinkEnd} å ç”¨ %{emphasisStart} 上
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr "%{metricsLinkStart} 内存 %{metricsLinkEnd} å ç”¨ %{emphasisStart} æ— å˜åŒ– %{emphasisEnd}, ä¿æŒåœ¨ %{memoryFrom}MB"
+msgid "mrWidget|Add approval"
+msgstr "添加批准"
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr "具有åˆå¹¶åˆ°ç›®æ ‡åˆ†æ”¯æƒé™çš„æˆå‘˜å…许æ交"
+msgid "mrWidget|An error occured while removing your approval."
+msgstr "删除您的批准时å‘生错误。"
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr "批准"
+
+msgid "mrWidget|Approved by"
+msgstr "批准人:"
+
msgid "mrWidget|Cancel automatic merge"
msgstr "å–消自动åˆå¹¶"
@@ -5331,10 +7544,10 @@ msgid "mrWidget|Checking ability to merge automatically"
msgstr "检查是å¦å¯ä»¥è‡ªåŠ¨åˆå¹¶"
msgid "mrWidget|Cherry-pick"
-msgstr "优选"
+msgstr "拣选"
msgid "mrWidget|Cherry-pick this merge request in a new merge request"
-msgstr "通过新的åˆå¹¶è¯·æ±‚中优选此åˆå¹¶è¯·æ±‚"
+msgstr "通过新的åˆå¹¶è¯·æ±‚中拣选此åˆå¹¶è¯·æ±‚"
msgid "mrWidget|Closed"
msgstr "已关闭"
@@ -5381,9 +7594,24 @@ msgstr "åˆå¹¶å¤±è´¥ã€‚"
msgid "mrWidget|Merge locally"
msgstr "本地åˆå¹¶"
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr "åˆå¹¶è€…:"
+msgid "mrWidget|No Approval required"
+msgstr "无需批准"
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr "批准已满足è¦æ±‚; 您ä»ç„¶å¯ä»¥ç»§ç»­æ·»åŠ é¢å¤–批准"
+
+msgid "mrWidget|Open in Web IDE"
+msgstr "在Web IDE中打开"
+
msgid "mrWidget|Plain diff"
msgstr "文本差异"
@@ -5402,6 +7630,9 @@ msgstr "删除æºåˆ†æ”¯"
msgid "mrWidget|Remove source branch"
msgstr "删除æºåˆ†æ”¯"
+msgid "mrWidget|Remove your approval"
+msgstr "删除您的批准"
+
msgid "mrWidget|Request to merge"
msgstr "请求åˆå¹¶"
@@ -5453,9 +7684,6 @@ msgstr "该åˆå¹¶è¯·æ±‚正在被åˆå¹¶"
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr "该项目已存档,ç¦æ­¢å†™å…¥"
-msgid "mrWidget|Web IDE"
-msgstr "Web IDE"
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr "å¯ä»¥æ‰‹åŠ¨åˆå¹¶æ­¤åˆå¹¶è¯·æ±‚,使用以下"
@@ -5493,27 +7721,42 @@ msgstr "密ç "
msgid "personal access token"
msgstr "个人访问令牌"
+msgid "private key does not match certificate."
+msgstr "ç§é’¥ä¸Žè¯ä¹¦ä¸åŒ¹é…。"
+
msgid "remaining"
msgstr "剩余"
msgid "remove due date"
msgstr "删除截止日期"
+msgid "remove weight"
+msgstr "移除æƒé‡"
+
msgid "source"
msgstr "æº"
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr "%{slash_command} 将会更新消耗的总时长。"
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr "此文档"
+msgid "to help your contributors communicate effectively!"
+msgstr "帮助您的贡献者进行有效沟通ï¼"
+
msgid "username"
msgstr "用户å"
msgid "uses Kubernetes clusters to deploy your code!"
msgstr "使用 Kubernetes 集群æ¥éƒ¨ç½²ä»£ç ï¼"
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr "å…± %{additions} æ¡æ–°å¢ž, %{deletions} æ¡åˆ é™¤."
diff --git a/locale/zh_HK/gitlab.po b/locale/zh_HK/gitlab.po
index d8fb7353484..b37b7aec35d 100644
--- a/locale/zh_HK/gitlab.po
+++ b/locale/zh_HK/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-01 11:02\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Chinese Traditional, Hong Kong\n"
"Language: zh_HK\n"
@@ -15,6 +13,18 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-HK\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:40\n"
+
+msgid " and"
+msgstr ""
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] ""
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] ""
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -48,6 +58,10 @@ msgid "%d metric"
msgid_plural "%d metrics"
msgstr[0] ""
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] ""
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] ""
@@ -56,6 +70,10 @@ msgid "%d unstaged change"
msgid_plural "%d unstaged changes"
msgstr[0] ""
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] ""
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "為æ高é é¢åŠ è¼‰é€Ÿåº¦åŠæ€§èƒ½ï¼Œå·²çœç•¥äº† %s 次æ交。"
@@ -66,6 +84,9 @@ msgstr ""
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr ""
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr ""
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] ""
@@ -82,6 +103,9 @@ msgstr ""
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr ""
+msgid "%{name}'s avatar"
+msgstr ""
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr ""
@@ -104,18 +128,23 @@ msgid "%{storage_name}: failed storage access attempt on host:"
msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:"
msgstr[0] "%{storage_name}:已訪å•æ­¤ä¸»æ©Ÿå¤±æ•— %{failed_attempts} 次"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] ""
+
msgid "%{text} is available"
msgstr ""
msgid "%{title} changes"
msgstr ""
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] ""
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr ""
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(想了解更多的安è£è¨Šæ¯è«‹æŸ¥çœ‹ %{link})"
-
msgid "+ %{moreCount} more"
msgstr ""
@@ -181,6 +210,30 @@ msgstr ""
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr ""
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr ""
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr ""
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr ""
+
msgid "<strong>Removes</strong> source branch"
msgstr ""
@@ -202,9 +255,18 @@ msgstr ""
msgid "A user with write access to the source branch selected this option"
msgstr ""
+msgid "About GitLab"
+msgstr ""
+
+msgid "About GitLab CE"
+msgstr ""
+
msgid "About auto deploy"
msgstr "關於自動部署"
+msgid "About this feature"
+msgstr ""
+
msgid "Abuse Reports"
msgstr ""
@@ -214,9 +276,18 @@ msgstr ""
msgid "Accept terms"
msgstr ""
+msgid "Accepted MR"
+msgstr ""
+
msgid "Access Tokens"
msgstr ""
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr ""
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr ""
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "å› æ¢å¾©å®‰è£ï¼Œè¨ªå•æ•…障存儲已被暫時ç¦ç”¨ã€‚在å•é¡Œè§£æ±ºå¾Œå°‡é‡ç½®å­˜å„²ä¿¡æ¯ï¼Œä»¥ä¾¿å†æ¬¡è¨ªå•ã€‚"
@@ -238,12 +309,18 @@ msgstr ""
msgid "Activity"
msgstr "活動"
+msgid "Add"
+msgstr ""
+
msgid "Add Changelog"
msgstr "添加更新日誌"
msgid "Add Contribution guide"
msgstr "添加貢ç»æŒ‡å—"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr ""
+
msgid "Add Kubernetes cluster"
msgstr ""
@@ -253,6 +330,12 @@ msgstr "添加許å¯è­‰"
msgid "Add Readme"
msgstr ""
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr ""
+
+msgid "Add new application"
+msgstr ""
+
msgid "Add new directory"
msgstr "添加新目錄"
@@ -262,6 +345,24 @@ msgstr ""
msgid "Add todo"
msgstr ""
+msgid "Add user(s) to the group:"
+msgstr ""
+
+msgid "Add users to group"
+msgstr ""
+
+msgid "Additional text"
+msgstr ""
+
+msgid "Admin Area"
+msgstr ""
+
+msgid "Admin Overview"
+msgstr ""
+
+msgid "Admin area"
+msgstr ""
+
msgid "AdminArea|Stop all jobs"
msgstr ""
@@ -343,12 +444,39 @@ msgstr ""
msgid "Allows you to add and manage Kubernetes clusters."
msgstr ""
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr ""
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr ""
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr ""
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr ""
+
+msgid "An error has occurred"
+msgstr ""
+
msgid "An error occured creating the new branch."
msgstr ""
+msgid "An error occured whilst fetching the job trace."
+msgstr ""
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr ""
+
msgid "An error occured whilst loading all the files."
msgstr ""
@@ -367,12 +495,24 @@ msgstr ""
msgid "An error occured whilst loading the merge request."
msgstr ""
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr ""
+
msgid "An error occurred previewing the blob"
msgstr ""
msgid "An error occurred when toggling the notification subscription"
msgstr ""
+msgid "An error occurred when updating the issue weight"
+msgstr ""
+
+msgid "An error occurred while adding approver"
+msgstr ""
+
+msgid "An error occurred while detecting host keys"
+msgstr ""
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr ""
@@ -394,7 +534,10 @@ msgstr ""
msgid "An error occurred while importing project: ${details}"
msgstr ""
-msgid "An error occurred while loading commits"
+msgid "An error occurred while initializing path locks"
+msgstr ""
+
+msgid "An error occurred while loading commit signatures"
msgstr ""
msgid "An error occurred while loading diff"
@@ -409,6 +552,9 @@ msgstr ""
msgid "An error occurred while making the request."
msgstr ""
+msgid "An error occurred while removing approver"
+msgstr ""
+
msgid "An error occurred while rendering KaTeX"
msgstr ""
@@ -421,18 +567,48 @@ msgstr ""
msgid "An error occurred while retrieving diff"
msgstr ""
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr ""
+
msgid "An error occurred while saving assignees"
msgstr ""
+msgid "An error occurred while subscribing to notifications."
+msgstr ""
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr ""
+
msgid "An error occurred while validating username"
msgstr ""
msgid "An error occurred. Please try again."
msgstr ""
+msgid "Anonymous"
+msgstr ""
+
+msgid "Anti-spam verification"
+msgstr ""
+
+msgid "Any"
+msgstr ""
+
+msgid "Any Label"
+msgstr ""
+
msgid "Appearance"
msgstr ""
+msgid "Application"
+msgstr ""
+
+msgid "Application Id"
+msgstr ""
+
+msgid "Application: %{name}"
+msgstr ""
+
msgid "Applications"
msgstr ""
@@ -448,6 +624,12 @@ msgstr ""
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "確定è¦åˆªé™¤æ­¤æµæ°´ç·šè¨ˆåŠƒå—Žï¼Ÿ"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr ""
+
msgid "Are you sure you want to remove this identity?"
msgstr ""
@@ -457,15 +639,24 @@ msgstr "確定è¦é‡ç½®è¨»å†Šä»¤ç‰Œå—Žï¼Ÿ"
msgid "Are you sure you want to reset the health check token?"
msgstr "確定è¦é‡ç½®å¥åº·æª¢æŸ¥ä»¤ç‰Œå—Žï¼Ÿ"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr ""
+
msgid "Are you sure?"
msgstr "確定嗎?"
msgid "Artifacts"
msgstr ""
+msgid "Ascending"
+msgstr ""
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr ""
+msgid "Assertion consumer service URL"
+msgstr ""
+
msgid "Assign custom color like #FF0000"
msgstr ""
@@ -493,12 +684,21 @@ msgstr ""
msgid "Assignee"
msgstr ""
+msgid "Assignee boards not available with your current license"
+msgstr ""
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr ""
+
msgid "Assignee(s)"
msgstr ""
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "拖放文件到此處或者 %{upload_link}"
+msgid "Audit Events"
+msgstr ""
+
msgid "Aug"
msgstr ""
@@ -508,12 +708,36 @@ msgstr ""
msgid "Authentication Log"
msgstr ""
+msgid "Authentication log"
+msgstr ""
+
msgid "Author"
msgstr ""
+msgid "Authorization code:"
+msgstr ""
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr ""
+
+msgid "Authorize"
+msgstr ""
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr ""
+
+msgid "Authorized At"
+msgstr ""
+
+msgid "Authorized applications (%{size})"
+msgstr ""
+
msgid "Authors: %{authors}"
msgstr ""
+msgid "Auto DevOps"
+msgstr ""
+
msgid "Auto DevOps enabled"
msgstr ""
@@ -571,6 +795,12 @@ msgstr ""
msgid "Average per day: %{average}"
msgstr ""
+msgid "Background Color"
+msgstr ""
+
+msgid "Background Jobs"
+msgstr ""
+
msgid "Background color"
msgstr ""
@@ -652,6 +882,81 @@ msgstr ""
msgid "Below are examples of regex for existing tools:"
msgstr ""
+msgid "Below you will find all the groups that are public."
+msgstr ""
+
+msgid "Billing"
+msgstr ""
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr ""
+
+msgid "BillingPlans|Current plan"
+msgstr ""
+
+msgid "BillingPlans|Customer Support"
+msgstr ""
+
+msgid "BillingPlans|Downgrade"
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr ""
+
+msgid "BillingPlans|Manage plan"
+msgstr ""
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr ""
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr ""
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr ""
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr ""
+
+msgid "BillingPlans|Upgrade"
+msgstr ""
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr ""
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr ""
+
+msgid "BillingPlans|frequently asked questions"
+msgstr ""
+
+msgid "BillingPlans|monthly"
+msgstr ""
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr ""
+
+msgid "BillingPlans|per user"
+msgstr ""
+
+msgid "Bitbucket import"
+msgstr ""
+
+msgid "Blog"
+msgstr ""
+
msgid "Boards"
msgstr ""
@@ -770,6 +1075,9 @@ msgstr ""
msgid "Branches|Stale branches"
msgstr ""
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr ""
+
msgid "Branches|The default branch cannot be deleted"
msgstr ""
@@ -782,9 +1090,15 @@ msgstr ""
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr ""
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr ""
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr ""
+msgid "Branches|diverged from upstream"
+msgstr ""
+
msgid "Branches|merged"
msgstr ""
@@ -806,6 +1120,9 @@ msgstr "ç€è¦½æ–‡ä»¶"
msgid "Browse files"
msgstr "ç€è¦½æ–‡ä»¶"
+msgid "Business metrics (Custom)"
+msgstr ""
+
msgid "ByAuthor|by"
msgstr "作者:"
@@ -815,9 +1132,15 @@ msgstr ""
msgid "CI / CD Settings"
msgstr ""
+msgid "CI/CD"
+msgstr ""
+
msgid "CI/CD configuration"
msgstr ""
+msgid "CI/CD for external repo"
+msgstr ""
+
msgid "CI/CD settings"
msgstr ""
@@ -845,6 +1168,9 @@ msgstr ""
msgid "CICD|Disable Auto DevOps"
msgstr ""
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr ""
+
msgid "CICD|Enable Auto DevOps"
msgstr ""
@@ -866,6 +1192,12 @@ msgstr ""
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr ""
+msgid "Callback URL"
+msgstr ""
+
+msgid "Callback url"
+msgstr ""
+
msgid "Can't find HEAD commit for this branch"
msgstr ""
@@ -881,6 +1213,12 @@ msgstr ""
msgid "Cannot modify managed Kubernetes cluster"
msgstr ""
+msgid "Certificate fingerprint"
+msgstr ""
+
+msgid "Change Weight"
+msgstr ""
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr ""
@@ -926,6 +1264,12 @@ msgstr "優é¸æ­¤æ交"
msgid "Cherry-pick this merge request"
msgstr "優é¸æ­¤åˆä½µè«‹æ±‚"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr ""
@@ -941,9 +1285,21 @@ msgstr ""
msgid "Choose file..."
msgstr ""
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr ""
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr ""
+
msgid "Choose which repositories you want to import."
msgstr ""
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr ""
+
msgid "CiStatusLabel|canceled"
msgstr "å·²å–消"
@@ -1013,12 +1369,21 @@ msgstr ""
msgid "CiVariable|All environments"
msgstr ""
+msgid "CiVariable|Create wildcard"
+msgstr ""
+
msgid "CiVariable|Error occured while saving variables"
msgstr ""
+msgid "CiVariable|New environment"
+msgstr ""
+
msgid "CiVariable|Protected"
msgstr ""
+msgid "CiVariable|Search environments"
+msgstr ""
+
msgid "CiVariable|Toggle protected"
msgstr ""
@@ -1028,15 +1393,24 @@ msgstr ""
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr ""
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr ""
+
msgid "Clear search input"
msgstr ""
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr ""
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr ""
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr ""
@@ -1046,12 +1420,30 @@ msgstr ""
msgid "Click to expand text"
msgstr ""
+msgid "Client authentication certificate"
+msgstr ""
+
+msgid "Client authentication key"
+msgstr ""
+
+msgid "Client authentication key password"
+msgstr ""
+
+msgid "Clients"
+msgstr ""
+
msgid "Clone repository"
msgstr ""
msgid "Close"
msgstr ""
+msgid "Closed"
+msgstr ""
+
+msgid "Closed issues"
+msgstr ""
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr ""
@@ -1061,9 +1453,6 @@ msgstr ""
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr ""
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr ""
@@ -1085,9 +1474,6 @@ msgstr ""
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr ""
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr ""
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr ""
@@ -1115,16 +1501,7 @@ msgstr ""
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr ""
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr ""
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr ""
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
+msgid "ClusterIntegration|Did you know?"
msgstr ""
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
@@ -1163,6 +1540,15 @@ msgstr ""
msgid "ClusterIntegration|Helm Tiller"
msgstr ""
+msgid "ClusterIntegration|Hide"
+msgstr ""
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr ""
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr ""
+
msgid "ClusterIntegration|Ingress"
msgstr ""
@@ -1172,6 +1558,9 @@ msgstr ""
msgid "ClusterIntegration|Install"
msgstr ""
+msgid "ClusterIntegration|Install Prometheus"
+msgstr ""
+
msgid "ClusterIntegration|Installed"
msgstr ""
@@ -1196,6 +1585,9 @@ msgstr ""
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr ""
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr ""
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr ""
@@ -1253,6 +1645,9 @@ msgstr ""
msgid "ClusterIntegration|More information"
msgstr ""
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr ""
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr ""
@@ -1289,9 +1684,6 @@ msgstr ""
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr ""
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr ""
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr ""
@@ -1406,6 +1798,9 @@ msgstr ""
msgid "ClusterIntegration|sign up"
msgstr ""
+msgid "Cohorts"
+msgstr ""
+
msgid "Collapse"
msgstr ""
@@ -1531,7 +1926,7 @@ msgstr ""
msgid "Configure limits for web and API requests."
msgstr ""
-msgid "Configure push mirrors."
+msgid "Configure push and pull mirrors."
msgstr ""
msgid "Configure storage path and circuit breaker settings."
@@ -1543,9 +1938,18 @@ msgstr ""
msgid "Connect"
msgstr ""
+msgid "Connect all repositories"
+msgstr ""
+
msgid "Connect repositories from GitHub"
msgstr ""
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr ""
+
+msgid "Connecting..."
+msgstr ""
+
msgid "Container Registry"
msgstr ""
@@ -1597,6 +2001,9 @@ msgstr ""
msgid "Continue"
msgstr ""
+msgid "Continue to the next step"
+msgstr ""
+
msgid "Continuous Integration and Deployment"
msgstr ""
@@ -1609,6 +2016,9 @@ msgstr ""
msgid "Contribution guide"
msgstr "è²¢ç»æŒ‡å—"
+msgid "Contributions per group member"
+msgstr ""
+
msgid "Contributors"
msgstr "è²¢ç»è€…"
@@ -1624,6 +2034,24 @@ msgstr ""
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr ""
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr ""
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr ""
+
+msgid "ConvDev Index"
+msgstr ""
+
+msgid "Copy SSH public key to clipboard"
+msgstr ""
+
msgid "Copy URL to clipboard"
msgstr "複製URL到剪貼æ¿"
@@ -1636,10 +2064,10 @@ msgstr ""
msgid "Copy commit SHA to clipboard"
msgstr "複製æ交 SHA 到剪貼æ¿"
-msgid "Copy file name to clipboard"
+msgid "Copy file path to clipboard"
msgstr ""
-msgid "Copy file path to clipboard"
+msgid "Copy incoming email address to clipboard"
msgstr ""
msgid "Copy reference to clipboard"
@@ -1648,6 +2076,9 @@ msgstr ""
msgid "Copy to clipboard"
msgstr ""
+msgid "Copy token to clipboard"
+msgstr ""
+
msgid "Create"
msgstr ""
@@ -1660,6 +2091,9 @@ msgstr ""
msgid "Create a new branch and merge request"
msgstr ""
+msgid "Create a new issue"
+msgstr ""
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "在帳戶上創建個人訪å•ä»¤ç‰Œï¼Œä»¥é€šéŽ %{protocol} 來拉å–或推é€ã€‚"
@@ -1675,12 +2109,21 @@ msgstr "創建目錄"
msgid "Create empty repository"
msgstr ""
+msgid "Create epic"
+msgstr ""
+
msgid "Create file"
msgstr ""
+msgid "Create group"
+msgstr ""
+
msgid "Create group label"
msgstr ""
+msgid "Create issue"
+msgstr ""
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr ""
@@ -1699,6 +2142,9 @@ msgstr ""
msgid "Create new file"
msgstr ""
+msgid "Create new file or directory"
+msgstr ""
+
msgid "Create new label"
msgstr ""
@@ -1720,15 +2166,27 @@ msgstr "創建個人訪å•ä»¤ç‰Œ"
msgid "Created"
msgstr ""
+msgid "Created At"
+msgstr ""
+
msgid "Created by me"
msgstr ""
+msgid "Created on:"
+msgstr ""
+
+msgid "Creating epic"
+msgstr ""
+
msgid "Cron Timezone"
msgstr "Cron 時å€"
msgid "Cron syntax"
msgstr "Cron 語法"
+msgid "Current node"
+msgstr ""
+
msgid "CurrentUser|Profile"
msgstr ""
@@ -1744,6 +2202,15 @@ msgstr "自定義通知事件"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "自定義通知級別繼承自åƒèˆ‡ç´šåˆ¥ã€‚使用自定義通知級別,您會收到åƒèˆ‡ç´šåˆ¥åŠé¸å®šäº‹ä»¶çš„通知。想了解更多信æ¯ï¼Œè«‹æŸ¥çœ‹ %{notification_link}."
+msgid "Customize colors"
+msgstr ""
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "週期分æž"
@@ -1768,6 +2235,9 @@ msgstr "é ç™¼å¸ƒ"
msgid "CycleAnalyticsStage|Test"
msgstr "測試"
+msgid "Dashboard"
+msgstr ""
+
msgid "DashboardProjects|All"
msgstr ""
@@ -1783,15 +2253,33 @@ msgstr ""
msgid "Decline and sign out"
msgstr ""
+msgid "Default classification label"
+msgstr ""
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "使用 Cron 語法定義自定義模å¼"
msgid "Delete"
msgstr "刪除"
+msgid "Delete Snippet"
+msgstr ""
+
msgid "Delete list"
msgstr ""
+msgid "Deleted"
+msgstr ""
+
+msgid "Deny"
+msgstr ""
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "部署"
@@ -1922,9 +2410,21 @@ msgstr ""
msgid "Deprioritize label"
msgstr ""
+msgid "Descending"
+msgstr ""
+
msgid "Description"
msgstr "æè¿°"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr ""
+
+msgid "Description:"
+msgstr ""
+
+msgid "Destroy"
+msgstr ""
+
msgid "Details"
msgstr "詳情"
@@ -1952,9 +2452,27 @@ msgstr ""
msgid "Discard draft"
msgstr ""
+msgid "Discover GitLab Geo."
+msgstr ""
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr ""
+msgid "Dismiss Merge Request promotion"
+msgstr ""
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr ""
+
msgid "Domain"
msgstr ""
@@ -1997,6 +2515,9 @@ msgstr ""
msgid "Due date"
msgstr ""
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr ""
+
msgid "Each Runner can be in one of the following states:"
msgstr ""
@@ -2009,12 +2530,27 @@ msgstr ""
msgid "Edit Pipeline Schedule %{id}"
msgstr "編輯 %{id} æµæ°´ç·šè¨ˆåŠƒ"
+msgid "Edit Snippet"
+msgstr ""
+
+msgid "Edit application"
+msgstr ""
+
msgid "Edit files in the editor and commit changes here"
msgstr ""
+msgid "Edit group: %{group_name}"
+msgstr ""
+
msgid "Edit identity for %{user_name}"
msgstr ""
+msgid "Elasticsearch"
+msgstr ""
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr ""
+
msgid "Email"
msgstr ""
@@ -2033,6 +2569,12 @@ msgstr ""
msgid "Enable Auto DevOps"
msgstr ""
+msgid "Enable Pseudonymizer data collection"
+msgstr ""
+
+msgid "Enable SAML authentication for this group"
+msgstr ""
+
msgid "Enable Sentry for error reporting and logging."
msgstr ""
@@ -2042,6 +2584,9 @@ msgstr ""
msgid "Enable and configure Prometheus metrics."
msgstr ""
+msgid "Enable classification control using an external service"
+msgstr ""
+
msgid "Enable for this project"
msgstr ""
@@ -2051,6 +2596,9 @@ msgstr ""
msgid "Enable or disable certain group features and choose access levels."
msgstr ""
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr ""
+
msgid "Enable or disable version check and usage ping."
msgstr ""
@@ -2060,6 +2608,9 @@ msgstr ""
msgid "Enable the Performance Bar for a given group."
msgstr ""
+msgid "Enabled"
+msgstr ""
+
msgid "Ends at (UTC)"
msgstr ""
@@ -2072,9 +2623,18 @@ msgstr ""
msgid "Environments|An error occurred while making the request."
msgstr ""
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr ""
+msgid "Environments|Deploy to..."
+msgstr ""
+
msgid "Environments|Deployment"
msgstr ""
@@ -2087,43 +2647,73 @@ msgstr ""
msgid "Environments|Job"
msgstr ""
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr ""
msgid "Environments|No deployments yet"
msgstr ""
-msgid "Environments|Open"
+msgid "Environments|No pod name has been specified"
msgstr ""
-msgid "Environments|Re-deploy"
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
+
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr ""
+
+msgid "Environments|Re-deploy to environment"
msgstr ""
msgid "Environments|Read more about environments"
msgstr ""
-msgid "Environments|Rollback"
+msgid "Environments|Rollback environment"
msgstr ""
msgid "Environments|Show all"
msgstr ""
+msgid "Environments|Stop"
+msgstr ""
+
+msgid "Environments|Stop environment"
+msgstr ""
+
msgid "Environments|Updated"
msgstr ""
msgid "Environments|You don't have any environments right now."
msgstr ""
-msgid "Error Reporting and Logging"
+msgid "Epic"
msgstr ""
-msgid "Error committing changes. Please try again."
+msgid "Epic will be removed! Are you sure?"
msgstr ""
-msgid "Error fetching contributors data."
+msgid "Epics"
msgstr ""
-msgid "Error fetching job trace"
+msgid "Epics Roadmap"
+msgstr ""
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr ""
+
+msgid "Error Reporting and Logging"
+msgstr ""
+
+msgid "Error creating epic"
+msgstr ""
+
+msgid "Error fetching contributors data."
msgstr ""
msgid "Error fetching labels."
@@ -2144,6 +2734,9 @@ msgstr ""
msgid "Error loading last commit."
msgstr ""
+msgid "Error loading markdown preview"
+msgstr ""
+
msgid "Error loading merge requests."
msgstr ""
@@ -2192,6 +2785,9 @@ msgstr "æ¯æœˆåŸ·è¡Œï¼ˆæ¯æœˆ 1 日淩晨 4 點)"
msgid "Every week (Sundays at 4:00am)"
msgstr "æ¯é€±åŸ·è¡Œï¼ˆå‘¨æ—¥æ·©æ™¨ 4 點)"
+msgid "Everyone can contribute"
+msgstr ""
+
msgid "Expand"
msgstr ""
@@ -2201,12 +2797,48 @@ msgstr ""
msgid "Expand sidebar"
msgstr ""
+msgid "Explore"
+msgstr ""
+
+msgid "Explore GitLab"
+msgstr ""
+
+msgid "Explore Groups"
+msgstr ""
+
+msgid "Explore groups"
+msgstr ""
+
msgid "Explore projects"
msgstr ""
msgid "Explore public groups"
msgstr ""
+msgid "External Classification Policy Authorization"
+msgstr ""
+
+msgid "External authentication"
+msgstr ""
+
+msgid "External authorization denied access to this project"
+msgstr ""
+
+msgid "External authorization request timeout"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr ""
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr ""
+
+msgid "Facebook"
+msgstr ""
+
msgid "Failed"
msgstr ""
@@ -2249,6 +2881,12 @@ msgstr "文件"
msgid "Files (%{human_size})"
msgstr ""
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "按æ交消æ¯éŽæ¿¾"
@@ -2258,6 +2896,12 @@ msgstr "按路徑查找"
msgid "Find file"
msgstr "查找文件"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr ""
@@ -2267,6 +2911,30 @@ msgstr "首次推é€"
msgid "FirstPushedBy|pushed by"
msgstr "推é€è€…:"
+msgid "FogBugz Email"
+msgstr ""
+
+msgid "FogBugz Import"
+msgstr ""
+
+msgid "FogBugz Password"
+msgstr ""
+
+msgid "FogBugz URL"
+msgstr ""
+
+msgid "FogBugz import"
+msgstr ""
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr ""
+
+msgid "Footer message"
+msgstr ""
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr ""
@@ -2298,6 +2966,18 @@ msgstr ""
msgid "From %{provider_title}"
msgstr ""
+msgid "From Bitbucket"
+msgstr ""
+
+msgid "From FogBugz"
+msgstr ""
+
+msgid "From GitLab.com"
+msgstr ""
+
+msgid "From Google Code"
+msgstr ""
+
msgid "From issue creation until deploy to production"
msgstr "從創建議題到部署到生產環境"
@@ -2319,6 +2999,201 @@ msgstr ""
msgid "Generate a default set of labels"
msgstr ""
+msgid "Geo Nodes"
+msgstr ""
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr ""
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr ""
+
+msgid "GeoNodes|Checksummed"
+msgstr ""
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr ""
+
+msgid "GeoNodes|Data replication lag"
+msgstr ""
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr ""
+
+msgid "GeoNodes|Failed"
+msgstr ""
+
+msgid "GeoNodes|Full"
+msgstr ""
+
+msgid "GeoNodes|GitLab version"
+msgstr ""
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr ""
+
+msgid "GeoNodes|Health status"
+msgstr ""
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr ""
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr ""
+
+msgid "GeoNodes|Loading nodes"
+msgstr ""
+
+msgid "GeoNodes|Local LFS objects"
+msgstr ""
+
+msgid "GeoNodes|Local attachments"
+msgstr ""
+
+msgid "GeoNodes|Local job artifacts"
+msgstr ""
+
+msgid "GeoNodes|New node"
+msgstr ""
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr ""
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr ""
+
+msgid "GeoNodes|Not checksummed"
+msgstr ""
+
+msgid "GeoNodes|Out of sync"
+msgstr ""
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr ""
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr ""
+
+msgid "GeoNodes|Replication slots"
+msgstr ""
+
+msgid "GeoNodes|Repositories"
+msgstr ""
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Repository verification progress"
+msgstr ""
+
+msgid "GeoNodes|Selective"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr ""
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr ""
+
+msgid "GeoNodes|Storage config"
+msgstr ""
+
+msgid "GeoNodes|Sync settings"
+msgstr ""
+
+msgid "GeoNodes|Synced"
+msgstr ""
+
+msgid "GeoNodes|Unused slots"
+msgstr ""
+
+msgid "GeoNodes|Unverified"
+msgstr ""
+
+msgid "GeoNodes|Used slots"
+msgstr ""
+
+msgid "GeoNodes|Verified"
+msgstr ""
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr ""
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr ""
+
+msgid "GeoNodes|Wikis"
+msgstr ""
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr ""
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr ""
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr ""
+
+msgid "Geo|All projects"
+msgstr ""
+
+msgid "Geo|File sync capacity"
+msgstr ""
+
+msgid "Geo|Groups to synchronize"
+msgstr ""
+
+msgid "Geo|Projects in certain groups"
+msgstr ""
+
+msgid "Geo|Projects in certain storage shards"
+msgstr ""
+
+msgid "Geo|Repository sync capacity"
+msgstr ""
+
+msgid "Geo|Select groups to replicate."
+msgstr ""
+
+msgid "Geo|Shards to synchronize"
+msgstr ""
+
+msgid "Geo|Verification capacity"
+msgstr ""
+
+msgid "Git"
+msgstr ""
+
msgid "Git repository URL"
msgstr ""
@@ -2340,11 +3215,29 @@ msgstr ""
msgid "GitLab CI Linter has been moved"
msgstr ""
+msgid "GitLab Geo"
+msgstr ""
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr ""
-msgid "GitLab Runner section"
-msgstr "GitLab Runner 介紹"
+msgid "GitLab Import"
+msgstr ""
+
+msgid "GitLab User"
+msgstr ""
+
+msgid "GitLab project export"
+msgstr ""
+
+msgid "GitLab single sign on URL"
+msgstr ""
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
+msgid "GitLab.com import"
+msgstr ""
msgid "Gitaly"
msgstr ""
@@ -2355,18 +3248,33 @@ msgstr ""
msgid "Gitaly|Address"
msgstr ""
+msgid "Gitea Host URL"
+msgstr ""
+
+msgid "Gitea Import"
+msgstr ""
+
msgid "Go Back"
msgstr ""
msgid "Go back"
msgstr ""
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "跳轉到派生項目"
msgid "GoToYourFork|Fork"
msgstr "跳轉到派生項目"
+msgid "Google Code import"
+msgstr ""
+
+msgid "Google Takeout"
+msgstr ""
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr ""
@@ -2376,18 +3284,72 @@ msgstr ""
msgid "Graph"
msgstr ""
+msgid "Group"
+msgstr ""
+
msgid "Group CI/CD settings"
msgstr ""
+msgid "Group Git LFS status:"
+msgstr ""
+
msgid "Group ID"
msgstr ""
msgid "Group Runners"
msgstr ""
+msgid "Group avatar"
+msgstr ""
+
+msgid "Group details"
+msgstr ""
+
+msgid "Group info:"
+msgstr ""
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr ""
+msgid "Group: %{group_name}"
+msgstr ""
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr ""
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr ""
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr ""
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr ""
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr ""
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr ""
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr ""
@@ -2412,9 +3374,33 @@ msgstr ""
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr ""
+msgid "Groups"
+msgstr ""
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr ""
+msgid "GroupsDropdown|Frequently visited"
+msgstr ""
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr ""
+
+msgid "GroupsDropdown|Loading groups"
+msgstr ""
+
+msgid "GroupsDropdown|Search your groups"
+msgstr ""
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr ""
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr ""
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr ""
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr ""
@@ -2454,6 +3440,12 @@ msgstr ""
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr ""
+msgid "Have your users email"
+msgstr ""
+
+msgid "Header message"
+msgstr ""
+
msgid "Health Check"
msgstr "å¥åº·æª¢æŸ¥ (Health Check)"
@@ -2524,12 +3516,21 @@ msgstr ""
msgid "Identities"
msgstr ""
+msgid "Identity provider single sign on URL"
+msgstr ""
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr ""
msgid "If enabled"
msgstr ""
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr ""
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr ""
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr ""
@@ -2548,29 +3549,81 @@ msgstr ""
msgid "Import"
msgstr ""
+msgid "Import Projects from Gitea"
+msgstr ""
+
+msgid "Import all compatible projects"
+msgstr ""
+
+msgid "Import all projects"
+msgstr ""
+
msgid "Import all repositories"
msgstr ""
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr ""
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr ""
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr ""
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr ""
msgid "Import repository"
msgstr "導入存儲庫"
+msgid "ImportButtons|Connect repositories from"
+msgstr ""
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr ""
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr ""
+msgid "Incompatible Project"
+msgstr ""
+
msgid "Inline"
msgstr ""
+msgid "Install GitLab Runner"
+msgstr ""
+
msgid "Install Runner on Kubernetes"
msgstr ""
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "安è£å£¹å€‹èˆ‡ GitLab CI 兼容的 Runner"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] ""
msgid "Instance does not support multiple Kubernetes clusters"
msgstr ""
@@ -2596,7 +3649,10 @@ msgstr "循環週期"
msgid "Introducing Cycle Analytics"
msgstr "週期分æžç°¡ä»‹"
-msgid "Issue Board"
+msgid "Issue Boards"
+msgstr ""
+
+msgid "Issue board focus mode"
msgstr ""
msgid "Issue events"
@@ -2605,12 +3661,18 @@ msgstr "議題事件 (issue event)"
msgid "IssueBoards|Board"
msgstr ""
+msgid "IssueBoards|Boards"
+msgstr ""
+
msgid "Issues"
msgstr ""
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr ""
+msgid "Issues closed"
+msgstr ""
+
msgid "Jan"
msgstr ""
@@ -2641,6 +3703,9 @@ msgstr ""
msgid "Koding"
msgstr ""
+msgid "Koding Dashboard"
+msgstr ""
+
msgid "Kubernetes"
msgstr ""
@@ -2680,12 +3745,18 @@ msgstr ""
msgid "Label actions dropdown"
msgstr ""
+msgid "Label lists show all issues with the selected label."
+msgstr ""
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr ""
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr ""
+msgid "LabelSelect|Labels"
+msgstr ""
+
msgid "Labels"
msgstr ""
@@ -2759,12 +3830,30 @@ msgstr "退出群組"
msgid "Leave project"
msgstr "退出項目"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr ""
+
+msgid "LinkedIn"
+msgstr ""
+
msgid "List"
msgstr ""
+msgid "List Your Gitea Repositories"
+msgstr ""
+
+msgid "List available repositories"
+msgstr ""
+
msgid "List your GitHub repositories"
msgstr ""
+msgid "Loading contribution stats for group members"
+msgstr ""
+
msgid "Loading the GitLab IDE..."
msgstr ""
@@ -2786,15 +3875,39 @@ msgstr ""
msgid "Locked"
msgstr ""
+msgid "Locked Files"
+msgstr ""
+
msgid "Locked to current projects"
msgstr ""
-msgid "Login"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr ""
+
+msgid "Logs"
+msgstr ""
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr ""
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
msgstr ""
msgid "Manage all notifications"
msgstr ""
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr ""
@@ -2804,6 +3917,27 @@ msgstr ""
msgid "Manage project labels"
msgstr ""
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr ""
+
+msgid "Manifest"
+msgstr ""
+
+msgid "Manifest file import"
+msgstr ""
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr ""
@@ -2828,18 +3962,30 @@ msgstr "中ä½æ•¸"
msgid "Members"
msgstr ""
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr ""
+
+msgid "Merge Request"
+msgstr ""
+
msgid "Merge Request:"
msgstr ""
msgid "Merge Requests"
msgstr ""
+msgid "Merge Requests created"
+msgstr ""
+
msgid "Merge events"
msgstr "åˆä½µäº‹ä»¶ (merge event)"
msgid "Merge request"
msgstr ""
+msgid "Merge request approvals"
+msgstr ""
+
msgid "Merge requests"
msgstr ""
@@ -2870,12 +4016,114 @@ msgstr ""
msgid "Messages"
msgstr ""
+msgid "Metrics"
+msgstr ""
+
msgid "Metrics - Influx"
msgstr ""
msgid "Metrics - Prometheus"
msgstr ""
+msgid "Metrics|Business"
+msgstr ""
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr ""
+
+msgid "Metrics|Create metric"
+msgstr ""
+
+msgid "Metrics|Edit metric"
+msgstr ""
+
+msgid "Metrics|Environment"
+msgstr ""
+
+msgid "Metrics|For grouping similar metrics"
+msgstr ""
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr ""
+
+msgid "Metrics|Learn about environments"
+msgstr ""
+
+msgid "Metrics|Legend label (optional)"
+msgstr ""
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr ""
+
+msgid "Metrics|Name"
+msgstr ""
+
+msgid "Metrics|New metric"
+msgstr ""
+
+msgid "Metrics|No deployed environments"
+msgstr ""
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr ""
+
+msgid "Metrics|Query"
+msgstr ""
+
+msgid "Metrics|Response"
+msgstr ""
+
+msgid "Metrics|System"
+msgstr ""
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr ""
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr ""
+
+msgid "Metrics|There was an error getting environments information."
+msgstr ""
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr ""
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr ""
+
+msgid "Metrics|Unit label"
+msgstr ""
+
+msgid "Metrics|Used as a title for the chart"
+msgstr ""
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr ""
+
+msgid "Metrics|Y-axis label"
+msgstr ""
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr ""
+
+msgid "Metrics|e.g. Requests/second"
+msgstr ""
+
+msgid "Metrics|e.g. Throughput"
+msgstr ""
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr ""
+
+msgid "Metrics|e.g. req/sec"
+msgstr ""
+
msgid "Milestone"
msgstr ""
@@ -2900,6 +4148,9 @@ msgstr ""
msgid "Milestones|Promote Milestone"
msgstr ""
+msgid "Milestones|This action cannot be reversed."
+msgstr ""
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "添加壹個 SSH 公鑰"
@@ -2912,21 +4163,36 @@ msgstr ""
msgid "Monitoring"
msgstr ""
+msgid "Months"
+msgstr ""
+
+msgid "More"
+msgstr ""
+
msgid "More actions"
msgstr ""
+msgid "More info"
+msgstr ""
+
msgid "More information"
msgstr ""
msgid "More information is available|here"
msgstr "幫助文檔"
+msgid "Most stars"
+msgstr ""
+
msgid "Move"
msgstr ""
msgid "Move issue"
msgstr ""
+msgid "Multiple issue boards"
+msgstr ""
+
msgid "Name"
msgstr ""
@@ -2936,6 +4202,9 @@ msgstr ""
msgid "Name your individual key via a title"
msgstr ""
+msgid "Name:"
+msgstr ""
+
msgid "Nav|Help"
msgstr ""
@@ -2948,25 +4217,37 @@ msgstr ""
msgid "Nav|Sign out and sign in with a different account"
msgstr ""
-msgid "New Identity"
+msgid "Network"
msgstr ""
-msgid "New Issue"
-msgid_plural "New Issues"
-msgstr[0] "新建議題"
+msgid "New"
+msgstr ""
+
+msgid "New Application"
+msgstr ""
-msgid "New Kubernetes Cluster"
+msgid "New Group"
msgstr ""
-msgid "New Kubernetes cluster"
+msgid "New Identity"
msgstr ""
+msgid "New Issue"
+msgid_plural "New Issues"
+msgstr[0] "新建議題"
+
msgid "New Label"
msgstr ""
msgid "New Pipeline Schedule"
msgstr "創建æµæ°´ç·šè¨ˆåŠƒ"
+msgid "New Snippet"
+msgstr ""
+
+msgid "New Snippets"
+msgstr ""
+
msgid "New branch"
msgstr "新增分支"
@@ -2976,6 +4257,9 @@ msgstr ""
msgid "New directory"
msgstr "新增目錄"
+msgid "New epic"
+msgstr ""
+
msgid "New file"
msgstr "新增文件"
@@ -3012,9 +4296,15 @@ msgstr ""
msgid "New tag"
msgstr "新增標籤"
+msgid "New..."
+msgstr ""
+
msgid "No"
msgstr ""
+msgid "No Label"
+msgstr ""
+
msgid "No assignee"
msgstr ""
@@ -3039,18 +4329,42 @@ msgstr ""
msgid "No files found."
msgstr ""
+msgid "No issues for the selected time period."
+msgstr ""
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr ""
+
msgid "No merge requests found"
msgstr ""
msgid "No messages were logged"
msgstr ""
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr ""
+
+msgid "No pushes for the selected time period."
+msgstr ""
+
msgid "No repository"
msgstr "沒有存儲庫"
msgid "No schedules"
msgstr "沒有計劃"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr ""
@@ -3075,12 +4389,21 @@ msgstr "數據ä¸è¶³"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr ""
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr ""
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr ""
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "通知事件"
@@ -3153,6 +4476,9 @@ msgstr ""
msgid "Number of access attempts"
msgstr ""
+msgid "OK"
+msgstr ""
+
msgid "Oct"
msgstr ""
@@ -3162,6 +4488,15 @@ msgstr ""
msgid "OfSearchInADropdown|Filter"
msgstr "篩é¸"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr ""
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr ""
@@ -3171,9 +4506,30 @@ msgstr ""
msgid "Only project members can comment."
msgstr ""
+msgid "Oops, are you sure?"
+msgstr ""
+
+msgid "Open"
+msgstr ""
+
msgid "Open in Xcode"
msgstr ""
+msgid "Open sidebar"
+msgstr ""
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr ""
+
+msgid "Opened MR"
+msgstr ""
+
+msgid "Opened issues"
+msgstr ""
+
msgid "OpenedNDaysAgo|Opened"
msgstr "開始於"
@@ -3183,6 +4539,12 @@ msgstr ""
msgid "Operations"
msgstr ""
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "æ“作"
@@ -3192,6 +4554,9 @@ msgstr ""
msgid "Other Labels"
msgstr ""
+msgid "Other information"
+msgstr ""
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr ""
@@ -3228,6 +4593,9 @@ msgstr ""
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr ""
+msgid "Path:"
+msgstr ""
+
msgid "Pause"
msgstr ""
@@ -3261,6 +4629,9 @@ msgstr "æµæ°´ç·šè¨ˆåŠƒ"
msgid "Pipeline Schedules"
msgstr "æµæ°´ç·šè¨ˆåŠƒ"
+msgid "Pipeline quota"
+msgstr ""
+
msgid "Pipeline triggers"
msgstr ""
@@ -3405,6 +4776,12 @@ msgstr "於階段"
msgid "Plain diff"
msgstr ""
+msgid "Planned finish date"
+msgstr ""
+
+msgid "Planned start date"
+msgstr ""
+
msgid "PlantUML"
msgstr ""
@@ -3414,6 +4791,15 @@ msgstr ""
msgid "Please accept the Terms of Service before continuing."
msgstr ""
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr ""
@@ -3423,6 +4809,9 @@ msgstr ""
msgid "Please try again"
msgstr ""
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr ""
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr ""
@@ -3432,6 +4821,9 @@ msgstr ""
msgid "Preferences|Navigation theme"
msgstr ""
+msgid "Primary"
+msgstr ""
+
msgid "Prioritize"
msgstr ""
@@ -3456,9 +4848,15 @@ msgstr ""
msgid "Profile"
msgstr ""
+msgid "Profile Settings"
+msgstr ""
+
msgid "Profiles|Account scheduled for removal."
msgstr ""
+msgid "Profiles|Add key"
+msgstr ""
+
msgid "Profiles|Change username"
msgstr ""
@@ -3486,9 +4884,15 @@ msgstr ""
msgid "Profiles|Path"
msgstr ""
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr ""
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr ""
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr ""
+
msgid "Profiles|Update username"
msgstr ""
@@ -3507,6 +4911,9 @@ msgstr ""
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr ""
+msgid "Profiles|e.g. My MacBook key"
+msgstr ""
+
msgid "Profiles|your account"
msgstr ""
@@ -3561,9 +4968,27 @@ msgstr "項目導出éˆæŽ¥å·²éŽæœŸã€‚請從項目設置中é‡æ–°ç”Ÿæˆé …目導
msgid "Project export started. A download link will be sent by email."
msgstr "項目導出已開始。下載éˆæŽ¥å°‡é€šéŽé›»å­éƒµä»¶ç™¼é€ã€‚"
+msgid "Project name"
+msgstr ""
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "訂閱"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr ""
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr ""
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr ""
+
+msgid "ProjectCreationLevel|No one"
+msgstr ""
+
msgid "ProjectFileTree|Name"
msgstr "å稱"
@@ -3573,9 +4998,39 @@ msgstr "從未"
msgid "ProjectLifecycle|Stage"
msgstr "階段"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr ""
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr ""
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr ""
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr ""
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr ""
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr ""
+
msgid "Projects"
msgstr ""
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr ""
@@ -3594,7 +5049,34 @@ msgstr ""
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr ""
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
+msgid "PrometheusAlerts|Add alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr ""
+
+msgid "PrometheusAlerts|Operator"
+msgstr ""
+
+msgid "PrometheusAlerts|Threshold"
msgstr ""
msgid "PrometheusDashboard|Time"
@@ -3621,9 +5103,18 @@ msgstr ""
msgid "PrometheusService|Common metrics"
msgstr ""
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr ""
+
+msgid "PrometheusService|Custom metrics"
+msgstr ""
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr ""
+msgid "PrometheusService|Finding custom metrics..."
+msgstr ""
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr ""
@@ -3636,21 +5127,24 @@ msgstr ""
msgid "PrometheusService|Metrics"
msgstr ""
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr ""
-
msgid "PrometheusService|Missing environment variable"
msgstr ""
msgid "PrometheusService|More information"
msgstr ""
+msgid "PrometheusService|New metric"
+msgstr ""
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr ""
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr ""
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr ""
+
msgid "PrometheusService|Time-series monitoring service"
msgstr ""
@@ -3675,12 +5169,27 @@ msgstr ""
msgid "Promote to group label"
msgstr ""
+msgid "Promotions|Don't show me this again"
+msgstr ""
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr ""
+
+msgid "Promotions|This feature is locked."
+msgstr ""
+
+msgid "Promotions|Upgrade plan"
+msgstr ""
+
msgid "Protip:"
msgstr ""
msgid "Provider"
msgstr ""
+msgid "Pseudonymizer data collection"
+msgstr ""
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr ""
@@ -3690,6 +5199,9 @@ msgstr ""
msgid "Public pipelines"
msgstr ""
+msgid "Push Rules"
+msgstr ""
+
msgid "Push events"
msgstr "推é€äº‹ä»¶ (push event) "
@@ -3699,15 +5211,27 @@ msgstr ""
msgid "Push to create a project"
msgstr ""
-msgid "Quick actions can be used in the issues description and comment boxes."
+msgid "PushRule|Committer restriction"
+msgstr ""
+
+msgid "Pushed"
+msgstr ""
+
+msgid "Pushes"
msgstr ""
-msgid "Re-deploy"
+msgid "Quarters"
+msgstr ""
+
+msgid "Quick actions can be used in the issues description and comment boxes."
msgstr ""
msgid "Read more"
msgstr "了解更多"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "自述文件"
@@ -3717,6 +5241,9 @@ msgstr ""
msgid "Reference:"
msgstr ""
+msgid "Refresh"
+msgstr ""
+
msgid "Register / Sign In"
msgstr ""
@@ -3768,12 +5295,27 @@ msgstr ""
msgid "Remove project"
msgstr "刪除項目"
+msgid "Repair authentication"
+msgstr ""
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr ""
+
msgid "Repository"
msgstr "存儲庫"
msgid "Repository Settings"
msgstr ""
+msgid "Repository URL"
+msgstr ""
+
+msgid "Repository has no locks."
+msgstr ""
+
msgid "Repository maintenance"
msgstr ""
@@ -3783,9 +5325,15 @@ msgstr ""
msgid "Repository storage"
msgstr ""
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr ""
+
msgid "Request Access"
msgstr "申請權é™"
+msgid "Requests Profiles"
+msgstr ""
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr ""
@@ -3807,6 +5355,9 @@ msgstr ""
msgid "Resolve discussion"
msgstr ""
+msgid "Response metrics (Custom)"
+msgstr ""
+
msgid "Resume"
msgstr ""
@@ -3832,13 +5383,22 @@ msgstr "還原此åˆä½µè«‹æ±‚"
msgid "Review"
msgstr ""
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr ""
+
msgid "Reviewing"
msgstr ""
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr ""
-msgid "Rollback"
+msgid "Revoke"
+msgstr ""
+
+msgid "Roadmap"
+msgstr ""
+
+msgid "Run CI/CD pipelines for external repositories"
msgstr ""
msgid "Runner token"
@@ -3856,6 +5416,21 @@ msgstr ""
msgid "Running"
msgstr ""
+msgid "SAML SSO"
+msgstr ""
+
+msgid "SAML SSO for %{group_name}"
+msgstr ""
+
+msgid "SAML Single Sign On"
+msgstr ""
+
+msgid "SAML Single Sign On Settings"
+msgstr ""
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr ""
+
msgid "SSH Keys"
msgstr ""
@@ -3865,6 +5440,9 @@ msgstr ""
msgid "Save"
msgstr ""
+msgid "Save application"
+msgstr ""
+
msgid "Save changes"
msgstr ""
@@ -3886,6 +5464,15 @@ msgstr ""
msgid "Scheduling Pipelines"
msgstr "æµæ°´ç·šè¨ˆåŠƒ"
+msgid "Scope"
+msgstr ""
+
+msgid "Scoped issue boards"
+msgstr ""
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr ""
@@ -3925,6 +5512,21 @@ msgstr ""
msgid "Seconds to wait for a storage access attempt"
msgstr ""
+msgid "Secret:"
+msgstr ""
+
+msgid "Security Dashboard"
+msgstr ""
+
+msgid "Security report"
+msgstr ""
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr ""
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr ""
+
msgid "Select"
msgstr ""
@@ -3955,12 +5557,21 @@ msgstr ""
msgid "Select project to choose zone"
msgstr ""
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr ""
msgid "Select target branch"
msgstr "é¸æ“‡ç›®æ¨™åˆ†æ”¯"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr ""
+
msgid "Send email"
msgstr ""
@@ -3973,9 +5584,15 @@ msgstr ""
msgid "Server version"
msgstr ""
+msgid "Service Desk"
+msgstr ""
+
msgid "Service Templates"
msgstr ""
+msgid "Service URL"
+msgstr ""
+
msgid "Session expiration, projects limit and attachment size."
msgstr ""
@@ -4000,6 +5617,9 @@ msgstr ""
msgid "Set up Koding"
msgstr "設置 Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr ""
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "設置密碼"
@@ -4012,9 +5632,24 @@ msgstr ""
msgid "Share"
msgstr ""
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr ""
+
msgid "Shared Runners"
msgstr ""
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr ""
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr ""
+
+msgid "Sherlock Transactions"
+msgstr ""
+
msgid "Show command"
msgstr ""
@@ -4043,6 +5678,30 @@ msgstr[0] "顯示 %d 個事件"
msgid "Side-by-side"
msgstr ""
+msgid "Sidebar|Change weight"
+msgstr ""
+
+msgid "Sidebar|None"
+msgstr ""
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr ""
+
+msgid "Sidebar|Weight"
+msgstr ""
+
+msgid "Sign in"
+msgstr ""
+
+msgid "Sign in / Register"
+msgstr ""
+
+msgid "Sign in to %{group_name}"
+msgstr ""
+
+msgid "Sign in with Single Sign-On"
+msgstr ""
+
msgid "Sign out"
msgstr ""
@@ -4055,6 +5714,9 @@ msgstr ""
msgid "Size and domain settings for static websites"
msgstr ""
+msgid "Slack application"
+msgstr ""
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr ""
@@ -4076,6 +5738,12 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
+msgid "Something went wrong while fetching assignees list"
+msgstr ""
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr ""
+
msgid "Something went wrong while fetching the projects."
msgstr ""
@@ -4091,6 +5759,9 @@ msgstr ""
msgid "Something went wrong. Please try again."
msgstr ""
+msgid "Sorry, no epics matched your search"
+msgstr ""
+
msgid "Sort by"
msgstr ""
@@ -4133,6 +5804,9 @@ msgstr ""
msgid "SortOptions|Least popular"
msgstr ""
+msgid "SortOptions|Less weight"
+msgstr ""
+
msgid "SortOptions|Milestone"
msgstr ""
@@ -4142,6 +5816,9 @@ msgstr ""
msgid "SortOptions|Milestone due soon"
msgstr ""
+msgid "SortOptions|More weight"
+msgstr ""
+
msgid "SortOptions|Most popular"
msgstr ""
@@ -4181,6 +5858,9 @@ msgstr ""
msgid "SortOptions|Start soon"
msgstr ""
+msgid "SortOptions|Weight"
+msgstr ""
+
msgid "Source"
msgstr ""
@@ -4253,9 +5933,15 @@ msgstr ""
msgid "Starts at (UTC)"
msgstr ""
+msgid "State your message to activate"
+msgstr ""
+
msgid "Status"
msgstr ""
+msgid "Stop impersonation"
+msgstr ""
+
msgid "Stop this environment"
msgstr ""
@@ -4265,9 +5951,18 @@ msgstr ""
msgid "Storage"
msgstr ""
+msgid "Storage:"
+msgstr ""
+
msgid "Subgroups"
msgstr ""
+msgid "Submit as spam"
+msgstr ""
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr ""
@@ -4280,9 +5975,21 @@ msgstr ""
msgid "Switch branch/tag"
msgstr "切æ›åˆ†æ”¯/標籤"
+msgid "Sync information"
+msgstr ""
+
msgid "System Hooks"
msgstr ""
+msgid "System Info"
+msgstr ""
+
+msgid "System header and footer:"
+msgstr ""
+
+msgid "System metrics (Custom)"
+msgstr ""
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] ""
@@ -4380,18 +6087,30 @@ msgstr ""
msgid "Test coverage parsing"
msgstr ""
+msgid "Thanks! Don't show me this again"
+msgstr ""
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr ""
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr ""
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr ""
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr ""
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "編碼階段概述了從第壹次æ交到創建åˆä½µè«‹æ±‚的時間。創建第壹個åˆä½µè«‹æ±‚後,數據將自動添加到此處。"
msgid "The collection of events added to the data gathered for that stage."
msgstr "與該階段相關的事件。"
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr ""
+
msgid "The fork relationship has been removed."
msgstr "派生關係已被刪除。"
@@ -4407,7 +6126,10 @@ msgstr ""
msgid "The number of attempts GitLab will make to access a storage."
msgstr ""
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
msgstr ""
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
@@ -4419,6 +6141,9 @@ msgstr "項目生命週期中的å„個階段。"
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "計劃階段概述了從議題添加到日程到推é€é¦–次æ交的時間。當首次推é€æ交後,數據將自動添加到此處。"
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr ""
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "生產階段概述了從創建議題到將代碼部署到生產環境的時間。當完æˆå®Œæ•´çš„想法到部署生產,數據將自動添加到此處。"
@@ -4428,6 +6153,9 @@ msgstr "該項目å…許已登錄的用戶訪å•ã€‚"
msgid "The project can be accessed without any authentication."
msgstr "該項目å…許任何人訪å•ã€‚"
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr ""
+
msgid "The repository for this project does not exist."
msgstr "此項目的存儲庫ä¸å­˜åœ¨ã€‚"
@@ -4440,6 +6168,9 @@ msgstr ""
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "評審階段概述了從創建åˆä½µè«‹æ±‚到åˆä½µçš„時間。當創建第壹個åˆä½µè«‹æ±‚後,數據將自動添加到此處。"
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr ""
+
msgid "The secure token used by the Runner to checkout the project"
msgstr ""
@@ -4455,12 +6186,18 @@ msgstr ""
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr ""
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "該階段æ¯æ¢æ•¸æ“šæ‰€èŠ±çš„時間"
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "中ä½æ•¸æ˜¯å£¹å€‹æ•¸åˆ—中最中間的值。例如在 3ã€5ã€9 之間,中ä½æ•¸æ˜¯ 5。在 3ã€5ã€7ã€8 之間,中ä½æ•¸æ˜¯ (5 + 7)/ 2 = 6。"
@@ -4476,12 +6213,6 @@ msgstr ""
msgid "There are problems accessing Git storage: "
msgstr "è¨ªå• Git 存儲時出ç¾å•é¡Œï¼š"
-msgid "There was an error loading jobs"
-msgstr ""
-
-msgid "There was an error loading latest pipeline"
-msgstr ""
-
msgid "There was an error loading users activity calendar."
msgstr ""
@@ -4503,15 +6234,33 @@ msgstr ""
msgid "They can be managed using the %{link}."
msgstr ""
+msgid "Third party offers"
+msgstr ""
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr ""
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr ""
+
msgid "This diff is collapsed."
msgstr ""
msgid "This directory"
msgstr ""
+msgid "This group"
+msgstr ""
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr ""
+
msgid "This group does not provide any group Runners yet."
msgstr ""
@@ -4587,6 +6336,12 @@ msgstr ""
msgid "This user has no identities"
msgstr ""
+msgid "This will delete the custom metric, Are you sure?"
+msgstr ""
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr ""
+
msgid "Time before an issue gets scheduled"
msgstr "議題被列入日程表的時間"
@@ -4596,6 +6351,9 @@ msgstr "開始進行編碼å‰çš„時間"
msgid "Time between merge request creation and merge/close"
msgstr "從創建åˆä½µè«‹æ±‚到被åˆä½µæˆ–關閉的時間"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr ""
+
msgid "Time remaining"
msgstr ""
@@ -4760,12 +6518,30 @@ msgstr "秒"
msgid "Tip:"
msgstr ""
+msgid "Title"
+msgstr ""
+
msgid "To GitLab"
msgstr ""
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr ""
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr ""
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr ""
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr ""
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr ""
@@ -4775,21 +6551,45 @@ msgstr ""
msgid "To import an SVN repository, check out %{svn_link}."
msgstr ""
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr ""
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr ""
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr ""
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr ""
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr ""
+
+msgid "To widen your search, change or remove filters."
+msgstr ""
+
msgid "Todo"
msgstr ""
+msgid "Todos"
+msgstr ""
+
msgid "Toggle Sidebar"
msgstr ""
msgid "Toggle discussion"
msgstr ""
+msgid "Toggle navigation"
+msgstr ""
+
msgid "Toggle sidebar"
msgstr ""
@@ -4802,6 +6602,9 @@ msgstr ""
msgid "Too many changes to show."
msgstr ""
+msgid "Total Contributions"
+msgstr ""
+
msgid "Total Time"
msgstr "總時間"
@@ -4811,9 +6614,18 @@ msgstr "所有æ交和åˆä½µçš„總測試時間"
msgid "Total: %{total}"
msgstr ""
+msgid "Track activity with Contribution Analytics."
+msgstr ""
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr ""
+
msgid "Track time with quick actions"
msgstr ""
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr ""
@@ -4823,9 +6635,21 @@ msgstr ""
msgid "Try again"
msgstr ""
+msgid "Turn on Service Desk"
+msgstr ""
+
+msgid "Twitter"
+msgstr ""
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr ""
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
msgid "Unlock"
msgstr ""
@@ -4868,13 +6692,30 @@ msgstr ""
msgid "Up to date"
msgstr ""
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] ""
+msgid "Update"
+msgstr ""
msgid "Update your group name, description, avatar, and other general settings."
msgstr ""
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr ""
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr ""
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr ""
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr ""
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr ""
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "上傳新文件"
@@ -4893,18 +6734,36 @@ msgstr ""
msgid "Usage statistics"
msgstr ""
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr ""
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr ""
+msgid "Use one line per URI"
+msgstr ""
+
msgid "Use the following registration token during setup:"
msgstr "在安è£éŽç¨‹ä¸­ä½¿ç”¨ä»¥ä¸‹è¨»å†Šä»¤ç‰Œï¼š"
msgid "Use your global notification setting"
msgstr "使用全局通知設置"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr ""
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr ""
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr ""
@@ -4923,15 +6782,27 @@ msgstr ""
msgid "Various settings that affect GitLab performance."
msgstr ""
+msgid "Verification information"
+msgstr ""
+
msgid "Verified"
msgstr ""
+msgid "View epics list"
+msgstr ""
+
msgid "View file @ "
msgstr ""
msgid "View group labels"
msgstr ""
+msgid "View issue"
+msgstr ""
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr ""
@@ -4953,6 +6824,12 @@ msgstr ""
msgid "Visibility and access controls"
msgstr ""
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "內部"
@@ -4968,6 +6845,9 @@ msgstr "未知"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "權é™ä¸è¶³ã€‚如需查看相關數據,請å‘管ç†å“¡ç”³è«‹æ¬Šé™ã€‚"
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "該階段的數據ä¸è¶³ï¼Œç„¡æ³•é¡¯ç¤ºã€‚"
@@ -4980,12 +6860,27 @@ msgstr ""
msgid "Web terminal"
msgstr ""
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr ""
+
+msgid "Weeks"
+msgstr ""
+
+msgid "Weight"
+msgstr ""
+
+msgid "Weight %{weight}"
+msgstr ""
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr ""
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr ""
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr ""
+
msgid "Wiki"
msgstr ""
@@ -5121,12 +7016,24 @@ msgstr ""
msgid "Wiki|Wiki Pages"
msgstr ""
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr ""
+
msgid "Withdraw Access Request"
msgstr "å–消權é™ç”³è¯·"
msgid "Yes"
msgstr ""
+msgid "Yes, add it"
+msgstr ""
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "å³å°‡åˆªé™¤ %{group_name}。已刪除的群組無法æ¢å¾©ï¼ç¢ºå®šç¹¼çºŒå—Žï¼Ÿ"
@@ -5142,6 +7049,9 @@ msgstr ""
msgid "You are on a read-only GitLab instance."
msgstr ""
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr ""
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr ""
@@ -5154,6 +7064,9 @@ msgstr ""
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr ""
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr ""
@@ -5169,12 +7082,24 @@ msgstr ""
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr ""
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr ""
+
msgid "You cannot write to this read-only GitLab instance."
msgstr ""
msgid "You do not have any assigned merge requests"
msgstr ""
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr ""
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr ""
@@ -5193,6 +7118,12 @@ msgstr ""
msgid "You must sign in to star a project"
msgstr "必須登錄æ‰èƒ½å°é …目加星標"
+msgid "You need a different license to enable FileLocks feature"
+msgstr ""
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr ""
+
msgid "You need permission."
msgstr "需è¦ç›¸é—œçš„權é™ã€‚"
@@ -5223,9 +7154,18 @@ msgstr ""
msgid "You'll need to use different branch names to get a valid comparison."
msgstr ""
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr ""
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr ""
@@ -5241,6 +7181,12 @@ msgstr ""
msgid "Your Todos"
msgstr ""
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr ""
@@ -5265,18 +7211,238 @@ msgstr ""
msgid "among other things"
msgstr ""
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] ""
+
msgid "assign yourself"
msgstr ""
msgid "branch name"
msgstr ""
+msgid "by"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr ""
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr ""
+
+msgid "ciReport|%{packagesString} and "
+msgstr ""
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr ""
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr ""
+
+msgid "ciReport|%{reportName} is loading"
+msgstr ""
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr ""
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|Class"
+msgstr ""
+
+msgid "ciReport|Code quality"
+msgstr ""
+
+msgid "ciReport|Confidence"
+msgstr ""
+
+msgid "ciReport|Container scanning detected"
+msgstr ""
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr ""
+
+msgid "ciReport|Container scanning is loading"
+msgstr ""
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|DAST detected"
+msgstr ""
+
+msgid "ciReport|DAST is loading"
+msgstr ""
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr ""
+
+msgid "ciReport|Dependency scanning detected"
+msgstr ""
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr ""
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Description"
+msgstr ""
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr ""
+
+msgid "ciReport|Dismissed by"
+msgstr ""
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr ""
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr ""
+
+msgid "ciReport|File"
+msgstr ""
+
+msgid "ciReport|Fixed:"
+msgstr ""
+
+msgid "ciReport|Identifiers"
+msgstr ""
+
+msgid "ciReport|Instances"
+msgstr ""
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr ""
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr ""
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr ""
+
+msgid "ciReport|License management detected no new licenses"
+msgstr ""
+
+msgid "ciReport|Links"
+msgstr ""
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr ""
+
+msgid "ciReport|Method"
+msgstr ""
+
+msgid "ciReport|Namespace"
+msgstr ""
+
+msgid "ciReport|No changes to code quality"
+msgstr ""
+
+msgid "ciReport|No changes to performance metrics"
+msgstr ""
+
+msgid "ciReport|Performance metrics"
+msgstr ""
+
+msgid "ciReport|Revert dismissal"
+msgstr ""
+
+msgid "ciReport|SAST detected"
+msgstr ""
+
+msgid "ciReport|SAST is loading"
+msgstr ""
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr ""
+
+msgid "ciReport|Security scanning"
+msgstr ""
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr ""
+
+msgid "ciReport|Security scanning is loading"
+msgstr ""
+
+msgid "ciReport|Severity"
+msgstr ""
+
+msgid "ciReport|Solution"
+msgstr ""
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr ""
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr ""
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr ""
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr ""
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr ""
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr ""
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr ""
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr ""
+
+msgid "ciReport|on pipeline"
+msgstr ""
+
msgid "command line instructions"
msgstr ""
msgid "connecting"
msgstr ""
+msgid "could not read private key, is the passphrase correct?"
+msgstr ""
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
msgstr[0] "天"
@@ -5284,9 +7450,23 @@ msgstr[0] "天"
msgid "deploy token"
msgstr ""
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] ""
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] ""
+
+msgid "detected no vulnerabilities"
+msgstr ""
+
msgid "disabled"
msgstr ""
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr ""
@@ -5296,12 +7476,30 @@ msgstr ""
msgid "for this project"
msgstr ""
+msgid "here"
+msgstr ""
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr ""
+msgid "is invalid because there is downstream lock"
+msgstr ""
+
+msgid "is invalid because there is upstream lock"
+msgstr ""
+
+msgid "is not a valid X509 certificate."
+msgstr ""
+
msgid "latest version"
msgstr ""
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr ""
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] ""
@@ -5318,9 +7516,24 @@ msgstr ""
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr ""
+msgid "mrWidget|Add approval"
+msgstr ""
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr ""
+msgid "mrWidget|An error occured while removing your approval."
+msgstr ""
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr ""
+
+msgid "mrWidget|Approved by"
+msgstr ""
+
msgid "mrWidget|Cancel automatic merge"
msgstr ""
@@ -5381,9 +7594,24 @@ msgstr ""
msgid "mrWidget|Merge locally"
msgstr ""
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr ""
+msgid "mrWidget|No Approval required"
+msgstr ""
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr ""
+
+msgid "mrWidget|Open in Web IDE"
+msgstr ""
+
msgid "mrWidget|Plain diff"
msgstr ""
@@ -5402,6 +7630,9 @@ msgstr ""
msgid "mrWidget|Remove source branch"
msgstr ""
+msgid "mrWidget|Remove your approval"
+msgstr ""
+
msgid "mrWidget|Request to merge"
msgstr ""
@@ -5453,9 +7684,6 @@ msgstr ""
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr ""
-msgid "mrWidget|Web IDE"
-msgstr ""
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr ""
@@ -5493,27 +7721,42 @@ msgstr ""
msgid "personal access token"
msgstr ""
+msgid "private key does not match certificate."
+msgstr ""
+
msgid "remaining"
msgstr ""
msgid "remove due date"
msgstr ""
+msgid "remove weight"
+msgstr ""
+
msgid "source"
msgstr ""
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr ""
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr ""
+msgid "to help your contributors communicate effectively!"
+msgstr ""
+
msgid "username"
msgstr ""
msgid "uses Kubernetes clusters to deploy your code!"
msgstr ""
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr ""
diff --git a/locale/zh_TW/gitlab.po b/locale/zh_TW/gitlab.po
index 206342b160d..0ca496b0395 100644
--- a/locale/zh_TW/gitlab.po
+++ b/locale/zh_TW/gitlab.po
@@ -2,8 +2,6 @@ msgid ""
msgstr ""
"Project-Id-Version: gitlab-ee\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-07-01 16:35+1000\n"
-"PO-Revision-Date: 2018-07-02 07:22\n"
"Last-Translator: gitlab <mbartlett+crowdin@gitlab.com>\n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
@@ -15,6 +13,18 @@ msgstr ""
"X-Crowdin-Project: gitlab-ee\n"
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /master/locale/gitlab.pot\n"
+"PO-Revision-Date: 2018-08-01 11:41\n"
+
+msgid " and"
+msgstr " 和"
+
+msgid " degraded on %d point"
+msgid_plural " degraded on %d points"
+msgstr[0] " 在 %d 點上é™ç´š"
+
+msgid " improved on %d point"
+msgid_plural " improved on %d points"
+msgstr[0] " 在 %d 點上改善"
msgid "%d changed file"
msgid_plural "%d changed files"
@@ -48,6 +58,10 @@ msgid "%d metric"
msgid_plural "%d metrics"
msgstr[0] "%d 指標"
+msgid "%d new license"
+msgid_plural "%d new licenses"
+msgstr[0] "%d 個新授權"
+
msgid "%d staged change"
msgid_plural "%d staged changes"
msgstr[0] "%d 個暫存變更"
@@ -56,6 +70,10 @@ msgid "%d unstaged change"
msgid_plural "%d unstaged changes"
msgstr[0] "%d 個未暫存變更"
+msgid "%d vulnerability"
+msgid_plural "%d vulnerabilities"
+msgstr[0] "%d 個æ¼æ´ž"
+
msgid "%s additional commit has been omitted to prevent performance issues."
msgid_plural "%s additional commits have been omitted to prevent performance issues."
msgstr[0] "因效能考é‡ï¼Œå·²éš±è— %s 個更動 (commit)。"
@@ -66,6 +84,9 @@ msgstr "%{actionText} 和 %{openOrClose} %{noteable}"
msgid "%{commit_author_link} authored %{commit_timeago}"
msgstr "ç”± %{commit_author_link} æ交於 %{commit_timeago}"
+msgid "%{counter_storage} (%{counter_repositories} repositories, %{counter_build_artifacts} build artifacts, %{counter_lfs_objects} LFS)"
+msgstr "%{counter_storage} (%{counter_repositories} 個版本庫ã€%{counter_build_artifacts} 個編譯產物ã€å’Œ %{counter_lfs_objects} 個 LFS)"
+
msgid "%{count} participant"
msgid_plural "%{count} participants"
msgstr[0] "%{count} åƒèˆ‡è€…"
@@ -82,6 +103,9 @@ msgstr "%{loadingIcon} 開始"
msgid "%{lock_path} is locked by GitLab User %{lock_user_id}"
msgstr "%{lock_path} 被使用者 %{lock_user_id} 鎖定"
+msgid "%{name}'s avatar"
+msgstr "%{name} çš„é ­è²¼"
+
msgid "%{nip_domain} can be used as an alternative to a custom domain."
msgstr "%{nip_domain} å¯ä»¥ä½¿ç”¨ç‚ºè‡ªè¨‚網域的替代方案。"
@@ -104,18 +128,23 @@ msgid "%{storage_name}: failed storage access attempt on host:"
msgid_plural "%{storage_name}: %{failed_attempts} failed storage access attempts:"
msgstr[0] "%{storage_name}:已存å–此主機失敗 %{failed_attempts} 次"
+msgid "%{text} %{files}"
+msgid_plural "%{text} %{files} files"
+msgstr[0] "%{text} %{files} 檔案"
+
msgid "%{text} is available"
msgstr "%{text} å¯ç”¨"
msgid "%{title} changes"
msgstr "%{title} 變更"
+msgid "%{type} detected 1 vulnerability"
+msgid_plural "%{type} detected %{vulnerabilityCount} vulnerabilities"
+msgstr[0] "%{type} åµæ¸¬åˆ° %{vulnerabilityCount} 個æ¼æ´ž"
+
msgid "%{unstaged} unstaged and %{staged} staged changes"
msgstr "%{unstaged} 個未暫存和 %{staged} 個已暫存變更"
-msgid "(checkout the %{link} for information on how to install it)."
-msgstr "(如何安è£è«‹åƒé–± %{link})"
-
msgid "+ %{moreCount} more"
msgstr "+ %{moreCount} 更多"
@@ -181,6 +210,30 @@ msgstr "無法找到網é "
msgid "404|Please contact your GitLab administrator if you think this is a mistake."
msgstr "404 |如果您èªç‚ºé€™æ˜¯éŒ¯èª¤ï¼Œè«‹è¯ç¹«æ‚¨çš„GitLab管ç†å“¡ã€‚"
+msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy."
+msgstr ""
+
+msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address."
+msgstr ""
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{accepted_count}</strong> accepted."
+msgstr "建立 <strong>%{created_count}</strong> 個,åŒæ„ <strong>%{accepted_count}</strong> 個。"
+
+msgid "<strong>%{created_count}</strong> created, <strong>%{closed_count}</strong> closed."
+msgstr "建立 <strong>%{created_count}</strong> 個,關閉 <strong>%{closed_count}</strong> 個。"
+
+msgid "<strong>%{group_name}</strong> group members"
+msgstr "<strong>%{group_name}</strong> 群組æˆå“¡"
+
+msgid "<strong>%{pushes}</strong> pushes, more than <strong>%{commits}</strong> commits by <strong>%{people}</strong> contributors."
+msgstr "æŽ¨é€ <strong>%{pushes}</strong> 個,<strong>%{people}</strong> 個貢ç»è€…æäº¤äº†è¶…éŽ <strong>%{commits}</strong> 個æ交。"
+
msgid "<strong>Removes</strong> source branch"
msgstr "<strong>刪除</strong>來æºåˆ†æ”¯"
@@ -202,9 +255,18 @@ msgstr "正則表é”å¼ï¼Œå°‡ç”¨æ–¼åœ¨ä½œæ¥­è·Ÿè¸ªä¸­æŸ¥æ‰¾æ¸¬è©¦è¦†è“‹çŽ‡çš„輸
msgid "A user with write access to the source branch selected this option"
msgstr "一個有存å–原始分支權é™çš„使用者,é¸æ“‡äº†æ­¤é …ç›®"
+msgid "About GitLab"
+msgstr "關於 GitLab"
+
+msgid "About GitLab CE"
+msgstr "關於 GitLab CE"
+
msgid "About auto deploy"
msgstr "關於自動部署"
+msgid "About this feature"
+msgstr "關於此功能"
+
msgid "Abuse Reports"
msgstr "濫用報告"
@@ -214,9 +276,18 @@ msgstr "濫用報告"
msgid "Accept terms"
msgstr "接å—æ¢æ¬¾"
+msgid "Accepted MR"
+msgstr "接å—çš„åˆä½µè«‹æ±‚"
+
msgid "Access Tokens"
msgstr "å­˜å–憑證"
+msgid "Access denied! Please verify you can add deploy keys to this repository."
+msgstr "å­˜å–被拒ï¼è«‹é©—證您是å¦å¯ä»¥åœ¨æ­¤ç‰ˆæœ¬åº«éƒ¨å±¬é‡‘鑰。"
+
+msgid "Access to '%{classification_label}' not allowed"
+msgstr "ä¸å…許存å–「%{classification_label}ã€"
+
msgid "Access to failing storages has been temporarily disabled to allow the mount to recover. Reset storage information after the issue has been resolved to allow access again."
msgstr "已暫時åœç”¨å¤±æ•—çš„ Git 儲存空間。當儲存空間æ¢å¾©æ­£å¸¸å¾Œï¼Œè«‹é‡ç½®å„²å­˜ç©ºé–“å¥åº·æŒ‡æ•¸ã€‚"
@@ -238,12 +309,18 @@ msgstr "連線中的è£ç½®"
msgid "Activity"
msgstr "活動"
+msgid "Add"
+msgstr "新增"
+
msgid "Add Changelog"
msgstr "新增更新日誌"
msgid "Add Contribution guide"
msgstr "新增å”作指å—"
+msgid "Add Group Webhooks and GitLab Enterprise Edition."
+msgstr "新增群組 Webhook å’Œ GitLab ä¼æ¥­ç‰ˆæœ¬ã€‚"
+
msgid "Add Kubernetes cluster"
msgstr "增加 Kubernetes å¢é›†"
@@ -253,6 +330,12 @@ msgstr "新增授權æ¢æ¬¾"
msgid "Add Readme"
msgstr "增加說明檔案"
+msgid "Add additional text to appear in all email communications. %{character_limit} character limit"
+msgstr "增加顯示於所有電å­éƒµä»¶å°è©±çš„附加文字。最多 %{character_limit} 個字。"
+
+msgid "Add new application"
+msgstr "建立新應用程å¼"
+
msgid "Add new directory"
msgstr "新增目錄"
@@ -262,6 +345,24 @@ msgstr "添加回應"
msgid "Add todo"
msgstr "增加待辦事項"
+msgid "Add user(s) to the group:"
+msgstr "加入使用者至群組:"
+
+msgid "Add users to group"
+msgstr "加入使用者到群組"
+
+msgid "Additional text"
+msgstr "附加文字"
+
+msgid "Admin Area"
+msgstr "管ç†å€å¡Š"
+
+msgid "Admin Overview"
+msgstr "管ç†å“¡æ¦‚覽"
+
+msgid "Admin area"
+msgstr "管ç†å€å¡Š"
+
msgid "AdminArea|Stop all jobs"
msgstr "åœæ­¢æ‰€æœ‰ä»»å‹™"
@@ -343,12 +444,39 @@ msgstr "å…許來自鉤å­å’Œæœå‹™çš„å°æœ¬åœ°ç¶²çµ¡çš„請求。"
msgid "Allows you to add and manage Kubernetes clusters."
msgstr "å…許您增加和管ç†Kuberneteså¢é›†ã€‚"
+msgid "Also called \"Issuer\" or \"Relying party trust identifier\""
+msgstr "也被稱為「議題æ“有者ã€æˆ–「ä¾è³´æ–¹ä¿¡ä»»æ¨™è­˜æ¨™ç±¤ã€"
+
+msgid "Also called \"Relying party service URL\" or \"Reply URL\""
+msgstr "也稱為「ä¾è³´æ–¹æœå‹™ URLã€æˆ–「回覆 URLã€"
+
+msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr "或者,你å¯ä»¥ä½¿ç”¨ %{personal_access_token_link}。當你建立你的個人存å–憑證時,你將需è¦é¸æ“‡<code>版本庫</code>範åœï¼Œæ‰€ä»¥æˆ‘們å¯ä»¥é¡¯ç¤ºä½ å¯ä»¥é€£ç·šä¹‹å…¬é–‹åŠç§å¯†çš„版本庫清單。"
+
msgid "Alternatively, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr "或者,你å¯ä»¥ä½¿ç”¨ %{personal_access_token_link}。當你建立你的個人存å–權æ–時,你將需è¦é¸æ“‡<code>檔案庫</code>範åœï¼Œæ‰€ä»¥æˆ‘們將會顯示你公開åŠç§äººçš„檔案庫清單進行匯入。"
+msgid "An application called %{link_to_client} is requesting access to your GitLab account."
+msgstr "一個自稱 %{link_to_client} 的應用程å¼è«‹æ±‚您 GitLab 帳號的存å–權。"
+
+msgid "An empty GitLab User field will add the FogBugz user's full name (e.g. \"By John Smith\") in the description of all issues and comments. It will also associate and/or assign these issues and comments with the project creator."
+msgstr ""
+
+msgid "An error accured whilst committing your changes."
+msgstr "æ交您的變更時發生錯誤"
+
+msgid "An error has occurred"
+msgstr "發生了一個錯誤"
+
msgid "An error occured creating the new branch."
msgstr "創建新分支時發生錯誤。"
+msgid "An error occured whilst fetching the job trace."
+msgstr "å–得工作追蹤資訊時發生錯誤"
+
+msgid "An error occured whilst fetching the latest pipline."
+msgstr "å–得最新æµæ°´ç·šæ™‚發生錯誤"
+
msgid "An error occured whilst loading all the files."
msgstr "讀å–檔案時發生錯誤。"
@@ -367,12 +495,24 @@ msgstr "讀å–åˆä½µè«‹æ±‚的版本資訊時發生錯誤。"
msgid "An error occured whilst loading the merge request."
msgstr "讀å–åˆä½µè«‹æ±‚時發生錯誤。"
+msgid "An error occured whilst loading the pipelines jobs."
+msgstr "載入æµæ°´ç·šå·¥ä½œçš„åŒæ™‚發生了錯誤"
+
msgid "An error occurred previewing the blob"
msgstr "é è¦½ blob 檔案時發生錯誤"
msgid "An error occurred when toggling the notification subscription"
msgstr "切æ›è¨‚閱通知時發生錯誤"
+msgid "An error occurred when updating the issue weight"
+msgstr "æ›´æ–°å•é¡Œæ¬Šé‡æ™‚發生錯誤"
+
+msgid "An error occurred while adding approver"
+msgstr "增加審核者時發生錯誤"
+
+msgid "An error occurred while detecting host keys"
+msgstr "åµæ¸¬ä¸»æ©Ÿé‡‘鑰時發生錯誤"
+
msgid "An error occurred while dismissing the alert. Refresh the page and try again."
msgstr "當解除通知時錯誤發生。請嘗試é‡æ–°æ•´ç†é é¢ä¸¦é‡è©¦ã€‚"
@@ -394,8 +534,11 @@ msgstr "讀å–專案時發生錯誤"
msgid "An error occurred while importing project: ${details}"
msgstr "匯入專案時發生錯誤: ${details}"
-msgid "An error occurred while loading commits"
-msgstr "讀å–更動記錄時發生錯誤"
+msgid "An error occurred while initializing path locks"
+msgstr "åˆå§‹åŒ–路徑鎖時發生錯誤"
+
+msgid "An error occurred while loading commit signatures"
+msgstr "載入æ交簽å時發生錯誤"
msgid "An error occurred while loading diff"
msgstr "讀å–差異檔時發生錯誤"
@@ -409,6 +552,9 @@ msgstr "讀å–檔案時發生錯誤"
msgid "An error occurred while making the request."
msgstr "建立請求時發生錯誤"
+msgid "An error occurred while removing approver"
+msgstr "刪除審核者時發生錯誤"
+
msgid "An error occurred while rendering KaTeX"
msgstr "渲染 KaTex 時發生錯誤"
@@ -421,18 +567,48 @@ msgstr "讀å–行事曆時發生錯誤"
msgid "An error occurred while retrieving diff"
msgstr "讀å–差異檔時發生錯誤"
+msgid "An error occurred while saving LDAP override status. Please try again."
+msgstr "儲存 LDAP 覆蓋狀態時發生錯誤,請é‡è©¦ã€‚"
+
msgid "An error occurred while saving assignees"
msgstr "儲存被指派人時發生錯誤"
+msgid "An error occurred while subscribing to notifications."
+msgstr "訂閱通知時發生錯誤。"
+
+msgid "An error occurred while unsubscribing to notifications."
+msgstr "當å–消訂閱通知時發生錯誤"
+
msgid "An error occurred while validating username"
msgstr "驗證使用者å稱時發生錯誤"
msgid "An error occurred. Please try again."
msgstr "發生錯誤,請å†è©¦ä¸€æ¬¡ã€‚"
+msgid "Anonymous"
+msgstr "匿å"
+
+msgid "Anti-spam verification"
+msgstr "防廣告驗證"
+
+msgid "Any"
+msgstr "任何"
+
+msgid "Any Label"
+msgstr "ä»»æ„標籤"
+
msgid "Appearance"
msgstr "外觀"
+msgid "Application"
+msgstr "應用程å¼"
+
+msgid "Application Id"
+msgstr "æ‡‰ç”¨ç¨‹å¼ ID"
+
+msgid "Application: %{name}"
+msgstr "應用程å¼ï¼š%{name}"
+
msgid "Applications"
msgstr "應用程å¼"
@@ -448,6 +624,12 @@ msgstr "這是個已經å°å­˜çš„專案ï¼å…¶æª”案庫與其其他專案資æºç‚º
msgid "Are you sure you want to delete this pipeline schedule?"
msgstr "確定è¦åˆªé™¤æ­¤æµæ°´ç·šæŽ’程嗎?"
+msgid "Are you sure you want to lose unsaved changes?"
+msgstr ""
+
+msgid "Are you sure you want to remove %{group_name}?"
+msgstr "確定移除 %{group_name}?"
+
msgid "Are you sure you want to remove this identity?"
msgstr "您確定è¦åˆªé™¤æ­¤èº«ä»½å—Ž?"
@@ -457,15 +639,24 @@ msgstr "確定è¦é‡ç½®è¨»å†Šæ†‘證嗎?"
msgid "Are you sure you want to reset the health check token?"
msgstr "確定è¦é‡ç½®å¥åº·æª¢æŸ¥å­˜å–憑證嗎?"
+msgid "Are you sure you want to unlock %{path_lock_path}?"
+msgstr "你確定è¦è§£éŽ– %{path_lock_path} ?"
+
msgid "Are you sure?"
msgstr "確定嗎?"
msgid "Artifacts"
msgstr "產物"
+msgid "Ascending"
+msgstr "é †åº"
+
msgid "Ask your group maintainer to setup a group Runner."
msgstr "è©¢å•æ‚¨çš„群組維護者以安è£ç¾¤çµ„執行器。"
+msgid "Assertion consumer service URL"
+msgstr "Assertion 客戶æœå‹™é€£çµ"
+
msgid "Assign custom color like #FF0000"
msgstr "自定義é¡è‰²ï¼Œä¾‹å¦‚ #FF0000"
@@ -493,12 +684,21 @@ msgstr "指派給我"
msgid "Assignee"
msgstr "指派人"
+msgid "Assignee boards not available with your current license"
+msgstr "您目å‰çš„授權並ä¸æ”¯æ´æŒ‡æ´¾çœ‹æ¿"
+
+msgid "Assignee lists show all issues assigned to the selected user."
+msgstr "指派列表顯示了分é…給é¸å®šä½¿ç”¨è€…的所有議題"
+
msgid "Assignee(s)"
msgstr "執行者"
msgid "Attach a file by drag &amp; drop or %{upload_link}"
msgstr "拖放檔案到此處或者 %{upload_link}"
+msgid "Audit Events"
+msgstr "審計活動"
+
msgid "Aug"
msgstr "八月"
@@ -508,12 +708,36 @@ msgstr "八月"
msgid "Authentication Log"
msgstr "登入紀錄"
+msgid "Authentication log"
+msgstr "èªè­‰è¨˜éŒ„"
+
msgid "Author"
msgstr "作者"
+msgid "Authorization code:"
+msgstr "授權碼:"
+
+msgid "Authorization was granted by entering your username and password in the application."
+msgstr "é€éŽåœ¨æ‡‰ç”¨ç¨‹å¼ä¸­è¼¸å…¥æ‚¨çš„使用者帳號與密碼,以給予授權權é™ã€‚"
+
+msgid "Authorize"
+msgstr "授權"
+
+msgid "Authorize %{link_to_client} to use your account?"
+msgstr "授權 %{link_to_client} 使用您的帳號?"
+
+msgid "Authorized At"
+msgstr "授權於"
+
+msgid "Authorized applications (%{size})"
+msgstr "æŽˆæ¬Šçš„æ‡‰ç”¨ç¨‹å¼ (%{size})"
+
msgid "Authors: %{authors}"
msgstr "作者:%{authors}"
+msgid "Auto DevOps"
+msgstr "自動 DevOps"
+
msgid "Auto DevOps enabled"
msgstr "啟動自動 DevOps"
@@ -571,6 +795,12 @@ msgstr "大頭貼將被刪除。你確定嗎?"
msgid "Average per day: %{average}"
msgstr "å¹³å‡æ¯å¤©ï¼š%{average}"
+msgid "Background Color"
+msgstr "背景é¡è‰²"
+
+msgid "Background Jobs"
+msgstr "背景作業"
+
msgid "Background color"
msgstr "背景é¡è‰²"
@@ -652,6 +882,81 @@ msgstr "從é¸å®šçš„變更紀錄開始"
msgid "Below are examples of regex for existing tools:"
msgstr "以下是ç¾æœ‰å·¥å…·çš„æ­£è¦è¡¨é”å¼ç¤ºä¾‹ï¼š"
+msgid "Below you will find all the groups that are public."
+msgstr "您將會在底下找到所有公開的群組。"
+
+msgid "Billing"
+msgstr "方案"
+
+msgid "BillingPlans|%{group_name} is currently on the %{plan_link} plan."
+msgstr "%{group_name} ç›®å‰ä½¿ç”¨ %{plan_link} 方案。"
+
+msgid "BillingPlans|Automatic downgrade and upgrade to some plans is currently not available."
+msgstr "在部份的方案中,ä¸æ”¯æ´è‡ªå‹•å‡ç´šæˆ–é™ç´šã€‚"
+
+msgid "BillingPlans|Current plan"
+msgstr "ç›®å‰æ–¹æ¡ˆ"
+
+msgid "BillingPlans|Customer Support"
+msgstr "客戶æœå‹™"
+
+msgid "BillingPlans|Downgrade"
+msgstr "é™ç´š"
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}, or start a free 30-day trial of GitLab.com Gold."
+msgstr ""
+
+msgid "BillingPlans|Learn more about each plan by reading our %{faq_link}."
+msgstr "é€éŽé–±è®€ %{faq_link} 了解更多我們的æ¯å€‹æ–¹æ¡ˆ"
+
+msgid "BillingPlans|Manage plan"
+msgstr "管ç†æ–¹æ¡ˆ"
+
+msgid "BillingPlans|Please contact %{customer_support_link} in that case."
+msgstr "在這情æ³ä¸‹ï¼Œè«‹è¯ç¹« %{customer_support_link}"
+
+msgid "BillingPlans|See all %{plan_name} features"
+msgstr "查看更多 %{plan_name} 功能"
+
+msgid "BillingPlans|This group uses the plan associated with its parent group."
+msgstr "此群組使用和上層群組相關的方案。"
+
+msgid "BillingPlans|To manage the plan for this group, visit the billing section of %{parent_billing_page_link}."
+msgstr "è‹¥è¦ç®¡ç†é€™å€‹ç¾¤çµ„的方案,請ç€è¦½ %{parent_billing_page_link} 的方案部分。"
+
+msgid "BillingPlans|Upgrade"
+msgstr "å‡ç´š"
+
+msgid "BillingPlans|You are currently on the %{plan_link} plan."
+msgstr "ä½ ç›®å‰æ­£åœ¨ä½¿ç”¨æ–¹æ¡ˆ %{plan_link}"
+
+msgid "BillingPlans|Your GitLab.com trial expired on %{expiration_date}. %{learn_more_text}"
+msgstr ""
+
+msgid "BillingPlans|Your Gold trial will <strong>expire after %{expiration_date}</strong>. You can learn more about GitLab.com Gold by reading about our %{features_link}."
+msgstr ""
+
+msgid "BillingPlans|features"
+msgstr "功能"
+
+msgid "BillingPlans|frequently asked questions"
+msgstr "常見å•é¡Œ"
+
+msgid "BillingPlans|monthly"
+msgstr "æ¯å€‹æœˆ"
+
+msgid "BillingPlans|paid annually at %{price_per_year}"
+msgstr "æ¯å¹´æ”¶å– %{price_per_year}"
+
+msgid "BillingPlans|per user"
+msgstr "æ¯ä½ä½¿ç”¨è€…"
+
+msgid "Bitbucket import"
+msgstr "匯入 Bitbucket"
+
+msgid "Blog"
+msgstr "部è½æ ¼"
+
msgid "Boards"
msgstr "看æ¿"
@@ -770,6 +1075,9 @@ msgstr "沉éœçš„"
msgid "Branches|Stale branches"
msgstr "沉éœçš„分支"
+msgid "Branches|The branch could not be updated automatically because it has diverged from its upstream counterpart."
+msgstr "分支無法自動更新,因為與上游分支存在差異。"
+
msgid "Branches|The default branch cannot be deleted"
msgstr "無法刪除é è¨­åˆ†æ”¯"
@@ -782,9 +1090,15 @@ msgstr "為é¿å…資料éºå¤±ï¼Œè«‹åˆä½µè©²åˆ†æ”¯å¾Œå†å°‡å®ƒåˆªé™¤ã€‚"
msgid "Branches|To confirm, type %{branch_name_confirmation}:"
msgstr "請輸入 %{branch_name_confirmation} ä»¥é€²è¡Œç¢ºèª ï¼š"
+msgid "Branches|To discard the local changes and overwrite the branch with the upstream version, delete it here and choose 'Update Now' above."
+msgstr "è‹¥è¦æ”¾æ£„本機變更並使用上游版本覆寫這個分支,請先從這裡刪除å†æŒ‰ä¸‹ä¸Šæ–¹çš„「立刻更新ã€ã€‚"
+
msgid "Branches|You’re about to permanently delete the protected branch %{branch_name}."
msgstr "你將永久刪除å—ä¿è­·çš„ %{branch_name} 分支。"
+msgid "Branches|diverged from upstream"
+msgstr "與上游存在差異"
+
msgid "Branches|merged"
msgstr "å·²åˆä½µ"
@@ -806,6 +1120,9 @@ msgstr "ç€è¦½æª”案"
msgid "Browse files"
msgstr "ç€è¦½æª”案"
+msgid "Business metrics (Custom)"
+msgstr "ä¼æ¥­æŒ‡æ¨™ï¼ˆè‡ªè¨‚)"
+
msgid "ByAuthor|by"
msgstr "作者:"
@@ -815,9 +1132,15 @@ msgstr "CI / CD"
msgid "CI / CD Settings"
msgstr "CI / CD 設定"
+msgid "CI/CD"
+msgstr "CI / CD"
+
msgid "CI/CD configuration"
msgstr "CI/CD 設定"
+msgid "CI/CD for external repo"
+msgstr "外部儲存庫的 CI / CD"
+
msgid "CI/CD settings"
msgstr "CI / CD 設定"
@@ -845,6 +1168,9 @@ msgstr "部屬策略需è¦ç¶²åŸŸæ‰èƒ½æ­£å¸¸å·¥ä½œ"
msgid "CICD|Disable Auto DevOps"
msgstr "åœç”¨è‡ªå‹• DevOps"
+msgid "CICD|Do not set up a domain here if you are setting up multiple Kubernetes clusters with Auto DevOps."
+msgstr "如果你設定了多個使用「自動 DevOpsã€çš„ Kubernetes å¢é›†ï¼Œè«‹ä¸è¦åœ¨é€™è£¡è¨­å®šç¶²åŸŸã€‚"
+
msgid "CICD|Enable Auto DevOps"
msgstr "啟用自動 DevOps"
@@ -866,6 +1192,12 @@ msgstr "當專案沒有 %{ci_file} 檔案,將啟用 Auto DevOps çš„æµæ°´ç·šè¨
msgid "CICD|You need to specify a domain if you want to use Auto Review Apps and Auto Deploy stages."
msgstr "如果你想è¦ä½¿ç”¨è‡ªå‹•è¤‡é–±ç¨‹å¼åŠè‡ªå‹•éƒ¨ç½²ï¼Œè«‹æŒ‡å®šç¶²åŸŸã€‚"
+msgid "Callback URL"
+msgstr "回呼 URL"
+
+msgid "Callback url"
+msgstr "回呼 url"
+
msgid "Can't find HEAD commit for this branch"
msgstr "找ä¸åˆ°æ­¤åˆ†æ”¯çš„ HEAD 更動。"
@@ -881,6 +1213,12 @@ msgstr "ä¸èƒ½è‡ªå‹•åˆä½µ"
msgid "Cannot modify managed Kubernetes cluster"
msgstr "無法變更託管的 Kubernetes å¢é›†"
+msgid "Certificate fingerprint"
+msgstr "憑證指紋"
+
+msgid "Change Weight"
+msgstr "變更權é‡"
+
msgid "Change this value to influence how frequently the GitLab UI polls for updates."
msgstr "更改此數值將影響到 GitLab UI 拉å–更新的頻率。"
@@ -926,6 +1264,12 @@ msgstr "挑é¸æ­¤æ›´å‹•è¨˜éŒ„"
msgid "Cherry-pick this merge request"
msgstr "挑é¸æ­¤åˆä½µè«‹æ±‚"
+msgid "Choose <strong>Create archive</strong> and wait for archiving to complete."
+msgstr ""
+
+msgid "Choose <strong>Next</strong> at the bottom of the page."
+msgstr ""
+
msgid "Choose File ..."
msgstr "é¸æ“‡æª”案⋯"
@@ -941,9 +1285,21 @@ msgstr "é¸æ“‡ <code>複製</code> 或 <code>抓å–</code> 以ç²å–最新的應
msgid "Choose file..."
msgstr "é¸æ“‡æª”案⋯"
+msgid "Choose the top-level group for your repository imports."
+msgstr ""
+
+msgid "Choose which groups you wish to synchronize to this secondary node."
+msgstr "é¸æ“‡æ‚¨å¸Œæœ›èˆ‡é€™å€‹æ¬¡è¦ç¯€é»žåŒæ­¥çš„群組"
+
+msgid "Choose which repositories you want to connect and run CI/CD pipelines."
+msgstr "é¸æ“‡ä½ æƒ³è¦é€£ç·šä¸¦åŸ·è¡Œ CI / CD æµæ°´ç·šçš„版本庫。"
+
msgid "Choose which repositories you want to import."
msgstr "é¸æ“‡ä½ æƒ³åŒ¯å…¥çš„檔案庫。"
+msgid "Choose which shards you wish to synchronize to this secondary node."
+msgstr "é¸æ“‡ä½ æƒ³è¦ç”¨ä¾†èˆ‡é€™å€‹æ¬¡è¦ç¯€é»žåŒæ­¥çš„碎片 (shards)。"
+
msgid "CiStatusLabel|canceled"
msgstr "å·²å–消"
@@ -1013,12 +1369,21 @@ msgstr "* (所有環境)"
msgid "CiVariable|All environments"
msgstr "所有環境"
+msgid "CiVariable|Create wildcard"
+msgstr "建立è¬ç”¨å­—å…ƒ"
+
msgid "CiVariable|Error occured while saving variables"
msgstr "儲存變數時發生錯誤"
+msgid "CiVariable|New environment"
+msgstr "建立新的環境"
+
msgid "CiVariable|Protected"
msgstr "å—ä¿è­·çš„"
+msgid "CiVariable|Search environments"
+msgstr "æœå°‹ç’°å¢ƒ"
+
msgid "CiVariable|Toggle protected"
msgstr "切æ›ç‚ºä¿è­·ç‹€æ…‹"
@@ -1028,15 +1393,24 @@ msgstr "驗證失敗"
msgid "CircuitBreakerApiLink|circuitbreaker api"
msgstr "斷路器 Api"
+msgid "ClassificationLabelUnavailable|is unavailable: %{reason}"
+msgstr "無法使用:%{reason}"
+
msgid "Clear search input"
msgstr "清除æœå°‹ç´€éŒ„"
msgid "Click any <strong>project name</strong> in the project list below to navigate to the project milestone."
msgstr "在專案列表點擊任何<strong>專案å稱</strong>,將轉跳到專案的里程碑。"
+msgid "Click the <strong>Download</strong> button and wait for downloading to complete."
+msgstr ""
+
msgid "Click the <strong>Promote</strong> button in the top right corner to promote it to a group milestone."
msgstr "點擊左上角的<strong>å‡ç´š</strong>按鈕,將æå‡è‡³ç¾¤çµ„里程碑。"
+msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"."
+msgstr ""
+
msgid "Click the button below to begin the install process by navigating to the Kubernetes page"
msgstr "點擊下é¢çš„按鈕,連çµåˆ° Kubernetes é é¢é–‹å§‹å®‰è£ã€‚"
@@ -1046,12 +1420,30 @@ msgstr "按一下以展開。"
msgid "Click to expand text"
msgstr "點擊以展開內容"
+msgid "Client authentication certificate"
+msgstr "客戶端èªè­‰æ†‘è­‰"
+
+msgid "Client authentication key"
+msgstr "客戶端驗證金鑰"
+
+msgid "Client authentication key password"
+msgstr "客戶端驗證金鑰密碼"
+
+msgid "Clients"
+msgstr "客戶端"
+
msgid "Clone repository"
msgstr "複製檔案庫"
msgid "Close"
msgstr "關閉"
+msgid "Closed"
+msgstr "已關閉"
+
+msgid "Closed issues"
+msgstr "已關閉議題"
+
msgid "ClusterIntegration|%{appList} was successfully installed on your Kubernetes cluster"
msgstr "%{appList} 已經æˆåŠŸå®‰è£åˆ°æ‚¨çš„ Kubernetes å¢é›†"
@@ -1061,9 +1453,6 @@ msgstr "Api 網å€"
msgid "ClusterIntegration|Add Kubernetes cluster"
msgstr "增加 Kubernetes å¢é›†"
-msgid "ClusterIntegration|Add an existing Kubernetes cluster"
-msgstr "增加ç¾æœ‰çš„ Kubernetes å¢é›†"
-
msgid "ClusterIntegration|Advanced options on this Kubernetes cluster's integration"
msgstr "Kubernetes å¢é›†æ•´åˆçš„進階設定"
@@ -1085,9 +1474,6 @@ msgstr "CAèªè­‰"
msgid "ClusterIntegration|Certificate Authority bundle (PEM format)"
msgstr "憑證 (PEMæ ¼å¼)"
-msgid "ClusterIntegration|Choose how to set up Kubernetes cluster integration"
-msgstr "é¸æ“‡å¦‚ä½•æ•´åˆ Kubernetes å¢é›†"
-
msgid "ClusterIntegration|Choose which of your project's environments will use this Kubernetes cluster."
msgstr "é¸æ“‡æ‚¨è¦ä½¿ç”¨æ­¤ Kubernetes å¢é›†çš„專案環境"
@@ -1115,17 +1501,8 @@ msgstr "複製權æ–"
msgid "ClusterIntegration|Create Kubernetes cluster"
msgstr "建立 Kubernetes å¢é›†"
-msgid "ClusterIntegration|Create Kubernetes cluster on Google Kubernetes Engine"
-msgstr "在 Google Kubernetes Engine 上建立 Kubernetes å¢é›†"
-
-msgid "ClusterIntegration|Create a new Kubernetes cluster on Google Kubernetes Engine right from GitLab"
-msgstr "é€éŽ GitLab 在 Google Kubernetes Engine 上建立 Kubernetes å¢é›†"
-
-msgid "ClusterIntegration|Create on Google Kubernetes Engine"
-msgstr "在 Google Kubernetes Engine 上建立"
-
-msgid "ClusterIntegration|Enter the details for an existing Kubernetes cluster"
-msgstr "輸入ç¾æœ‰çš„ Kubernetes å¢é›†è©³ç´°è³‡è¨Š"
+msgid "ClusterIntegration|Did you know?"
+msgstr "你知é“嗎?"
msgid "ClusterIntegration|Enter the details for your Kubernetes cluster"
msgstr "輸入您的 Kubernetes å¢é›†è©³ç´°è³‡è¨Š"
@@ -1163,6 +1540,15 @@ msgstr "Google Kubernetes Engine 專案"
msgid "ClusterIntegration|Helm Tiller"
msgstr "Helm Tiller"
+msgid "ClusterIntegration|Hide"
+msgstr "éš±è—"
+
+msgid "ClusterIntegration|If you are setting up multiple clusters and are using Auto DevOps, %{help_link_start}read this first%{help_link_end}."
+msgstr "如果你正在設定多個å¢é›†ä¸”正在使用自動 DevOps,%{help_link_start}請先閱讀這個說明%{help_link_end}。"
+
+msgid "ClusterIntegration|In order to show the health of the cluster, we'll need to provision your cluster with Prometheus to collect the required data."
+msgstr "為了è¦é¡¯ç¤ºå¢é›†çš„å¥åº·ç‹€æ³ï¼Œæˆ‘們需è¦ç‚ºæ‚¨çš„å¢é›†è¨­å®š Prometheus 以收集所需的資訊。"
+
msgid "ClusterIntegration|Ingress"
msgstr "å…¥å£"
@@ -1172,6 +1558,9 @@ msgstr "å…¥å£ IP ä½ç½®"
msgid "ClusterIntegration|Install"
msgstr "安è£"
+msgid "ClusterIntegration|Install Prometheus"
+msgstr "å®‰è£ Prometheus"
+
msgid "ClusterIntegration|Installed"
msgstr "已安è£"
@@ -1196,6 +1585,9 @@ msgstr "Kubernetes å¢é›†"
msgid "ClusterIntegration|Kubernetes cluster details"
msgstr "Kubernetes å¢é›†è©³ç´°è³‡è¨Š"
+msgid "ClusterIntegration|Kubernetes cluster health"
+msgstr "Kubernetes å¢é›†å¥åº·ç¨‹åº¦"
+
msgid "ClusterIntegration|Kubernetes cluster integration"
msgstr "Kubernetes å¢é›†æ•´åˆ"
@@ -1253,6 +1645,9 @@ msgstr "請至 %{link_gke} 管ç†æ‚¨çš„ Kubernetes å¢é›†"
msgid "ClusterIntegration|More information"
msgstr "詳細資料"
+msgid "ClusterIntegration|Multiple Kubernetes clusters are available in GitLab Enterprise Edition Premium and Ultimate"
+msgstr "多個 Kubernetes å¢é›†æ–¼ GitLab ä¼æ¥­ç‰ˆæœ¬ Premium å’Œ Ultimate 中支æ´"
+
msgid "ClusterIntegration|No machine types matched your search"
msgstr "沒有機器類型符åˆæ‚¨çš„æœå°‹"
@@ -1289,9 +1684,6 @@ msgstr "Prometheus"
msgid "ClusterIntegration|Read our %{link_to_help_page} on Kubernetes cluster integration."
msgstr "閱讀我們關於 Kubernetes å¢é›†æ•´åˆçš„ %{link_to_help_page}。"
-msgid "ClusterIntegration|Redeem up to $500 in free credit for Google Cloud Platform"
-msgstr "為 Google Cloud Platform å…Œæ›å…費的 500 å…ƒé¡åº¦"
-
msgid "ClusterIntegration|Remove Kubernetes cluster integration"
msgstr "刪除 Kubernetes å¢é›†æ•´åˆ"
@@ -1406,6 +1798,9 @@ msgstr "設定正確"
msgid "ClusterIntegration|sign up"
msgstr "註冊"
+msgid "Cohorts"
+msgstr "Cohorts"
+
msgid "Collapse"
msgstr "收起"
@@ -1531,8 +1926,8 @@ msgstr "於檔案庫上設定自動 Git 檢查與內務管ç†"
msgid "Configure limits for web and API requests."
msgstr "為網路與 API 請求設定é™åˆ¶ã€‚"
-msgid "Configure push mirrors."
-msgstr "設定推é€çš„é¡åƒã€‚"
+msgid "Configure push and pull mirrors."
+msgstr "設定推é€å’Œæå–çš„é¡åƒã€‚"
msgid "Configure storage path and circuit breaker settings."
msgstr "設定儲存路徑與斷路器設定。"
@@ -1543,9 +1938,18 @@ msgstr "設定使用者建立新帳號的方å¼ã€‚"
msgid "Connect"
msgstr "連線"
+msgid "Connect all repositories"
+msgstr "連接所有版本庫"
+
msgid "Connect repositories from GitHub"
msgstr "é€£çµ GitHub 檔案庫"
+msgid "Connect your external repositories, and CI/CD pipelines will run for new commits. A GitLab project will be created with only CI/CD features enabled."
+msgstr "連çµæ‚¨çš„外部版本庫,CI / CD æµæ°´ç·šå°‡æœƒç‚ºæ–°çš„æ交執行。åªæœƒå»ºç«‹åªå•Ÿç”¨ CI / CD 功能的 GitLab 專案。"
+
+msgid "Connecting..."
+msgstr "正在連çµâ€¦"
+
msgid "Container Registry"
msgstr "Container Registry"
@@ -1597,6 +2001,9 @@ msgstr "您也å¯ä»¥ä½¿ç”¨ %{deploy_token} 為 Registry 映åƒæª”進行唯讀存
msgid "Continue"
msgstr "繼續"
+msgid "Continue to the next step"
+msgstr "繼續下個步驟"
+
msgid "Continuous Integration and Deployment"
msgstr "æŒçºŒæ•´åˆèˆ‡éƒ¨å±¬"
@@ -1609,6 +2016,9 @@ msgstr "è²¢ç»"
msgid "Contribution guide"
msgstr "å”作指å—"
+msgid "Contributions per group member"
+msgstr "æ¯å€‹ç¾¤çµ„æˆå“¡çš„è²¢ç»"
+
msgid "Contributors"
msgstr "å”作者"
@@ -1624,6 +2034,24 @@ msgstr "æ交到%{branch_name},ä¸åŒ…å«åˆä½µæ交,é™åˆ¶æ–¼ 6,000 次更
msgid "ContributorsPage|Please wait a moment, this page will automatically refresh when ready."
msgstr "è«‹ç¨ç­‰ç‰‡åˆ»ï¼Œé€™å€‹é é¢æœƒæº–備好時自動刷新。"
+msgid "Control the display of third party offers."
+msgstr ""
+
+msgid "Control the maximum concurrency of LFS/attachment backfill for this secondary node"
+msgstr "控制此次è¦ç¯€é»žçš„ LFS 和附加檔案的最大併發é‡"
+
+msgid "Control the maximum concurrency of repository backfill for this secondary node"
+msgstr "控制此次è¦ç¯€é»žçš„版本庫最大並行é‡"
+
+msgid "Control the maximum concurrency of verification operations for this Geo node"
+msgstr "控制此 Geo 節點驗證æ“作的最大並行é‡"
+
+msgid "ConvDev Index"
+msgstr "ConvDev 索引"
+
+msgid "Copy SSH public key to clipboard"
+msgstr "複製 SSH 公鑰到剪貼簿"
+
msgid "Copy URL to clipboard"
msgstr "複製網å€åˆ°å‰ªè²¼ç°¿"
@@ -1636,18 +2064,21 @@ msgstr "複製指令"
msgid "Copy commit SHA to clipboard"
msgstr "複製更動記錄的 SHA 值到剪貼簿"
-msgid "Copy file name to clipboard"
-msgstr "將檔案å稱複製到剪貼簿"
-
msgid "Copy file path to clipboard"
msgstr "複製檔案路徑到剪貼簿"
+msgid "Copy incoming email address to clipboard"
+msgstr ""
+
msgid "Copy reference to clipboard"
msgstr "複製連çµ"
msgid "Copy to clipboard"
msgstr "複製至剪貼簿"
+msgid "Copy token to clipboard"
+msgstr "複製憑證到剪貼簿"
+
msgid "Create"
msgstr "建立"
@@ -1660,6 +2091,9 @@ msgstr "建立新分支"
msgid "Create a new branch and merge request"
msgstr "建立新分支åŠåˆä½µè«‹æ±‚"
+msgid "Create a new issue"
+msgstr "建立新議題"
+
msgid "Create a personal access token on your account to pull or push via %{protocol}."
msgstr "建立個人存å–憑證以使用 %{protocol} 來上傳或下載。"
@@ -1675,12 +2109,21 @@ msgstr "建立目錄"
msgid "Create empty repository"
msgstr "建立空的檔案庫"
+msgid "Create epic"
+msgstr "建立 epic"
+
msgid "Create file"
msgstr "新增檔案"
+msgid "Create group"
+msgstr "建立群組"
+
msgid "Create group label"
msgstr "建立群組標籤"
+msgid "Create issue"
+msgstr "建立議題"
+
msgid "Create lists from labels. Issues with that label appear in that list."
msgstr "建立標籤列表。å«æœ‰æ­¤æ¨™ç±¤çš„議題將會顯示於清單中。"
@@ -1699,6 +2142,9 @@ msgstr "新增資料夾"
msgid "Create new file"
msgstr "新增檔案"
+msgid "Create new file or directory"
+msgstr "建立新檔案或目錄"
+
msgid "Create new label"
msgstr "建立新的標籤"
@@ -1720,15 +2166,27 @@ msgstr "建立個人存å–憑證"
msgid "Created"
msgstr "已建立"
+msgid "Created At"
+msgstr "建立於"
+
msgid "Created by me"
msgstr "由我創建"
+msgid "Created on:"
+msgstr "建立於:"
+
+msgid "Creating epic"
+msgstr "建立 epic"
+
msgid "Cron Timezone"
msgstr "Cron 時å€"
msgid "Cron syntax"
msgstr "Cron 語法"
+msgid "Current node"
+msgstr "ç›®å‰ç¯€é»ž"
+
msgid "CurrentUser|Profile"
msgstr "個人資料"
@@ -1744,6 +2202,15 @@ msgstr "自訂事件通知"
msgid "Custom notification levels are the same as participating levels. With custom notification levels you will also receive notifications for select events. To find out more, check out %{notification_link}."
msgstr "自訂通知的等級與åƒèˆ‡åº¦è¨­å®šç›¸åŒã€‚使用自訂通知讓你åªæ”¶åˆ°ç‰¹å®šçš„事件通知。想了解更多資訊,請查閱 %{notification_link} 。"
+msgid "Customize colors"
+msgstr "自訂é¡è‰²"
+
+msgid "Customize how FogBugz email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
+msgid "Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Cycle Analytics"
msgstr "週期分æž"
@@ -1768,6 +2235,9 @@ msgstr "試營é‹"
msgid "CycleAnalyticsStage|Test"
msgstr "測試"
+msgid "Dashboard"
+msgstr "監控é¢æ¿"
+
msgid "DashboardProjects|All"
msgstr "全部"
@@ -1783,15 +2253,33 @@ msgstr "å二月"
msgid "Decline and sign out"
msgstr "拒絕並登出"
+msgid "Default classification label"
+msgstr "é è¨­åˆ†é¡žæ¨™ç±¤"
+
+msgid "Default: Directly import the Google Code email address or username"
+msgstr ""
+
+msgid "Default: Map a FogBugz account ID to a full name"
+msgstr ""
+
msgid "Define a custom pattern with cron syntax"
msgstr "使用 Cron 語法自訂排程"
msgid "Delete"
msgstr "刪除"
+msgid "Delete Snippet"
+msgstr "刪除片段"
+
msgid "Delete list"
msgstr "刪除清單"
+msgid "Deleted"
+msgstr "已刪除"
+
+msgid "Deny"
+msgstr "拒絕"
+
msgid "Deploy"
msgid_plural "Deploys"
msgstr[0] "部署"
@@ -1922,9 +2410,21 @@ msgstr "您的新專案部屬憑證已經建立。"
msgid "Deprioritize label"
msgstr "優先標籤"
+msgid "Descending"
+msgstr "é™å†ª"
+
msgid "Description"
msgstr "æè¿°"
+msgid "Description templates allow you to define context-specific templates for issue and merge request description fields for your project."
+msgstr "《æ述範本》å…許你為您專案的議題或åˆä½µè«‹æ±‚之æ述欄ä½å®šç¾©ç¬¦åˆä¸Šä¸‹æ–‡çš„範本。"
+
+msgid "Description:"
+msgstr "說明:"
+
+msgid "Destroy"
+msgstr "銷毀"
+
msgid "Details"
msgstr "細節"
@@ -1952,9 +2452,27 @@ msgstr "撤銷變更"
msgid "Discard draft"
msgstr "放棄è‰ç¨¿"
+msgid "Discover GitLab Geo."
+msgstr "探索 GitLab Geo。"
+
+msgid "Discover projects, groups and snippets. Share your projects with others"
+msgstr ""
+
+msgid "Dismiss"
+msgstr "忽略"
+
msgid "Dismiss Cycle Analytics introduction box"
msgstr "關閉循環分æžä»‹ç´¹è¦–窗"
+msgid "Dismiss Merge Request promotion"
+msgstr "忽略åˆä½µè«‹æ±‚的促銷廣告"
+
+msgid "Do you want to customize how Google Code email addresses and usernames are imported into GitLab?"
+msgstr ""
+
+msgid "Documentation for popular identity providers"
+msgstr "知å身份æ供商的文件"
+
msgid "Domain"
msgstr "網域"
@@ -1997,6 +2515,9 @@ msgstr "噓"
msgid "Due date"
msgstr "截止日期"
+msgid "During this process, you’ll be asked for URLs from GitLab’s side. Use the URLs shown below."
+msgstr "在這éŽç¨‹ä¸­ï¼Œæ‚¨å°‡æœƒè¢«è©¢å• GitLab 方的連çµï¼Œè«‹ä½¿ç”¨åº•ä¸‹é¡¯ç¤ºçš„連çµã€‚"
+
msgid "Each Runner can be in one of the following states:"
msgstr "æ¯å€‹åŸ·è¡Œå™¨å¯ä»¥è™•æ–¼ä»¥ä¸‹ç‹€æ…‹ä¹‹ä¸€ï¼š"
@@ -2009,12 +2530,27 @@ msgstr "編輯標籤"
msgid "Edit Pipeline Schedule %{id}"
msgstr "編輯 %{id} æµæ°´ç·šæŽ’程"
+msgid "Edit Snippet"
+msgstr "編輯片段"
+
+msgid "Edit application"
+msgstr "編輯應用程å¼"
+
msgid "Edit files in the editor and commit changes here"
msgstr "在編輯器中編輯æ交更動紀錄"
+msgid "Edit group: %{group_name}"
+msgstr "編輯群組:%{group_name}"
+
msgid "Edit identity for %{user_name}"
msgstr "編輯 %{user_name} 的身份"
+msgid "Elasticsearch"
+msgstr "Elasticsearch"
+
+msgid "Elasticsearch intergration. Elasticsearch AWS IAM."
+msgstr "Elasticsearch æ•´åˆã€‚ Elasticsearch AWS IAM。"
+
msgid "Email"
msgstr "é›»å­ä¿¡ç®±"
@@ -2033,6 +2569,12 @@ msgstr "啟用"
msgid "Enable Auto DevOps"
msgstr "啟用自動 DevOps"
+msgid "Enable Pseudonymizer data collection"
+msgstr "啟用 Pseudonymizer 的資料收集"
+
+msgid "Enable SAML authentication for this group"
+msgstr "為此群組啟用 SAML 驗證"
+
msgid "Enable Sentry for error reporting and logging."
msgstr "為錯誤報告與日誌啟用 Sentry。"
@@ -2042,6 +2584,9 @@ msgstr "啟用與設定 InfluxDB 指標。"
msgid "Enable and configure Prometheus metrics."
msgstr "啟用與設定 Prometheus 指標。"
+msgid "Enable classification control using an external service"
+msgstr "使用外部æœå‹™é€²è¡Œåˆ†é¡žæŽ§åˆ¶"
+
msgid "Enable for this project"
msgstr "為此專案啟用"
@@ -2051,6 +2596,9 @@ msgstr "啟用群組執行器"
msgid "Enable or disable certain group features and choose access levels."
msgstr "啟用或åœç”¨æŸäº›ç¾¤çµ„功能,並é¸æ“‡å­˜å–等級。"
+msgid "Enable or disable the Pseudonymizer data collection."
+msgstr "啟用或åœç”¨ Pseudonymizer 的資料收集。"
+
msgid "Enable or disable version check and usage ping."
msgstr "啟用或åœç”¨ç‰ˆæœ¬æª¢æŸ¥å’Œä½¿ç”¨ ping。"
@@ -2060,6 +2608,9 @@ msgstr "啟用 reCAPTCHA 或 Akismet 並設定 IP 上é™ã€‚"
msgid "Enable the Performance Bar for a given group."
msgstr "啟用æ供群組的效能桿。"
+msgid "Enabled"
+msgstr "已啟用"
+
msgid "Ends at (UTC)"
msgstr "æ–¼ (UTC) çµæŸ"
@@ -2072,9 +2623,18 @@ msgstr "ç²å–環境時發生錯誤。"
msgid "Environments|An error occurred while making the request."
msgstr "發é€è«‹æ±‚時發生錯誤"
+msgid "Environments|An error occurred while stopping the environment, please try again"
+msgstr ""
+
+msgid "Environments|Are you sure you want to stop this environment?"
+msgstr ""
+
msgid "Environments|Commit"
msgstr "æ›´å‹•"
+msgid "Environments|Deploy to..."
+msgstr "部屬到…"
+
msgid "Environments|Deployment"
msgstr "部署"
@@ -2087,45 +2647,75 @@ msgstr "環境"
msgid "Environments|Job"
msgstr "任務"
+msgid "Environments|Learn more about stopping environments"
+msgstr ""
+
msgid "Environments|New environment"
msgstr "新建環境"
msgid "Environments|No deployments yet"
msgstr "尚未部署"
-msgid "Environments|Open"
-msgstr "é–‹å•Ÿ"
+msgid "Environments|No pod name has been specified"
+msgstr "沒有指定 pod å稱"
+
+msgid "Environments|Note that this action will stop the environment, but it will %{emphasis_start}not%{emphasis_end} have an effect on any existing deployment due to no “stop environment action†being defined in the %{ci_config_link_start}.gitlab-ci.yml%{ci_config_link_end} file."
+msgstr ""
-msgid "Environments|Re-deploy"
-msgstr "é‡æ–°éƒ¨ç½²"
+msgid "Environments|Open live environment"
+msgstr ""
+
+msgid "Environments|Pod logs from"
+msgstr "Pod 日誌由"
+
+msgid "Environments|Re-deploy to environment"
+msgstr ""
msgid "Environments|Read more about environments"
msgstr "了解有關環境的更多訊æ¯"
-msgid "Environments|Rollback"
-msgstr "還原"
+msgid "Environments|Rollback environment"
+msgstr ""
msgid "Environments|Show all"
msgstr "顯示全部"
+msgid "Environments|Stop"
+msgstr "åœæ­¢"
+
+msgid "Environments|Stop environment"
+msgstr "åœæ­¢ç’°å¢ƒ"
+
msgid "Environments|Updated"
msgstr "已更新"
msgid "Environments|You don't have any environments right now."
msgstr "你還沒有設置環境"
+msgid "Epic"
+msgstr "Epic"
+
+msgid "Epic will be removed! Are you sure?"
+msgstr "將會移除 Epicï¼æ‚¨ç¢ºå®šå—Žï¼Ÿ"
+
+msgid "Epics"
+msgstr "Epic"
+
+msgid "Epics Roadmap"
+msgstr "Epics 開發è—圖"
+
+msgid "Epics let you manage your portfolio of projects more efficiently and with less effort"
+msgstr "Epics 讓你能更有效率且花費更少功夫的管ç†æ‚¨å°ˆæ¡ˆçš„組åˆã€‚"
+
msgid "Error Reporting and Logging"
msgstr "錯誤報告與日誌"
-msgid "Error committing changes. Please try again."
-msgstr "æ交改變時發生錯誤,請ç¨å¾Œå†è©¦ã€‚"
+msgid "Error creating epic"
+msgstr "建立 epic 時發生錯誤"
msgid "Error fetching contributors data."
msgstr "讀å–è²¢ç»è€…資料時發生錯誤。"
-msgid "Error fetching job trace"
-msgstr "追蹤讀å–任務錯誤"
-
msgid "Error fetching labels."
msgstr "讀å–標籤時發生錯誤。"
@@ -2144,6 +2734,9 @@ msgstr "載入分支資料時錯誤,請é‡è©¦ã€‚"
msgid "Error loading last commit."
msgstr "載入最新更動紀錄時失敗。"
+msgid "Error loading markdown preview"
+msgstr "載入 Markdown é è¦½æ™‚發生å•é¡Œ"
+
msgid "Error loading merge requests."
msgstr "載入åˆä½µè«‹æ±‚時錯誤。"
@@ -2192,6 +2785,9 @@ msgstr "æ¯æœˆåŸ·è¡Œï¼ˆæ¯æœˆä¸€æ—¥æ·©æ™¨å››é»žï¼‰"
msgid "Every week (Sundays at 4:00am)"
msgstr "æ¯é€±åŸ·è¡Œï¼ˆé€±æ—¥æ·©æ™¨ 四點)"
+msgid "Everyone can contribute"
+msgstr "æ¯å€‹äººéƒ½èƒ½è²¢ç»"
+
msgid "Expand"
msgstr "展開"
@@ -2201,12 +2797,48 @@ msgstr "展開全部"
msgid "Expand sidebar"
msgstr "展開å´é‚Šæ¬„"
+msgid "Explore"
+msgstr "ç€è¦½"
+
+msgid "Explore GitLab"
+msgstr "ç€è¦½ GitLab"
+
+msgid "Explore Groups"
+msgstr "ç€è¦½ç¾¤çµ„"
+
+msgid "Explore groups"
+msgstr "ç€è¦½ç¾¤çµ„"
+
msgid "Explore projects"
msgstr "ç€è¦½å°ˆæ¡ˆ"
msgid "Explore public groups"
msgstr "æœå°‹å…¬é–‹çš„群組"
+msgid "External Classification Policy Authorization"
+msgstr "外部分類策略èªè­‰"
+
+msgid "External authentication"
+msgstr "外部èªè­‰"
+
+msgid "External authorization denied access to this project"
+msgstr "外部èªè­‰æ‹’絕存å–這個專案。"
+
+msgid "External authorization request timeout"
+msgstr "外部èªè­‰è«‹æ±‚等待éŽä¹…"
+
+msgid "ExternalAuthorizationService|Classification Label"
+msgstr "分類標籤"
+
+msgid "ExternalAuthorizationService|Classification label"
+msgstr "分類標籤"
+
+msgid "ExternalAuthorizationService|When no classification label is set the default label `%{default_label}` will be used."
+msgstr "當沒有設定分類標籤時,將會使用é è¨­æ¨™ç±¤ `%{default_label}`。"
+
+msgid "Facebook"
+msgstr "Facebook"
+
msgid "Failed"
msgstr "失敗"
@@ -2249,6 +2881,12 @@ msgstr "檔案"
msgid "Files (%{human_size})"
msgstr "檔案 (%{human_size})"
+msgid "Fill in the fields below, turn on <strong>%{enable_label}</strong>, and press <strong>%{save_changes}</strong>"
+msgstr "填寫以下的欄ä½ï¼Œé–‹å•Ÿ <strong>%{enable_label}</strong> 後按下 <strong>%{save_changes}</strong>"
+
+msgid "Filter"
+msgstr ""
+
msgid "Filter by commit message"
msgstr "以更動說明篩é¸"
@@ -2258,6 +2896,12 @@ msgstr "以路徑æœå°‹"
msgid "Find file"
msgstr "æœå°‹æª”案"
+msgid "Find the downloaded ZIP file and decompress it."
+msgstr ""
+
+msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file."
+msgstr ""
+
msgid "Finished"
msgstr "已完æˆ"
@@ -2267,6 +2911,30 @@ msgstr "首次"
msgid "FirstPushedBy|pushed by"
msgstr "推é€è€…:"
+msgid "FogBugz Email"
+msgstr "FogBugz é›»å­ä¿¡ç®±"
+
+msgid "FogBugz Import"
+msgstr "匯入 FogBugz"
+
+msgid "FogBugz Password"
+msgstr "FogBugz 密碼"
+
+msgid "FogBugz URL"
+msgstr "FogBugz URL"
+
+msgid "FogBugz import"
+msgstr "匯入 FogBugz"
+
+msgid "Follow the steps below to export your Google Code project data."
+msgstr ""
+
+msgid "Font Color"
+msgstr "å­—é«”é¡è‰²"
+
+msgid "Footer message"
+msgstr "é å°¾è¨Šæ¯"
+
msgid "For internal projects, any logged in user can view pipelines and access job details (output logs and artifacts)"
msgstr "å°æ–¼å…§éƒ¨å°ˆæ¡ˆï¼Œä»»ä½•ç™»éŒ„的使用者都å¯ä»¥æŸ¥çœ‹æµæ°´ç·šä¸¦å­˜å–工作詳細資訊 (輸出日誌和產物)"
@@ -2298,6 +2966,18 @@ msgstr "在您的 .gitlab-ci.yml 中找到錯誤:"
msgid "From %{provider_title}"
msgstr "來自 %{provider_title}"
+msgid "From Bitbucket"
+msgstr "從 Bitbucket"
+
+msgid "From FogBugz"
+msgstr "從 FogBugz"
+
+msgid "From GitLab.com"
+msgstr "從 GitLab.com"
+
+msgid "From Google Code"
+msgstr "從 Google Code"
+
msgid "From issue creation until deploy to production"
msgstr "從議題建立直到部署至營é‹ç’°å¢ƒ"
@@ -2319,6 +2999,201 @@ msgstr "一般æµæ°´ç·š"
msgid "Generate a default set of labels"
msgstr "產生é è¨­çš„標籤"
+msgid "Geo Nodes"
+msgstr "Geo 節點"
+
+msgid "Geo allows you to replicate your GitLab instance to other geographical locations."
+msgstr "Geo å…許您將您的 GitLab 實例複製到其他地ç†ä½ç½®ã€‚"
+
+msgid "GeoNodeSyncStatus|Node is failing or broken."
+msgstr "節點發生錯誤或æ壞。"
+
+msgid "GeoNodeSyncStatus|Node is slow, overloaded, or it just recovered after an outage."
+msgstr "節點éŽæ…¢ã€è¶…載或剛從åœæ©Ÿä¸­é‚„原。"
+
+msgid "GeoNodes|Checksummed"
+msgstr "已進行雜湊值驗證"
+
+msgid "GeoNodes|Data is out of date from %{timeago}"
+msgstr "資料已經éŽæœŸäº† %{timeago} 之久"
+
+msgid "GeoNodes|Data replication lag"
+msgstr "資料複製延é²"
+
+msgid "GeoNodes|Disabling a node stops the sync process. Are you sure?"
+msgstr "åœç”¨ç¯€é»žå°‡æœƒåœæ­¢åŒæ­¥ç¨‹åºï¼Œæ‚¨ç¢ºå®šè¦é€™éº¼åšå—Žï¼Ÿ"
+
+msgid "GeoNodes|Does not match the primary storage configuration"
+msgstr "ä¸ç¬¦åˆä¸»è¦å„²å­˜ç©ºé–“é…ç½®"
+
+msgid "GeoNodes|Failed"
+msgstr "失敗"
+
+msgid "GeoNodes|Full"
+msgstr "全部"
+
+msgid "GeoNodes|GitLab version"
+msgstr "GitLab 版本"
+
+msgid "GeoNodes|GitLab version does not match the primary node version"
+msgstr "GitLab 版本與主è¦ç¯€é»žç‰ˆæœ¬ä¸ç¬¦"
+
+msgid "GeoNodes|Health status"
+msgstr "å¥åº·ç‹€æ³"
+
+msgid "GeoNodes|Last event ID processed by cursor"
+msgstr "利用游標處ç†æœ€å¾Œä¸€å€‹äº‹ä»¶ ID"
+
+msgid "GeoNodes|Last event ID seen from primary"
+msgstr "從主畫é¢çœ‹åˆ°çš„最新活動 ID"
+
+msgid "GeoNodes|Learn more about Repository checksum progress"
+msgstr "了解關於版本庫計算雜湊值éŽç¨‹çš„更多資訊"
+
+msgid "GeoNodes|Learn more about Repository verification"
+msgstr "了解關於版本庫驗證的更多資訊"
+
+msgid "GeoNodes|Learn more about Wiki checksum progress"
+msgstr "了解關於維基雜湊值éŽç¨‹çš„更多資訊"
+
+msgid "GeoNodes|Learn more about Wiki verification"
+msgstr "關於維基èªè­‰çš„更多資訊"
+
+msgid "GeoNodes|Loading nodes"
+msgstr "正在載入節點"
+
+msgid "GeoNodes|Local LFS objects"
+msgstr "本機 LFS 物件"
+
+msgid "GeoNodes|Local attachments"
+msgstr "本機附件"
+
+msgid "GeoNodes|Local job artifacts"
+msgstr "本機任務文件"
+
+msgid "GeoNodes|New node"
+msgstr "新增節點"
+
+msgid "GeoNodes|Node Authentication was successfully repaired."
+msgstr "節點èªè­‰å·²æˆåŠŸä¿®å¾©ã€‚"
+
+msgid "GeoNodes|Node was successfully removed."
+msgstr "已順利移除節點。"
+
+msgid "GeoNodes|Not checksummed"
+msgstr "未檢查雜湊值"
+
+msgid "GeoNodes|Out of sync"
+msgstr "ä¸åŒæ­¥"
+
+msgid "GeoNodes|Removing a node stops the sync process. Are you sure?"
+msgstr "移除節點將會åœæ­¢åŒæ­¥ç¨‹åºï¼Œç¢ºå®šï¼Ÿ"
+
+msgid "GeoNodes|Replication slot WAL"
+msgstr "複製 WAL æ’槽"
+
+msgid "GeoNodes|Replication slots"
+msgstr "複製æ’槽"
+
+msgid "GeoNodes|Repositories"
+msgstr "版本庫"
+
+msgid "GeoNodes|Repositories checksummed for verification with their counterparts on Secondary nodes"
+msgstr "輔助節點上與å°æ‡‰æ–¹èªè­‰çš„版本庫已算出雜湊值"
+
+msgid "GeoNodes|Repositories verified with their counterparts on the Primary node"
+msgstr "主節點上與å°æ‡‰æ–¹çš„版本庫已驗證"
+
+msgid "GeoNodes|Repository checksum progress"
+msgstr "版本庫雜湊值程åº"
+
+msgid "GeoNodes|Repository verification progress"
+msgstr "版本庫驗證程åº"
+
+msgid "GeoNodes|Selective"
+msgstr "é¸æ“‡"
+
+msgid "GeoNodes|Something went wrong while changing node status"
+msgstr "變更節點狀態時發生錯誤"
+
+msgid "GeoNodes|Something went wrong while fetching nodes"
+msgstr "抓å–節點時發生錯誤"
+
+msgid "GeoNodes|Something went wrong while removing node"
+msgstr "移除節點時發生錯誤"
+
+msgid "GeoNodes|Something went wrong while repairing node"
+msgstr "修復節點時發生錯誤"
+
+msgid "GeoNodes|Storage config"
+msgstr "儲存空間設定"
+
+msgid "GeoNodes|Sync settings"
+msgstr "åŒæ­¥è¨­å®š"
+
+msgid "GeoNodes|Synced"
+msgstr "å·²åŒæ­¥"
+
+msgid "GeoNodes|Unused slots"
+msgstr "未使用æ’槽"
+
+msgid "GeoNodes|Unverified"
+msgstr "未驗證"
+
+msgid "GeoNodes|Used slots"
+msgstr "使用的æ’槽"
+
+msgid "GeoNodes|Verified"
+msgstr "已驗證"
+
+msgid "GeoNodes|Wiki checksum progress"
+msgstr "維基雜湊值進度"
+
+msgid "GeoNodes|Wiki verification progress"
+msgstr "維基驗證進度"
+
+msgid "GeoNodes|Wikis"
+msgstr "維基"
+
+msgid "GeoNodes|Wikis checksummed for verification with their counterparts on Secondary nodes"
+msgstr "主節點上與å°æ‡‰æ–¹é©—證的維基已算出雜湊值"
+
+msgid "GeoNodes|Wikis verified with their counterparts on the Primary node"
+msgstr "Wiki 已在主è¦ç¯€é»žçš„å°æ‡‰æ–¹é©—證完æˆ"
+
+msgid "GeoNodes|You have configured Geo nodes using an insecure HTTP connection. We recommend the use of HTTPS."
+msgstr "您使用ä¸å®‰å…¨çš„ HTTP 連線設定 Geo 節點。我們建議使用 HTTPS。"
+
+msgid "Geo|All projects"
+msgstr "所有專案"
+
+msgid "Geo|File sync capacity"
+msgstr "檔案åŒæ­¥é‡"
+
+msgid "Geo|Groups to synchronize"
+msgstr "è¦åŒæ­¥çš„群組"
+
+msgid "Geo|Projects in certain groups"
+msgstr "æŸäº›ç¾¤çµ„中的專案"
+
+msgid "Geo|Projects in certain storage shards"
+msgstr "æŸäº›å„²å­˜ç©ºé–“碎片中的專案"
+
+msgid "Geo|Repository sync capacity"
+msgstr "版本庫åŒæ­¥é‡"
+
+msgid "Geo|Select groups to replicate."
+msgstr "é¸æ“‡è¦è¤‡è£½çš„群組。"
+
+msgid "Geo|Shards to synchronize"
+msgstr "è¦åŒæ­¥çš„碎片"
+
+msgid "Geo|Verification capacity"
+msgstr "驗證能力"
+
+msgid "Git"
+msgstr "Git"
+
msgid "Git repository URL"
msgstr "Git 檔案庫網å€"
@@ -2340,11 +3215,29 @@ msgstr "GitHub 匯入"
msgid "GitLab CI Linter has been moved"
msgstr "GitLab CI Linter 已經æ¬ç§»"
+msgid "GitLab Geo"
+msgstr "GitLab Geo"
+
msgid "GitLab Group Runners can execute code for all the projects in this group."
msgstr "GitLab 群組執行器å¯ä»¥ç‚ºæ­¤ç¾¤çµ„的所有專案執行程å¼ç¢¼ã€‚"
-msgid "GitLab Runner section"
-msgstr "GitLab Runner"
+msgid "GitLab Import"
+msgstr "匯入 GitLab"
+
+msgid "GitLab User"
+msgstr "GitLab 使用者"
+
+msgid "GitLab project export"
+msgstr "匯出 GitLab 專案"
+
+msgid "GitLab single sign on URL"
+msgstr "GitLab URL 單一登入"
+
+msgid "GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr "GitLab 將會在後å°é€²è¡Œç”¢ç”Ÿ GitLab 資料庫å‡å CSV 的作業,該資料庫將會上傳到您設定的å°è±¡å„²å­˜ç›®éŒ„。"
+
+msgid "GitLab.com import"
+msgstr "匯入 GitLab.com"
msgid "Gitaly"
msgstr "Gitaly"
@@ -2355,18 +3248,33 @@ msgstr "Gitaly 伺æœå™¨"
msgid "Gitaly|Address"
msgstr "地å€"
+msgid "Gitea Host URL"
+msgstr "Gitea 主機 URL"
+
+msgid "Gitea Import"
+msgstr "匯入 Gitea"
+
msgid "Go Back"
msgstr "返回"
msgid "Go back"
msgstr "上一é "
+msgid "Go to %{link_to_google_takeout}."
+msgstr ""
+
msgid "Go to your fork"
msgstr "å‰å¾€æ‚¨çš„分支"
msgid "GoToYourFork|Fork"
msgstr "å‰å¾€æ‚¨çš„分支"
+msgid "Google Code import"
+msgstr "匯入 Google Code"
+
+msgid "Google Takeout"
+msgstr "Google Takeout"
+
msgid "Google authentication is not %{link_to_documentation}. Ask your GitLab administrator if you want to use this service."
msgstr "Google 身份驗證ä¸æ˜¯ %{link_to_documentation}。如果您想使用此æœå‹™ï¼Œè«‹è«®è©¢ç®¡ç†å“¡ã€‚"
@@ -2376,18 +3284,72 @@ msgstr "明白ï¼"
msgid "Graph"
msgstr "圖表"
+msgid "Group"
+msgstr "群組"
+
msgid "Group CI/CD settings"
msgstr "群組 CI / CD 設定"
+msgid "Group Git LFS status:"
+msgstr "群組 Git LFS 狀態:"
+
msgid "Group ID"
msgstr "群組 ID"
msgid "Group Runners"
msgstr "群組執行器"
+msgid "Group avatar"
+msgstr "群組頭åƒ"
+
+msgid "Group details"
+msgstr "群組詳細資訊"
+
+msgid "Group info:"
+msgstr "群組資訊:"
+
msgid "Group maintainers can register group runners in the %{link}"
msgstr "群組維護者å¯ä»¥åœ¨ %{link} 註冊群組執行器"
+msgid "Group: %{group_name}"
+msgstr "群組:%{group_name}"
+
+msgid "GroupRoadmap|From %{dateWord}"
+msgstr "從 %{dateWord}"
+
+msgid "GroupRoadmap|Loading roadmap"
+msgstr "正在讀å–開發è—圖"
+
+msgid "GroupRoadmap|Something went wrong while fetching epics"
+msgstr "å–å¾— Epic 時發生錯誤。"
+
+msgid "GroupRoadmap|Sorry, no epics matched your search"
+msgstr "抱歉,沒有任何 Epic 符åˆæ‚¨çš„æœå°‹ã€‚"
+
+msgid "GroupRoadmap|The roadmap shows the progress of your epics along a timeline"
+msgstr "開發è—圖顯示時間軸上您的 Epic 進度"
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è‹¥è¦æª¢è¦–開發è—圖,請新增這個群組或其å­ç¾¤çµ„中一個 Epic 的計畫開始與完æˆæ—¥æœŸã€‚月檢視中,åªæœƒé¡¯ç¤ºä¸Šå€‹æœˆã€é€™å€‹æœˆã€å’ŒæŽ¥ä¸‹ä¾†äº”個月的 Epic &ndash; 從 %{startDate} 到 %{endDate}。"
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è‹¥è¦æª¢è¦–開發è—圖,請新增這個群組或其å­ç¾¤çµ„中一個 Epic 的計畫開始與完æˆæ—¥æœŸã€‚季度檢視中,åªæœƒé¡¯ç¤ºä¸Šå€‹å­£åº¦ã€é€™å€‹å­£åº¦ã€å’ŒæŽ¥ä¸‹ä¾†å››å€‹å­£åº¦çš„ Epic &ndash; 從 %{startDate} 到 %{endDate}。"
+
+msgid "GroupRoadmap|To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è‹¥è¦æª¢è¦–開發è—圖,請新增這個群組或其å­ç¾¤çµ„中一個 Epic 的計畫開始與完æˆæ—¥æœŸã€‚週檢視中,åªæœƒé¡¯ç¤ºä¸Šé€±ã€é€™é€±ã€å’ŒæŽ¥ä¸‹ä¾†å››é€±çš„ Epic &ndash; 從 %{startDate} 到 %{endDate}。"
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the months view, only epics in the past month, current month, and next 5 months are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è‹¥è¦æ“´å¤§æ‚¨çš„æœå°‹ï¼Œè«‹å˜—試修改或移除篩é¸å™¨ã€‚月檢視中,åªæœƒé¡¯ç¤ºä¸Šå€‹æœˆã€é€™å€‹æœˆã€å’ŒæŽ¥ä¸‹ä¾†äº”個月的 Epic &ndash; 從 %{startDate} 到 %{endDate}。"
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the quarters view, only epics in the past quarter, current quarter, and next 4 quarters are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è‹¥è¦æ“´å¤§æ‚¨çš„æœå°‹ï¼Œè«‹å˜—試修改或移除篩é¸å™¨ã€‚季度檢視中,åªæœƒé¡¯ç¤ºä¸Šå€‹å­£åº¦ã€é€™å€‹å­£åº¦ã€å’ŒæŽ¥ä¸‹ä¾†å››å€‹å­£åº¦çš„ Epic &ndash; 從 %{startDate} 到 %{endDate}。"
+
+msgid "GroupRoadmap|To widen your search, change or remove filters. In the weeks view, only epics in the past week, current week, and next 4 weeks are shown &ndash; from %{startDate} to %{endDate}."
+msgstr "è‹¥è¦æ“´å¤§æ‚¨çš„æœå°‹ï¼Œè«‹å˜—試修改或移除篩é¸å™¨ã€‚週檢視中,åªæœƒé¡¯ç¤ºä¸Šé€±ã€é€™é€±ã€å’ŒæŽ¥ä¸‹ä¾†å››é€±çš„ Epic &ndash; 從 %{startDate} 到 %{endDate}。"
+
+msgid "GroupRoadmap|Until %{dateWord}"
+msgstr "直到 %{dateWord}"
+
msgid "GroupSettings|Prevent sharing a project within %{group} with other groups"
msgstr "ç¦æ­¢èˆ‡å…¶ä»–群組共享 %{group} 中的專案"
@@ -2412,9 +3374,33 @@ msgstr "無法啟用上級群組的「共享群組鎖ã€ã€‚åªæœ‰ä¸Šç´šç¾¤çµ„çš„
msgid "GroupSettings|remove the share with group lock from %{ancestor_group_name}"
msgstr "從 %{ancestor_group_name} 中移除共享群組鎖"
+msgid "Groups"
+msgstr "群組"
+
msgid "Groups can also be nested by creating %{subgroup_docs_link_start}subgroups%{subgroup_docs_link_end}."
msgstr "群組也å¯ä»¥å‰µå»º %{subgroup_docs_link_start}å­ç¾¤çµ„%{subgroup_docs_link_end}。"
+msgid "GroupsDropdown|Frequently visited"
+msgstr "最近ç€è¦½"
+
+msgid "GroupsDropdown|Groups you visit often will appear here"
+msgstr "你經常ç€è¦½çš„群組將會在這裡顯示"
+
+msgid "GroupsDropdown|Loading groups"
+msgstr "正在載入群組"
+
+msgid "GroupsDropdown|Search your groups"
+msgstr "æœå°‹æ‚¨çš„群組"
+
+msgid "GroupsDropdown|Something went wrong on our end."
+msgstr "çµæŸæ™‚發生錯誤。"
+
+msgid "GroupsDropdown|Sorry, no groups matched your search"
+msgstr "抱歉,沒有符åˆæ‚¨æœå°‹çš„群組。"
+
+msgid "GroupsDropdown|This feature requires browser localStorage support"
+msgstr "這個功能需è¦ç€è¦½å™¨çš„ localStorage 支æ´"
+
msgid "GroupsEmptyState|A group is a collection of several projects."
msgstr "群組是數個專案的集åˆã€‚"
@@ -2454,6 +3440,12 @@ msgstr "ä¸å¥½æ„æ€ï¼Œæ²’有æœå°‹åˆ°ä»»ä½•ç¬¦åˆæ¢ä»¶çš„群組"
msgid "GroupsTree|Sorry, no groups or projects matched your search"
msgstr "ä¸å¥½æ„æ€ï¼Œæ²’有æœå°‹åˆ°ä»»ä½•ç¬¦åˆæ¢ä»¶çš„群組或專案"
+msgid "Have your users email"
+msgstr "有來自您使用者的信件"
+
+msgid "Header message"
+msgstr "標頭訊æ¯"
+
msgid "Health Check"
msgstr "å¥åº·æª¢æŸ¥"
@@ -2524,12 +3516,21 @@ msgstr "識別碼"
msgid "Identities"
msgstr "身份"
+msgid "Identity provider single sign on URL"
+msgstr "身份æ供者的 URL 單一登入"
+
msgid "If disabled, the access level will depend on the user's permissions in the project."
msgstr "如果ç¦ç”¨ï¼Œå­˜å–等級將å–決於使用者在專案中的權é™ã€‚"
msgid "If enabled"
msgstr "如果啟用"
+msgid "If enabled, access to projects will be validated on an external service using their classification label."
+msgstr "如果啟用,將會使用其分類標籤在外部æœå‹™ä¸Šé©—證專案的存å–。"
+
+msgid "If using GitHub, you’ll see pipeline statuses on GitHub for your commits and pull requests. %{more_info_link}"
+msgstr "如果使用 GitHub,你將會看到用於æ交與推é€è«‹æ±‚çš„ GitHub æµæ°´ç·šç‹€æ…‹ã€‚%{more_info_link}"
+
msgid "If you already have files you can push them using the %{link_to_cli} below."
msgstr "如果你已經æ“有檔案,你å¯ä»¥ä½¿ç”¨ %{link_to_cli} 推é€ä»–們。"
@@ -2548,29 +3549,81 @@ msgstr "Swipe"
msgid "Import"
msgstr "匯入"
+msgid "Import Projects from Gitea"
+msgstr "從 Gitea 匯入專案"
+
+msgid "Import all compatible projects"
+msgstr "匯入所有相容的項目"
+
+msgid "Import all projects"
+msgstr "匯入所有專案"
+
msgid "Import all repositories"
msgstr "匯入所有檔案庫"
+msgid "Import an exported GitLab project"
+msgstr ""
+
msgid "Import in progress"
msgstr "匯入中..."
+msgid "Import multiple repositories by uploading a manifest file."
+msgstr ""
+
+msgid "Import project"
+msgstr "匯入專案"
+
+msgid "Import projects from Bitbucket"
+msgstr ""
+
+msgid "Import projects from FogBugz"
+msgstr "從 FogBugz 匯入專案"
+
+msgid "Import projects from GitLab.com"
+msgstr ""
+
+msgid "Import projects from Google Code"
+msgstr ""
+
msgid "Import repositories from GitHub"
msgstr "從 GitHub 匯入檔案庫"
msgid "Import repository"
msgstr "匯入檔案庫"
+msgid "ImportButtons|Connect repositories from"
+msgstr "連線版本庫自"
+
+msgid "Improve Issue boards with GitLab Enterprise Edition."
+msgstr "改善 GitLab ä¼æ¥­ç‰ˆæœ¬çš„議題看æ¿ã€‚"
+
+msgid "Improve issues management with Issue weight and GitLab Enterprise Edition."
+msgstr "é€éŽè­°é¡Œæ¬Šé‡å’Œ GitLab ä¼æ¥­ç‰ˆæœ¬æ”¹å–„議題管ç†ã€‚"
+
+msgid "Improve search with Advanced Global Search and GitLab Enterprise Edition."
+msgstr "使用進階全域æœå°‹å’Œ GitLab ä¼æ¥­ç‰ˆæœ¬ä¾†æ”¹é€²æœå°‹ã€‚"
+
+msgid "In the next step, you'll be able to select the projects you want to import."
+msgstr ""
+
msgid "Include a Terms of Service agreement and Privacy Policy that all users must accept."
msgstr "包括所有用戶必須接å—çš„æœå‹™æ¢æ¬¾å”議和隱ç§æ”¿ç­–。"
+msgid "Incompatible Project"
+msgstr "ä¸ç›¸å®¹çš„專案"
+
msgid "Inline"
msgstr "內嵌"
+msgid "Install GitLab Runner"
+msgstr "å®‰è£ GitHub 執行器"
+
msgid "Install Runner on Kubernetes"
msgstr "在 Kubernetes 上安è£é‹è¡Œå™¨"
-msgid "Install a Runner compatible with GitLab CI"
-msgstr "安è£èˆ‡ GitLab CI 相容的 Runner"
+msgid "Instance"
+msgid_plural "Instances"
+msgstr[0] "實例"
msgid "Instance does not support multiple Kubernetes clusters"
msgstr "主機沒有支æ´å¤šå€‹ Kubernetes å¢é›†"
@@ -2596,21 +3649,30 @@ msgstr "循環週期"
msgid "Introducing Cycle Analytics"
msgstr "週期分æžç°¡ä»‹"
-msgid "Issue Board"
+msgid "Issue Boards"
msgstr "議題看æ¿"
+msgid "Issue board focus mode"
+msgstr "議題看æ¿ç„¦é»žæ¨¡å¼"
+
msgid "Issue events"
msgstr "議題事件"
msgid "IssueBoards|Board"
msgstr "看æ¿"
+msgid "IssueBoards|Boards"
+msgstr "看æ¿"
+
msgid "Issues"
msgstr "議題"
msgid "Issues can be bugs, tasks or ideas to be discussed. Also, issues are searchable and filterable."
msgstr "è­°é¡Œå¯ä»¥æ˜¯bug,任務或想法來討論。此外,å•é¡Œæ˜¯å¯æœå°‹å’ŒéŽæ¿¾çš„。"
+msgid "Issues closed"
+msgstr "議題已關閉"
+
msgid "Jan"
msgstr "一月"
@@ -2641,6 +3703,9 @@ msgstr "六月"
msgid "Koding"
msgstr "Koding"
+msgid "Koding Dashboard"
+msgstr "Koding 控制é¢æ¿"
+
msgid "Kubernetes"
msgstr "Kubernetes"
@@ -2680,12 +3745,18 @@ msgstr "標籤"
msgid "Label actions dropdown"
msgstr "標籤æ“作下拉èœå–®"
+msgid "Label lists show all issues with the selected label."
+msgstr "標籤列表顯示了é¸å–標籤的所有å•é¡Œã€‚"
+
msgid "LabelSelect|%{firstLabelName} +%{remainingLabelCount} more"
msgstr "%{firstLabelName} +%{remainingLabelCount} 更多"
msgid "LabelSelect|%{labelsString}, and %{remainingLabelCount} more"
msgstr "%{labelsString},和%{remainingLabelCount} 更多"
+msgid "LabelSelect|Labels"
+msgstr "標籤"
+
msgid "Labels"
msgstr "標籤"
@@ -2759,12 +3830,30 @@ msgstr "退出群組"
msgid "Leave project"
msgstr "退出專案"
+msgid "Leave the \"File type\" and \"Delivery method\" options on their default values."
+msgstr ""
+
+msgid "License"
+msgstr "授權"
+
+msgid "LinkedIn"
+msgstr "LinkedIn"
+
msgid "List"
msgstr "清單"
+msgid "List Your Gitea Repositories"
+msgstr "列出您的 Gitea 版本庫"
+
+msgid "List available repositories"
+msgstr "列出å¯ç”¨çš„版本庫"
+
msgid "List your GitHub repositories"
msgstr "列出您 GitHub 的檔案庫"
+msgid "Loading contribution stats for group members"
+msgstr "正在讀å–群組æˆå“¡çš„è²¢ç»çµ±è¨ˆ"
+
msgid "Loading the GitLab IDE..."
msgstr "è®€å– GitLab IDE..."
@@ -2786,15 +3875,39 @@ msgstr "鎖定目å‰å°ˆæ¡ˆ"
msgid "Locked"
msgstr "鎖定"
+msgid "Locked Files"
+msgstr "鎖定的檔案"
+
msgid "Locked to current projects"
msgstr "已鎖定目å‰å°ˆæ¡ˆ"
-msgid "Login"
-msgstr "登入"
+msgid "Locks give the ability to lock specific file or folder."
+msgstr "《鎖定》æ供了鎖定特定檔案或資料夾的能力。"
+
+msgid "Logs"
+msgstr "記錄檔"
+
+msgid "Make everyone on your team more productive regardless of their location. GitLab Geo creates read-only mirrors of your GitLab instance so you can reduce the time it takes to clone and fetch large repos."
+msgstr "無論身在何處,都能讓您團隊中的æ¯å€‹äººéƒ½æ›´æœ‰æ•ˆçŽ‡ã€‚GitLab Geo 建立了您 GitLab 主機的唯讀é¡åƒï¼Œæ‰€ä»¥æ‚¨å¯ä»¥ç¸®çŸ­è¤‡è£½å’ŒæŠ“å–大型版本庫的時間。"
+
+msgid "Make sure you're logged into the account that owns the projects you'd like to import."
+msgstr ""
+
+msgid "Manage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki."
+msgstr ""
+
+msgid "Manage access"
+msgstr "管ç†å­˜å–"
msgid "Manage all notifications"
msgstr "管ç†æ‰€æœ‰é€šçŸ¥"
+msgid "Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account."
+msgstr ""
+
+msgid "Manage applications that you've authorized to use your account."
+msgstr ""
+
msgid "Manage group labels"
msgstr "管ç†ç¾¤çµ„標籤"
@@ -2804,6 +3917,27 @@ msgstr "管ç†æ¨™ç±¤"
msgid "Manage project labels"
msgstr "管ç†å°ˆæ¡ˆæ¨™ç±¤"
+msgid "Manage your group’s membership while adding another level of security with SAML."
+msgstr "當é€éŽ SAML 增加其他安全性等級時,管ç†æ‚¨çš„群組æˆå“¡èº«ä»½ã€‚"
+
+msgid "Manifest"
+msgstr "Manifest"
+
+msgid "Manifest file import"
+msgstr "匯入 Manifest 檔案"
+
+msgid "Map a FogBugz account ID to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a GitLab user"
+msgstr ""
+
+msgid "Map a Google Code user to a full email address"
+msgstr ""
+
+msgid "Map a Google Code user to a full name"
+msgstr ""
+
msgid "Mar"
msgstr "三月"
@@ -2828,18 +3962,30 @@ msgstr "中ä½æ•¸"
msgid "Members"
msgstr "æˆå“¡"
+msgid "Members will be forwarded here when signing in to your group. Get this from your identity provider, where it can also be called \"SSO Service Location\", \"SAML Token Issuance Endpoint\", or \"SAML 2.0/W-Federation URL\"."
+msgstr "當登入至您的群組,æˆå“¡å€‘將會被轉移到這裡。從您的身份æä¾›å–得這個,其å¯èƒ½è¢«ç¨±ç‚ºã€ŒSSO æœå‹™ä½ç½®ã€ã€ã€ŒSAML 憑證頒發端點ã€æˆ–「SAML 2.0/W-Federation URLã€ã€‚"
+
+msgid "Merge Request"
+msgstr "åˆä½µè«‹æ±‚"
+
msgid "Merge Request:"
msgstr "åˆä½µè«‹æ±‚:"
msgid "Merge Requests"
msgstr "åˆä½µè«‹æ±‚"
+msgid "Merge Requests created"
+msgstr "已建立åˆä½µè«‹æ±‚"
+
msgid "Merge events"
msgstr "åˆä½µäº‹ä»¶"
msgid "Merge request"
msgstr "åˆä½µè«‹æ±‚"
+msgid "Merge request approvals"
+msgstr "批准åˆä½µè«‹æ±‚"
+
msgid "Merge requests"
msgstr "åˆä½µè«‹æ±‚"
@@ -2870,12 +4016,114 @@ msgstr "å·²åˆä½µ"
msgid "Messages"
msgstr "公告"
+msgid "Metrics"
+msgstr "指標"
+
msgid "Metrics - Influx"
msgstr "指標 - Influx"
msgid "Metrics - Prometheus"
msgstr "指標 - Prometheus"
+msgid "Metrics|Business"
+msgstr "ä¼æ¥­"
+
+msgid "Metrics|Check out the CI/CD documentation on deploying to an environment"
+msgstr "查看有關部署到環境的 CI / CD 文件。"
+
+msgid "Metrics|Create metric"
+msgstr "建立指標"
+
+msgid "Metrics|Edit metric"
+msgstr "編輯指標"
+
+msgid "Metrics|Environment"
+msgstr "環境"
+
+msgid "Metrics|For grouping similar metrics"
+msgstr "å°ç›¸ä¼¼çš„指標進行分組"
+
+msgid "Metrics|Label of the chart's vertical axis. Usually the type of the unit being charted. The horizontal axis (X-axis) always represents time."
+msgstr "圖表垂直軸的標籤,通常是繪製單ä½çš„類型。水平軸 (X 軸) 總是表示時間。"
+
+msgid "Metrics|Learn about environments"
+msgstr "了解關於環境的資訊"
+
+msgid "Metrics|Legend label (optional)"
+msgstr "圖例標籤(éžå¿…è¦ï¼‰"
+
+msgid "Metrics|Must be a valid PromQL query."
+msgstr "必須是有效的 PromQL 查詢。"
+
+msgid "Metrics|Name"
+msgstr "å稱"
+
+msgid "Metrics|New metric"
+msgstr "建立指標"
+
+msgid "Metrics|No deployed environments"
+msgstr "沒有已經佈署的環境"
+
+msgid "Metrics|Prometheus Query Documentation"
+msgstr "Prometheus 查詢文件"
+
+msgid "Metrics|Query"
+msgstr "查詢"
+
+msgid "Metrics|Response"
+msgstr "回應"
+
+msgid "Metrics|System"
+msgstr "系統"
+
+msgid "Metrics|There was an error fetching the environments data, please try again"
+msgstr "å–得環境資訊時發生錯誤,請é‡è©¦ã€‚"
+
+msgid "Metrics|There was an error getting deployment information."
+msgstr "å–得部署資訊時發生錯誤。"
+
+msgid "Metrics|There was an error getting environments information."
+msgstr "å–得部署資訊時發生錯誤。"
+
+msgid "Metrics|There was an error while retrieving metrics"
+msgstr ""
+
+msgid "Metrics|Type"
+msgstr "類別"
+
+msgid "Metrics|Unexpected deployment data response from prometheus endpoint"
+msgstr "來自 Prometheus 端點的éžé æœŸéƒ¨å±¬è³‡æ–™å›žæ‡‰"
+
+msgid "Metrics|Unexpected metrics data response from prometheus endpoint"
+msgstr "來自 Prometheus 端點的éžé æœŸæŒ‡æ¨™è³‡æ–™å›žæ‡‰"
+
+msgid "Metrics|Unit label"
+msgstr "å–®ä½æ¨™ç±¤"
+
+msgid "Metrics|Used as a title for the chart"
+msgstr "用來當作圖表的標題"
+
+msgid "Metrics|Used if the query returns a single series. If it returns multiple series, their legend labels will be picked up from the response."
+msgstr "如果查詢回傳了單個åºåˆ—則使用,如果其回傳多個åºåˆ—,則會從回應中å–出其圖例標籤。"
+
+msgid "Metrics|Y-axis label"
+msgstr "Y 軸標籤"
+
+msgid "Metrics|e.g. HTTP requests"
+msgstr "例如 HTTP 請求"
+
+msgid "Metrics|e.g. Requests/second"
+msgstr "例如:æ¯ç§’請求"
+
+msgid "Metrics|e.g. Throughput"
+msgstr "例如:Throughput"
+
+msgid "Metrics|e.g. rate(http_requests_total[5m])"
+msgstr "例如:rate(http_requests_total[5m])"
+
+msgid "Metrics|e.g. req/sec"
+msgstr "例如:æ¯ç§’請求"
+
msgid "Milestone"
msgstr "里程碑"
@@ -2900,6 +4148,9 @@ msgstr "å°‡ %{milestoneTitle} æå‡æˆç¾¤çµ„里程碑?"
msgid "Milestones|Promote Milestone"
msgstr "推動里程碑"
+msgid "Milestones|This action cannot be reversed."
+msgstr "這動作無法復原。"
+
msgid "MissingSSHKeyWarningLink|add an SSH key"
msgstr "新增 SSH 金鑰"
@@ -2912,21 +4163,36 @@ msgstr "關閉"
msgid "Monitoring"
msgstr "監控"
+msgid "Months"
+msgstr "月"
+
+msgid "More"
+msgstr "更多"
+
msgid "More actions"
msgstr "更多動作"
+msgid "More info"
+msgstr "更多資訊"
+
msgid "More information"
msgstr "更多資訊"
msgid "More information is available|here"
msgstr "å¥åº·æª¢æŸ¥"
+msgid "Most stars"
+msgstr "最多星數"
+
msgid "Move"
msgstr "移動"
msgid "Move issue"
msgstr "移動議題"
+msgid "Multiple issue boards"
+msgstr "多個議題看æ¿"
+
msgid "Name"
msgstr "å稱"
@@ -2936,6 +4202,9 @@ msgstr "命å新標籤"
msgid "Name your individual key via a title"
msgstr "é€éŽæ¨™é¡Œç‚ºæ‚¨çš„個人密鑰命å"
+msgid "Name:"
+msgstr "å稱:"
+
msgid "Nav|Help"
msgstr "幫助"
@@ -2948,6 +4217,18 @@ msgstr "註冊 / 登入"
msgid "Nav|Sign out and sign in with a different account"
msgstr "登出,並使用其他帳號登入"
+msgid "Network"
+msgstr "網路"
+
+msgid "New"
+msgstr "新增"
+
+msgid "New Application"
+msgstr "新增應用程å¼"
+
+msgid "New Group"
+msgstr "新增群組"
+
msgid "New Identity"
msgstr "新增身份"
@@ -2955,18 +4236,18 @@ msgid "New Issue"
msgid_plural "New Issues"
msgstr[0] "建立議題"
-msgid "New Kubernetes Cluster"
-msgstr "建立 Kubernetes å¢é›†"
-
-msgid "New Kubernetes cluster"
-msgstr "建立 Kubernetes å¢é›†"
-
msgid "New Label"
msgstr "新增標籤"
msgid "New Pipeline Schedule"
msgstr "建立æµæ°´ç·šæŽ’程"
+msgid "New Snippet"
+msgstr "新增片段"
+
+msgid "New Snippets"
+msgstr "新增片段"
+
msgid "New branch"
msgstr "新分支"
@@ -2976,6 +4257,9 @@ msgstr "新的分支ä¸å¯ç”¨"
msgid "New directory"
msgstr "新增目錄"
+msgid "New epic"
+msgstr "æ–°çš„ Epic"
+
msgid "New file"
msgstr "新增檔案"
@@ -3012,9 +4296,15 @@ msgstr "æ–°å­ç¾¤çµ„"
msgid "New tag"
msgstr "新增標籤"
+msgid "New..."
+msgstr "新增…"
+
msgid "No"
msgstr "å¦"
+msgid "No Label"
+msgstr "沒有標籤"
+
msgid "No assignee"
msgstr "未指派"
@@ -3039,18 +4329,42 @@ msgstr "找ä¸åˆ°ä»»ä½•æª”案"
msgid "No files found."
msgstr "找ä¸åˆ°ä»»ä½•æª”案"
+msgid "No issues for the selected time period."
+msgstr "é¸å–的時間範åœä¸­æ²’有議題。"
+
+msgid "No labels with such name or description"
+msgstr ""
+
+msgid "No merge requests for the selected time period."
+msgstr "é¸å–的時間範åœä¸­æ²’有åˆä½µè«‹æ±‚。"
+
msgid "No merge requests found"
msgstr "找ä¸åˆ°åˆä½µè«‹æ±‚"
msgid "No messages were logged"
msgstr "沒有消æ¯è¢«è¨˜éŒ„"
+msgid "No other labels with such name or description"
+msgstr ""
+
+msgid "No prioritised labels with such name or description"
+msgstr ""
+
+msgid "No public groups"
+msgstr "沒有公開群組"
+
+msgid "No pushes for the selected time period."
+msgstr "é¸å–的時間範åœä¸­æ²’有推é€ã€‚"
+
msgid "No repository"
msgstr "找ä¸åˆ°æª”案庫"
msgid "No schedules"
msgstr "沒有排程"
+msgid "No, directly import the existing email addresses and usernames."
+msgstr ""
+
msgid "None"
msgstr "ç„¡"
@@ -3075,12 +4389,21 @@ msgstr "資料ä¸è¶³"
msgid "Note that the master branch is automatically protected. %{link_to_protected_branches}"
msgstr "請注æ„,master 分支é è¨­ç‚ºå—ä¿è­·çš„。 %{link_to_protected_branches}"
+msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr "注æ„:作為管ç†å“¡ï¼Œæ‚¨å¯èƒ½å¸Œæœ›è¨­å®š %{github_integration_link},其å¯ä»¥å…許é€éŽ GitHub 登入,並å…許在未產生個人存å–憑證的情æ³ä¸‹é€£ç·šç‰ˆæœ¬åº«ã€‚"
+
msgid "Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "注æ„:作為管ç†å“¡ï¼Œæ‚¨å¯èƒ½å¸Œæœ›é…ç½® %{github_integration_link},這將å…è¨±é€šéŽ GitHub 登入並å…許匯入存儲庫而ä¸ç”Ÿæˆå€‹äººå­˜å–憑證。"
+msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow connecting repositories without generating a Personal Access Token."
+msgstr "注æ„:請考慮讓您的 GitLab 管ç†å“¡è¨­å®š %{github_integration_link},讓其å…許é€éŽ GitHub 登入並å…許在沒有產生個人存å–憑證的情æ³ä¸‹é€£ç·šåˆ°ç‰ˆæœ¬åº«ã€‚"
+
msgid "Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token."
msgstr "注æ„:請考慮讓您的 GitLab 管ç†å“¡è¨­å®š %{github_integration_link},這將å…許使用者é€éŽ GitHub 登入並å…許匯入儲存庫而ä¸ç”Ÿæˆå€‹äººå­˜å–憑證。"
+msgid "Notes|Are you sure you want to cancel creating this comment?"
+msgstr ""
+
msgid "Notification events"
msgstr "事件通知"
@@ -3153,6 +4476,9 @@ msgstr "å一月"
msgid "Number of access attempts"
msgstr "嘗試存å–的次數"
+msgid "OK"
+msgstr "確定"
+
msgid "Oct"
msgstr "å月"
@@ -3162,6 +4488,15 @@ msgstr "å月"
msgid "OfSearchInADropdown|Filter"
msgstr "篩é¸"
+msgid "Once imported, repositories can be mirrored over SSH. Read more %{ssh_link}"
+msgstr "一旦匯入,就å¯ä»¥é€éŽ SSH é¡åƒç‰ˆæœ¬åº«ã€‚閱讀 %{ssh_link} 以了解更多資訊"
+
+msgid "One or more of your Bitbucket projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
+msgid "One or more of your Google Code projects cannot be imported into GitLab directly because they use Subversion or Mercurial for version control, rather than Git."
+msgstr ""
+
msgid "Online IDE integration settings."
msgstr "線上 IDE æ•´åˆè¨­å®šã€‚"
@@ -3171,9 +4506,30 @@ msgstr "下é¢åƒ…顯示來自以下æ交的註釋"
msgid "Only project members can comment."
msgstr "åªæœ‰ç¾¤çµ„æˆå“¡æ‰èƒ½ç•™è¨€ã€‚"
+msgid "Oops, are you sure?"
+msgstr "喔喔…你確定嗎?"
+
+msgid "Open"
+msgstr "é–‹å•Ÿ"
+
msgid "Open in Xcode"
msgstr "在 Xcode 開啟"
+msgid "Open sidebar"
+msgstr "é–‹å•Ÿå´é‚Šæ¬„"
+
+msgid "Open source software to collaborate on code"
+msgstr ""
+
+msgid "Opened"
+msgstr "é–‹å•Ÿçš„"
+
+msgid "Opened MR"
+msgstr "é–‹å•Ÿçš„åˆä½µè«‹æ±‚ (MR)"
+
+msgid "Opened issues"
+msgstr "開啟的議題"
+
msgid "OpenedNDaysAgo|Opened"
msgstr "開始於"
@@ -3183,6 +4539,12 @@ msgstr "於新視窗開啟"
msgid "Operations"
msgstr "動作"
+msgid "Optionally, you can %{link_to_customize} how FogBugz email addresses and usernames are imported into GitLab."
+msgstr ""
+
+msgid "Optionally, you can %{link_to_customize} how Google Code email addresses and usernames are imported into GitLab."
+msgstr ""
+
msgid "Options"
msgstr "é¸é …"
@@ -3192,6 +4554,9 @@ msgstr "或者您å¯ä»¥åœ¨ä¸‹æ–¹å»ºè­°çš„é¡è‰²ä¸­é¸æ“‡ä¸€å€‹"
msgid "Other Labels"
msgstr "其他標籤"
+msgid "Other information"
+msgstr "其他資訊"
+
msgid "Otherwise it is recommended you start with one of the options below."
msgstr "此外,建議您從下é¢çš„一個é¸é …開始。"
@@ -3228,6 +4593,9 @@ msgstr "密碼"
msgid "Paste your public SSH key, which is usually contained in the file '~/.ssh/id_rsa.pub' and begins with 'ssh-rsa'. Don't use your private SSH key."
msgstr "貼上您的SSH公鑰,通常放置在 '~/.ssh/id_rsa.pub',並以 'ssh-rsa' 開頭。ä¸è¦ä½¿ç”¨æ‚¨çš„SSHç§é‘°ã€‚"
+msgid "Path:"
+msgstr "ä½ç½®ï¼š"
+
msgid "Pause"
msgstr "æš«åœ"
@@ -3261,6 +4629,9 @@ msgstr "æµæ°´ç·šæŽ’程"
msgid "Pipeline Schedules"
msgstr "æµæ°´ç·šæŽ’程"
+msgid "Pipeline quota"
+msgstr "æµæ°´ç·šé¡åº¦"
+
msgid "Pipeline triggers"
msgstr "æµæ°´ç·šè§¸ç™¼å™¨"
@@ -3405,6 +4776,12 @@ msgstr "於階段"
msgid "Plain diff"
msgstr "本文差異"
+msgid "Planned finish date"
+msgstr "計畫完æˆæ—¥æœŸ"
+
+msgid "Planned start date"
+msgstr "計畫開始日期"
+
msgid "PlantUML"
msgstr "PlantUML"
@@ -3414,6 +4791,15 @@ msgstr "執行"
msgid "Please accept the Terms of Service before continuing."
msgstr "在繼續之å‰ï¼Œè«‹åŒæ„æœå‹™æ¢æ¬¾"
+msgid "Please convert them to %{link_to_git}, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please convert them to Git on Google Code, and go through the %{link_to_import_flow} again."
+msgstr ""
+
+msgid "Please note that this application is not provided by GitLab and you should verify its authenticity before allowing access."
+msgstr ""
+
msgid "Please select at least one filter to see results"
msgstr "è«‹é¸æ“‡è‡³å°‘一個篩é¸å™¨ä»¥æª¢è¦–çµæžœ"
@@ -3423,6 +4809,9 @@ msgstr "請填寫驗證碼"
msgid "Please try again"
msgstr "è«‹å†è©¦ä¸€æ¬¡"
+msgid "Please wait while we connect to your repository. Refresh at will."
+msgstr "è«‹ç¨å€™ï¼Œæˆ‘們正在連çµåˆ°æ‚¨çš„版本庫,ç¨å¾Œè«‹é‡æ–°æ•´ç†ã€‚"
+
msgid "Please wait while we import the repository for you. Refresh at will."
msgstr "è«‹ç¨å€™ï¼Œæˆ‘們正在匯入您的檔案庫,ç¨å¾Œè«‹é‡æ–°æ•´ç†ã€‚"
@@ -3432,6 +4821,9 @@ msgstr "å好設定"
msgid "Preferences|Navigation theme"
msgstr "導航主題"
+msgid "Primary"
+msgstr "主è¦"
+
msgid "Prioritize"
msgstr "優先"
@@ -3456,9 +4848,15 @@ msgstr "å¯ä»¥åœ¨æ‚¨çš„個人命å空間中建立ç§äººå°ˆæ¡ˆ:"
msgid "Profile"
msgstr "個人資料"
+msgid "Profile Settings"
+msgstr "個人資料設定"
+
msgid "Profiles|Account scheduled for removal."
msgstr "帳號將會被刪除"
+msgid "Profiles|Add key"
+msgstr "新增金鑰"
+
msgid "Profiles|Change username"
msgstr "變更使用者å稱"
@@ -3486,9 +4884,15 @@ msgstr "無效的使用者å稱"
msgid "Profiles|Path"
msgstr "ä½ç½®"
+msgid "Profiles|This doesn't look like a public SSH key, are you sure you want to add it?"
+msgstr "這看起來ä¸åƒæ˜¯ SSH 公鑰,您確定è¦å¢žåŠ å®ƒå—Žï¼Ÿ"
+
msgid "Profiles|Type your %{confirmationValue} to confirm:"
msgstr "輸入您的 %{confirmationValue} 以確èªï¼š"
+msgid "Profiles|Typically starts with \"ssh-rsa …\""
+msgstr "通常以 \"ssh-rsa …\" 起頭"
+
msgid "Profiles|Update username"
msgstr "更新使用者å稱"
@@ -3507,6 +4911,9 @@ msgstr "你必須轉æ›ä½ çš„所有權或在你刪除你帳號å‰åˆªé™¤é€™äº›ç¾¤
msgid "Profiles|Your account is currently an owner in these groups:"
msgstr "你的帳號目å‰æ“有這些群組:"
+msgid "Profiles|e.g. My MacBook key"
+msgstr "例如:我的 MacBook 金鑰"
+
msgid "Profiles|your account"
msgstr "你的帳號"
@@ -3561,9 +4968,27 @@ msgstr "專案的匯出連çµå·²å¤±æ•ˆã€‚請到專案設定中產生新的連çµ
msgid "Project export started. A download link will be sent by email."
msgstr "專案導出已開始。完æˆå¾Œä¸‹è¼‰é€£çµæœƒé€åˆ°æ‚¨çš„信箱。"
+msgid "Project name"
+msgstr "專案å稱"
+
msgid "ProjectActivityRSS|Subscribe"
msgstr "訂閱"
+msgid "ProjectCreationLevel|Allowed to create projects"
+msgstr "å…許建立專案"
+
+msgid "ProjectCreationLevel|Default project creation protection"
+msgstr "é è¨­å°ˆæ¡ˆå»ºç«‹ä¿è­·"
+
+msgid "ProjectCreationLevel|Developers + Maintainers"
+msgstr "開發者 + 維護者"
+
+msgid "ProjectCreationLevel|Maintainers"
+msgstr "維護者"
+
+msgid "ProjectCreationLevel|No one"
+msgstr "完全沒有"
+
msgid "ProjectFileTree|Name"
msgstr "å稱"
@@ -3573,9 +4998,39 @@ msgstr "從未"
msgid "ProjectLifecycle|Stage"
msgstr "階段"
+msgid "ProjectPage|Project ID: %{project_id}"
+msgstr ""
+
+msgid "ProjectSettings|Contact an admin to change this setting."
+msgstr "è¯çµ¡ç®¡ç†å“¡ä»¥è®Šæ›´é€™å€‹è¨­å®šã€‚"
+
+msgid "ProjectSettings|Failed to protect the tag"
+msgstr "無法ä¿è­·æ¨™ç±¤"
+
+msgid "ProjectSettings|Failed to update tag!"
+msgstr "無法更新標籤ï¼"
+
+msgid "ProjectSettings|Only signed commits can be pushed to this repository."
+msgstr "åªæœ‰å·²ç°½ç½²çš„變更æ‰èƒ½æŽ¨é€åˆ°ç‰ˆæœ¬åº«ã€‚"
+
+msgid "ProjectSettings|This setting is applied on the server level and can be overridden by an admin."
+msgstr "此設定已經套用於伺æœå™¨å±¤ç´šï¼Œä¸¦ä¸”å¯è¢«ç®¡ç†å“¡è¦†å¯«ã€‚"
+
+msgid "ProjectSettings|This setting is applied on the server level but has been overridden for this project."
+msgstr "此設定已經套用於伺æœå™¨ç´šåˆ¥ï¼Œä½†å·²ç¶“在這個專案被覆寫。"
+
+msgid "ProjectSettings|This setting will be applied to all projects unless overridden by an admin."
+msgstr "此設定將套用於所有專案,除éžè¢«ç®¡ç†å“¡è¦†å¯«ã€‚"
+
+msgid "ProjectSettings|Users can only push commits to this repository that were committed with one of their own verified emails."
+msgstr "使用者åªèƒ½é€éŽä»–們自己通éŽé©—證的電å­ä¿¡ç®±ä¹‹ä¸€æ交,æ‰èƒ½æŽ¨é€æ交到這個版本庫。"
+
msgid "Projects"
msgstr "專案"
+msgid "Projects shared with %{group_name}"
+msgstr ""
+
msgid "ProjectsDropdown|Frequently visited"
msgstr "經常使用"
@@ -3594,8 +5049,35 @@ msgstr "發生了內部錯誤"
msgid "ProjectsDropdown|Sorry, no projects matched your search"
msgstr "抱歉,沒有符åˆæœå°‹æ¢ä»¶çš„專案"
-msgid "ProjectsDropdown|This feature requires browser localStorage support"
-msgstr "此功能需è¦ç€è¦½å™¨æ”¯æ´ localStorage"
+msgid "PrometheusAlerts|Add alert"
+msgstr "增加警報"
+
+msgid "PrometheusAlerts|Alert set"
+msgstr "警報設定"
+
+msgid "PrometheusAlerts|Edit alert"
+msgstr "編輯警報"
+
+msgid "PrometheusAlerts|Error creating alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error deleting alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error fetching alert"
+msgstr ""
+
+msgid "PrometheusAlerts|Error saving alert"
+msgstr ""
+
+msgid "PrometheusAlerts|No alert set"
+msgstr "未設定警報"
+
+msgid "PrometheusAlerts|Operator"
+msgstr "æ“作者"
+
+msgid "PrometheusAlerts|Threshold"
+msgstr "門檻"
msgid "PrometheusDashboard|Time"
msgstr "時間"
@@ -3621,9 +5103,18 @@ msgstr "é è¨­ Prometheus ç›£è½ â€˜http://localhost:9090’。ä¸å»ºè­°æ›´æ”¹é 
msgid "PrometheusService|Common metrics"
msgstr "常見指標"
+msgid "PrometheusService|Common metrics are automatically monitored based on a library of metrics from popular exporters."
+msgstr "常用的指標會根據å—匯出者歡迎的指標庫來自動監控。"
+
+msgid "PrometheusService|Custom metrics"
+msgstr "自訂指標"
+
msgid "PrometheusService|Finding and configuring metrics..."
msgstr "尋找和é…置指標⋯⋯"
+msgid "PrometheusService|Finding custom metrics..."
+msgstr "正在æœå°‹è‡ªè¨‚指標…"
+
msgid "PrometheusService|Install Prometheus on clusters"
msgstr "在å¢é›†ä¸­å®‰è£ Prometheus"
@@ -3636,21 +5127,24 @@ msgstr "手動設置"
msgid "PrometheusService|Metrics"
msgstr "指標"
-msgid "PrometheusService|Metrics are automatically configured and monitored based on a library of metrics from popular exporters."
-msgstr "指標會根據一些å—大眾歡迎的指標,自動設置åŠç›£æŽ§ã€‚"
-
msgid "PrometheusService|Missing environment variable"
msgstr "缺少環境變數"
msgid "PrometheusService|More information"
msgstr "更多訊æ¯"
+msgid "PrometheusService|New metric"
+msgstr "新增指標"
+
msgid "PrometheusService|Prometheus API Base URL, like http://prometheus.example.com/"
msgstr "Prometheus API 地å€ï¼Œä¾‹å¦‚ http://prometheus.example.com/"
msgid "PrometheusService|Prometheus is being automatically managed on your clusters"
msgstr "Prometheus 正在自動管ç†æ‚¨çš„å¢é›†"
+msgid "PrometheusService|These metrics will only be monitored after your first deployment to an environment"
+msgstr "這些指標åªæœƒåœ¨ä½ ç¬¬ä¸€æ¬¡éƒ¨å±¬ç’°å¢ƒæ™‚æ‰æœƒç›£æŽ§"
+
msgid "PrometheusService|Time-series monitoring service"
msgstr "時間監控æœå‹™"
@@ -3675,12 +5169,27 @@ msgstr "æå‡è‡³ç¾¤çµ„里程碑"
msgid "Promote to group label"
msgstr "æå‡è‡³ç¾¤çµ„標籤"
+msgid "Promotions|Don't show me this again"
+msgstr "ä¸è¦å†é¡¯ç¤º"
+
+msgid "Promotions|Epics let you manage your portfolio of projects more efficiently and with less effort by tracking groups of issues that share a theme, across projects and milestones."
+msgstr "Epic 讓您更有效率且更少工作é‡çš„管ç†æ‚¨çš„專案組åˆï¼Œé€éŽè¿½è¹¤ç›¸åŒä¸»é¡Œã€è·¨å°ˆæ¡ˆèˆ‡é‡Œç¨‹ç¢‘的群組議題。"
+
+msgid "Promotions|This feature is locked."
+msgstr "這個功能已被鎖定。"
+
+msgid "Promotions|Upgrade plan"
+msgstr "å‡ç´šæ–¹æ¡ˆ"
+
msgid "Protip:"
msgstr "æ示:"
msgid "Provider"
msgstr "æ供者"
+msgid "Pseudonymizer data collection"
+msgstr "Pseudonymizer 資料收集"
+
msgid "Public - The group and any public projects can be viewed without any authentication."
msgstr "公開 - 未登入的情æ³ä¸‹ä¾ç„¶å¯ä»¥æŸ¥çœ‹ä»»ä½•å…¬é–‹å°ˆæ¡ˆ"
@@ -3690,6 +5199,9 @@ msgstr "公開 - 無須任何身份驗證å³å¯å­˜å–該專案"
msgid "Public pipelines"
msgstr "公共æµæ°´ç·š"
+msgid "Push Rules"
+msgstr "推é€è¦å‰‡"
+
msgid "Push events"
msgstr "推é€äº‹ä»¶"
@@ -3699,15 +5211,27 @@ msgstr "é€éŽæŒ‡ä»¤æŽ¨é€å°ˆæ¡ˆ"
msgid "Push to create a project"
msgstr "é€éŽæŽ¨é€å»ºç«‹å°ˆæ¡ˆ"
+msgid "PushRule|Committer restriction"
+msgstr "é™åˆ¶æ交者"
+
+msgid "Pushed"
+msgstr "推é€çš„"
+
+msgid "Pushes"
+msgstr "推é€"
+
+msgid "Quarters"
+msgstr "季度"
+
msgid "Quick actions can be used in the issues description and comment boxes."
msgstr "快速æ“作å¯ä»¥ç”¨æ–¼å•é¡Œæ述和評論框。"
-msgid "Re-deploy"
-msgstr "é‡æ–°éƒ¨ç½²"
-
msgid "Read more"
msgstr "瞭解更多"
+msgid "Read more about project permissions <strong>%{link_to_help}</strong>"
+msgstr ""
+
msgid "Readme"
msgstr "說明檔"
@@ -3717,6 +5241,9 @@ msgstr "å³æ™‚功能"
msgid "Reference:"
msgstr "åƒè€ƒä¾†æº:"
+msgid "Refresh"
+msgstr "é‡æ–°æ•´ç†"
+
msgid "Register / Sign In"
msgstr "註冊 / 登入"
@@ -3768,12 +5295,27 @@ msgstr "刪除優先權"
msgid "Remove project"
msgstr "刪除專案"
+msgid "Repair authentication"
+msgstr "修復èªè­‰"
+
+msgid "Reply to this email directly or %{view_it_on_gitlab}."
+msgstr ""
+
+msgid "Repo by URL"
+msgstr "來自 URL 的版本庫"
+
msgid "Repository"
msgstr "檔案庫"
msgid "Repository Settings"
msgstr "檔案庫設置"
+msgid "Repository URL"
+msgstr "版本庫 URL"
+
+msgid "Repository has no locks."
+msgstr "版本庫沒有上鎖。"
+
msgid "Repository maintenance"
msgstr "檔案庫維護"
@@ -3783,9 +5325,15 @@ msgstr "é¡åƒæª”案庫"
msgid "Repository storage"
msgstr "檔案庫儲存空間"
+msgid "RepositorySettingsAccessLevel|Select"
+msgstr "é¸æ“‡"
+
msgid "Request Access"
msgstr "申請權é™"
+msgid "Requests Profiles"
+msgstr "請求個人資料"
+
msgid "Require all users to accept Terms of Service and Privacy Policy when they access GitLab."
msgstr "è¦æ±‚所有用戶在訪å•GitLab時接å—æœå‹™æ¢æ¬¾å’Œéš±ç§æ”¿ç­–。"
@@ -3807,6 +5355,9 @@ msgstr "解決來æºåˆ†æ”¯ä¸Šçš„è¡çª"
msgid "Resolve discussion"
msgstr "關閉討論"
+msgid "Response metrics (Custom)"
+msgstr "接收指標 (自訂)"
+
msgid "Resume"
msgstr "繼續"
@@ -3832,14 +5383,23 @@ msgstr "還原此åˆä½µ"
msgid "Review"
msgstr "審閱"
+msgid "Review the process for configuring service providers in your identity provider — in this case, GitLab is the \"service provider\" or \"relying party\"."
+msgstr "審閱您的身份æ供者中設定æœå‹™æ供者的éŽç¨‹ -- 如果這樣,GitLab 就是「æœå‹™æ供者ã€æˆ–「ä¾è³´æ–¹ã€ã€‚"
+
msgid "Reviewing"
msgstr "審查"
msgid "Reviewing (merge request !%{mergeRequestId})"
msgstr "正在審閱中(åˆä½µè«‹æ±‚ !%{mergeRequestId})"
-msgid "Rollback"
-msgstr "退回"
+msgid "Revoke"
+msgstr "撤回"
+
+msgid "Roadmap"
+msgstr "開發è—圖"
+
+msgid "Run CI/CD pipelines for external repositories"
+msgstr "執行外部版本庫的 CI / CD æµæ°´ç·šã€‚"
msgid "Runner token"
msgstr "執行器憑證"
@@ -3856,6 +5416,21 @@ msgstr "執行器å¯æ”¾ç½®æ–¼ä¸åŒçš„使用者ã€ä¼ºæœå™¨ï¼Œç”šè‡³åœ¨æ‚¨çš„本
msgid "Running"
msgstr "執行中"
+msgid "SAML SSO"
+msgstr "SAML SSO"
+
+msgid "SAML SSO for %{group_name}"
+msgstr "%{group_name} çš„ SAML SSO"
+
+msgid "SAML Single Sign On"
+msgstr "SAML 單一登入"
+
+msgid "SAML Single Sign On Settings"
+msgstr "SAML 單一登入設定"
+
+msgid "SHA1 fingerprint of the SAML token signing certificate. Get this from your identity provider, where it can also be called \"Thumbprint\"."
+msgstr "SAML 憑證登入憑證的 SHA1 指紋。從您的身份æ供者å–得這個指紋 -- 它å¯èƒ½è¢«ç¨±ç‚ºã€ŒThumbprintã€"
+
msgid "SSH Keys"
msgstr "SSH 金鑰"
@@ -3865,6 +5440,9 @@ msgstr "SSL é©—è­‰"
msgid "Save"
msgstr "儲存"
+msgid "Save application"
+msgstr "儲存應用程å¼"
+
msgid "Save changes"
msgstr "儲存變更"
@@ -3886,6 +5464,15 @@ msgstr "排程"
msgid "Scheduling Pipelines"
msgstr "æµæ°´ç·šæŽ’程"
+msgid "Scope"
+msgstr "範åœ"
+
+msgid "Scoped issue boards"
+msgstr "å€åŸŸæ€§çš„議題看æ¿"
+
+msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right."
+msgstr ""
+
msgid "Scroll to bottom"
msgstr "滾到底部"
@@ -3925,6 +5512,21 @@ msgstr "é‡ç½®å¤±æ•—訊æ¯ç­‰å¾…時間(秒)"
msgid "Seconds to wait for a storage access attempt"
msgstr "等待存å–儲存空間的嘗試時間(秒)"
+msgid "Secret:"
+msgstr "金鑰:"
+
+msgid "Security Dashboard"
+msgstr "安全儀表æ¿"
+
+msgid "Security report"
+msgstr "安全性報告"
+
+msgid "SecurityDashboard|Monitor vulnerabilities in your code"
+msgstr "監控程å¼ç¢¼ä¸­çš„æ¼æ´ž"
+
+msgid "SecurityDashboard|Pipeline %{pipelineLink} triggered"
+msgstr "觸發了æµæ°´ç·š %{pipelineLink}"
+
msgid "Select"
msgstr "é¸æ“‡"
@@ -3955,12 +5557,21 @@ msgstr "é¸æ“‡å°ˆæ¡ˆèˆ‡ä½ç½®ä¾†é¸æ“‡æ©Ÿå™¨é¡žåž‹"
msgid "Select project to choose zone"
msgstr "é¸æ“‡å°ˆæ¡ˆä»¥é¸æ“‡ä½ç½®"
+msgid "Select projects you want to import."
+msgstr ""
+
msgid "Select source branch"
msgstr "é¸æ“‡ä¾†æºåˆ†æ”¯"
msgid "Select target branch"
msgstr "é¸æ“‡ç›®æ¨™åˆ†æ”¯"
+msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user."
+msgstr ""
+
+msgid "Selective synchronization"
+msgstr "é¸æ“‡æ€§åŒæ­¥"
+
msgid "Send email"
msgstr "傳é€é›»å­éƒµä»¶"
@@ -3973,9 +5584,15 @@ msgstr "ä¹æœˆ"
msgid "Server version"
msgstr "伺æœå™¨ç‰ˆæœ¬"
+msgid "Service Desk"
+msgstr "æœå‹™å€"
+
msgid "Service Templates"
msgstr "æœå‹™ç¯„本"
+msgid "Service URL"
+msgstr "æœå‹™ URL"
+
msgid "Session expiration, projects limit and attachment size."
msgstr "éŽæœŸå·¥ä½œéšŽæ®µã€å°ˆæ¡ˆä¸Šé™èˆ‡é™„件大å°ã€‚"
@@ -4000,6 +5617,9 @@ msgstr "設定 CI/CD"
msgid "Set up Koding"
msgstr "設定 Koding"
+msgid "Set up assertions/attributes/claims (email, first_name, last_name) and NameID according to %{docsLinkStart}the documentation %{icon}%{docsLinkEnd}"
+msgstr "根據 %{docsLinkStart}這個文件%{icon}%{docsLinkEnd} 設定斷言 / 屬性 / è²æ˜Ž (email, first_name, last_name) å’Œ NameID"
+
msgid "SetPasswordToCloneLink|set a password"
msgstr "設定密碼"
@@ -4012,9 +5632,24 @@ msgstr "自動設置特定的執行器"
msgid "Share"
msgstr "分享"
+msgid "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider"
+msgstr "與æˆå“¡åˆ†äº« <strong>%{sso_label}</strong>,使他們能é€éŽæ‚¨çš„身份æ供者登入您的群組。"
+
msgid "Shared Runners"
msgstr "分享的執行器"
+msgid "SharedRunnersMinutesSettings|By resetting the pipeline minutes for this namespace, the currently used minutes will be set to zero."
+msgstr "通éŽé‡è¨­æ­¤å‘½å空間的æµæ°´ç·šåŸ·è¡Œæ™‚間,目å‰ä½¿ç”¨çš„執行時間將會被歸零。"
+
+msgid "SharedRunnersMinutesSettings|Reset pipeline minutes"
+msgstr "é‡è¨­æµæ°´ç·šåŸ·è¡Œæ™‚é–“"
+
+msgid "SharedRunnersMinutesSettings|Reset used pipeline minutes"
+msgstr "é‡è¨­æµæ°´ç·šå·²ç”¨æ™‚é–“"
+
+msgid "Sherlock Transactions"
+msgstr "Sherlock 交易"
+
msgid "Show command"
msgstr "顯示指令"
@@ -4043,6 +5678,30 @@ msgstr[0] "顯示 %d 個事件"
msgid "Side-by-side"
msgstr "並排"
+msgid "Sidebar|Change weight"
+msgstr "變更權é‡"
+
+msgid "Sidebar|None"
+msgstr "ç„¡"
+
+msgid "Sidebar|Only numeral characters allowed"
+msgstr "åªå…許數字字元"
+
+msgid "Sidebar|Weight"
+msgstr "權é‡"
+
+msgid "Sign in"
+msgstr "登入"
+
+msgid "Sign in / Register"
+msgstr "登入 / 註冊"
+
+msgid "Sign in to %{group_name}"
+msgstr "登入至 %{group_name}"
+
+msgid "Sign in with Single Sign-On"
+msgstr "é€éŽå–®ä¸€ç™»å…¥é€²è¡Œç™»å…¥"
+
msgid "Sign out"
msgstr "登出"
@@ -4055,6 +5714,9 @@ msgstr "註冊é™åˆ¶"
msgid "Size and domain settings for static websites"
msgstr "為éœæ…‹ç¶²ç«™çš„大å°èˆ‡ç¶²åŸŸè¨­å®š"
+msgid "Slack application"
+msgstr "Slack 應用程å¼"
+
msgid "Slower but makes sure the project workspace is pristine as it clones the repository from scratch for every job"
msgstr "速度較慢,但確ä¿é …目工作空間是原始的,因為它為æ¯é …工作從頭開始複製檔案庫"
@@ -4076,6 +5738,12 @@ msgstr "切æ›æŒ‰éˆ•æ™‚發生未知的錯誤"
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr "在關閉議題 %{issuable} 時出ç¾å•é¡Œï¼Œè«‹ç¨å¾Œå†è©¦"
+msgid "Something went wrong while fetching assignees list"
+msgstr "抓å–指派者清單時發生錯誤。"
+
+msgid "Something went wrong while fetching group member contributions"
+msgstr "å–得群組æˆå“¡è²¢ç»æ™‚發生錯誤。"
+
msgid "Something went wrong while fetching the projects."
msgstr "讀å–專案時發生錯誤。"
@@ -4091,6 +5759,9 @@ msgstr "解決此議題時出ç¾å•é¡Œã€‚è«‹å†è©¦ä¸€æ¬¡ã€‚"
msgid "Something went wrong. Please try again."
msgstr "發生了未知的錯誤,請ç¨å¾Œå†è©¦"
+msgid "Sorry, no epics matched your search"
+msgstr "抱歉,沒有符åˆæ‚¨æœå°‹çš„ Epic"
+
msgid "Sort by"
msgstr "排åº"
@@ -4133,6 +5804,9 @@ msgstr "最近更新"
msgid "SortOptions|Least popular"
msgstr "最ä¸å—æ­¡è¿Ž"
+msgid "SortOptions|Less weight"
+msgstr "é™ä½Žæ¬Šé‡"
+
msgid "SortOptions|Milestone"
msgstr "里程碑"
@@ -4142,6 +5816,9 @@ msgstr "里程碑截止日期"
msgid "SortOptions|Milestone due soon"
msgstr "å³å°‡æˆªæ­¢çš„里程碑"
+msgid "SortOptions|More weight"
+msgstr "加大權é‡"
+
msgid "SortOptions|Most popular"
msgstr "最å—æ­¡è¿Ž"
@@ -4181,6 +5858,9 @@ msgstr "ç¨å¾Œé–‹å§‹"
msgid "SortOptions|Start soon"
msgstr "ç¾åœ¨é–‹å§‹"
+msgid "SortOptions|Weight"
+msgstr "權é‡"
+
msgid "Source"
msgstr "來æº"
@@ -4253,9 +5933,15 @@ msgstr "已開始"
msgid "Starts at (UTC)"
msgstr "開始於 (UTC)"
+msgid "State your message to activate"
+msgstr "暫存您的訊æ¯ä»¥å•Ÿç”¨"
+
msgid "Status"
msgstr "狀態"
+msgid "Stop impersonation"
+msgstr "åœæ­¢æ¨¡æ“¬"
+
msgid "Stop this environment"
msgstr "åœæ­¢æ­¤ç’°å¢ƒ"
@@ -4265,9 +5951,18 @@ msgstr "å·²åœæ­¢"
msgid "Storage"
msgstr "儲存"
+msgid "Storage:"
+msgstr "儲存空間:"
+
msgid "Subgroups"
msgstr "å­ç¾¤çµ„"
+msgid "Submit as spam"
+msgstr "以垃圾訊æ¯æ交"
+
+msgid "Submit search"
+msgstr ""
+
msgid "Subscribe"
msgstr "訂閱"
@@ -4280,9 +5975,21 @@ msgstr "訂閱專案"
msgid "Switch branch/tag"
msgstr "切æ›åˆ†æ”¯/標籤"
+msgid "Sync information"
+msgstr "åŒæ­¥è©³ç´°è³‡è¨Š"
+
msgid "System Hooks"
msgstr "系統鉤å­"
+msgid "System Info"
+msgstr "系統資訊"
+
+msgid "System header and footer:"
+msgstr "系統標頭與尾端:"
+
+msgid "System metrics (Custom)"
+msgstr "系統指標 (自訂)"
+
msgid "Tag (%{tag_count})"
msgid_plural "Tags (%{tag_count})"
msgstr[0] "標籤(%{tag_count})"
@@ -4380,18 +6087,30 @@ msgstr "æœå‹™æ¢æ¬¾å’Œéš±ç§æ”¿ç­–"
msgid "Test coverage parsing"
msgstr "測試覆蓋率分æž"
+msgid "Thanks! Don't show me this again"
+msgstr "æ„Ÿè¬ï¼è«‹ä¸è¦å†æ¬¡é¡¯ç¤º"
+
+msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project."
+msgstr "GitLab 的進階全域æœå°‹åŠŸèƒ½æ˜¯éžå¸¸å¼·å¤§çš„æœå°‹æœå‹™ã€‚您å¯ä»¥ç«‹åˆ»æœå°‹å…¶ä»–團隊的代碼以幫助您完善自己項目中的代碼。從而é¿å…建立é‡è¤‡çš„程å¼ç¢¼æµªè²»æ™‚間。"
+
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project"
msgstr "議題追蹤器是添加專案中需è¦æ”¹é€²æˆ–解決å•é¡Œçš„地方。"
msgid "The Issue Tracker is the place to add things that need to be improved or solved in a project. You can register or sign in to create issues for this project."
msgstr "議題追蹤器是添加專案中需è¦æ”¹é€²æˆ–解決å•é¡Œçš„地方。您å¯ä»¥è¨»å†Šæˆ–登入為專案創建議題。"
+msgid "The X509 Certificate to use when mutual TLS is required to communicate with the external authorization service. If left blank, the server certificate is still validated when accessing over HTTPS."
+msgstr "當需è¦ç›¸äº’ TLS 與外部èªè­‰æœå‹™è¯çµ¡æ™‚,所使用的 X509 憑證。如果留白,使用 HTTPS 連線時伺æœå™¨çš„憑證ä»ç„¶ç‚ºã€Œå·²èªè­‰ã€ã€‚"
+
msgid "The coding stage shows the time from the first commit to creating the merge request. The data will automatically be added here once you create your first merge request."
msgstr "程å¼é–‹ç™¼éšŽæ®µé¡¯ç¤ºå¾žç¬¬ä¸€æ¬¡æ›´å‹•è¨˜éŒ„到建立åˆä½µè«‹æ±‚的時間。建立第一個åˆä½µè«‹æ±‚後,資料將自動填入。"
msgid "The collection of events added to the data gathered for that stage."
msgstr "該階段中的相關事件集åˆã€‚"
+msgid "The connection will time out after %{timeout}. For repositories that take longer, use a clone/push combination."
+msgstr "該連線將在 %{timeout} 之後超時。å°æ–¼éœ€è¦ä½¿ç”¨æ›´é•·æ™‚間的版本庫,請使用 clone / push 組åˆã€‚"
+
msgid "The fork relationship has been removed."
msgstr "分支與主幹間的關è¯å·²è¢«åˆªé™¤ã€‚"
@@ -4407,8 +6126,11 @@ msgstr "最大檔案大å°ç‚º 200KB"
msgid "The number of attempts GitLab will make to access a storage."
msgstr "GitLab å­˜å–儲存空間的嘗試次數。"
-msgid "The number of failures of after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
-msgstr "GitLab 將阻擋存å–失敗的次數。在管ç†è€…介é¢ä¸­å¯ä»¥é‡ç½®å¤±æ•—次數: %{link_to_health_page} 或使用 %{api_documentation_link}。"
+msgid "The number of failures after which GitLab will completely prevent access to the storage. The number of failures can be reset in the admin interface: %{link_to_health_page} or using the %{api_documentation_link}."
+msgstr ""
+
+msgid "The passphrase required to decrypt the private key. This is optional and the value is encrypted at rest."
+msgstr "解密ç§é‘°æ‰€éœ€çš„密碼。這是é¸ç”¨ä¸”該值將會被加密儲存。"
msgid "The path to CI config file. Defaults to <code>.gitlab-ci.yml</code>"
msgstr "CI 設定檔的路徑。默èªç‚º <code>.gitlab-ci.yml</code>"
@@ -4419,6 +6141,9 @@ msgstr "專案開發週期的å„個階段。"
msgid "The planning stage shows the time from the previous step to pushing your first commit. This time will be added automatically once you push your first commit."
msgstr "計劃階段顯示從更動記錄被排程至第一個推é€çš„時間。第一次推é€ä¹‹å¾Œï¼Œè³‡æ–™å°‡è‡ªå‹•å¡«å…¥ã€‚"
+msgid "The private key to use when a client certificate is provided. This value is encrypted at rest."
+msgstr "æ供客戶端憑證時所使用的ç§é‘°ã€‚æ­¤ç§é‘°å°‡æœƒè¢«åŠ å¯†å„²å­˜ã€‚"
+
msgid "The production stage shows the total time it takes between creating an issue and deploying the code to production. The data will be automatically added once you have completed the full idea to production cycle."
msgstr "營é‹éšŽæ®µé¡¯ç¤ºå¾žå»ºç«‹è­°é¡Œåˆ°éƒ¨ç½²ç¨‹å¼ä¸Šç·šæ‰€èŠ±çš„時間。完æˆå¾žç™¼æƒ³åˆ°ä¸Šç·šçš„完整開發週期後,資料將自動填入。"
@@ -4428,6 +6153,9 @@ msgstr "本專案å¯è®“任何已登入的使用者存å–"
msgid "The project can be accessed without any authentication."
msgstr "本專案å¯è®“任何人存å–"
+msgid "The pseudonymizer data collection is disabled. When enabled, GitLab will run a background job that will produce pseudonymized CSVs of the GitLab database that will be uploaded to your configured object storage directory."
+msgstr "Pseudonymizer 資料è’集已經åœç”¨ã€‚如果啟用,GitLab 將會執行一個背景作業 -- 其將會產生 GitLab 資料庫的å‡å CSV,使其å¯ä»¥ä¸Šå‚³åˆ°æ‚¨è¨­å®šçš„å°è±¡å„²å­˜ç›®éŒ„。"
+
msgid "The repository for this project does not exist."
msgstr "本專案沒有檔案庫"
@@ -4440,6 +6168,9 @@ msgstr "該存儲庫必須å¯é€šéŽ <code>http://</code>, <code>https://</
msgid "The review stage shows the time from creating the merge request to merging it. The data will automatically be added after you merge your first merge request."
msgstr "複閱階段顯示從åˆä½µè«‹æ±‚建立後至被åˆä½µçš„時間。當建立第一個åˆä½µè«‹æ±‚後,資料將自動填入。"
+msgid "The roadmap shows the progress of your epics along a timeline"
+msgstr "開發è—圖顯示了時間軸上您的 Epic 的進度"
+
msgid "The secure token used by the Runner to checkout the project"
msgstr "此安全憑證使用於執行器簽出專案"
@@ -4455,12 +6186,18 @@ msgstr "GitLab ä¿å­˜å¤±æ•—訊æ¯çš„時間(秒)。在此時間內若沒有發生
msgid "The time in seconds GitLab will try to access storage. After this time a timeout error will be raised."
msgstr "GitLab 嘗試存å–檔案庫的時間 (秒)。超éŽæ­¤æ™‚間將會引發逾時錯誤。"
-msgid "The time in seconds between storage checks. When a previous check did complete yet, GitLab will skip a check."
-msgstr "存儲檢查之間的時間(秒)。當以å‰çš„檢查完æˆæ™‚,GitLab將跳éŽæª¢æŸ¥ã€‚"
+msgid "The time in seconds between storage checks. If a check did not complete yet, GitLab will skip the next check."
+msgstr ""
msgid "The time taken by each data entry gathered by that stage."
msgstr "該階段中æ¯ä¸€å€‹è³‡æ–™é …目所花的時間。"
+msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side."
+msgstr ""
+
+msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below."
+msgstr ""
+
msgid "The value lying at the midpoint of a series of observed values. E.g., between 3, 5, 9, the median is 5. Between 3, 5, 7, 8, the median is (5+7)/2 = 6."
msgstr "中ä½æ•¸æ˜¯ä¸€å€‹æ•¸åˆ—中最中間的值。例如在 3ã€5ã€9 之間,中ä½æ•¸æ˜¯ 5。在 3ã€5ã€7ã€8 之間,中ä½æ•¸æ˜¯ (5 + 7)/ 2 = 6。"
@@ -4476,12 +6213,6 @@ msgstr "沒有任何的åˆä½µè«‹æ±‚"
msgid "There are problems accessing Git storage: "
msgstr "å­˜å– Git 儲存空間時出ç¾å•é¡Œï¼š"
-msgid "There was an error loading jobs"
-msgstr "載入工作時發生錯誤"
-
-msgid "There was an error loading latest pipeline"
-msgstr "載入最新æµæ°´ç·šæ™‚發生錯誤"
-
msgid "There was an error loading users activity calendar."
msgstr "讀å–使用者行事曆活動時發生錯誤"
@@ -4503,15 +6234,33 @@ msgstr "å–消訂閱此標籤時出ç¾éŒ¯èª¤ã€‚"
msgid "They can be managed using the %{link}."
msgstr "å…¶å¯ä»¥ä½¿ç”¨ %{link} 進行管ç†ã€‚"
+msgid "Third party offers"
+msgstr "第三方æä¾›"
+
msgid "This GitLab instance does not provide any shared Runners yet. Instance administrators can register shared Runners in the admin area."
msgstr "æ­¤ GitLab 實例ä¸æ供任何分享的執行器。實例管ç†å“¡å¯ä»¥åœ¨ç®¡ç†å“¡å€åŸŸè¨»å†Šåˆ†äº«çš„執行器。"
+msgid "This application was created by %{link_to_owner}."
+msgstr ""
+
+msgid "This application will be able to:"
+msgstr ""
+
+msgid "This board's scope is reduced"
+msgstr "已縮å°æ­¤çœ‹æ¿ç¯„åœ"
+
msgid "This diff is collapsed."
msgstr "此差異已折疊。"
msgid "This directory"
msgstr "這個目錄"
+msgid "This group"
+msgstr "此群組"
+
+msgid "This group allows you to sign in with your %{group_name} Single Sign-On account. This will redirect you to an external sign in page."
+msgstr "此群組å…許您以您的 %{group_name} 單一登入帳號登入。這將會é‡æ–°å°Žå‘您到外部登入é é¢ã€‚"
+
msgid "This group does not provide any group Runners yet."
msgstr "這群組尚未æ供任何群組執行器。"
@@ -4587,6 +6336,12 @@ msgstr "此原始碼差異無法顯示,因為它太大。"
msgid "This user has no identities"
msgstr "該使用者沒有身份"
+msgid "This will delete the custom metric, Are you sure?"
+msgstr "這會刪除自訂指標資料,你確定嗎?"
+
+msgid "Those emails automatically become issues (with the comments becoming the email conversation) listed here."
+msgstr "這裡列出了那些自動æˆç‚ºè­°é¡Œçš„é›»å­éƒµä»¶ï¼ˆå¾žç•™è¨€è®Šæˆçš„é›»å­éƒµä»¶å°è©±ï¼‰"
+
msgid "Time before an issue gets scheduled"
msgstr "議題被列入日程表的時間"
@@ -4596,6 +6351,9 @@ msgstr "議題等待開始實作的時間"
msgid "Time between merge request creation and merge/close"
msgstr "åˆä½µè«‹æ±‚從建立到被åˆä½µæˆ–是關閉的時間"
+msgid "Time in seconds GitLab will wait for a response from the external service. When the service does not respond in time, access will be denied."
+msgstr "GitLab 等待外部æœå‹™çš„回應時間(秒)。當æœå‹™æ²’有在時間內回應時,存å–將被拒絕。"
+
msgid "Time remaining"
msgstr "剩餘時間"
@@ -4760,12 +6518,30 @@ msgstr "秒"
msgid "Tip:"
msgstr "æ示:"
+msgid "Title"
+msgstr "標題"
+
msgid "To GitLab"
msgstr "到 GitLab"
msgid "To add an SSH key you need to %{generate_link_start}generate one%{link_end} or use an %{existing_link_start}existing key%{link_end}."
msgstr "è¦æ·»åŠ SSHå¯†é‘°ï¼Œä½ éœ€è¦ %{generate_link_start}產生一個%{link_end} 或使用 %{existing_link_start}ç¾æœ‰çš„密鑰%{link_end}。"
+msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect."
+msgstr "è‹¥è¦é€£ç·šåˆ° GitHub 版本庫,您å¯ä»¥ä½¿ç”¨ %{personal_access_token_link} 連çµã€‚當您建立了您的個人存å–憑證,您將需è¦é¸æ“‡ <code>版本庫</code> 範åœï¼Œæ‰€ä»¥æˆ‘們å¯ä»¥é¡¯ç¤ºæ‚¨å¯ä¾›é€£ç·šçš„公開與ç§å¯†ç‰ˆæœ¬åº«åˆ—表。"
+
+msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories:"
+msgstr "è¦é€£æŽ¥ GitHub 版本庫,您首先需è¦æŽˆæ¬Š GitLab å­˜å–您的 GitHub 版本庫列表:"
+
+msgid "To connect an SVN repository, check out %{svn_link}."
+msgstr "è‹¥è¦é€£æŽ¥åˆ°ä¸€å€‹ SVN 版本庫,請åƒé–± %{svn_link}。"
+
+msgid "To get started you enter your FogBugz URL and login information below. In the next steps, you'll be able to map users and select the projects you want to import."
+msgstr ""
+
+msgid "To get started, please enter your Gitea Host URL and a %{link_to_personal_token}."
+msgstr ""
+
msgid "To import GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import."
msgstr "è¦åŒ¯å…¥ GitHub 存儲庫,你å¯ä»¥ä½¿ç”¨ %{personal_access_token_link}。當你建立你的個人存å–權æ–時,你將需è¦é¸æ“‡<code>檔案庫</code>範åœï¼Œæ‰€ä»¥æˆ‘們將會顯示你公開åŠç§äººçš„檔案庫清單進行匯入。"
@@ -4775,21 +6551,45 @@ msgstr "è¦åŒ¯å…¥ GitHub 存儲庫,您首先需è¦æŽˆæ¬Š GitLab 訪å•æ‚¨çš„ G
msgid "To import an SVN repository, check out %{svn_link}."
msgstr "è¦åŒ¯å…¥SVN存儲庫,請查看 %{svn_link}。"
+msgid "To move or copy an entire GitLab project from another GitLab installation to this one, navigate to the original project's settings page, generate an export file, and upload it here."
+msgstr ""
+
+msgid "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>."
+msgstr "è‹¥è¦åªå°å¤–部版本庫使用 CI / CD 功能,請é¸æ“‡ <strong>為外部版本庫的 CI/CD</strong>"
+
+msgid "To set up SAML authentication for your group through an identity provider like Azure, Okta, Onelogin, Ping Identity, or your custom SAML 2.0 provider:"
+msgstr "è‹¥è¦é€éŽèº«ä»½æ供者(例如 Azureã€Oktaã€Oneloginã€Ping Identity 或您自訂的 SAML 2.0 æ供者)設定 SAML èªè­‰ï¼š"
+
msgid "To start serving your jobs you can add Runners to your group"
msgstr "è‹¥è¦é–‹å§‹æ供您的工作,您å¯ä»¥å¢žåŠ åŸ·è¡Œå™¨è‡³é€™å€‹ç¾¤çµ„"
+msgid "To this GitLab instance"
+msgstr ""
+
msgid "To validate your GitLab CI configurations, go to 'CI/CD → Pipelines' inside your project, and click on the 'CI Lint' button."
msgstr "è‹¥è¦é©—證您的 GitLab CI 設定,請å‰å¾€æ‚¨å°ˆæ¡ˆå…§çš„「CI/CD → æµæ°´ç·šã€ï¼Œä¸¦æŒ‰ä¸‹ã€ŒCI Lintã€æŒ‰éˆ•ã€‚"
+msgid "To view the roadmap, add a planned start or finish date to one of your epics in this group or its subgroups. Only epics in the past 3 months and the next 3 months are shown."
+msgstr "è‹¥è¦æª¢è¦–開發è—圖,請在您群組或å­ç¾¤çµ„中的其中一個 Epic 中增加計畫開始或完æˆæ™‚間。åªæœƒé¡¯ç¤ºæœ€è¿‘三個月或接下來三個月的 Epic。"
+
+msgid "To widen your search, change or remove filters."
+msgstr "è‹¥è¦æ“´å¤§æœå°‹ç¯„åœï¼Œè«‹è®Šæ›´æˆ–移除篩é¸å™¨ã€‚"
+
msgid "Todo"
msgstr "待辦事項"
+msgid "Todos"
+msgstr "待辦事項"
+
msgid "Toggle Sidebar"
msgstr "展開 / 收起å´é‚Šæ¬„"
msgid "Toggle discussion"
msgstr "切æ›è¨Žè«–"
+msgid "Toggle navigation"
+msgstr "切æ›å°Žèˆªæ¬„"
+
msgid "Toggle sidebar"
msgstr "切æ›å´é‚Šæ¬„"
@@ -4802,6 +6602,9 @@ msgstr "切æ›ç‹€æ…‹ï¼šé–‹å•Ÿ"
msgid "Too many changes to show."
msgstr "太多的更改。"
+msgid "Total Contributions"
+msgstr "總計貢ç»"
+
msgid "Total Time"
msgstr "總時間"
@@ -4811,9 +6614,18 @@ msgstr "åˆä½µ/更動記錄的總測試時間"
msgid "Total: %{total}"
msgstr "總計: %{total}"
+msgid "Track activity with Contribution Analytics."
+msgstr "追蹤貢ç»åˆ†æžçš„相關動態"
+
+msgid "Track groups of issues that share a theme, across projects and milestones"
+msgstr "跟蹤共通主題ã€è·¨å°ˆæ¡ˆå’Œé‡Œç¨‹ç¢‘的議題群組"
+
msgid "Track time with quick actions"
msgstr "快速使用時間追蹤工具"
+msgid "Trending"
+msgstr ""
+
msgid "Trigger this manual action"
msgstr "啟動此任務"
@@ -4823,9 +6635,21 @@ msgstr "觸發器å¯ä»¥å¼·åˆ¶ä½¿ç”¨API​​調用é‡å»ºç‰¹å®šçš„分支或標記
msgid "Try again"
msgstr "é‡è©¦"
+msgid "Turn on Service Desk"
+msgstr "é–‹å•Ÿæœå‹™å€"
+
+msgid "Twitter"
+msgstr "Twitter"
+
msgid "Unable to load the diff. %{button_try_again}"
msgstr "無法載入差異。%{button_try_again}"
+msgid "Unable to sign you in to the group with SAML due to \"%{reason}\""
+msgstr "因為「%{reason}ã€ï¼Œæ‰€ä»¥ç„¡æ³•è®“ä½ é€éŽ SAML 登入這個群組。"
+
+msgid "Unknown"
+msgstr "未知"
+
msgid "Unlock"
msgstr "解鎖"
@@ -4868,13 +6692,30 @@ msgstr "未驗證"
msgid "Up to date"
msgstr "已經是最新"
-msgid "Update %{files}"
-msgid_plural "Update %{files} files"
-msgstr[0] "更新 %{files} 檔案"
+msgid "Update"
+msgstr "æ›´æ–°"
msgid "Update your group name, description, avatar, and other general settings."
msgstr "更新您的群組å稱ã€èªªæ˜Žã€é ­åƒèˆ‡å…¶ä»–一般設定。"
+msgid "Upgrade your plan to activate Advanced Global Search."
+msgstr "å‡ç´šæ‚¨çš„方案以啟用進階全局æœå°‹ã€‚"
+
+msgid "Upgrade your plan to activate Contribution Analytics."
+msgstr "å‡ç´šæ‚¨çš„方案以啟用貢ç»åˆ†æžã€‚"
+
+msgid "Upgrade your plan to activate Group Webhooks."
+msgstr "å‡ç´šä½ çš„方案以啟用群組 Webhook。"
+
+msgid "Upgrade your plan to activate Issue weight."
+msgstr "å‡ç´šæ‚¨çš„方案以啟用議題權é‡ã€‚"
+
+msgid "Upgrade your plan to improve Issue boards."
+msgstr "å‡ç´šæ‚¨çš„方案以改善議題看æ¿ã€‚"
+
+msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:"
+msgstr ""
+
msgid "Upload New File"
msgstr "上傳新檔案"
@@ -4893,18 +6734,36 @@ msgstr "讚"
msgid "Usage statistics"
msgstr "使用情形統計資料"
+msgid "Use <code>%{native_redirect_uri}</code> for local tests"
+msgstr ""
+
+msgid "Use Service Desk to connect with your users (e.g. to offer customer support) through email right inside GitLab"
+msgstr "使用æœå‹™å°åœ¨ GitLab 內部é€éŽé›»å­éƒµä»¶èˆ‡ä½¿ç”¨è€…è¯çµ¡ (例如æ供客戶æœå‹™)"
+
msgid "Use group milestones to manage issues from multiple projects in the same milestone."
msgstr "使用群組里程碑從多個專案中於åŒä¸€å€‹é‡Œç¨‹ç¢‘管ç†è­°é¡Œã€‚"
+msgid "Use one line per URI"
+msgstr "æ¯å€‹ URL 使用一行"
+
msgid "Use the following registration token during setup:"
msgstr "在安è£éŽç¨‹ä¸­ä½¿ç”¨æ­¤è¨»å†Šæ†‘è­‰:"
msgid "Use your global notification setting"
msgstr "使用全域通知設定"
+msgid "Used by members to sign in to your group in GitLab"
+msgstr "用來讓æˆå“¡ç™»å…¥æ‚¨åœ¨ GitLab 的群組"
+
+msgid "User Settings"
+msgstr ""
+
msgid "User and IP Rate Limits"
msgstr "使用者與 IP 速率é™åˆ¶"
+msgid "User map"
+msgstr ""
+
msgid "Users"
msgstr "使用者"
@@ -4923,15 +6782,27 @@ msgstr "å„種電å­ä¿¡ç®±è¨­å®šã€‚"
msgid "Various settings that affect GitLab performance."
msgstr "å„種會影響 GitLab 效能的設定。"
+msgid "Verification information"
+msgstr "èªè­‰è³‡è¨Š"
+
msgid "Verified"
msgstr "已驗證"
+msgid "View epics list"
+msgstr "檢視 Epic 列表"
+
msgid "View file @ "
msgstr "ç€è¦½æª”案 @ "
msgid "View group labels"
msgstr "查看群組標籤"
+msgid "View issue"
+msgstr "檢視議題"
+
+msgid "View it on GitLab"
+msgstr ""
+
msgid "View jobs"
msgstr "查看工作"
@@ -4953,6 +6824,12 @@ msgstr "ç€è¦½å·²æ›¿æ›æª”案 @ "
msgid "Visibility and access controls"
msgstr "å¯è¦‹æ€§èˆ‡å­˜å–控制"
+msgid "Visibility level:"
+msgstr ""
+
+msgid "Visibility:"
+msgstr ""
+
msgid "VisibilityLevel|Internal"
msgstr "內部"
@@ -4968,6 +6845,9 @@ msgstr "ä¸æ˜Ž"
msgid "Want to see the data? Please ask an administrator for access."
msgstr "權é™ä¸è¶³ã€‚如需查看相關資料,請å‘管ç†å“¡ç”³è«‹æ¬Šé™ã€‚"
+msgid "We detected potential spam in the %{humanized_resource_name}. Please solve the reCAPTCHA to proceed."
+msgstr ""
+
msgid "We don't have enough data to show this stage."
msgstr "因該階段的資料ä¸è¶³è€Œç„¡æ³•é¡¯ç¤ºç›¸é—œè³‡è¨Š"
@@ -4980,12 +6860,27 @@ msgstr "ç¶²é  IDE"
msgid "Web terminal"
msgstr "網é çµ‚端器"
+msgid "Webhooks allow you to trigger a URL if, for example, new code is pushed or a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. Group webhooks will apply to all projects in a group, allowing you to standardize webhook functionality across your entire group."
+msgstr "Webhooks å…許你觸發 URL,例如推é€äº†æ–°çš„程å¼ç¢¼ã€æˆ–是建立了新的議題。您å¯ä»¥è¨­å®š Webhook 以監è½æŒ‡å®šçš„活動,例如推é€ã€è­°é¡Œæˆ–åˆä½µè«‹æ±‚。群組 Webhooks 將套用至群組中的所有專案,å…許你è¦ç¯„整個群組中的 Webhook 的功能。"
+
+msgid "Weeks"
+msgstr "週"
+
+msgid "Weight"
+msgstr "權é‡"
+
+msgid "Weight %{weight}"
+msgstr "æ¬Šé‡ %{weight}"
+
msgid "When a runner is locked, it cannot be assigned to other projects"
msgstr "當執行器被鎖定,其將ä¸èƒ½è¢«å…¶ä»–專案指定。"
msgid "When enabled, users cannot use GitLab until the terms have been accepted."
msgstr "當啟用,使用者在接å—æ¢æ¬¾ä¹‹å‰éƒ½ä¸èƒ½ä½¿ç”¨ GitLab。"
+msgid "When leaving the URL blank, classification labels can still be specified without disabling cross project features or performing external authorization checks."
+msgstr "當 URL 留空時,還是å¯ä»¥æŒ‡å®šåˆ†é¡žæ¨™ç±¤ï¼Œè€Œä¸”ä¸å¿…åœç”¨è·¨å°ˆæ¡ˆåŠŸèƒ½æˆ–執行外部授權檢查。"
+
msgid "Wiki"
msgstr "Wiki"
@@ -5121,12 +7016,24 @@ msgstr "é é¢"
msgid "Wiki|Wiki Pages"
msgstr "維基é é¢"
+msgid "With contribution analytics you can have an overview for the activity of issues, merge requests and push events of your organization and its members."
+msgstr "é€éŽè²¢ç»åˆ†æžï¼Œæ‚¨å¯ä»¥å–得活動概覽,其包å«äº†æ‚¨çš„組織和其æˆå“¡çš„è­°é¡Œã€åˆä½µè«‹æ±‚與推é€æ´»å‹•ã€‚"
+
msgid "Withdraw Access Request"
msgstr "å–消權é™ç”³è«‹"
msgid "Yes"
msgstr "是"
+msgid "Yes, add it"
+msgstr "是的,新增它"
+
+msgid "Yes, let me map Google Code users to full names or GitLab users."
+msgstr ""
+
+msgid "You are an admin, which means granting access to <strong>%{client_name}</strong> will allow them to interact with GitLab as an admin as well. Proceed with caution."
+msgstr ""
+
msgid "You are going to remove %{group_name}. Removed groups CANNOT be restored! Are you ABSOLUTELY sure?"
msgstr "å°‡è¦åˆªé™¤ %{group_name}。被刪除的群組無法復原ï¼çœŸçš„「確定ã€è¦é€™éº¼åšå—Žï¼Ÿ"
@@ -5142,6 +7049,9 @@ msgstr "å°‡è¦æŠŠ %{project_full_name} 的所有權轉移給å¦ä¸€å€‹äººã€‚真çš
msgid "You are on a read-only GitLab instance."
msgstr "您在唯讀的 GitLab 主機上。"
+msgid "You are on a secondary, <b>read-only</b> Geo node. If you want to make changes, you must visit this page on the %{primary_node}."
+msgstr "您在次è¦ä¸”<b>唯讀</b>çš„ Geo 節點上。若您想è¦é€²è¡Œè®Šæ›´ï¼Œæ‚¨å¿…é ˆç€è¦½ %{primary_node} 的這個é é¢"
+
msgid "You can %{linkStart}view the blob%{linkEnd} instead."
msgstr "您å¯ä»¥ %{linkStart}查看BLOB%{linkEnd} 。"
@@ -5154,6 +7064,9 @@ msgstr "您還å¯ä»¥ç‚ºæŸå€‹æ¨™ç±¤åŠ ä¸Šæ˜Ÿæ˜Ÿï¼Œä½¿å…¶æˆç‚ºå„ªå…ˆæ¨™ç±¤ã€‚"
msgid "You can also test your .gitlab-ci.yml in the %{linkStart}Lint%{linkEnd}"
msgstr "您也å¯ä»¥åœ¨ %{linkStart}Lint%{linkEnd} 測試您的 .gitlab-ci.yml"
+msgid "You can easily contribute to them by requesting to join these groups."
+msgstr ""
+
msgid "You can easily install a Runner on a Kubernetes cluster. %{link_to_help_page}"
msgstr "您å¯ä»¥è¼•é¬†åœ°åœ¨ Kubernetes å¢é›†ä¸Šå®‰è£é‹è¡Œå™¨ã€‚ %{link_to_help_page}"
@@ -5169,12 +7082,24 @@ msgstr "您åªèƒ½åœ¨åˆ†æ”¯ä¸Šç·¨è¼¯æ–‡ä»¶"
msgid "You can resolve the merge conflict using either the Interactive mode, by choosing %{use_ours} or %{use_theirs} buttons, or by editing the files directly. Commit these changes into %{branch_name}"
msgstr "您å¯ä»¥é€éŽä½¿ç”¨äº’動模å¼é¸æ“‡ %{use_ours} 或 %{use_theirs} 按鈕ã€æˆ–者是直接編輯檔案來解決åˆä½µè¡çªï¼Œä¸¦å°‡é€™äº›è®Šæ›´æ交到 %{branch_name}。"
+msgid "You cannot write to a read-only secondary GitLab Geo instance. Please use %{link_to_primary_node} instead."
+msgstr "您ä¸èƒ½å¯«å…¥åˆ°å”¯è®€çš„æ¬¡è¦ GitLab Geo 主機。請改用 %{link_to_primary_node}。"
+
msgid "You cannot write to this read-only GitLab instance."
msgstr "您ä¸èƒ½ä¿®æ”¹é€™å€‹å”¯è®€çš„ GitLab 主機。"
msgid "You do not have any assigned merge requests"
msgstr "您沒有被分é…çš„åˆä½µè«‹æ±‚"
+msgid "You do not have the correct permissions to override the settings from the LDAP group sync."
+msgstr "您沒有權é™ä¾†è¦†è“‹ LDAP 群組åŒæ­¥è¨­å®šã€‚"
+
+msgid "You don't have any applications"
+msgstr ""
+
+msgid "You don't have any authorized applications"
+msgstr ""
+
msgid "You have no permissions"
msgstr "你沒有權é™"
@@ -5193,6 +7118,12 @@ msgstr "您必須æ“有維護者存å–æ‰èƒ½å¼·åˆ¶ç§»é™¤éŽ–定"
msgid "You must sign in to star a project"
msgstr "必須登入æ‰èƒ½æ”¶è—專案"
+msgid "You need a different license to enable FileLocks feature"
+msgstr "您需è¦ä½¿ç”¨ä¸åŒçš„授權以啟用 FileLocks 功能"
+
+msgid "You need git-lfs version %{min_git_lfs_version} (or greater) to continue. Please visit https://git-lfs.github.com"
+msgstr "æ‚¨éœ€è¦ git-lfs 版本 %{min_git_lfs_version} (或更高版本) æ‰èƒ½ç¹¼çºŒã€‚è«‹å‰å¾€ https://git-lfs.github.com"
+
msgid "You need permission."
msgstr "需è¦æ¬Šé™æ‰èƒ½é€™éº¼åšã€‚"
@@ -5223,9 +7154,18 @@ msgstr "在您的個人資料中添加 SSH 密鑰之å‰ï¼Œä½ ä¸èƒ½é€éŽ SSH ä¾
msgid "You'll need to use different branch names to get a valid comparison."
msgstr "你需è¦é¸æ“‡å…©å€‹ä¸åŒçš„分支,æ‰èƒ½é€²è¡Œæ¯”較。"
+msgid "You're receiving this email because %{reason}."
+msgstr ""
+
+msgid "You're receiving this email because of your account on %{host}."
+msgstr ""
+
msgid "You're receiving this email because of your account on %{host}. %{manage_notifications_link} &middot; %{help_link}"
msgstr "你收到此電å­éƒµä»¶æ˜¯å› ç‚ºä½ çš„帳戶在 %{host}. %{manage_notifications_link} &middot; %{help_link}"
+msgid "YouTube"
+msgstr ""
+
msgid "Your Groups"
msgstr "你的群組"
@@ -5241,6 +7181,12 @@ msgstr "您的專案活動"
msgid "Your Todos"
msgstr "您的待辦事項"
+msgid "Your applications (%{size})"
+msgstr ""
+
+msgid "Your authorized applications"
+msgstr ""
+
msgid "Your changes can be committed to %{branch_name} because a merge request is open."
msgstr "你的更改將å¯ä»¥æ交到 %{branch_name} 因為åˆä½µè«‹æ±‚已打開。"
@@ -5265,28 +7211,262 @@ msgstr "之å‰"
msgid "among other things"
msgstr "除了其他事情"
+msgid "and 1 fixed vulnerability"
+msgid_plural "and %d fixed vulnerabilities"
+msgstr[0] "å’Œ %d 個已經修復的æ¼æ´ž"
+
msgid "assign yourself"
msgstr "指派給自己"
msgid "branch name"
msgstr "分支å稱"
+msgid "by"
+msgstr "來自"
+
+msgid "ciReport|%{linkStartTag}Learn more about Container Scanning %{linkEndTag}"
+msgstr "%{linkStartTag}關於容器掃æ的更多資訊%{linkEndTag}"
+
+msgid "ciReport|%{linkStartTag}Learn more about DAST %{linkEndTag}"
+msgstr "%{linkStartTag}關於 DAST 的更多資訊%{linkEndTag}"
+
+msgid "ciReport|%{linkStartTag}Learn more about Dependency Scanning %{linkEndTag}"
+msgstr "%{linkStartTag}關於相ä¾æ€§æŽƒæ的更多資訊%{linkEndTag}"
+
+msgid "ciReport|%{linkStartTag}Learn more about SAST %{linkEndTag}"
+msgstr "%{linkStartTag}關於 SAST 的更多資訊%{linkEndTag}"
+
+msgid "ciReport|%{namespace} is affected by %{vulnerability}."
+msgstr "%{namespace} 被 %{vulnerability} 影響"
+
+msgid "ciReport|%{packagesString} and "
+msgstr "%{packagesString} 和 "
+
+msgid "ciReport|%{packagesString} and %{lastPackage}"
+msgstr "%{packagesString} 和 %{lastPackage}"
+
+msgid "ciReport|%{remainingPackagesCount} more"
+msgstr "%{remainingPackagesCount} 更多"
+
+msgid "ciReport|%{reportName} is loading"
+msgstr "正在載入 %{reportName}"
+
+msgid "ciReport|%{reportName} resulted in error while loading results"
+msgstr "載入çµæžœæ™‚å›  %{reportName} 而導致錯誤"
+
+msgid "ciReport|%{type} detected no new security vulnerabilities"
+msgstr "%{type} 未åµæ¸¬åˆ°æ–°çš„安全性æ¼æ´ž"
+
+msgid "ciReport|%{type} detected no security vulnerabilities"
+msgstr "%{type} 未åµæ¸¬åˆ°å®‰å…¨æ€§æ¼æ´ž"
+
+msgid "ciReport|%{type} detected no vulnerabilities"
+msgstr "%{type} 未åµæ¸¬åˆ°æ¼æ´ž"
+
+msgid "ciReport|Class"
+msgstr "類別"
+
+msgid "ciReport|Code quality"
+msgstr "程å¼ç¢¼å“質"
+
+msgid "ciReport|Confidence"
+msgstr "ä¿¡ä»»"
+
+msgid "ciReport|Container scanning detected"
+msgstr "åµæ¸¬åˆ°å®¹å™¨æŽƒæ"
+
+msgid "ciReport|Container scanning detects known vulnerabilities in your docker images."
+msgstr "容器掃æåµæ¸¬åœ¨æ‚¨çš„ Docker 映åƒä¸­çš„已知æ¼æ´žã€‚"
+
+msgid "ciReport|Container scanning is loading"
+msgstr "正在載入容器掃æ"
+
+msgid "ciReport|Container scanning resulted in error while loading results"
+msgstr "當載入çµæžœæ™‚,因容器掃æ而導致錯誤"
+
+msgid "ciReport|DAST detected"
+msgstr "åµæ¸¬åˆ° DAST"
+
+msgid "ciReport|DAST is loading"
+msgstr "正在載入 DAST"
+
+msgid "ciReport|DAST resulted in error while loading results"
+msgstr "載入çµæžœæ™‚,因 DAST 而導致錯誤"
+
+msgid "ciReport|Dependency Scanning detects known vulnerabilities in your source code\\'s dependencies."
+msgstr "相ä¾æ€§æŽƒæåµæ¸¬æ‚¨åŽŸå§‹ç¢¼ç›¸ä¾æ€§çš„已知æ¼æ´žã€‚"
+
+msgid "ciReport|Dependency scanning detected"
+msgstr "åµæ¸¬åˆ°ç›¸ä¾æ€§æŽƒæ"
+
+msgid "ciReport|Dependency scanning is loading"
+msgstr "正在載入相ä¾æ€§æŽƒæ"
+
+msgid "ciReport|Dependency scanning resulted in error while loading results"
+msgstr "當載入çµæžœæ™‚因相ä¾æ€§æŽƒæ而導致錯誤"
+
+msgid "ciReport|Description"
+msgstr "說明"
+
+msgid "ciReport|Dismiss vulnerability"
+msgstr "忽略æ¼æ´ž"
+
+msgid "ciReport|Dismissed by"
+msgstr "忽略由"
+
+msgid "ciReport|Dynamic Application Security Testing (DAST) detects known vulnerabilities in your web application."
+msgstr "動態應用程å¼å®‰å…¨æ€§æ¸¬è©¦ (DAST) 在您的網é æ‡‰ç”¨ç¨‹å¼ä¸­åµæ¸¬åˆ°å·²çŸ¥æ¼æ´žã€‚"
+
+msgid "ciReport|Failed to load %{reportName} report"
+msgstr "無法載入 %{reportName} 報告"
+
+msgid "ciReport|File"
+msgstr "檔案"
+
+msgid "ciReport|Fixed:"
+msgstr "修正的:"
+
+msgid "ciReport|Identifiers"
+msgstr "身份"
+
+msgid "ciReport|Instances"
+msgstr "實例"
+
+msgid "ciReport|Learn more about interacting with security reports (Alpha)."
+msgstr "了解關於和安全性報告 (Alpha) 互動的更多資訊。"
+
+msgid "ciReport|Learn more about whitelisting"
+msgstr "了解關於白å單的更多資訊"
+
+msgid "ciReport|License management detected %{licenseInfo}"
+msgstr "授權管ç†åµæ¸¬åˆ° %{licenseInfo}"
+
+msgid "ciReport|License management detected no new licenses"
+msgstr "授權管ç†æœªåµæ¸¬åˆ°æ–°æŽˆæ¬Š"
+
+msgid "ciReport|Links"
+msgstr "連çµ"
+
+msgid "ciReport|Loading %{reportName} report"
+msgstr "正在載入 %{reportName} 報告"
+
+msgid "ciReport|Method"
+msgstr "方法"
+
+msgid "ciReport|Namespace"
+msgstr "命å空間"
+
+msgid "ciReport|No changes to code quality"
+msgstr "沒有程å¼ç¢¼å“質的更動"
+
+msgid "ciReport|No changes to performance metrics"
+msgstr "沒有效能指標的變動"
+
+msgid "ciReport|Performance metrics"
+msgstr "效能指標"
+
+msgid "ciReport|Revert dismissal"
+msgstr "撤回忽略"
+
+msgid "ciReport|SAST detected"
+msgstr "åµæ¸¬åˆ° SAST"
+
+msgid "ciReport|SAST is loading"
+msgstr "正在載入 SAST"
+
+msgid "ciReport|SAST resulted in error while loading results"
+msgstr "當載入çµæžœæ™‚,因 SAST 而導致錯誤"
+
+msgid "ciReport|Security scanning"
+msgstr "安全性掃æ"
+
+msgid "ciReport|Security scanning failed loading any results"
+msgstr "安全性掃æ無法載入任何çµæžœ"
+
+msgid "ciReport|Security scanning is loading"
+msgstr "正在載入安全掃æ"
+
+msgid "ciReport|Severity"
+msgstr "åš´é‡æ€§"
+
+msgid "ciReport|Solution"
+msgstr "解決方案"
+
+msgid "ciReport|Static Application Security Testing (SAST) detects known vulnerabilities in your source code."
+msgstr "éœæ…‹æ‡‰ç”¨ç¨‹å¼å®‰å…¨æ€§æ¸¬è©¦ (SAST) 在您的原始碼中åµæ¸¬å·²çŸ¥æ¼æ´žã€‚"
+
+msgid "ciReport|There was an error creating the issue. Please try again."
+msgstr "建立議題時發生錯誤。請é‡è©¦ã€‚"
+
+msgid "ciReport|There was an error dismissing the vulnerability. Please try again."
+msgstr "é§å›žæ­¤æ¼æ´žæ™‚發生錯誤。請é‡è©¦ã€‚"
+
+msgid "ciReport|There was an error loading DAST report"
+msgstr "載入 DAST 報告時發生錯誤。"
+
+msgid "ciReport|There was an error loading SAST report"
+msgstr "載入 SAST 報告時發生錯誤。"
+
+msgid "ciReport|There was an error loading container scanning report"
+msgstr "載入容器掃æ報告時發生錯誤。"
+
+msgid "ciReport|There was an error loading dependency scanning report"
+msgstr "載入相ä¾æ€§æŽƒæ報告時發生錯誤。"
+
+msgid "ciReport|There was an error reverting the dismissal. Please try again."
+msgstr "撤回é§å›žæ™‚發生錯誤。請é‡è©¦ã€‚"
+
+msgid "ciReport|Unapproved vulnerabilities (red) can be marked as approved."
+msgstr "未批准的æ¼æ´ž (紅色) å¯ä»¥æ¨™è¨˜ç‚ºå·²æ‰¹å‡†ã€‚"
+
+msgid "ciReport|Upgrade %{name} from %{version} to %{fixed}."
+msgstr "å°‡ %{name} 從 %{version} å‡ç´šåˆ° %{fixed}。"
+
+msgid "ciReport|View full report"
+msgstr ""
+
+msgid "ciReport|no vulnerabilities"
+msgstr "沒有æ¼æ´ž"
+
+msgid "ciReport|on pipeline"
+msgstr "æµæ°´ç·šä¸Š"
+
msgid "command line instructions"
msgstr "指令說明"
msgid "connecting"
msgstr "連線中"
+msgid "could not read private key, is the passphrase correct?"
+msgstr "無法存å–ç§é‘°ï¼Œæª¢æŸ¥å¯†ç¢¼æ˜¯å¦æ­£ç¢ºï¼Ÿ"
+
+msgid "customize"
+msgstr ""
+
msgid "day"
msgid_plural "days"
-msgstr[0] "天"
+msgstr[0] "æ—¥"
msgid "deploy token"
msgstr "部署憑證"
+msgid "detected %d fixed vulnerability"
+msgid_plural "detected %d fixed vulnerabilities"
+msgstr[0] "åµæ¸¬åˆ° %d 個已修復æ¼æ´ž"
+
+msgid "detected %d new vulnerability"
+msgid_plural "detected %d new vulnerabilities"
+msgstr[0] "åµæ¸¬åˆ° %d 個新æ¼æ´ž"
+
+msgid "detected no vulnerabilities"
+msgstr "未åµæ¸¬åˆ°æ¼æ´ž"
+
msgid "disabled"
msgstr "å·²åœç”¨"
+msgid "done"
+msgstr ""
+
msgid "enabled"
msgstr "已啟用"
@@ -5296,12 +7476,30 @@ msgstr "%{slash_command} 將更新é ä¼°èŠ±è²»æ™‚間。"
msgid "for this project"
msgstr "為此專案"
+msgid "here"
+msgstr "這裡"
+
+msgid "import flow"
+msgstr ""
+
msgid "importing"
msgstr "輸入"
+msgid "is invalid because there is downstream lock"
+msgstr "因為下游鎖定,所以無效"
+
+msgid "is invalid because there is upstream lock"
+msgstr "因上游鎖定而無效"
+
+msgid "is not a valid X509 certificate."
+msgstr "éžæœ‰æ•ˆ X509 憑證。"
+
msgid "latest version"
msgstr "最新版本"
+msgid "locked by %{path_lock_user_name} %{created_at}"
+msgstr "由 %{path_lock_user_name} 於 %{created_at} 鎖定"
+
msgid "merge request"
msgid_plural "merge requests"
msgstr[0] "åˆä½µè«‹æ±‚"
@@ -5318,9 +7516,24 @@ msgstr "%{metricsLinkStart} 記憶體 %{metricsLinkEnd} 使用 %{emphasisStart}
msgid "mrWidget|%{metricsLinkStart} Memory %{metricsLinkEnd} usage is %{emphasisStart} unchanged %{emphasisEnd} at %{memoryFrom}MB"
msgstr "%{metricsLinkStart} 記憶體 %{metricsLinkEnd} 使用 %{emphasisStart} 沒有發生變化 %{emphasisEnd} 於 %{memoryFrom} MB"
+msgid "mrWidget|Add approval"
+msgstr "新增批准"
+
msgid "mrWidget|Allows commits from members who can merge to the target branch"
msgstr "å…許å¯ä»¥åˆä½µåˆ°ç›®æ¨™åˆ†æ”¯çš„æˆå“¡æ交"
+msgid "mrWidget|An error occured while removing your approval."
+msgstr "移除您的批准時發生錯誤。"
+
+msgid "mrWidget|An error occurred while submitting your approval."
+msgstr ""
+
+msgid "mrWidget|Approve"
+msgstr "批准"
+
+msgid "mrWidget|Approved by"
+msgstr "批准由"
+
msgid "mrWidget|Cancel automatic merge"
msgstr "å–消自動åˆä½µ"
@@ -5381,9 +7594,24 @@ msgstr "åˆä½µå¤±æ•—"
msgid "mrWidget|Merge locally"
msgstr "本地åˆä½µ"
+msgid "mrWidget|Merge request approved"
+msgstr ""
+
+msgid "mrWidget|Merge request approved; you can approve additionally"
+msgstr ""
+
msgid "mrWidget|Merged by"
msgstr "åˆä½µè€…"
+msgid "mrWidget|No Approval required"
+msgstr "無須批准"
+
+msgid "mrWidget|No Approval required; you can still approve"
+msgstr "ä¸éœ€è¦æ‰¹å‡†ï¼›ä½†æ‚¨ä»å¯ä»¥æ‰¹å‡†"
+
+msgid "mrWidget|Open in Web IDE"
+msgstr "åœ¨ç¶²é  IDE 中開啟"
+
msgid "mrWidget|Plain diff"
msgstr "本文差異"
@@ -5402,6 +7630,9 @@ msgstr "刪除原始分支"
msgid "mrWidget|Remove source branch"
msgstr "刪除原始分支"
+msgid "mrWidget|Remove your approval"
+msgstr "移除您的批准"
+
msgid "mrWidget|Request to merge"
msgstr "請求åˆä½µ"
@@ -5453,9 +7684,6 @@ msgstr "æ­¤åˆä½µè«‹æ±‚正在被åˆä½µ"
msgid "mrWidget|This project is archived, write access has been disabled"
msgstr "這個專案已經被打包,無法寫入"
-msgid "mrWidget|Web IDE"
-msgstr "ç¶²é  IDE"
-
msgid "mrWidget|You can merge this merge request manually using the"
msgstr "ä½ å¯ä»¥æ‰‹å‹•åˆä½µé€™å€‹åˆä½µè«‹æ±‚,藉由"
@@ -5493,27 +7721,42 @@ msgstr "密碼"
msgid "personal access token"
msgstr "ç§äººå­˜å–憑證"
+msgid "private key does not match certificate."
+msgstr "ç§é‘°ä¸ç¬¦åˆæ†‘證。"
+
msgid "remaining"
msgstr "剩餘"
msgid "remove due date"
msgstr "刪除截止日期"
+msgid "remove weight"
+msgstr "移除權é‡"
+
msgid "source"
msgstr "來æº"
msgid "spendCommand|%{slash_command} will update the sum of the time spent."
msgstr "%{slash_command} 將會更新ã€åŠ ç¸½æ‰€èŠ±è²»çš„時間"
+msgid "started"
+msgstr ""
+
msgid "this document"
msgstr "這份文件"
+msgid "to help your contributors communicate effectively!"
+msgstr "å”助你的貢ç»è€…進行有效的æºé€šï¼"
+
msgid "username"
msgstr "使用者å稱"
msgid "uses Kubernetes clusters to deploy your code!"
msgstr "使用 Kubernetes å¢é›†éƒ¨ç½²æ‚¨çš„程å¼ç¢¼!"
+msgid "view it on GitLab"
+msgstr ""
+
msgid "with %{additions} additions, %{deletions} deletions."
msgstr "共增加 %{additions} ,刪除 %{deletions}"
diff --git a/package.json b/package.json
index 256ebc1fb6e..4e5cf05f49b 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,8 @@
"webpack-prod": "NODE_ENV=production webpack --config config/webpack.config.js"
},
"dependencies": {
- "@gitlab-org/gitlab-svgs": "^1.26.0",
+ "@gitlab-org/gitlab-svgs": "^1.27.0",
+ "@gitlab-org/gitlab-ui": "1.0.5",
"autosize": "^4.0.0",
"axios": "^0.17.1",
"babel-core": "^6.26.3",
@@ -37,6 +38,7 @@
"core-js": "^2.4.1",
"cropper": "^2.3.0",
"css-loader": "^1.0.0",
+ "d3": "4.12.2",
"d3-array": "^1.2.1",
"d3-axis": "^1.0.8",
"d3-brush": "^1.0.4",
@@ -101,7 +103,8 @@
"webpack-bundle-analyzer": "^2.13.1",
"webpack-cli": "^3.0.8",
"webpack-stats-plugin": "^0.2.1",
- "worker-loader": "^2.0.0"
+ "worker-loader": "^2.0.0",
+ "xterm": "^3.5.0"
},
"devDependencies": {
"axios-mock-adapter": "^1.15.0",
diff --git a/qa/qa/page/admin/settings/repository_storage.rb b/qa/qa/page/admin/settings/repository_storage.rb
index b4a1344216e..68dd23a41e1 100644
--- a/qa/qa/page/admin/settings/repository_storage.rb
+++ b/qa/qa/page/admin/settings/repository_storage.rb
@@ -6,11 +6,11 @@ module QA
view 'app/views/admin/application_settings/_repository_storage.html.haml' do
element :submit, "submit 'Save changes'"
element :hashed_storage,
- 'Create new projects using hashed storage paths'
+ 'Use hashed storage paths for newly created and renamed projects'
end
def enable_hashed_storage
- check 'Create new projects using hashed storage paths'
+ check 'Use hashed storage paths for newly created and renamed projects'
end
def save_settings
diff --git a/qa/qa/page/menu/side.rb b/qa/qa/page/menu/side.rb
index c14a835c2c9..354ccec2a5a 100644
--- a/qa/qa/page/menu/side.rb
+++ b/qa/qa/page/menu/side.rb
@@ -5,8 +5,8 @@ module QA
view 'app/views/layouts/nav/sidebar/_project.html.haml' do
element :settings_item
element :settings_link, 'link_to edit_project_path'
- element :repository_link, "title: 'Repository'"
- element :pipelines_settings_link, "title: 'CI / CD'"
+ element :repository_link, "title: _('Repository')"
+ element :pipelines_settings_link, "title: _('CI / CD')"
element :operations_kubernetes_link, "title: _('Kubernetes')"
element :issues_link, /link_to.*shortcuts-issues/
element :issues_link_text, "Issues"
@@ -14,7 +14,7 @@ module QA
element :merge_requests_link_text, "Merge Requests"
element :top_level_items, '.sidebar-top-level-items'
element :operations_section, "class: 'shortcuts-operations'"
- element :activity_link, "title: 'Activity'"
+ element :activity_link, "title: _('Activity')"
element :wiki_link_text, "Wiki"
element :milestones_link
end
diff --git a/qa/qa/page/project/show.rb b/qa/qa/page/project/show.rb
index 1d3dad4cda0..c751b472535 100644
--- a/qa/qa/page/project/show.rb
+++ b/qa/qa/page/project/show.rb
@@ -14,7 +14,7 @@ module QA
view 'app/views/layouts/header/_new_dropdown.haml' do
element :new_menu_toggle
- element :new_issue_link, "link_to 'New issue', new_project_issue_path(@project)"
+ element :new_issue_link, "link_to _('New issue'), new_project_issue_path(@project)"
end
view 'app/views/shared/_ref_switcher.html.haml' do
diff --git a/qa/qa/runtime/browser.rb b/qa/qa/runtime/browser.rb
index 0c8eca5229e..4c64270ce92 100644
--- a/qa/qa/runtime/browser.rb
+++ b/qa/qa/runtime/browser.rb
@@ -72,6 +72,7 @@ module QA
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
+ clear_local_storage: true,
desired_capabilities: capabilities,
options: options
)
diff --git a/spec/config/object_store_settings_spec.rb b/spec/config/object_store_settings_spec.rb
new file mode 100644
index 00000000000..b1ada3c99db
--- /dev/null
+++ b/spec/config/object_store_settings_spec.rb
@@ -0,0 +1,29 @@
+require 'spec_helper'
+require Rails.root.join('config', 'object_store_settings.rb')
+
+describe ObjectStoreSettings do
+ describe '.parse' do
+ it 'should set correct default values' do
+ settings = described_class.parse(nil)
+
+ expect(settings['enabled']).to be false
+ expect(settings['direct_upload']).to be false
+ expect(settings['background_upload']).to be true
+ expect(settings['remote_directory']).to be nil
+ end
+
+ it 'respects original values' do
+ original_settings = Settingslogic.new({
+ 'enabled' => true,
+ 'remote_directory' => 'artifacts'
+ })
+
+ settings = described_class.parse(original_settings)
+
+ expect(settings['enabled']).to be true
+ expect(settings['direct_upload']).to be false
+ expect(settings['background_upload']).to be true
+ expect(settings['remote_directory']).to eq 'artifacts'
+ end
+ end
+end
diff --git a/spec/controllers/admin/services_controller_spec.rb b/spec/controllers/admin/services_controller_spec.rb
index 701211c2586..4439ea4a533 100644
--- a/spec/controllers/admin/services_controller_spec.rb
+++ b/spec/controllers/admin/services_controller_spec.rb
@@ -13,7 +13,7 @@ describe Admin::ServicesController do
Service.available_services_names.each do |service_name|
context "#{service_name}" do
let!(:service) do
- service_template = service_name.concat("_service").camelize.constantize
+ service_template = "#{service_name}_service".camelize.constantize
service_template.where(template: true).first_or_create
end
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index f1165c73847..bad7a28556c 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -57,6 +57,10 @@ describe ApplicationController do
end
describe "#authenticate_user_from_personal_access_token!" do
+ before do
+ stub_authentication_activity_metrics(debug: false)
+ end
+
controller(described_class) do
def index
render text: 'authenticated'
@@ -67,7 +71,13 @@ describe ApplicationController do
context "when the 'personal_access_token' param is populated with the personal access token" do
it "logs the user in" do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_sessionless_authentication_counter)
+
get :index, private_token: personal_access_token.token
+
expect(response).to have_gitlab_http_status(200)
expect(response.body).to eq('authenticated')
end
@@ -75,15 +85,25 @@ describe ApplicationController do
context "when the 'PERSONAL_ACCESS_TOKEN' header is populated with the personal access token" do
it "logs the user in" do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_sessionless_authentication_counter)
+
@request.headers["PRIVATE-TOKEN"] = personal_access_token.token
get :index
+
expect(response).to have_gitlab_http_status(200)
expect(response.body).to eq('authenticated')
end
end
it "doesn't log the user in otherwise" do
+ expect(authentication_metrics)
+ .to increment(:user_unauthenticated_counter)
+
get :index, private_token: "token"
+
expect(response.status).not_to eq(200)
expect(response.body).not_to eq('authenticated')
end
@@ -174,6 +194,10 @@ describe ApplicationController do
end
describe '#authenticate_sessionless_user!' do
+ before do
+ stub_authentication_activity_metrics(debug: false)
+ end
+
describe 'authenticating a user from a feed token' do
controller(described_class) do
def index
@@ -184,7 +208,13 @@ describe ApplicationController do
context "when the 'feed_token' param is populated with the feed token" do
context 'when the request format is atom' do
it "logs the user in" do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_sessionless_authentication_counter)
+
get :index, feed_token: user.feed_token, format: :atom
+
expect(response).to have_gitlab_http_status 200
expect(response.body).to eq 'authenticated'
end
@@ -192,7 +222,13 @@ describe ApplicationController do
context 'when the request format is ics' do
it "logs the user in" do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_sessionless_authentication_counter)
+
get :index, feed_token: user.feed_token, format: :ics
+
expect(response).to have_gitlab_http_status 200
expect(response.body).to eq 'authenticated'
end
@@ -200,7 +236,11 @@ describe ApplicationController do
context 'when the request format is neither atom nor ics' do
it "doesn't log the user in" do
+ expect(authentication_metrics)
+ .to increment(:user_unauthenticated_counter)
+
get :index, feed_token: user.feed_token
+
expect(response.status).not_to have_gitlab_http_status 200
expect(response.body).not_to eq 'authenticated'
end
@@ -209,7 +249,11 @@ describe ApplicationController do
context "when the 'feed_token' param is populated with an invalid feed token" do
it "doesn't log the user" do
+ expect(authentication_metrics)
+ .to increment(:user_unauthenticated_counter)
+
get :index, feed_token: 'token', format: :atom
+
expect(response.status).not_to eq 200
expect(response.body).not_to eq 'authenticated'
end
diff --git a/spec/controllers/boards/issues_controller_spec.rb b/spec/controllers/boards/issues_controller_spec.rb
index ce7762691c9..d98e6ff0df8 100644
--- a/spec/controllers/boards/issues_controller_spec.rb
+++ b/spec/controllers/boards/issues_controller_spec.rb
@@ -42,7 +42,7 @@ describe Boards::IssuesController do
parsed_response = JSON.parse(response.body)
expect(response).to match_response_schema('issues')
- expect(parsed_response.length).to eq 2
+ expect(parsed_response['issues'].length).to eq 2
expect(development.issues.map(&:relative_position)).not_to include(nil)
end
@@ -80,7 +80,7 @@ describe Boards::IssuesController do
parsed_response = JSON.parse(response.body)
expect(response).to match_response_schema('issues')
- expect(parsed_response.length).to eq 2
+ expect(parsed_response['issues'].length).to eq 2
end
end
diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb
index ba2669a5ea7..505c040b5d5 100644
--- a/spec/controllers/dashboard/milestones_controller_spec.rb
+++ b/spec/controllers/dashboard/milestones_controller_spec.rb
@@ -2,8 +2,10 @@ require 'spec_helper'
describe Dashboard::MilestonesController do
let(:project) { create(:project) }
- let(:user) { create(:user) }
+ let(:group) { create(:group) }
+ let(:user) { create(:user) }
let(:project_milestone) { create(:milestone, project: project) }
+ let(:group_milestone) { create(:milestone, group: group) }
let(:milestone) do
DashboardMilestone.build(
[project],
@@ -11,13 +13,17 @@ describe Dashboard::MilestonesController do
)
end
let(:issue) { create(:issue, project: project, milestone: project_milestone) }
+ let(:group_issue) { create(:issue, milestone: group_milestone) }
+
let!(:label) { create(:label, project: project, title: 'Issue Label', issues: [issue]) }
+ let!(:group_label) { create(:group_label, group: group, title: 'Group Issue Label', issues: [group_issue]) }
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project, milestone: project_milestone) }
let(:milestone_path) { dashboard_milestone_path(milestone.safe_title, title: milestone.title) }
before do
sign_in(user)
project.add_maintainer(user)
+ group.add_developer(user)
end
it_behaves_like 'milestone tabs'
@@ -35,4 +41,15 @@ describe Dashboard::MilestonesController do
expect(response).to have_gitlab_http_status(200)
end
end
+
+ describe "#index" do
+ it 'should contain group and project milestones' do
+ get :index, format: :json
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response.size).to eq(2)
+ expect(json_response.map { |i| i["first_milestone"]["id"] }).to include(group_milestone.id, project_milestone.id)
+ expect(json_response.map { |i| i["group_name"] }).to include(group.name)
+ end
+ end
end
diff --git a/spec/controllers/instance_statistics/cohorts_controller_spec.rb b/spec/controllers/instance_statistics/cohorts_controller_spec.rb
new file mode 100644
index 00000000000..e4eedede93a
--- /dev/null
+++ b/spec/controllers/instance_statistics/cohorts_controller_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe InstanceStatistics::CohortsController do
+ it_behaves_like 'instance statistics availability'
+end
diff --git a/spec/controllers/instance_statistics/conversational_development_index_controller_spec.rb b/spec/controllers/instance_statistics/conversational_development_index_controller_spec.rb
new file mode 100644
index 00000000000..4935cb265bf
--- /dev/null
+++ b/spec/controllers/instance_statistics/conversational_development_index_controller_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe InstanceStatistics::ConversationalDevelopmentIndexController do
+ it_behaves_like 'instance statistics availability'
+end
diff --git a/spec/controllers/profiles_controller_spec.rb b/spec/controllers/profiles_controller_spec.rb
index 4530a301d4d..360c536c667 100644
--- a/spec/controllers/profiles_controller_spec.rb
+++ b/spec/controllers/profiles_controller_spec.rb
@@ -78,6 +78,15 @@ describe ProfilesController, :request_store do
expect(ldap_user.name).not_to eq('John')
expect(ldap_user.location).to eq('City, Country')
end
+
+ it 'allows setting a user status' do
+ sign_in(user)
+
+ put :update, user: { status: { message: 'Working hard!' } }
+
+ expect(user.reload.status.message).to eq('Working hard!')
+ expect(response).to have_gitlab_http_status(302)
+ end
end
describe 'PUT update_username' do
diff --git a/spec/controllers/projects/commits_controller_spec.rb b/spec/controllers/projects/commits_controller_spec.rb
index d44048fdf55..a43bdd3ea80 100644
--- a/spec/controllers/projects/commits_controller_spec.rb
+++ b/spec/controllers/projects/commits_controller_spec.rb
@@ -9,6 +9,18 @@ describe Projects::CommitsController do
project.add_maintainer(user)
end
+ describe "GET commits_root" do
+ context "no ref is provided" do
+ it 'should redirect to the default branch of the project' do
+ get(:commits_root,
+ namespace_id: project.namespace,
+ project_id: project)
+
+ expect(response).to redirect_to project_commits_path(project)
+ end
+ end
+ end
+
describe "GET show" do
render_views
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index ff1835a34c2..5b347b1109a 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -993,6 +993,29 @@ describe Projects::IssuesController do
expect(json_response.first.keys).to match_array(%w[id reply_id expanded notes diff_discussion discussion_path individual_note resolvable resolved resolved_at resolved_by resolved_by_push commit_id for_commit project_id])
end
+ it 'renders the author status html if there is a status' do
+ create(:user_status, user: discussion.author)
+
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issue.iid
+
+ note_json = json_response.first['notes'].first
+
+ expect(note_json['author']['status_tooltip_html']).to be_present
+ end
+
+ it 'does not cause an extra query for the status' do
+ control = ActiveRecord::QueryRecorder.new do
+ get :discussions, namespace_id: project.namespace, project_id: project, id: issue.iid
+ end
+
+ create(:user_status, user: discussion.author)
+ second_discussion = create(:discussion_note_on_issue, noteable: issue, project: issue.project, author: create(:user))
+ create(:user_status, user: second_discussion.author)
+
+ expect { get :discussions, namespace_id: project.namespace, project_id: project, id: issue.iid }
+ .not_to exceed_query_limit(control)
+ end
+
context 'with cross-reference system note', :request_store do
let(:new_issue) { create(:issue) }
let(:cross_reference) { "mentioned in #{new_issue.to_reference(issue.project)}" }
diff --git a/spec/controllers/projects/labels_controller_spec.rb b/spec/controllers/projects/labels_controller_spec.rb
index 273702e6d21..e03d23bcdf6 100644
--- a/spec/controllers/projects/labels_controller_spec.rb
+++ b/spec/controllers/projects/labels_controller_spec.rb
@@ -143,6 +143,14 @@ describe Projects::LabelsController do
expect(GroupLabel.find_by(title: promoted_label_name)).not_to be_nil
end
+ it 'renders label name without parsing it as HTML' do
+ label_1.update!(name: 'CCC&lt;img src=x onerror=alert(document.domain)&gt;')
+
+ post :promote, namespace_id: project.namespace.to_param, project_id: project, id: label_1.to_param
+
+ expect(flash[:notice]).to eq("CCC&lt;img src=x onerror=alert(document.domain)&gt; promoted to <a href=\"#{group_labels_path(project.group)}\"><u>group label</u></a>.")
+ end
+
context 'service raising InvalidRecord' do
before do
expect_any_instance_of(Labels::PromoteService).to receive(:execute) do |label|
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 1692f299552..375018e2229 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -580,6 +580,64 @@ describe Projects::MergeRequestsController do
end
end
+ describe 'GET test_reports' do
+ subject do
+ get :test_reports,
+ namespace_id: project.namespace.to_param,
+ project_id: project,
+ id: merge_request.iid,
+ format: :json
+ end
+
+ before do
+ allow_any_instance_of(MergeRequest)
+ .to receive(:compare_test_reports).and_return(comparison_status)
+ end
+
+ context 'when comparison is being processed' do
+ let(:comparison_status) { { status: :parsing } }
+
+ it 'returns 204 HTTP status' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:no_content)
+ end
+ end
+
+ context 'when comparison is done' do
+ let(:comparison_status) { { status: :parsed, data: { summary: 1 } } }
+
+ it 'returns 200 HTTP status' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(json_response).to eq({ 'summary' => 1 })
+ end
+ end
+
+ context 'when user created corrupted test reports' do
+ let(:comparison_status) { { status: :error, status_reason: 'Failed to parse test reports' } }
+
+ it 'returns 400 HTTP status' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response).to eq({ 'status_reason' => 'Failed to parse test reports' })
+ end
+ end
+
+ context 'when something went wrong on our system' do
+ let(:comparison_status) { {} }
+
+ it 'returns 500 HTTP status' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:internal_server_error)
+ expect(json_response).to eq({ 'status_reason' => 'Unknown error' })
+ end
+ end
+ end
+
describe 'POST remove_wip' do
before do
merge_request.title = merge_request.wip_title
diff --git a/spec/controllers/projects/milestones_controller_spec.rb b/spec/controllers/projects/milestones_controller_spec.rb
index ea906cf7f32..6c2d1c7e92b 100644
--- a/spec/controllers/projects/milestones_controller_spec.rb
+++ b/spec/controllers/projects/milestones_controller_spec.rb
@@ -127,6 +127,14 @@ describe Projects::MilestonesController do
expect(flash[:notice]).to eq("#{milestone.title} promoted to <a href=\"#{group_milestone_path(project.group, milestone.iid)}\"><u>group milestone</u></a>.")
expect(response).to redirect_to(project_milestones_path(project))
end
+
+ it 'renders milestone name without parsing it as HTML' do
+ milestone.update!(name: 'CCC&lt;img src=x onerror=alert(document.domain)&gt;')
+
+ post :promote, namespace_id: project.namespace.id, project_id: project.id, id: milestone.iid
+
+ expect(flash[:notice]).to eq("CCC promoted to <a href=\"#{group_milestone_path(project.group, milestone.iid)}\"><u>group milestone</u></a>.")
+ end
end
context 'promotion fails' do
diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb
index 290fcd4f8e6..d89716b1b50 100644
--- a/spec/controllers/projects/pipelines_controller_spec.rb
+++ b/spec/controllers/projects/pipelines_controller_spec.rb
@@ -55,10 +55,8 @@ describe Projects::PipelinesController do
stub_feature_flags(ci_pipeline_persisted_stages: false)
end
- it 'returns JSON with serialized pipelines', :request_store do
- queries = ActiveRecord::QueryRecorder.new do
- get_pipelines_index_json
- end
+ it 'returns JSON with serialized pipelines' do
+ get_pipelines_index_json
expect(response).to have_gitlab_http_status(:ok)
expect(response).to match_response_schema('pipeline')
@@ -73,8 +71,14 @@ describe Projects::PipelinesController do
json_response.dig('pipelines', 0, 'details', 'stages').tap do |stages|
expect(stages.count).to eq 3
end
+ end
+
+ it 'does not execute N+1 queries' do
+ queries = ActiveRecord::QueryRecorder.new do
+ get_pipelines_index_json
+ end
- expect(queries.count).to be_within(5).of(30)
+ expect(queries.count).to be <= 36
end
end
diff --git a/spec/controllers/projects/wikis_controller_spec.rb b/spec/controllers/projects/wikis_controller_spec.rb
index 92addf30307..30623b6cb3d 100644
--- a/spec/controllers/projects/wikis_controller_spec.rb
+++ b/spec/controllers/projects/wikis_controller_spec.rb
@@ -1,16 +1,132 @@
require 'spec_helper'
describe Projects::WikisController do
- let(:project) { create(:project_empty_repo, :public) }
- let(:user) { create(:user) }
+ let(:project) { create(:project, :public, :repository) }
+ let(:user) { project.owner }
+ let(:project_wiki) { ProjectWiki.new(project, user) }
+ let(:wiki) { project_wiki.wiki }
+ let(:wiki_title) { 'page-title-test' }
+
+ before do
+ create_page(wiki_title, 'hello world')
+
+ sign_in(user)
+ end
+
+ after do
+ destroy_page(wiki_title)
+ end
+
+ describe 'GET #show' do
+ render_views
+
+ subject { get :show, namespace_id: project.namespace, project_id: project, id: wiki_title }
+
+ context 'when page content encoding is invalid' do
+ it 'limits the retrieved pages for the sidebar' do
+ expect(controller).to receive(:load_wiki).and_return(project_wiki)
+
+ # empty? call
+ expect(project_wiki).to receive(:pages).with(limit: 1).and_call_original
+ # Sidebar entries
+ expect(project_wiki).to receive(:pages).with(limit: 15).and_call_original
+
+ subject
+
+ expect(response).to have_http_status(:ok)
+ expect(response.body).to include(wiki_title)
+ end
+ end
+
+ context 'when page content encoding is invalid' do
+ it 'sets flash error' do
+ allow(controller).to receive(:valid_encoding?).and_return(false)
+
+ subject
+
+ expect(response).to have_http_status(:ok)
+ expect(flash[:notice]).to eq 'The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository.'
+ end
+ end
+ end
describe 'POST #preview_markdown' do
it 'renders json in a correct format' do
- sign_in(user)
-
post :preview_markdown, namespace_id: project.namespace, project_id: project, id: 'page/path', text: '*Markdown* text'
expect(JSON.parse(response.body).keys).to match_array(%w(body references))
end
end
+
+ describe 'GET #edit' do
+ subject { get(:edit, namespace_id: project.namespace, project_id: project, id: wiki_title) }
+
+ context 'when page content encoding is invalid' do
+ it 'redirects to show' do
+ allow(controller).to receive(:valid_encoding?).and_return(false)
+
+ subject
+
+ expect(response).to redirect_to(project_wiki_path(project, project_wiki.pages.first))
+ end
+ end
+
+ context 'when page content encoding is valid' do
+ render_views
+
+ it 'shows the edit page' do
+ subject
+
+ expect(response).to have_http_status(:ok)
+ expect(response.body).to include('Edit Page')
+ end
+ end
+ end
+
+ describe 'PATCH #update' do
+ let(:new_title) { 'New title' }
+ let(:new_content) { 'New content' }
+ subject do
+ patch(:update,
+ namespace_id: project.namespace,
+ project_id: project,
+ id: wiki_title,
+ wiki: { title: new_title, content: new_content })
+ end
+
+ context 'when page content encoding is invalid' do
+ it 'redirects to show' do
+ allow(controller).to receive(:valid_encoding?).and_return(false)
+
+ subject
+ expect(response).to redirect_to(project_wiki_path(project, project_wiki.pages.first))
+ end
+ end
+
+ context 'when page content encoding is valid' do
+ render_views
+
+ it 'updates the page' do
+ subject
+
+ wiki_page = project_wiki.pages.first
+
+ expect(wiki_page.title).to eq new_title
+ expect(wiki_page.content).to eq new_content
+ end
+ end
+ end
+
+ def create_page(name, content)
+ wiki.write_page(name, :markdown, content, commit_details(name))
+ end
+
+ def commit_details(name)
+ Gitlab::Git::Wiki::CommitDetails.new(user.id, user.username, user.name, user.email, "created page #{name}")
+ end
+
+ def destroy_page(title, dir = '')
+ page = wiki.page(title: title, dir: dir)
+ project_wiki.delete_page(page, "test commit")
+ end
end
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index b0acf4a49ac..071f96a729e 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -2,6 +2,8 @@ require 'spec_helper'
describe UsersController do
let(:user) { create(:user) }
+ let(:private_user) { create(:user, private_profile: true) }
+ let(:public_user) { create(:user) }
describe 'GET #show' do
context 'with rendered views' do
@@ -98,16 +100,47 @@ describe UsersController do
expect(assigns(:events)).to be_empty
end
+
+ it 'hides events if the user has a private profile' do
+ Gitlab::DataBuilder::Push.build_sample(project, private_user)
+
+ get :show, username: private_user.username, format: :json
+
+ expect(assigns(:events)).to be_empty
+ end
end
end
describe 'GET #calendar' do
- it 'renders calendar' do
- sign_in(user)
+ context 'for user' do
+ let(:project) { create(:project) }
+
+ before do
+ sign_in(user)
+ project.add_developer(user)
+ end
+
+ context 'with public profile' do
+ it 'renders calendar' do
+ push_data = Gitlab::DataBuilder::Push.build_sample(project, public_user)
+ EventCreateService.new.push(project, public_user, push_data)
+
+ get :calendar, username: public_user.username, format: :json
- get :calendar, username: user.username, format: :json
+ expect(response).to have_gitlab_http_status(200)
+ end
+ end
+
+ context 'with private profile' do
+ it 'does not render calendar' do
+ push_data = Gitlab::DataBuilder::Push.build_sample(project, private_user)
+ EventCreateService.new.push(project, private_user, push_data)
- expect(response).to have_gitlab_http_status(200)
+ get :calendar, username: private_user.username, format: :json
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
end
context 'forked project' do
@@ -150,9 +183,26 @@ describe UsersController do
expect(assigns(:calendar_date)).to eq(Date.parse('2014-07-31'))
end
- it 'renders calendar_activities' do
- get :calendar_activities, username: user.username
- expect(response).to render_template('calendar_activities')
+ context 'for user' do
+ context 'with public profile' do
+ it 'renders calendar_activities' do
+ push_data = Gitlab::DataBuilder::Push.build_sample(project, public_user)
+ EventCreateService.new.push(project, public_user, push_data)
+
+ get :calendar_activities, username: public_user.username
+ expect(assigns[:events]).not_to be_empty
+ end
+ end
+
+ context 'with private profile' do
+ it 'does not render calendar_activities' do
+ push_data = Gitlab::DataBuilder::Push.build_sample(project, private_user)
+ EventCreateService.new.push(project, private_user, push_data)
+
+ get :calendar_activities, username: private_user.username
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
end
end
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index 83cb4750741..9813190925b 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -187,6 +187,12 @@ FactoryBot.define do
end
end
+ trait :test_reports do
+ after(:build) do |build|
+ build.job_artifacts << create(:ci_job_artifact, :junit, job: build)
+ end
+ end
+
trait :expired do
artifacts_expire_at 1.minute.ago
end
diff --git a/spec/factories/ci/job_artifacts.rb b/spec/factories/ci/job_artifacts.rb
index 3d3287d8168..46aaaf6aa5d 100644
--- a/spec/factories/ci/job_artifacts.rb
+++ b/spec/factories/ci/job_artifacts.rb
@@ -4,6 +4,7 @@ FactoryBot.define do
factory :ci_job_artifact, class: Ci::JobArtifact do
job factory: :ci_build
file_type :archive
+ file_format :zip
trait :remote_store do
file_store JobArtifactUploader::Store::REMOTE
@@ -15,6 +16,7 @@ FactoryBot.define do
trait :archive do
file_type :archive
+ file_format :zip
after(:build) do |artifact, _|
artifact.file = fixture_file_upload(
@@ -24,6 +26,7 @@ FactoryBot.define do
trait :metadata do
file_type :metadata
+ file_format :gzip
after(:build) do |artifact, _|
artifact.file = fixture_file_upload(
@@ -33,6 +36,7 @@ FactoryBot.define do
trait :trace do
file_type :trace
+ file_format :raw
after(:build) do |artifact, evaluator|
artifact.file = fixture_file_upload(
@@ -40,6 +44,46 @@ FactoryBot.define do
end
end
+ trait :junit do
+ file_type :junit
+ file_format :gzip
+
+ after(:build) do |artifact, evaluator|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/junit/junit.xml.gz'), 'application/x-gzip')
+ end
+ end
+
+ trait :junit_with_ant do
+ file_type :junit
+ file_format :gzip
+
+ after(:build) do |artifact, evaluator|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/junit/junit_ant.xml.gz'), 'application/x-gzip')
+ end
+ end
+
+ trait :junit_with_three_testsuites do
+ file_type :junit
+ file_format :gzip
+
+ after(:build) do |artifact, evaluator|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/junit/junit_with_three_testsuites.xml.gz'), 'application/x-gzip')
+ end
+ end
+
+ trait :junit_with_corrupted_data do
+ file_type :junit
+ file_format :gzip
+
+ after(:build) do |artifact, evaluator|
+ artifact.file = fixture_file_upload(
+ Rails.root.join('spec/fixtures/junit/junit_with_corrupted_data.xml.gz'), 'application/x-gzip')
+ end
+ end
+
trait :correct_checksum do
after(:build) do |artifact, evaluator|
artifact.file_sha256 = Digest::SHA256.file(artifact.file.path).hexdigest
diff --git a/spec/factories/ci/pipelines.rb b/spec/factories/ci/pipelines.rb
index 51a767e5b93..a6ff226fa75 100644
--- a/spec/factories/ci/pipelines.rb
+++ b/spec/factories/ci/pipelines.rb
@@ -58,6 +58,10 @@ FactoryBot.define do
status :success
end
+ trait :running do
+ status :running
+ end
+
trait :failed do
status :failed
end
@@ -65,6 +69,14 @@ FactoryBot.define do
trait :protected do
protected true
end
+
+ trait :with_test_reports do
+ status :success
+
+ after(:build) do |pipeline, evaluator|
+ pipeline.builds << build(:ci_build, :test_reports, pipeline: pipeline, project: pipeline.project)
+ end
+ end
end
end
end
diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb
index f722bb9cb0d..cbc0b943396 100644
--- a/spec/factories/merge_requests.rb
+++ b/spec/factories/merge_requests.rb
@@ -89,6 +89,18 @@ FactoryBot.define do
end
end
+ trait :with_test_reports do
+ after(:build) do |merge_request|
+ merge_request.head_pipeline = build(
+ :ci_pipeline,
+ :success,
+ :with_test_reports,
+ project: merge_request.source_project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha)
+ end
+ end
+
after(:build) do |merge_request|
target_project = merge_request.target_project
source_project = merge_request.source_project
diff --git a/spec/factories/programming_languages.rb b/spec/factories/programming_languages.rb
new file mode 100644
index 00000000000..d3511d42b6c
--- /dev/null
+++ b/spec/factories/programming_languages.rb
@@ -0,0 +1,6 @@
+FactoryBot.define do
+ factory :programming_language do
+ name 'Ruby'
+ color '#123456'
+ end
+end
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb
index fec1bea2751..1215b04913e 100644
--- a/spec/factories/projects.rb
+++ b/spec/factories/projects.rb
@@ -34,7 +34,7 @@ FactoryBot.define do
builds_access_level = [evaluator.builds_access_level, evaluator.repository_access_level].min
merge_requests_access_level = [evaluator.merge_requests_access_level, evaluator.repository_access_level].min
- project.project_feature.update_columns(
+ project.project_feature.update(
wiki_access_level: evaluator.wiki_access_level,
builds_access_level: builds_access_level,
snippets_access_level: evaluator.snippets_access_level,
diff --git a/spec/factories/repository_languages.rb b/spec/factories/repository_languages.rb
new file mode 100644
index 00000000000..1757ba6766c
--- /dev/null
+++ b/spec/factories/repository_languages.rb
@@ -0,0 +1,7 @@
+FactoryBot.define do
+ factory :repository_language do
+ project
+ programming_language
+ share 98.5
+ end
+end
diff --git a/spec/factories/resource_label_events.rb b/spec/factories/resource_label_events.rb
new file mode 100644
index 00000000000..a67ad78c098
--- /dev/null
+++ b/spec/factories/resource_label_events.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :resource_label_event do
+ user { issue.project.creator }
+ action :add
+ label
+ issue
+ end
+end
diff --git a/spec/factories/site_statistics.rb b/spec/factories/site_statistics.rb
new file mode 100644
index 00000000000..dd8c795515a
--- /dev/null
+++ b/spec/factories/site_statistics.rb
@@ -0,0 +1,7 @@
+FactoryBot.define do
+ factory :site_statistics, class: 'SiteStatistic' do
+ id 1
+ repositories_count 999
+ wikis_count 555
+ end
+end
diff --git a/spec/factories/user_statuses.rb b/spec/factories/user_statuses.rb
new file mode 100644
index 00000000000..9998ae9609c
--- /dev/null
+++ b/spec/factories/user_statuses.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :user_status do
+ user
+ emoji 'coffee'
+ message 'I crave coffee'
+ end
+end
diff --git a/spec/features/dashboard/active_tab_spec.rb b/spec/features/dashboard/active_tab_spec.rb
index 8bab501134b..f4d0f82d248 100644
--- a/spec/features/dashboard/active_tab_spec.rb
+++ b/spec/features/dashboard/active_tab_spec.rb
@@ -7,32 +7,38 @@ RSpec.describe 'Dashboard Active Tab', :js do
shared_examples 'page has active tab' do |title|
it "#{title} tab" do
+ subject
+
expect(page).to have_selector('.navbar-sub-nav li.active', count: 1)
expect(find('.navbar-sub-nav li.active')).to have_content(title)
end
end
context 'on dashboard projects' do
- before do
- visit dashboard_projects_path
+ it_behaves_like 'page has active tab', 'Projects' do
+ subject { visit dashboard_projects_path }
end
-
- it_behaves_like 'page has active tab', 'Projects'
end
context 'on dashboard groups' do
- before do
- visit dashboard_groups_path
+ it_behaves_like 'page has active tab', 'Groups' do
+ subject { visit dashboard_groups_path }
end
-
- it_behaves_like 'page has active tab', 'Groups'
end
context 'on activity projects' do
- before do
- visit activity_dashboard_path
+ it_behaves_like 'page has active tab', 'Activity' do
+ subject { visit activity_dashboard_path }
end
+ end
- it_behaves_like 'page has active tab', 'Activity'
+ context 'on instance statistics' do
+ subject { visit instance_statistics_root_path }
+
+ it 'shows Instance Statistics` as active' do
+ subject
+
+ expect(find('.navbar-sub-nav li.active')).to have_link('Instance Statistics')
+ end
end
end
diff --git a/spec/features/dashboard/instance_statistics_spec.rb b/spec/features/dashboard/instance_statistics_spec.rb
new file mode 100644
index 00000000000..21ee2796bd8
--- /dev/null
+++ b/spec/features/dashboard/instance_statistics_spec.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Showing instance statistics' do
+ before do
+ sign_in user if user
+ end
+
+ # Using a path that is publicly accessible
+ subject { visit explore_projects_path }
+
+ context 'for unauthenticated users' do
+ let(:user) { nil }
+
+ it 'does not show the instance statistics link' do
+ subject
+
+ expect(page).not_to have_link('Instance Statistics')
+ end
+ end
+
+ context 'for regular users' do
+ let(:user) { create(:user) }
+
+ context 'when instance statistics are publicly available' do
+ before do
+ stub_application_setting(instance_statistics_visibility_private: false)
+ end
+
+ it 'shows the instance statistics link' do
+ subject
+
+ expect(page).to have_link('Instance Statistics')
+ end
+ end
+
+ context 'when instance statistics are not publicly available' do
+ before do
+ stub_application_setting(instance_statistics_visibility_private: true)
+ end
+
+ it 'shows the instance statistics link' do
+ subject
+
+ expect(page).not_to have_link('Instance Statistics')
+ end
+ end
+ end
+
+ context 'for admins' do
+ let(:user) { create(:admin) }
+
+ it 'shows the instance statistics link' do
+ subject
+
+ expect(page).to have_link('Instance Statistics')
+ end
+ end
+end
diff --git a/spec/features/groups/board_spec.rb b/spec/features/groups/board_spec.rb
new file mode 100644
index 00000000000..86a4a016f3d
--- /dev/null
+++ b/spec/features/groups/board_spec.rb
@@ -0,0 +1,35 @@
+require 'rails_helper'
+
+describe 'Group Boards' do
+ let(:group) { create(:group) }
+ let!(:project) { create(:project_empty_repo, group: group) }
+ let(:user) { create(:group_member, :maintainer, user: create(:user), group: group ).user }
+
+ before do
+ sign_in(user)
+ end
+
+ context 'Creates a an issue', :js do
+ before do
+ visit group_boards_path(group)
+ end
+
+ it 'Adds an issue to the backlog' do
+ page.within(find('.board', match: :first)) do
+ issue_title = 'New Issue'
+ find(:css, '.issue-count-badge-add-button').click
+ expect(find('.board-new-issue-form')).to be_visible
+
+ fill_in 'issue_title', with: issue_title
+ find('.dropdown-menu-toggle').click
+
+ wait_for_requests
+
+ click_link(project.name)
+ click_button 'Submit issue'
+
+ expect(page).to have_content(issue_title)
+ end
+ end
+ end
+end
diff --git a/spec/features/groups/members/list_members_spec.rb b/spec/features/groups/members/list_members_spec.rb
index 33f93fcc470..e1587a8b6a5 100644
--- a/spec/features/groups/members/list_members_spec.rb
+++ b/spec/features/groups/members/list_members_spec.rb
@@ -9,7 +9,7 @@ describe 'Groups > Members > List members' do
let(:nested_group) { create(:group, parent: group) }
before do
- gitlab_sign_in(user1)
+ sign_in(user1)
end
it 'show members from current group and parent', :nested_groups do
@@ -32,6 +32,18 @@ describe 'Groups > Members > List members' do
expect(second_row).to be_blank
end
+ describe 'showing status of members' do
+ before do
+ group.add_developer(user2)
+ end
+
+ subject { visit group_group_members_path(group) }
+
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { user2 }
+ end
+ end
+
def first_row
page.all('ul.content-list > li')[0]
end
diff --git a/spec/features/admin/admin_cohorts_spec.rb b/spec/features/instance_statistics/cohorts_spec.rb
index 9dce9494b97..81fc5eff980 100644
--- a/spec/features/admin/admin_cohorts_spec.rb
+++ b/spec/features/instance_statistics/cohorts_spec.rb
@@ -1,6 +1,6 @@
require 'rails_helper'
-describe 'Admin cohorts page' do
+describe 'Cohorts page' do
before do
sign_in(create(:admin))
end
@@ -8,7 +8,7 @@ describe 'Admin cohorts page' do
it 'See users count per month' do
2.times { create(:user) }
- visit admin_cohorts_path
+ visit instance_statistics_cohorts_path
expect(page).to have_content("#{Time.now.strftime('%b %Y')} 3 0")
end
diff --git a/spec/features/admin/admin_conversational_development_index_spec.rb b/spec/features/instance_statistics/conversational_development_index_spec.rb
index 2d2c7df5364..d441a7a5af9 100644
--- a/spec/features/admin/admin_conversational_development_index_spec.rb
+++ b/spec/features/instance_statistics/conversational_development_index_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe 'Admin Conversational Development Index' do
+describe 'Conversational Development Index' do
before do
sign_in(create(:admin))
end
@@ -9,7 +9,7 @@ describe 'Admin Conversational Development Index' do
it 'shows empty state' do
stub_application_setting(usage_ping_enabled: false)
- visit admin_conversational_development_index_path
+ visit instance_statistics_conversational_development_index_index_path
expect(page).to have_content('Usage ping is not enabled')
end
@@ -19,7 +19,7 @@ describe 'Admin Conversational Development Index' do
it 'shows empty state' do
stub_application_setting(usage_ping_enabled: true)
- visit admin_conversational_development_index_path
+ visit instance_statistics_conversational_development_index_index_path
expect(page).to have_content('Data is still calculating')
end
@@ -30,7 +30,7 @@ describe 'Admin Conversational Development Index' do
stub_application_setting(usage_ping_enabled: true)
create(:conversational_development_index_metric)
- visit admin_conversational_development_index_path
+ visit instance_statistics_conversational_development_index_index_path
expect(page).to have_content(
'Issues created per active user 1.2 You 9.3 Lead 13.3%'
diff --git a/spec/features/issues/update_issues_spec.rb b/spec/features/issues/update_issues_spec.rb
index 845a7c5fc42..fd8629ae504 100644
--- a/spec/features/issues/update_issues_spec.rb
+++ b/spec/features/issues/update_issues_spec.rb
@@ -49,7 +49,7 @@ describe 'Multiple issue updating from issues#index', :js do
click_update_issues_button
page.within('.issue .controls') do
- expect(find('.author_link')["title"]).to have_content(user.name)
+ expect(find('.author-link')["title"]).to have_content(user.name)
end
end
@@ -63,7 +63,7 @@ describe 'Multiple issue updating from issues#index', :js do
click_link 'Unassigned'
click_update_issues_button
- expect(find('.issue:first-child .controls')).not_to have_css('.author_link')
+ expect(find('.issue:first-child .controls')).not_to have_css('.author-link')
end
end
diff --git a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
index 2d268ecab58..bf4d5396df9 100644
--- a/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
+++ b/spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb
@@ -342,9 +342,8 @@ describe 'Merge request > User resolves diff notes and discussions', :js do
end
end
- it 'shows jump to next discussion button, apart from the last one' do
- expect(page).to have_selector('.discussion-reply-holder', count: 2)
- expect(page).to have_selector('.discussion-reply-holder .discussion-next-btn', count: 1)
+ it 'shows jump to next discussion button' do
+ expect(page.all('.discussion-reply-holder', count: 2)).to all(have_selector('.discussion-next-btn'))
end
it 'displays next discussion even if hidden' do
diff --git a/spec/features/merge_requests/user_mass_updates_spec.rb b/spec/features/merge_requests/user_mass_updates_spec.rb
index bb327159cb0..cb6603d3f50 100644
--- a/spec/features/merge_requests/user_mass_updates_spec.rb
+++ b/spec/features/merge_requests/user_mass_updates_spec.rb
@@ -47,7 +47,7 @@ describe 'Merge requests > User mass updates', :js do
change_assignee(user.name)
page.within('.merge-request .controls') do
- expect(find('.author_link')["title"]).to have_content(user.name)
+ expect(find('.author-link')["title"]).to have_content(user.name)
end
end
end
@@ -62,7 +62,7 @@ describe 'Merge requests > User mass updates', :js do
it 'removes assignee from the merge request' do
change_assignee('Unassigned')
- expect(find('.merge-request .controls')).not_to have_css('.author_link')
+ expect(find('.merge-request .controls')).not_to have_css('.author-link')
end
end
end
diff --git a/spec/features/profiles/user_edit_profile_spec.rb b/spec/features/profiles/user_edit_profile_spec.rb
index 0b5eacbe916..96bbe6f93f1 100644
--- a/spec/features/profiles/user_edit_profile_spec.rb
+++ b/spec/features/profiles/user_edit_profile_spec.rb
@@ -55,4 +55,31 @@ describe 'User edit profile' do
expect(page).to have_link('gravatar.com')
end
end
+
+ context 'user status' do
+ it 'hides user status when the feature is disabled' do
+ stub_feature_flags(user_status_form: false)
+
+ visit(profile_path)
+
+ expect(page).not_to have_content('Current Status')
+ end
+
+ it 'shows the status form when the feature is enabled' do
+ stub_feature_flags(user_status_form: true)
+
+ visit(profile_path)
+
+ expect(page).to have_content('Current Status')
+ end
+
+ it 'shows the status form when the feature is enabled by setting a cookie', :js do
+ stub_feature_flags(user_status_form: false)
+ set_cookie('feature_user_status_form', 'true')
+
+ visit(profile_path)
+
+ expect(page).to have_content('Current Status')
+ end
+ end
end
diff --git a/spec/features/projects/commit/user_views_user_status_on_commit_spec.rb b/spec/features/projects/commit/user_views_user_status_on_commit_spec.rb
new file mode 100644
index 00000000000..e78b7f7ae08
--- /dev/null
+++ b/spec/features/projects/commit/user_views_user_status_on_commit_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Project > Commit > View user status' do
+ include RepoHelpers
+
+ set(:project) { create(:project, :repository) }
+ set(:user) { create(:user) }
+ let(:commit_author) { create(:user, email: sample_commit.author_email) }
+
+ before do
+ sign_in(user)
+ project.add_developer(user)
+ end
+
+ subject { visit(project_commit_path(project, sample_commit.id)) }
+
+ describe 'status for the commit author' do
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { commit_author }
+ end
+ end
+
+ describe 'status for a comment on the commit' do
+ let(:note) { create(:note, :on_commit, project: project) }
+
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { note.author }
+ end
+ end
+
+ describe 'status for a diff note on the commit' do
+ let(:note) { create(:diff_note_on_commit, project: project) }
+
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { note.author }
+ end
+ end
+end
diff --git a/spec/features/projects/import_export/import_file_object_storage_spec.rb b/spec/features/projects/import_export/import_file_object_storage_spec.rb
new file mode 100644
index 00000000000..0d364543916
--- /dev/null
+++ b/spec/features/projects/import_export/import_file_object_storage_spec.rb
@@ -0,0 +1,103 @@
+require 'spec_helper'
+
+describe 'Import/Export - project import integration test', :js do
+ include Select2Helper
+
+ let(:user) { create(:user) }
+ let(:file) { File.join(Rails.root, 'spec', 'features', 'projects', 'import_export', 'test_project_export.tar.gz') }
+ let(:export_path) { "#{Dir.tmpdir}/import_file_spec" }
+
+ before do
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+ allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
+ gitlab_sign_in(user)
+ end
+
+ after do
+ FileUtils.rm_rf(export_path, secure: true)
+ end
+
+ context 'when selecting the namespace' do
+ let(:user) { create(:admin) }
+ let!(:namespace) { user.namespace }
+ let(:project_path) { 'test-project-path' + SecureRandom.hex }
+
+ context 'prefilled the path' do
+ it 'user imports an exported project successfully' do
+ visit new_project_path
+
+ select2(namespace.id, from: '#project_namespace_id')
+ fill_in :project_path, with: project_path, visible: true
+ click_import_project_tab
+ click_link 'GitLab export'
+
+ expect(page).to have_content('Import an exported GitLab project')
+ expect(URI.parse(current_url).query).to eq("namespace_id=#{namespace.id}&path=#{project_path}")
+
+ attach_file('file', file)
+ click_on 'Import project'
+
+ expect(Project.count).to eq(1)
+
+ project = Project.last
+ expect(project).not_to be_nil
+ expect(project.description).to eq("Foo Bar")
+ expect(project.issues).not_to be_empty
+ expect(project.merge_requests).not_to be_empty
+ expect(project_hook_exists?(project)).to be true
+ expect(wiki_exists?(project)).to be true
+ expect(project.import_state.status).to eq('finished')
+ end
+ end
+
+ context 'path is not prefilled' do
+ it 'user imports an exported project successfully' do
+ visit new_project_path
+ click_import_project_tab
+ click_link 'GitLab export'
+
+ fill_in :path, with: 'test-project-path', visible: true
+ attach_file('file', file)
+
+ expect { click_on 'Import project' }.to change { Project.count }.by(1)
+
+ project = Project.last
+ expect(project).not_to be_nil
+ expect(page).to have_content("Project 'test-project-path' is being imported")
+ end
+ end
+ end
+
+ it 'invalid project' do
+ project = create(:project, namespace: user.namespace)
+
+ visit new_project_path
+
+ select2(user.namespace.id, from: '#project_namespace_id')
+ fill_in :project_path, with: project.name, visible: true
+ click_import_project_tab
+ click_link 'GitLab export'
+ attach_file('file', file)
+ click_on 'Import project'
+
+ page.within('.flash-container') do
+ expect(page).to have_content('Project could not be imported')
+ end
+ end
+
+ def wiki_exists?(project)
+ wiki = ProjectWiki.new(project)
+ wiki.repository.exists? && !wiki.repository.empty?
+ end
+
+ def project_hook_exists?(project)
+ Gitlab::GitalyClient::StorageSettings.allow_disk_access do
+ Gitlab::Git::Hook.new('post-receive', project.repository.raw_repository).exists?
+ end
+ end
+
+ def click_import_project_tab
+ find('#import-project-tab').click
+ end
+end
diff --git a/spec/features/projects/import_export/import_file_spec.rb b/spec/features/projects/import_export/import_file_spec.rb
index 9cbfb62d872..2d86115de12 100644
--- a/spec/features/projects/import_export/import_file_spec.rb
+++ b/spec/features/projects/import_export/import_file_spec.rb
@@ -8,6 +8,7 @@ describe 'Import/Export - project import integration test', :js do
let(:export_path) { "#{Dir.tmpdir}/import_file_spec" }
before do
+ stub_feature_flags(import_export_object_storage: false)
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
gitlab_sign_in(user)
end
diff --git a/spec/features/projects/issues/user_views_issue_spec.rb b/spec/features/projects/issues/user_views_issue_spec.rb
index 4093876c289..117e5986f29 100644
--- a/spec/features/projects/issues/user_views_issue_spec.rb
+++ b/spec/features/projects/issues/user_views_issue_spec.rb
@@ -29,4 +29,22 @@ describe "User views issue" do
expect(page).not_to have_link('Close issue')
end
end
+
+ describe 'user status' do
+ subject { visit(project_issue_path(project, issue)) }
+
+ describe 'showing status of the author of the issue' do
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { issue.author }
+ end
+ end
+
+ describe 'showing status of a user who commented on an issue', :js do
+ let!(:note) { create(:note, noteable: issue, project: project, author: user_with_status) }
+
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { create(:user) }
+ end
+ end
+ end
end
diff --git a/spec/features/projects/jobs_spec.rb b/spec/features/projects/jobs_spec.rb
index 35b1c46ecf6..83293c0ca7d 100644
--- a/spec/features/projects/jobs_spec.rb
+++ b/spec/features/projects/jobs_spec.rb
@@ -135,6 +135,20 @@ describe 'Jobs', :clean_gitlab_redis_shared_state do
end
end
+ context 'sidebar' do
+ let(:job) { create(:ci_build, :success, :trace_live, pipeline: pipeline, name: '<img src=x onerror=alert(document.domain)>') }
+
+ before do
+ visit project_job_path(project, job)
+ end
+
+ it 'renders escaped tooltip name' do
+ page.within('aside.right-sidebar') do
+ expect(find('.active.build-job a')['data-title']).to eq('<img src="x"> - passed')
+ end
+ end
+ end
+
context 'when job is not running', :js do
let(:job) { create(:ci_build, :success, :trace_artifact, pipeline: pipeline) }
diff --git a/spec/features/projects/labels/search_labels_spec.rb b/spec/features/projects/labels/search_labels_spec.rb
new file mode 100644
index 00000000000..2d5a138c3cc
--- /dev/null
+++ b/spec/features/projects/labels/search_labels_spec.rb
@@ -0,0 +1,80 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Search for labels', :js do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+ let!(:label1) { create(:label, title: 'Foo', description: 'Lorem ipsum', project: project) }
+ let!(:label2) { create(:label, title: 'Bar', description: 'Fusce consequat', project: project) }
+
+ before do
+ project.add_maintainer(user)
+ sign_in(user)
+
+ visit project_labels_path(project)
+ end
+
+ it 'searches for label by title' do
+ fill_in 'label-search', with: 'Bar'
+ find('#label-search').native.send_keys(:enter)
+
+ expect(page).to have_content(label2.title)
+ expect(page).to have_content(label2.description)
+ expect(page).not_to have_content(label1.title)
+ expect(page).not_to have_content(label1.description)
+ end
+
+ it 'searches for label by title' do
+ fill_in 'label-search', with: 'Lorem'
+ find('#label-search').native.send_keys(:enter)
+
+ expect(page).to have_content(label1.title)
+ expect(page).to have_content(label1.description)
+ expect(page).not_to have_content(label2.title)
+ expect(page).not_to have_content(label2.description)
+ end
+
+ it 'shows nothing found message' do
+ fill_in 'label-search', with: 'nonexistent'
+ find('#label-search').native.send_keys(:enter)
+
+ expect(page).to have_content('No labels with such name or description')
+ expect(page).not_to have_content(label1.title)
+ expect(page).not_to have_content(label1.description)
+ expect(page).not_to have_content(label2.title)
+ expect(page).not_to have_content(label2.description)
+ end
+
+ context 'priority labels' do
+ let!(:label_priority) { create(:label_priority, label: label1, project: project) }
+
+ it 'searches for priority label' do
+ fill_in 'label-search', with: 'Foo'
+ find('#label-search').native.send_keys(:enter)
+
+ page.within('.prioritized-labels') do
+ expect(page).to have_content(label1.title)
+ expect(page).to have_content(label1.description)
+ end
+
+ page.within('.other-labels') do
+ expect(page).to have_content('No other labels with such name or description')
+ end
+ end
+
+ it 'searches for other label' do
+ fill_in 'label-search', with: 'Bar'
+ find('#label-search').native.send_keys(:enter)
+
+ page.within('.prioritized-labels') do
+ expect(page).to have_content('No prioritised labels with such name or description')
+ end
+
+ page.within('.other-labels') do
+ expect(page).to have_content(label2.title)
+ expect(page).to have_content(label2.description)
+ end
+ end
+ end
+end
diff --git a/spec/features/projects/members/group_members_spec.rb b/spec/features/projects/members/group_members_spec.rb
index 41b2beb40b9..0b2cd13b8ec 100644
--- a/spec/features/projects/members/group_members_spec.rb
+++ b/spec/features/projects/members/group_members_spec.rb
@@ -87,4 +87,12 @@ describe 'Projects members' do
end
end
end
+
+ describe 'showing status of members' do
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { developer }
+
+ subject { visit project_settings_members_path(project) }
+ end
+ end
end
diff --git a/spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb b/spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb
new file mode 100644
index 00000000000..78d9c6c6db1
--- /dev/null
+++ b/spec/features/projects/merge_requests/user_views_user_status_on_merge_request_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Project > Merge request > View user status' do
+ let(:project) { create(:project, :public, :repository) }
+ let(:merge_request) do
+ create(:merge_request, source_project: project, target_project: project, author: create(:user))
+ end
+
+ subject { visit merge_request_path(merge_request) }
+
+ describe 'the status of the merge request author' do
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { merge_request.author }
+ end
+ end
+
+ context 'for notes', :js do
+ describe 'the status of the author of a note on a merge request' do
+ let(:note) { create(:note, noteable: merge_request, project: project, author: create(:user)) }
+
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { note.author }
+ end
+ end
+
+ describe 'the status of the author of a diff note on a merge request' do
+ let(:note) { create(:diff_note_on_merge_request, noteable: merge_request, project: project, author: create(:user)) }
+
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { note.author }
+ end
+ end
+ end
+end
diff --git a/spec/features/projects/pipelines/pipeline_spec.rb b/spec/features/projects/pipelines/pipeline_spec.rb
index ecc7cf84138..a84492ea5f1 100644
--- a/spec/features/projects/pipelines/pipeline_spec.rb
+++ b/spec/features/projects/pipelines/pipeline_spec.rb
@@ -63,6 +63,12 @@ describe 'Pipeline', :js do
expect(page).to have_css('#js-tab-pipeline.active')
end
+ it_behaves_like 'showing user status' do
+ let(:user_with_status) { pipeline.user }
+
+ subject { visit project_pipeline_path(project, pipeline) }
+ end
+
describe 'pipeline graph' do
context 'when pipeline has running builds' do
it 'shows a running icon and a cancel action for the running build' do
diff --git a/spec/features/projects/snippets/show_spec.rb b/spec/features/projects/snippets/show_spec.rb
index 3cc797277dd..f3dc13fb52f 100644
--- a/spec/features/projects/snippets/show_spec.rb
+++ b/spec/features/projects/snippets/show_spec.rb
@@ -141,4 +141,16 @@ describe 'Projects > Snippets > Project snippet', :js do
end
end
end
+
+ it_behaves_like 'showing user status' do
+ let(:file_name) { 'ruby-style-guide.md' }
+ let(:content) { project.repository.blob_at('master', 'files/markdown/ruby-style-guide.md').data }
+
+ let(:user_with_status) { snippet.author }
+
+ subject do
+ visit project_snippet_path(project, snippet)
+ wait_for_requests
+ end
+ end
end
diff --git a/spec/features/projects/user_uses_shortcuts_spec.rb b/spec/features/projects/user_uses_shortcuts_spec.rb
index df9ee69aadb..64f9a4fcd39 100644
--- a/spec/features/projects/user_uses_shortcuts_spec.rb
+++ b/spec/features/projects/user_uses_shortcuts_spec.rb
@@ -9,6 +9,8 @@ describe 'User uses shortcuts', :js do
sign_in(user)
visit(project_path(project))
+
+ wait_for_requests
end
context 'when navigating to the Project pages' do
diff --git a/spec/features/projects/wiki/user_views_wiki_page_spec.rb b/spec/features/projects/wiki/user_views_wiki_page_spec.rb
index 0ef7f35f64a..760324adacc 100644
--- a/spec/features/projects/wiki/user_views_wiki_page_spec.rb
+++ b/spec/features/projects/wiki/user_views_wiki_page_spec.rb
@@ -137,6 +137,26 @@ describe 'User views a wiki page' do
end
end
+ context 'when page has invalid content encoding' do
+ let(:content) { 'whatever'.force_encoding('ISO-8859-1') }
+
+ before do
+ allow(Gitlab::EncodingHelper).to receive(:encode!).and_return(content)
+
+ visit(project_wiki_path(project, wiki_page))
+ end
+
+ it 'does not show "Edit" button' do
+ expect(page).not_to have_selector('a.btn', text: 'Edit')
+ end
+
+ it 'shows error' do
+ page.within(:css, '.flash-notice') do
+ expect(page).to have_content('The content of this page is not encoded in UTF-8. Edits can only be made via the Git repository.')
+ end
+ end
+ end
+
it 'opens a default wiki page', :js do
visit(project_path(project))
diff --git a/spec/features/snippets/notes_on_personal_snippets_spec.rb b/spec/features/snippets/notes_on_personal_snippets_spec.rb
index 269351e55c9..1442e011d52 100644
--- a/spec/features/snippets/notes_on_personal_snippets_spec.rb
+++ b/spec/features/snippets/notes_on_personal_snippets_spec.rb
@@ -16,6 +16,8 @@ describe 'Comments on personal snippets', :js do
before do
sign_in user
visit snippet_path(snippet)
+
+ wait_for_requests
end
subject { page }
@@ -42,6 +44,15 @@ describe 'Comments on personal snippets', :js do
expect(page).to have_selector('.note-emoji-button')
end
end
+
+ it 'shows the status of a note author' do
+ status = create(:user_status, user: user)
+ visit snippet_path(snippet)
+
+ within("#note_#{snippet_notes[0].id}") do
+ expect(page).to show_user_status(status)
+ end
+ end
end
context 'when submitting a note' do
diff --git a/spec/features/snippets/show_spec.rb b/spec/features/snippets/show_spec.rb
index f31457db92f..3fe0b60b18f 100644
--- a/spec/features/snippets/show_spec.rb
+++ b/spec/features/snippets/show_spec.rb
@@ -155,4 +155,12 @@ describe 'Snippet', :js do
end
end
end
+
+ it_behaves_like 'showing user status' do
+ let(:file_name) { 'popen.rb' }
+ let(:content) { project.repository.blob_at('master', 'files/ruby/popen.rb').data }
+ let(:user_with_status) { snippet.author }
+
+ subject { visit snippet_path(snippet) }
+ end
end
diff --git a/spec/features/users/add_email_to_existing_account.rb b/spec/features/users/add_email_to_existing_account.rb
new file mode 100644
index 00000000000..4355f769429
--- /dev/null
+++ b/spec/features/users/add_email_to_existing_account.rb
@@ -0,0 +1,15 @@
+require 'spec_helper'
+
+describe 'AdditionalEmailToExistingAccount' do
+ describe 'add secondary email associated with account' do
+ let(:user) { create(:user) }
+
+ it 'verifies confirmation of additional email' do
+ sign_in(user)
+
+ email = create(:email, user: user)
+ visit email_confirmation_path(confirmation_token: email.confirmation_token)
+ expect(page).to have_content 'Your email address has been successfully confirmed.'
+ end
+ end
+end
diff --git a/spec/features/users/login_spec.rb b/spec/features/users/login_spec.rb
index 21891b9ccda..44758f862a8 100644
--- a/spec/features/users/login_spec.rb
+++ b/spec/features/users/login_spec.rb
@@ -3,28 +3,40 @@ require 'spec_helper'
describe 'Login' do
include TermsHelper
- it 'Successful user signin invalidates password reset token' do
- user = create(:user)
+ before do
+ stub_authentication_activity_metrics(debug: true)
+ end
+
+ describe 'password reset token after successful sign in' do
+ it 'invalidates password reset token' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ user = create(:user)
- expect(user.reset_password_token).to be_nil
+ expect(user.reset_password_token).to be_nil
- visit new_user_password_path
- fill_in 'user_email', with: user.email
- click_button 'Reset password'
+ visit new_user_password_path
+ fill_in 'user_email', with: user.email
+ click_button 'Reset password'
- user.reload
- expect(user.reset_password_token).not_to be_nil
+ user.reload
+ expect(user.reset_password_token).not_to be_nil
- find('a[href="#login-pane"]').click
- gitlab_sign_in(user)
- expect(current_path).to eq root_path
+ find('a[href="#login-pane"]').click
+ gitlab_sign_in(user)
+ expect(current_path).to eq root_path
- user.reload
- expect(user.reset_password_token).to be_nil
+ user.reload
+ expect(user.reset_password_token).to be_nil
+ end
end
describe 'initial login after setup' do
it 'allows the initial admin to create a password' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
# This behavior is dependent on there only being one user
User.delete_all
@@ -56,6 +68,11 @@ describe 'Login' do
describe 'with a blocked account' do
it 'prevents the user from logging in' do
+ expect(authentication_metrics)
+ .to increment(:user_blocked_counter)
+ .and increment(:user_unauthenticated_counter)
+ .and increment(:user_session_destroyed_counter).twice
+
user = create(:user, :blocked)
gitlab_sign_in(user)
@@ -64,6 +81,11 @@ describe 'Login' do
end
it 'does not update Devise trackable attributes', :clean_gitlab_redis_shared_state do
+ expect(authentication_metrics)
+ .to increment(:user_blocked_counter)
+ .and increment(:user_unauthenticated_counter)
+ .and increment(:user_session_destroyed_counter).twice
+
user = create(:user, :blocked)
expect { gitlab_sign_in(user) }.not_to change { user.reload.sign_in_count }
@@ -72,13 +94,22 @@ describe 'Login' do
describe 'with the ghost user' do
it 'disallows login' do
+ expect(authentication_metrics)
+ .to increment(:user_unauthenticated_counter)
+ .and increment(:user_password_invalid_counter)
+
gitlab_sign_in(User.ghost)
expect(page).to have_content('Invalid Login or password.')
end
it 'does not update Devise trackable attributes', :clean_gitlab_redis_shared_state do
- expect { gitlab_sign_in(User.ghost) }.not_to change { User.ghost.reload.sign_in_count }
+ expect(authentication_metrics)
+ .to increment(:user_unauthenticated_counter)
+ .and increment(:user_password_invalid_counter)
+
+ expect { gitlab_sign_in(User.ghost) }
+ .not_to change { User.ghost.reload.sign_in_count }
end
end
@@ -93,17 +124,30 @@ describe 'Login' do
before do
gitlab_sign_in(user, remember: true)
+
expect(page).to have_content('Two-Factor Authentication')
end
it 'does not show a "You are already signed in." error message' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_two_factor_authenticated_counter)
+
enter_code(user.current_otp)
+
expect(page).not_to have_content('You are already signed in.')
end
context 'using one-time code' do
it 'allows login with valid code' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_two_factor_authenticated_counter)
+
enter_code(user.current_otp)
+
expect(current_path).to eq root_path
end
@@ -114,11 +158,20 @@ describe 'Login' do
end
it 'blocks login with invalid code' do
+ # TODO invalid 2FA code does not generate any events
+ # See gitlab-org/gitlab-ce#49785
+
enter_code('foo')
+
expect(page).to have_content('Invalid two-factor code')
end
it 'allows login with invalid code, then valid code' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_two_factor_authenticated_counter)
+
enter_code('foo')
expect(page).to have_content('Invalid two-factor code')
@@ -139,16 +192,33 @@ describe 'Login' do
context 'with valid code' do
it 'allows login' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_two_factor_authenticated_counter)
+
enter_code(codes.sample)
+
expect(current_path).to eq root_path
end
it 'invalidates the used code' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_two_factor_authenticated_counter)
+
expect { enter_code(codes.sample) }
.to change { user.reload.otp_backup_codes.size }.by(-1)
end
it 'invalidates backup codes twice in a row' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter).twice
+ .and increment(:user_session_override_counter).twice
+ .and increment(:user_two_factor_authenticated_counter).twice
+ .and increment(:user_session_destroyed_counter)
+
random_code = codes.delete(codes.sample)
expect { enter_code(random_code) }
.to change { user.reload.otp_backup_codes.size }.by(-1)
@@ -163,6 +233,9 @@ describe 'Login' do
context 'with invalid code' do
it 'blocks login' do
+ # TODO, invalid two factor authentication does not increment
+ # metrics / counters, see gitlab-org/gitlab-ce#49785
+
code = codes.sample
expect(user.invalidate_otp_backup_code!(code)).to eq true
@@ -176,7 +249,7 @@ describe 'Login' do
end
end
- context 'logging in via OAuth' do
+ context 'when logging in via OAuth' do
let(:user) { create(:omniauth_user, :two_factor, extern_uid: 'my-uid', provider: 'saml')}
let(:mock_saml_response) do
File.read('spec/fixtures/authentication/saml_response.xml')
@@ -185,49 +258,80 @@ describe 'Login' do
before do
stub_omniauth_saml_config(enabled: true, auto_link_saml_user: true, allow_single_sign_on: ['saml'],
providers: [mock_saml_config_with_upstream_two_factor_authn_contexts])
- gitlab_sign_in_via('saml', user, 'my-uid', mock_saml_response)
end
context 'when authn_context is worth two factors' do
let(:mock_saml_response) do
File.read('spec/fixtures/authentication/saml_response.xml')
- .gsub('urn:oasis:names:tc:SAML:2.0:ac:classes:Password', 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS')
+ .gsub('urn:oasis:names:tc:SAML:2.0:ac:classes:Password',
+ 'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS')
end
it 'signs user in without prompting for second factor' do
+ # TODO, OAuth authentication does not fire events,
+ # see gitlab-org/gitlab-ce#49786
+
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+
+ sign_in_using_saml!
+
expect(page).not_to have_content('Two-Factor Authentication')
expect(current_path).to eq root_path
end
end
- context 'when authn_context is not worth two factors' do
+ context 'when two factor authentication is required' do
it 'shows 2FA prompt after OAuth login' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_two_factor_authenticated_counter)
+
+ sign_in_using_saml!
+
expect(page).to have_content('Two-Factor Authentication')
+
enter_code(user.current_otp)
+
expect(current_path).to eq root_path
end
end
+
+ def sign_in_using_saml!
+ gitlab_sign_in_via('saml', user, 'my-uid', mock_saml_response)
+ end
end
end
describe 'without two-factor authentication' do
- let(:user) { create(:user) }
+ context 'with correct username and password' do
+ let(:user) { create(:user) }
- it 'allows basic login' do
- gitlab_sign_in(user)
- expect(current_path).to eq root_path
- end
+ it 'allows basic login' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
- it 'does not show a "You are already signed in." error message' do
- gitlab_sign_in(user)
- expect(page).not_to have_content('You are already signed in.')
+ gitlab_sign_in(user)
+
+ expect(current_path).to eq root_path
+ expect(page).not_to have_content('You are already signed in.')
+ end
end
- it 'blocks invalid login' do
- user = create(:user, password: 'not-the-default')
+ context 'with invalid username and password' do
+ let(:user) { create(:user, password: 'not-the-default') }
- gitlab_sign_in(user)
- expect(page).to have_content('Invalid Login or password.')
+ it 'blocks invalid login' do
+ expect(authentication_metrics)
+ .to increment(:user_unauthenticated_counter)
+ .and increment(:user_password_invalid_counter)
+
+ gitlab_sign_in(user)
+
+ expect(page).to have_content('Invalid Login or password.')
+ end
end
end
@@ -243,18 +347,26 @@ describe 'Login' do
context 'with grace period defined' do
before do
stub_application_setting(two_factor_grace_period: 48)
- gitlab_sign_in(user)
end
context 'within the grace period' do
it 'redirects to two-factor configuration page' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+
expect(current_path).to eq profile_two_factor_auth_path
expect(page).to have_content('The global settings require you to enable Two-Factor Authentication for your account. You need to do this before ')
end
it 'allows skipping two-factor configuration', :js do
- expect(current_path).to eq profile_two_factor_auth_path
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+ expect(current_path).to eq profile_two_factor_auth_path
click_link 'Configure it later'
expect(current_path).to eq root_path
end
@@ -264,6 +376,11 @@ describe 'Login' do
let(:user) { create(:user, otp_grace_period_started_at: 9999.hours.ago) }
it 'redirects to two-factor configuration page' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+
expect(current_path).to eq profile_two_factor_auth_path
expect(page).to have_content(
'The global settings require you to enable Two-Factor Authentication for your account.'
@@ -271,6 +388,11 @@ describe 'Login' do
end
it 'disallows skipping two-factor configuration', :js do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+
expect(current_path).to eq profile_two_factor_auth_path
expect(page).not_to have_link('Configure it later')
end
@@ -280,10 +402,14 @@ describe 'Login' do
context 'without grace period defined' do
before do
stub_application_setting(two_factor_grace_period: 0)
- gitlab_sign_in(user)
end
it 'redirects to two-factor configuration page' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+
expect(current_path).to eq profile_two_factor_auth_path
expect(page).to have_content(
'The global settings require you to enable Two-Factor Authentication for your account.'
@@ -303,11 +429,15 @@ describe 'Login' do
context 'with grace period defined' do
before do
stub_application_setting(two_factor_grace_period: 48)
- gitlab_sign_in(user)
end
context 'within the grace period' do
it 'redirects to two-factor configuration page' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+
expect(current_path).to eq profile_two_factor_auth_path
expect(page).to have_content(
'The group settings for Group 1 and Group 2 require you to enable ' \
@@ -316,8 +446,12 @@ describe 'Login' do
end
it 'allows skipping two-factor configuration', :js do
- expect(current_path).to eq profile_two_factor_auth_path
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ gitlab_sign_in(user)
+
+ expect(current_path).to eq profile_two_factor_auth_path
click_link 'Configure it later'
expect(current_path).to eq root_path
end
@@ -327,6 +461,11 @@ describe 'Login' do
let(:user) { create(:user, otp_grace_period_started_at: 9999.hours.ago) }
it 'redirects to two-factor configuration page' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+
expect(current_path).to eq profile_two_factor_auth_path
expect(page).to have_content(
'The group settings for Group 1 and Group 2 require you to enable ' \
@@ -335,6 +474,11 @@ describe 'Login' do
end
it 'disallows skipping two-factor configuration', :js do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+
expect(current_path).to eq profile_two_factor_auth_path
expect(page).not_to have_link('Configure it later')
end
@@ -344,10 +488,14 @@ describe 'Login' do
context 'without grace period defined' do
before do
stub_application_setting(two_factor_grace_period: 0)
- gitlab_sign_in(user)
end
it 'redirects to two-factor configuration page' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
+ gitlab_sign_in(user)
+
expect(current_path).to eq profile_two_factor_auth_path
expect(page).to have_content(
'The group settings for Group 1 and Group 2 require you to enable ' \
@@ -431,6 +579,9 @@ describe 'Login' do
end
it 'asks to accept the terms on first login' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
visit new_user_session_path
fill_in 'user_login', with: user.email
@@ -447,6 +598,9 @@ describe 'Login' do
end
it 'does not ask for terms when the user already accepted them' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
accept_terms(user)
visit new_user_session_path
@@ -467,6 +621,9 @@ describe 'Login' do
context 'when the user did not enable 2FA' do
it 'asks to set 2FA before asking to accept the terms' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
visit new_user_session_path
fill_in 'user_login', with: user.email
@@ -495,6 +652,11 @@ describe 'Login' do
end
it 'asks the user to accept the terms' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+ .and increment(:user_two_factor_authenticated_counter)
+
visit new_user_session_path
fill_in 'user_login', with: user.email
@@ -518,6 +680,9 @@ describe 'Login' do
end
it 'asks the user to accept the terms before setting a new password' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+
visit new_user_session_path
fill_in 'user_login', with: user.email
@@ -546,6 +711,10 @@ describe 'Login' do
end
it 'asks the user to accept the terms before setting an email' do
+ expect(authentication_metrics)
+ .to increment(:user_authenticated_counter)
+ .and increment(:user_session_override_counter)
+
gitlab_sign_in_via('saml', user, 'my-uid')
expect_to_be_on_terms_page
diff --git a/spec/features/users/show_spec.rb b/spec/features/users/show_spec.rb
index 3e2fb704bc6..bc07ab48c39 100644
--- a/spec/features/users/show_spec.rb
+++ b/spec/features/users/show_spec.rb
@@ -3,18 +3,64 @@ require 'spec_helper'
describe 'User page' do
let(:user) { create(:user) }
- it 'shows all the tabs' do
- visit(user_path(user))
+ context 'with public profile' do
+ it 'shows all the tabs' do
+ visit(user_path(user))
+
+ page.within '.nav-links' do
+ expect(page).to have_link('Activity')
+ expect(page).to have_link('Groups')
+ expect(page).to have_link('Contributed projects')
+ expect(page).to have_link('Personal projects')
+ expect(page).to have_link('Snippets')
+ end
+ end
+
+ it 'does not show private profile message' do
+ visit(user_path(user))
- page.within '.nav-links' do
- expect(page).to have_link('Activity')
- expect(page).to have_link('Groups')
- expect(page).to have_link('Contributed projects')
- expect(page).to have_link('Personal projects')
- expect(page).to have_link('Snippets')
+ expect(page).not_to have_content("This user has a private profile")
end
end
+ context 'with private profile' do
+ let(:user) { create(:user, private_profile: true) }
+
+ it 'shows no tab' do
+ visit(user_path(user))
+
+ expect(page).to have_css("div.profile-header")
+ expect(page).not_to have_css("ul.nav-links")
+ end
+
+ it 'shows private profile message' do
+ visit(user_path(user))
+
+ expect(page).to have_content("This user has a private profile")
+ end
+
+ it 'shows own tabs' do
+ sign_in(user)
+ visit(user_path(user))
+
+ page.within '.nav-links' do
+ expect(page).to have_link('Activity')
+ expect(page).to have_link('Groups')
+ expect(page).to have_link('Contributed projects')
+ expect(page).to have_link('Personal projects')
+ expect(page).to have_link('Snippets')
+ end
+ end
+ end
+
+ it 'shows the status if there was one' do
+ create(:user_status, user: user, message: "Working hard!")
+
+ visit(user_path(user))
+
+ expect(page).to have_content("Working hard!")
+ end
+
context 'signup disabled' do
it 'shows the sign in link' do
stub_application_setting(signup_enabled: false)
diff --git a/spec/finders/labels_finder_spec.rb b/spec/finders/labels_finder_spec.rb
index 899d0d22819..eb2a4576e30 100644
--- a/spec/finders/labels_finder_spec.rb
+++ b/spec/finders/labels_finder_spec.rb
@@ -14,7 +14,7 @@ describe LabelsFinder do
let(:project_4) { create(:project, :public) }
let(:project_5) { create(:project, namespace: group_1) }
- let!(:project_label_1) { create(:label, project: project_1, title: 'Label 1') }
+ let!(:project_label_1) { create(:label, project: project_1, title: 'Label 1', description: 'awesome label') }
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') }
@@ -196,5 +196,19 @@ describe LabelsFinder do
expect(finder.execute).to be_empty
end
end
+
+ context 'search by title and description' do
+ it 'returns labels with a partially matching title' do
+ finder = described_class.new(user, search: '(group)')
+
+ expect(finder.execute).to eq [group_label_1]
+ end
+
+ it 'returns labels with a partially matching description' do
+ finder = described_class.new(user, search: 'awesome')
+
+ expect(finder.execute).to eq [project_label_1]
+ end
+ end
end
end
diff --git a/spec/finders/user_recent_events_finder_spec.rb b/spec/finders/user_recent_events_finder_spec.rb
index da043f94021..58470f4c84d 100644
--- a/spec/finders/user_recent_events_finder_spec.rb
+++ b/spec/finders/user_recent_events_finder_spec.rb
@@ -29,11 +29,22 @@ describe UserRecentEventsFinder do
public_project.add_developer(current_user)
end
- it 'returns all the events' do
- expect(finder.execute).to include(private_event, internal_event, public_event)
+ context 'when profile is public' do
+ it 'returns all the events' do
+ expect(finder.execute).to include(private_event, internal_event, public_event)
+ end
+ end
+
+ context 'when profile is private' do
+ it 'returns no event' do
+ allow(Ability).to receive(:allowed?).and_call_original
+ allow(Ability).to receive(:allowed?).with(current_user, :read_user_profile, project_owner).and_return(false)
+ expect(finder.execute).to be_empty
+ end
end
it 'does not include the events if the user cannot read cross project' do
+ expect(Ability).to receive(:allowed?).and_call_original
expect(Ability).to receive(:allowed?).with(current_user, :read_cross_project) { false }
expect(finder.execute).to be_empty
end
diff --git a/spec/fixtures/api/schemas/entities/merge_request_widget.json b/spec/fixtures/api/schemas/entities/merge_request_widget.json
index 3b741d51598..c40977bc4ee 100644
--- a/spec/fixtures/api/schemas/entities/merge_request_widget.json
+++ b/spec/fixtures/api/schemas/entities/merge_request_widget.json
@@ -81,6 +81,7 @@
"can_revert_on_current_merge_request": { "type": ["boolean", "null"] },
"can_cherry_pick_on_current_merge_request": { "type": ["boolean", "null"] },
"can_create_note": { "type": "boolean" },
+ "can_create_issue": { "type": "boolean" },
"can_update": { "type": "boolean" }
},
"additionalProperties": false
@@ -116,7 +117,8 @@
"rebase_in_progress": { "type": "boolean" },
"can_push_to_source_branch": { "type": "boolean" },
"rebase_path": { "type": ["string", "null"] },
- "squash": { "type": "boolean" }
+ "squash": { "type": "boolean" },
+ "test_reports_path": { "type": ["string", "null"] }
},
"additionalProperties": false
}
diff --git a/spec/fixtures/api/schemas/entities/test_case.json b/spec/fixtures/api/schemas/entities/test_case.json
new file mode 100644
index 00000000000..c9ba1f3ad18
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/test_case.json
@@ -0,0 +1,15 @@
+{
+ "type": "object",
+ "required" : [
+ "status",
+ "name"
+ ],
+ "properties": {
+ "status": { "type": "string" },
+ "name": { "type": "string" },
+ "execution_time": { "type": "float" },
+ "system_output": { "type": ["string", "null"] },
+ "stack_trace": { "type": ["string", "null"] }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/test_reports_comparer.json b/spec/fixtures/api/schemas/entities/test_reports_comparer.json
new file mode 100644
index 00000000000..d7880801c01
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/test_reports_comparer.json
@@ -0,0 +1,26 @@
+{
+ "type": "object",
+ "required" : [
+ "status",
+ "summary",
+ "suites"
+ ],
+ "properties": {
+ "status": { "type": "string" },
+ "summary": {
+ "type": "object",
+ "properties": {
+ "total": { "type": "integer" },
+ "resolved": { "type": "integer" },
+ "failed": { "type": "integer" }
+ },
+ "required": [
+ "total",
+ "resolved",
+ "failed"
+ ]
+ },
+ "suites": { "type": "array", "items": { "$ref": "test_suite_comparer.json" } }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/test_suite_comparer.json b/spec/fixtures/api/schemas/entities/test_suite_comparer.json
new file mode 100644
index 00000000000..d63fea1f0db
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/test_suite_comparer.json
@@ -0,0 +1,32 @@
+{
+ "type": "object",
+ "required": [
+ "name",
+ "status",
+ "summary",
+ "new_failures",
+ "resolved_failures",
+ "existing_failures"
+ ],
+ "properties": {
+ "name": { "type": "string" },
+ "status": { "type": "string" },
+ "summary": {
+ "type": "object",
+ "properties": {
+ "total": { "type": "integer" },
+ "resolved": { "type": "integer" },
+ "failed": { "type": "integer" }
+ },
+ "required": [
+ "total",
+ "resolved",
+ "failed"
+ ]
+ },
+ "new_failures": { "type": "array", "items": { "$ref": "test_case.json" } },
+ "resolved_failures": { "type": "array", "items": { "$ref": "test_case.json" } },
+ "existing_failures": { "type": "array", "items": { "$ref": "test_case.json" } }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/emails/commands_in_reply.eml b/spec/fixtures/emails/commands_in_reply.eml
index 712f6f797b4..6a467ccbbc6 100644
--- a/spec/fixtures/emails/commands_in_reply.eml
+++ b/spec/fixtures/emails/commands_in_reply.eml
@@ -8,7 +8,7 @@ From: Jake the Dog <jake@adventuretime.ooo>
To: reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
In-Reply-To: <issue_1@localhost>
-References: <issue_1@localhost> <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost>
+References: <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost> <issue_1@localhost>
Subject: re: [Discourse Meta] eviltrout posted in 'Adventure Time Sux'
Mime-Version: 1.0
Content-Type: text/plain;
diff --git a/spec/fixtures/emails/commands_only_reply.eml b/spec/fixtures/emails/commands_only_reply.eml
index 2d2e2f94290..9b8d25c406e 100644
--- a/spec/fixtures/emails/commands_only_reply.eml
+++ b/spec/fixtures/emails/commands_only_reply.eml
@@ -8,7 +8,7 @@ From: Jake the Dog <jake@adventuretime.ooo>
To: reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
In-Reply-To: <issue_1@localhost>
-References: <issue_1@localhost> <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost>
+References: <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost> <issue_1@localhost>
Subject: re: [Discourse Meta] eviltrout posted in 'Adventure Time Sux'
Mime-Version: 1.0
Content-Type: text/plain;
diff --git a/spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references.eml b/spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references.eml
index 39d5cefbc2a..609d9d9e93d 100644
--- a/spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references.eml
+++ b/spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references.eml
@@ -8,7 +8,7 @@ From: Jake the Dog <jake@adventuretime.ooo>
To: reply@appmail.adventuretime.ooo
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
In-Reply-To: <issue_1@localhost>
-References: <issue_1@localhost> <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost>
+References: <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost> <issue_1@localhost>
Subject: re: [Discourse Meta] eviltrout posted in 'Adventure Time Sux'
Mime-Version: 1.0
Content-Type: text/plain;
diff --git a/spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references_with_a_comma.eml b/spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references_with_a_comma.eml
index 6823db0cfc8..7be1ed5bf44 100644
--- a/spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references_with_a_comma.eml
+++ b/spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references_with_a_comma.eml
@@ -8,7 +8,7 @@ From: Jake the Dog <jake@adventuretime.ooo>
To: reply@appmail.adventuretime.ooo
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
In-Reply-To: <issue_1@localhost>
-References: <issue_1@localhost> <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost>,<exchange@microsoft.com>
+References: <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost> <issue_1@localhost>,<exchange@microsoft.com>
Subject: re: [Discourse Meta] eviltrout posted in 'Adventure Time Sux'
Mime-Version: 1.0
Content-Type: text/plain;
diff --git a/spec/fixtures/emails/update_commands_only_reply.eml b/spec/fixtures/emails/update_commands_only_reply.eml
index bb0d2b0e03a..927a62f6475 100644
--- a/spec/fixtures/emails/update_commands_only_reply.eml
+++ b/spec/fixtures/emails/update_commands_only_reply.eml
@@ -8,7 +8,7 @@ From: Jake the Dog <jake@adventuretime.ooo>
To: reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
In-Reply-To: <issue_1@localhost>
-References: <issue_1@localhost> <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost>
+References: <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost> <issue_1@localhost>
Subject: re: [Discourse Meta] eviltrout posted in 'Adventure Time Sux'
Mime-Version: 1.0
Content-Type: text/plain;
diff --git a/spec/fixtures/emails/valid_reply.eml b/spec/fixtures/emails/valid_reply.eml
index 980e10a8812..5fbeebdb6b0 100644
--- a/spec/fixtures/emails/valid_reply.eml
+++ b/spec/fixtures/emails/valid_reply.eml
@@ -8,7 +8,7 @@ From: Jake the Dog <jake@adventuretime.ooo>
To: reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo
Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
In-Reply-To: <issue_1@localhost>
-References: <issue_1@localhost> <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost>
+References: <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost> <issue_1@localhost>
Subject: re: [Discourse Meta] eviltrout posted in 'Adventure Time Sux'
Mime-Version: 1.0
Content-Type: text/plain;
diff --git a/spec/fixtures/junit/junit.xml b/spec/fixtures/junit/junit.xml
new file mode 100644
index 00000000000..b826afdc3ae
--- /dev/null
+++ b/spec/fixtures/junit/junit.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="rspec" tests="4" skipped="0" failures="2" errors="0" time="0.011289" timestamp="2018-07-17T10:48:13+00:00" hostname="runner-400e3f62-project-15-concurrent-0">
+<properties>
+<property name="seed" value="404"/>
+</properties>
+<testcase classname="spec.test_spec" name="Test#sum when a is 1 and b is 2 returns summary" file="./spec/test_spec.rb" time="0.009292"><failure message="
+expected: 3
+ got: -1
+
+(compared using ==)
+" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: is_expected.to eq(3)
+
+ expected: 3
+ got: -1
+
+ (compared using ==)
+./spec/test_spec.rb:12:in `block (4 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#sum when a is 100 and b is 200 returns summary" file="./spec/test_spec.rb" time="0.000180"><failure message="
+expected: 300
+ got: -100
+
+(compared using ==)
+" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: is_expected.to eq(300)
+
+ expected: 300
+ got: -100
+
+ (compared using ==)
+./spec/test_spec.rb:21:in `block (4 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract when a is 1 and b is 2 raises an error" file="./spec/test_spec.rb" time="0.000748"></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract when a is 2 and b is 1 returns correct result" file="./spec/test_spec.rb" time="0.000064"></testcase>
+</testsuite>
diff --git a/spec/fixtures/junit/junit.xml.gz b/spec/fixtures/junit/junit.xml.gz
new file mode 100644
index 00000000000..88b7de6fa61
--- /dev/null
+++ b/spec/fixtures/junit/junit.xml.gz
Binary files differ
diff --git a/spec/fixtures/junit/junit_ant.xml.gz b/spec/fixtures/junit/junit_ant.xml.gz
new file mode 100644
index 00000000000..e9cca1b0c73
--- /dev/null
+++ b/spec/fixtures/junit/junit_ant.xml.gz
Binary files differ
diff --git a/spec/fixtures/junit/junit_with_corrupted_data.xml.gz b/spec/fixtures/junit/junit_with_corrupted_data.xml.gz
new file mode 100644
index 00000000000..e6d17e4595d
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_corrupted_data.xml.gz
Binary files differ
diff --git a/spec/fixtures/junit/junit_with_three_testsuites.xml.gz b/spec/fixtures/junit/junit_with_three_testsuites.xml.gz
new file mode 100644
index 00000000000..aa4ad154de8
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_three_testsuites.xml.gz
Binary files differ
diff --git a/spec/fixtures/junit/junit_with_three_testsuites_1.xml b/spec/fixtures/junit/junit_with_three_testsuites_1.xml
new file mode 100644
index 00000000000..5f31824042e
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_three_testsuites_1.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="rspec" tests="2" skipped="0" failures="0" errors="0" time="0.001670" timestamp="2018-07-30T10:02:37+00:00" hostname="runner-7661726c-project-14-concurrent-0">
+<properties>
+<property name="seed" value="52549"/>
+</properties>
+<testcase classname="spec.hash_scan_spec" name="HashScan#scan when argument is hash returns the value" file="./spec/hash_scan_spec.rb" time="0.000287"></testcase>
+<testcase classname="spec.hash_scan_spec" name="HashScan#scan when argument is not hash raises and error" file="./spec/hash_scan_spec.rb" time="0.000686"></testcase>
+</testsuite>
diff --git a/spec/fixtures/junit/junit_with_three_testsuites_2.xml b/spec/fixtures/junit/junit_with_three_testsuites_2.xml
new file mode 100644
index 00000000000..8ae771978e0
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_three_testsuites_2.xml
@@ -0,0 +1,6010 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="rspec" tests="1004" skipped="0" failures="1000" errors="0" time="0.202645" timestamp="2018-07-30T10:02:36+00:00" hostname="runner-7661726c-project-14-concurrent-0">
+<properties>
+<property name="seed" value="28152"/>
+</properties>
+<testcase classname="spec.test_spec" name="Test#sum when a is 1 and b is 2 returns summary" file="./spec/test_spec.rb" time="0.000368"></testcase>
+<testcase classname="spec.test_spec" name="Test#sum when a is 100 and b is 200 returns summary" file="./spec/test_spec.rb" time="0.000069"></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract when a is 1 and b is 2 raises an error" file="./spec/test_spec.rb" time="0.000734"></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract when a is 2 and b is 1 returns correct result" file="./spec/test_spec.rb" time="0.000066"></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract1 fails" file="./spec/test_spec.rb" time="0.009856"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:52:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract2 fails" file="./spec/test_spec.rb" time="0.000185"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:59:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract3 fails" file="./spec/test_spec.rb" time="0.000102"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:66:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract4 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:73:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract5 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:80:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract6 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:87:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract7 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:94:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract8 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:101:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract9 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:108:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract10 fails" file="./spec/test_spec.rb" time="0.013083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:115:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract11 fails" file="./spec/test_spec.rb" time="0.000117"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:122:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract12 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:129:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract13 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:136:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract14 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:143:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract15 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:150:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract16 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:157:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract17 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:164:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract18 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:171:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract19 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:178:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract20 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:185:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract21 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:192:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract22 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:199:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract23 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:206:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract24 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:213:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract25 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:220:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract26 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:227:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract27 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:234:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract28 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:241:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract29 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:248:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract30 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:255:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract31 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:262:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract32 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:269:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract33 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:276:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract34 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:283:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract35 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:290:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract36 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:297:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract37 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:304:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract38 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:311:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract39 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:318:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract40 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:325:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract41 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:332:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract42 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:339:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract43 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:346:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract44 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:353:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract45 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:360:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract46 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:367:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract47 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:374:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract48 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:381:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract49 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:388:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract50 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:395:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract51 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:402:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract52 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:409:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract53 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:416:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract54 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:423:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract55 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:430:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract56 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:437:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract57 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:444:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract58 fails" file="./spec/test_spec.rb" time="0.000110"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:451:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract59 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:458:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract60 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:465:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract61 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:472:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract62 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:479:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract63 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:486:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract64 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:493:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract65 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:500:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract66 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:507:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract67 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:514:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract68 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:521:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract69 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:528:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract70 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:535:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract71 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:542:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract72 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:549:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract73 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:556:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract74 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:563:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract75 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:570:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract76 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:577:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract77 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:584:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract78 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:591:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract79 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:598:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract80 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:605:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract81 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:612:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract82 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:619:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract83 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:626:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract84 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:633:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract85 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:640:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract86 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:647:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract87 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:654:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract88 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:661:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract89 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:668:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract90 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:675:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract91 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:682:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract92 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:689:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract93 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:696:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract94 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:703:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract95 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:710:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract96 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:717:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract97 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:724:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract98 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:731:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract99 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:738:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract100 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:745:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract101 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:752:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract102 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:759:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract103 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:766:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract104 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:773:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract105 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:780:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract106 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:787:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract107 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:794:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract108 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:801:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract109 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:808:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract110 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:815:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract111 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:822:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract112 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:829:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract113 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:836:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract114 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:843:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract115 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:850:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract116 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:857:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract117 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:864:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract118 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:871:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract119 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:878:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract120 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:885:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract121 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:892:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract122 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:899:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract123 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:906:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract124 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:913:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract125 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:920:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract126 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:927:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract127 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:934:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract128 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:941:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract129 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:948:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract130 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:955:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract131 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:962:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract132 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:969:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract133 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:976:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract134 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:983:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract135 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:990:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract136 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:997:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract137 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1004:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract138 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1011:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract139 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1018:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract140 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1025:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract141 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1032:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract142 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1039:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract143 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1046:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract144 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1053:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract145 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1060:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract146 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1067:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract147 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1074:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract148 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1081:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract149 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1088:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract150 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1095:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract151 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1102:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract152 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1109:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract153 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1116:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract154 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1123:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract155 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1130:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract156 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1137:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract157 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1144:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract158 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1151:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract159 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1158:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract160 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1165:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract161 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1172:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract162 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1179:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract163 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1186:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract164 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1193:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract165 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1200:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract166 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1207:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract167 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1214:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract168 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1221:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract169 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1228:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract170 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1235:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract171 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1242:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract172 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1249:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract173 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1256:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract174 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1263:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract175 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1270:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract176 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1277:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract177 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1284:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract178 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1291:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract179 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1298:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract180 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1305:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract181 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1312:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract182 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1319:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract183 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1326:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract184 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1333:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract185 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1340:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract186 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1347:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract187 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1354:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract188 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1361:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract189 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1368:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract190 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1375:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract191 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1382:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract192 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1389:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract193 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1396:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract194 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1403:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract195 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1410:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract196 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1417:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract197 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1424:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract198 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1431:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract199 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1438:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract200 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1445:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract201 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1452:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract202 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1459:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract203 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1466:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract204 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1473:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract205 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1480:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract206 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1487:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract207 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1494:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract208 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1501:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract209 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1508:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract210 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1515:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract211 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1522:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract212 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1529:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract213 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1536:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract214 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1543:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract215 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1550:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract216 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1557:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract217 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1564:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract218 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1571:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract219 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1578:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract220 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1585:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract221 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1592:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract222 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1599:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract223 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1606:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract224 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1613:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract225 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1620:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract226 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1627:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract227 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1634:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract228 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1641:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract229 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1648:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract230 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1655:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract231 fails" file="./spec/test_spec.rb" time="0.000102"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1662:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract232 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1669:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract233 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1676:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract234 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1683:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract235 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1690:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract236 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1697:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract237 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1704:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract238 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1711:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract239 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1718:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract240 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1725:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract241 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1732:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract242 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1739:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract243 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1746:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract244 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1753:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract245 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1760:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract246 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1767:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract247 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1774:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract248 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1781:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract249 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1788:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract250 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1795:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract251 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1802:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract252 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1809:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract253 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1816:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract254 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1823:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract255 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1830:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract256 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1837:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract257 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1844:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract258 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1851:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract259 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1858:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract260 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1865:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract261 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1872:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract262 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1879:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract263 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1886:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract264 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1893:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract265 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1900:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract266 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1907:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract267 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1914:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract268 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1921:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract269 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1928:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract270 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1935:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract271 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1942:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract272 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1949:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract273 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1956:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract274 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1963:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract275 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1970:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract276 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1977:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract277 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1984:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract278 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1991:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract279 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:1998:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract280 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2005:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract281 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2012:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract282 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2019:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract283 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2026:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract284 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2033:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract285 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2040:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract286 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2047:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract287 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2054:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract288 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2061:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract289 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2068:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract290 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2075:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract291 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2082:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract292 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2089:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract293 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2096:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract294 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2103:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract295 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2110:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract296 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2117:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract297 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2124:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract298 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2131:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract299 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2138:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract300 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2145:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract301 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2152:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract302 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2159:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract303 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2166:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract304 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2173:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract305 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2180:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract306 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2187:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract307 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2194:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract308 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2201:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract309 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2208:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract310 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2215:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract311 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2222:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract312 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2229:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract313 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2236:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract314 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2243:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract315 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2250:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract316 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2257:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract317 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2264:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract318 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2271:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract319 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2278:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract320 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2285:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract321 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2292:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract322 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2299:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract323 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2306:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract324 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2313:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract325 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2320:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract326 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2327:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract327 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2334:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract328 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2341:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract329 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2348:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract330 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2355:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract331 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2362:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract332 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2369:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract333 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2376:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract334 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2383:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract335 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2390:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract336 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2397:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract337 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2404:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract338 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2411:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract339 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2418:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract340 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2425:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract341 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2432:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract342 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2439:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract343 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2446:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract344 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2453:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract345 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2460:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract346 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2467:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract347 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2474:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract348 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2481:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract349 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2488:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract350 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2495:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract351 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2502:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract352 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2509:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract353 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2516:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract354 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2523:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract355 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2530:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract356 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2537:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract357 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2544:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract358 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2551:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract359 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2558:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract360 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2565:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract361 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2572:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract362 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2579:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract363 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2586:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract364 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2593:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract365 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2600:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract366 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2607:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract367 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2614:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract368 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2621:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract369 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2628:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract370 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2635:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract371 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2642:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract372 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2649:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract373 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2656:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract374 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2663:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract375 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2670:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract376 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2677:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract377 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2684:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract378 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2691:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract379 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2698:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract380 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2705:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract381 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2712:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract382 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2719:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract383 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2726:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract384 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2733:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract385 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2740:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract386 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2747:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract387 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2754:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract388 fails" file="./spec/test_spec.rb" time="0.006281"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2761:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract389 fails" file="./spec/test_spec.rb" time="0.000197"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2768:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract390 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2775:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract391 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2782:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract392 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2789:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract393 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2796:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract394 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2803:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract395 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2810:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract396 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2817:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract397 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2824:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract398 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2831:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract399 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2838:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract400 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2845:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract401 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2852:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract402 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2859:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract403 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2866:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract404 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2873:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract405 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2880:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract406 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2887:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract407 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2894:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract408 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2901:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract409 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2908:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract410 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2915:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract411 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2922:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract412 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2929:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract413 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2936:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract414 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2943:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract415 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2950:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract416 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2957:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract417 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2964:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract418 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2971:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract419 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2978:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract420 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2985:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract421 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2992:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract422 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:2999:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract423 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3006:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract424 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3013:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract425 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3020:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract426 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3027:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract427 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3034:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract428 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3041:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract429 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3048:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract430 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3055:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract431 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3062:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract432 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3069:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract433 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3076:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract434 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3083:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract435 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3090:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract436 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3097:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract437 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3104:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract438 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3111:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract439 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3118:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract440 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3125:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract441 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3132:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract442 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3139:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract443 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3146:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract444 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3153:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract445 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3160:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract446 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3167:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract447 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3174:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract448 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3181:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract449 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3188:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract450 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3195:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract451 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3202:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract452 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3209:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract453 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3216:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract454 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3223:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract455 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3230:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract456 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3237:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract457 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3244:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract458 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3251:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract459 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3258:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract460 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3265:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract461 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3272:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract462 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3279:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract463 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3286:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract464 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3293:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract465 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3300:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract466 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3307:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract467 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3314:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract468 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3321:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract469 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3328:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract470 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3335:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract471 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3342:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract472 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3349:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract473 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3356:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract474 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3363:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract475 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3370:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract476 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3377:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract477 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3384:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract478 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3391:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract479 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3398:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract480 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3405:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract481 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3412:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract482 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3419:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract483 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3426:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract484 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3433:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract485 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3440:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract486 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3447:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract487 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3454:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract488 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3461:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract489 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3468:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract490 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3475:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract491 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3482:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract492 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3489:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract493 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3496:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract494 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3503:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract495 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3510:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract496 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3517:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract497 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3524:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract498 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3531:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract499 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3538:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract500 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3545:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract501 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3552:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract502 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3559:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract503 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3566:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract504 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3573:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract505 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3580:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract506 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3587:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract507 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3594:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract508 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3601:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract509 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3608:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract510 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3615:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract511 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3622:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract512 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3629:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract513 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3636:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract514 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3643:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract515 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3650:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract516 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3657:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract517 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3664:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract518 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3671:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract519 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3678:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract520 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3685:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract521 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3692:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract522 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3699:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract523 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3706:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract524 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3713:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract525 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3720:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract526 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3727:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract527 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3734:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract528 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3741:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract529 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3748:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract530 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3755:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract531 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3762:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract532 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3769:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract533 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3776:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract534 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3783:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract535 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3790:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract536 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3797:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract537 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3804:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract538 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3811:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract539 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3818:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract540 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3825:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract541 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3832:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract542 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3839:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract543 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3846:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract544 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3853:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract545 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3860:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract546 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3867:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract547 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3874:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract548 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3881:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract549 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3888:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract550 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3895:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract551 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3902:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract552 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3909:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract553 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3916:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract554 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3923:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract555 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3930:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract556 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3937:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract557 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3944:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract558 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3951:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract559 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3958:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract560 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3965:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract561 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3972:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract562 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3979:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract563 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3986:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract564 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:3993:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract565 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4000:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract566 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4007:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract567 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4014:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract568 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4021:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract569 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4028:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract570 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4035:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract571 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4042:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract572 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4049:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract573 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4056:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract574 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4063:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract575 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4070:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract576 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4077:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract577 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4084:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract578 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4091:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract579 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4098:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract580 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4105:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract581 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4112:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract582 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4119:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract583 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4126:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract584 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4133:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract585 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4140:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract586 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4147:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract587 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4154:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract588 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4161:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract589 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4168:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract590 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4175:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract591 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4182:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract592 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4189:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract593 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4196:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract594 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4203:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract595 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4210:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract596 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4217:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract597 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4224:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract598 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4231:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract599 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4238:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract600 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4245:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract601 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4252:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract602 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4259:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract603 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4266:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract604 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4273:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract605 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4280:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract606 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4287:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract607 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4294:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract608 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4301:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract609 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4308:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract610 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4315:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract611 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4322:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract612 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4329:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract613 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4336:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract614 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4343:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract615 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4350:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract616 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4357:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract617 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4364:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract618 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4371:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract619 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4378:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract620 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4385:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract621 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4392:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract622 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4399:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract623 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4406:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract624 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4413:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract625 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4420:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract626 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4427:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract627 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4434:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract628 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4441:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract629 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4448:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract630 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4455:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract631 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4462:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract632 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4469:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract633 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4476:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract634 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4483:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract635 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4490:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract636 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4497:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract637 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4504:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract638 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4511:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract639 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4518:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract640 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4525:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract641 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4532:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract642 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4539:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract643 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4546:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract644 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4553:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract645 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4560:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract646 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4567:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract647 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4574:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract648 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4581:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract649 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4588:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract650 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4595:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract651 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4602:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract652 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4609:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract653 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4616:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract654 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4623:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract655 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4630:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract656 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4637:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract657 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4644:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract658 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4651:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract659 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4658:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract660 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4665:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract661 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4672:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract662 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4679:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract663 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4686:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract664 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4693:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract665 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4700:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract666 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4707:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract667 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4714:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract668 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4721:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract669 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4728:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract670 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4735:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract671 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4742:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract672 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4749:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract673 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4756:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract674 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4763:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract675 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4770:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract676 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4777:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract677 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4784:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract678 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4791:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract679 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4798:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract680 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4805:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract681 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4812:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract682 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4819:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract683 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4826:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract684 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4833:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract685 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4840:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract686 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4847:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract687 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4854:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract688 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4861:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract689 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4868:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract690 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4875:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract691 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4882:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract692 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4889:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract693 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4896:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract694 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4903:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract695 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4910:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract696 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4917:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract697 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4924:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract698 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4931:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract699 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4938:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract700 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4945:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract701 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4952:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract702 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4959:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract703 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4966:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract704 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4973:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract705 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4980:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract706 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4987:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract707 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:4994:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract708 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5001:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract709 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5008:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract710 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5015:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract711 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5022:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract712 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5029:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract713 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5036:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract714 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5043:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract715 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5050:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract716 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5057:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract717 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5064:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract718 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5071:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract719 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5078:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract720 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5085:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract721 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5092:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract722 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5099:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract723 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5106:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract724 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5113:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract725 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5120:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract726 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5127:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract727 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5134:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract728 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5141:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract729 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5148:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract730 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5155:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract731 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5162:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract732 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5169:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract733 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5176:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract734 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5183:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract735 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5190:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract736 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5197:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract737 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5204:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract738 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5211:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract739 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5218:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract740 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5225:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract741 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5232:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract742 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5239:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract743 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5246:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract744 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5253:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract745 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5260:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract746 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5267:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract747 fails" file="./spec/test_spec.rb" time="0.000083"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5274:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract748 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5281:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract749 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5288:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract750 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5295:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract751 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5302:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract752 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5309:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract753 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5316:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract754 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5323:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract755 fails" file="./spec/test_spec.rb" time="0.005906"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5330:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract756 fails" file="./spec/test_spec.rb" time="0.000117"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5337:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract757 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5344:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract758 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5351:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract759 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5358:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract760 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5365:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract761 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5372:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract762 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5379:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract763 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5386:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract764 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5393:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract765 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5400:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract766 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5407:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract767 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5414:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract768 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5421:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract769 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5428:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract770 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5435:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract771 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5442:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract772 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5449:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract773 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5456:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract774 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5463:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract775 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5470:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract776 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5477:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract777 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5484:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract778 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5491:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract779 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5498:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract780 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5505:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract781 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5512:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract782 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5519:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract783 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5526:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract784 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5533:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract785 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5540:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract786 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5547:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract787 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5554:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract788 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5561:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract789 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5568:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract790 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5575:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract791 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5582:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract792 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5589:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract793 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5596:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract794 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5603:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract795 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5610:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract796 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5617:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract797 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5624:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract798 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5631:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract799 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5638:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract800 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5645:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract801 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5652:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract802 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5659:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract803 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5666:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract804 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5673:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract805 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5680:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract806 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5687:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract807 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5694:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract808 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5701:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract809 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5708:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract810 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5715:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract811 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5722:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract812 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5729:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract813 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5736:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract814 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5743:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract815 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5750:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract816 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5757:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract817 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5764:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract818 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5771:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract819 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5778:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract820 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5785:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract821 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5792:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract822 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5799:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract823 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5806:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract824 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5813:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract825 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5820:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract826 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5827:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract827 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5834:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract828 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5841:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract829 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5848:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract830 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5855:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract831 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5862:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract832 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5869:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract833 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5876:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract834 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5883:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract835 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5890:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract836 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5897:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract837 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5904:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract838 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5911:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract839 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5918:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract840 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5925:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract841 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5932:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract842 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5939:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract843 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5946:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract844 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5953:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract845 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5960:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract846 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5967:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract847 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5974:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract848 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5981:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract849 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5988:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract850 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:5995:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract851 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6002:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract852 fails" file="./spec/test_spec.rb" time="0.000101"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6009:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract853 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6016:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract854 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6023:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract855 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6030:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract856 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6037:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract857 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6044:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract858 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6051:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract859 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6058:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract860 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6065:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract861 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6072:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract862 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6079:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract863 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6086:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract864 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6093:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract865 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6100:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract866 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6107:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract867 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6114:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract868 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6121:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract869 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6128:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract870 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6135:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract871 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6142:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract872 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6149:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract873 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6156:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract874 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6163:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract875 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6170:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract876 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6177:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract877 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6184:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract878 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6191:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract879 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6198:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract880 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6205:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract881 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6212:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract882 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6219:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract883 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6226:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract884 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6233:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract885 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6240:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract886 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6247:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract887 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6254:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract888 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6261:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract889 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6268:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract890 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6275:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract891 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6282:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract892 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6289:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract893 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6296:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract894 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6303:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract895 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6310:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract896 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6317:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract897 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6324:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract898 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6331:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract899 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6338:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract900 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6345:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract901 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6352:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract902 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6359:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract903 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6366:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract904 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6373:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract905 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6380:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract906 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6387:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract907 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6394:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract908 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6401:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract909 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6408:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract910 fails" file="./spec/test_spec.rb" time="0.000096"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6415:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract911 fails" file="./spec/test_spec.rb" time="0.000099"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6422:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract912 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6429:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract913 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6436:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract914 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6443:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract915 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6450:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract916 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6457:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract917 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6464:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract918 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6471:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract919 fails" file="./spec/test_spec.rb" time="0.000084"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6478:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract920 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6485:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract921 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6492:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract922 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6499:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract923 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6506:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract924 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6513:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract925 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6520:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract926 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6527:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract927 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6534:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract928 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6541:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract929 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6548:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract930 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6555:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract931 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6562:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract932 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6569:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract933 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6576:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract934 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6583:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract935 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6590:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract936 fails" file="./spec/test_spec.rb" time="0.000093"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6597:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract937 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6604:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract938 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6611:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract939 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6618:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract940 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6625:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract941 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6632:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract942 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6639:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract943 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6646:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract944 fails" file="./spec/test_spec.rb" time="0.000095"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6653:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract945 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6660:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract946 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6667:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract947 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6674:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract948 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6681:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract949 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6688:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract950 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6695:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract951 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6702:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract952 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6709:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract953 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6716:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract954 fails" file="./spec/test_spec.rb" time="0.000092"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6723:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract955 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6730:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract956 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6737:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract957 fails" file="./spec/test_spec.rb" time="0.000082"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6744:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract958 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6751:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract959 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6758:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract960 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6765:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract961 fails" file="./spec/test_spec.rb" time="0.000094"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6772:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract962 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6779:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract963 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6786:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract964 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6793:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract965 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6800:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract966 fails" file="./spec/test_spec.rb" time="0.000088"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6807:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract967 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6814:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract968 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6821:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract969 fails" file="./spec/test_spec.rb" time="0.000085"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6828:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract970 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6835:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract971 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6842:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract972 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6849:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract973 fails" file="./spec/test_spec.rb" time="0.000086"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6856:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract974 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6863:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract975 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6870:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract976 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6877:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract977 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6884:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract978 fails" file="./spec/test_spec.rb" time="0.000089"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6891:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract979 fails" file="./spec/test_spec.rb" time="0.000091"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6898:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract980 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6905:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract981 fails" file="./spec/test_spec.rb" time="0.000090"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6912:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract982 fails" file="./spec/test_spec.rb" time="0.000087"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6919:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract983 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6926:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract984 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6933:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract985 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6940:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract986 fails" file="./spec/test_spec.rb" time="0.000100"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6947:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract987 fails" file="./spec/test_spec.rb" time="0.000098"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6954:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract988 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6961:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract989 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6968:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract990 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6975:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract991 fails" file="./spec/test_spec.rb" time="0.000113"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6982:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract992 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6989:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract993 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:6996:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract994 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7003:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract995 fails" file="./spec/test_spec.rb" time="0.000104"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7010:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract996 fails" file="./spec/test_spec.rb" time="0.000079"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7017:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract997 fails" file="./spec/test_spec.rb" time="0.000081"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7024:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract998 fails" file="./spec/test_spec.rb" time="0.000080"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7031:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract999 fails" file="./spec/test_spec.rb" time="0.000097"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7038:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+<testcase classname="spec.test_spec" name="Test#subtract1000 fails" file="./spec/test_spec.rb" time="0.000078"><failure message="expected: falsey value
+ got: true" type="RSpec::Expectations::ExpectationNotMetError">Failure/Error: expect(true).to be_falsy
+
+ expected: falsey value
+ got: true
+./spec/test_spec.rb:7045:in `block (3 levels) in &lt;top (required)&gt;&apos;</failure></testcase>
+</testsuite>
diff --git a/spec/fixtures/junit/junit_with_three_testsuites_3.xml b/spec/fixtures/junit/junit_with_three_testsuites_3.xml
new file mode 100644
index 00000000000..9b3c287aec8
--- /dev/null
+++ b/spec/fixtures/junit/junit_with_three_testsuites_3.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<testsuite name="rspec" tests="2" skipped="0" failures="0" errors="0" time="0.001691" timestamp="2018-07-30T10:02:37+00:00" hostname="runner-7661726c-project-14-concurrent-0">
+<properties>
+<property name="seed" value="8528"/>
+</properties>
+<testcase classname="spec.string_helper_spec" name="StringHelper#concatenate when a is git and b is lab returns summary" file="./spec/string_helper_spec.rb" time="0.000287"></testcase>
+<testcase classname="spec.string_helper_spec" name="StringHelper#concatenate when a is git and b is 200 raises an error" file="./spec/string_helper_spec.rb" time="0.000706"></testcase>
+</testsuite>
diff --git a/spec/graphql/gitlab_schema_spec.rb b/spec/graphql/gitlab_schema_spec.rb
index 515bbe78cb7..b9ddb427e85 100644
--- a/spec/graphql/gitlab_schema_spec.rb
+++ b/spec/graphql/gitlab_schema_spec.rb
@@ -18,8 +18,6 @@ describe GitlabSchema do
end
it 'has the base mutation' do
- pending('Adding an empty mutation breaks the documentation explorer')
-
expect(described_class.mutation).to eq(::Types::MutationType.to_graphql)
end
diff --git a/spec/graphql/mutations/concerns/mutations/resolves_project_spec.rb b/spec/graphql/mutations/concerns/mutations/resolves_project_spec.rb
new file mode 100644
index 00000000000..19f5a8907a2
--- /dev/null
+++ b/spec/graphql/mutations/concerns/mutations/resolves_project_spec.rb
@@ -0,0 +1,19 @@
+require 'spec_helper'
+
+describe Mutations::ResolvesProject do
+ let(:mutation_class) do
+ Class.new(Mutations::BaseMutation) do
+ include Mutations::ResolvesProject
+ end
+ end
+
+ let(:context) { double }
+ subject(:mutation) { mutation_class.new(object: nil, context: context) }
+
+ it 'uses the ProjectsResolver to resolve projects by path' do
+ project = create(:project)
+
+ expect(Resolvers::ProjectResolver).to receive(:new).with(object: nil, context: context).and_call_original
+ expect(mutation.resolve_project(full_path: project.full_path)).to eq(project)
+ end
+end
diff --git a/spec/graphql/mutations/merge_requests/set_wip_spec.rb b/spec/graphql/mutations/merge_requests/set_wip_spec.rb
new file mode 100644
index 00000000000..e600abf3941
--- /dev/null
+++ b/spec/graphql/mutations/merge_requests/set_wip_spec.rb
@@ -0,0 +1,51 @@
+require 'spec_helper'
+
+describe Mutations::MergeRequests::SetWip do
+ let(:merge_request) { create(:merge_request) }
+ let(:user) { create(:user) }
+ subject(:mutation) { described_class.new(object: nil, context: { current_user: user }) }
+
+ describe '#resolve' do
+ let(:wip) { true }
+ let(:mutated_merge_request) { subject[:merge_request] }
+ subject { mutation.resolve(project_path: merge_request.project.full_path, iid: merge_request.iid, wip: wip) }
+
+ it 'raises an error if the resource is not accessible to the user' do
+ expect { subject }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+
+ context 'when the user can update the merge request' do
+ before do
+ merge_request.project.add_developer(user)
+ end
+
+ it 'returns the merge request as a wip' do
+ expect(mutated_merge_request).to eq(merge_request)
+ expect(mutated_merge_request).to be_work_in_progress
+ expect(subject[:errors]).to be_empty
+ end
+
+ it 'returns errors merge request could not be updated' do
+ # Make the merge request invalid
+ merge_request.allow_broken = true
+ merge_request.update!(source_project: nil)
+
+ expect(subject[:errors]).not_to be_empty
+ end
+
+ context 'when passing wip as false' do
+ let(:wip) { false }
+
+ it 'removes `wip` from the title' do
+ merge_request.update(title: "WIP: working on it")
+
+ expect(mutated_merge_request).not_to be_work_in_progress
+ end
+
+ it 'does not do anything if the title did not start with wip' do
+ expect(mutated_merge_request).not_to be_work_in_progress
+ end
+ end
+ end
+ end
+end
diff --git a/spec/graphql/types/mutation_type_spec.rb b/spec/graphql/types/mutation_type_spec.rb
new file mode 100644
index 00000000000..a67d83b1edf
--- /dev/null
+++ b/spec/graphql/types/mutation_type_spec.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Types::MutationType do
+ it 'is expected to have the MergeRequestSetWip' do
+ expect(described_class).to have_graphql_mutation(Mutations::MergeRequests::SetWip)
+ end
+end
diff --git a/spec/helpers/snippets_helper_spec.rb b/spec/helpers/snippets_helper_spec.rb
index 0323ffb641c..ce5e037f88d 100644
--- a/spec/helpers/snippets_helper_spec.rb
+++ b/spec/helpers/snippets_helper_spec.rb
@@ -7,13 +7,13 @@ describe SnippetsHelper do
it 'gives view raw button of embedded snippets for project snippets' do
@snippet = create(:project_snippet, :public)
- expect(embedded_snippet_raw_button.to_s).to eq("<a class=\"btn\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Open raw\" href=\"#{raw_project_snippet_url(@snippet.project, @snippet)}\">#{external_snippet_icon('doc_code')}</a>")
+ expect(embedded_snippet_raw_button.to_s).to eq("<a class=\"btn\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Open raw\" href=\"#{raw_project_snippet_url(@snippet.project, @snippet)}\">#{external_snippet_icon('doc-code')}</a>")
end
it 'gives view raw button of embedded snippets for personal snippets' do
@snippet = create(:personal_snippet, :public)
- expect(embedded_snippet_raw_button.to_s).to eq("<a class=\"btn\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Open raw\" href=\"#{raw_snippet_url(@snippet)}\">#{external_snippet_icon('doc_code')}</a>")
+ expect(embedded_snippet_raw_button.to_s).to eq("<a class=\"btn\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Open raw\" href=\"#{raw_snippet_url(@snippet)}\">#{external_snippet_icon('doc-code')}</a>")
end
end
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index b18c045848f..b079802cb81 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -25,8 +25,20 @@ describe UsersHelper do
allow(helper).to receive(:can?).and_return(true)
end
- it 'includes all the expected tabs' do
- expect(tabs).to include(:activity, :groups, :contributed, :projects, :snippets)
+ context 'with public profile' do
+ it 'includes all the expected tabs' do
+ expect(tabs).to include(:activity, :groups, :contributed, :projects, :snippets)
+ end
+ end
+
+ context 'with private profile' do
+ before do
+ allow(helper).to receive(:can?).with(user, :read_user_profile, nil).and_return(false)
+ end
+
+ it 'is empty' do
+ expect(tabs).to be_empty
+ end
end
end
diff --git a/spec/javascripts/.eslintrc.yml b/spec/javascripts/.eslintrc.yml
index 78e2f3b521f..5525c9f5bd0 100644
--- a/spec/javascripts/.eslintrc.yml
+++ b/spec/javascripts/.eslintrc.yml
@@ -30,7 +30,6 @@ rules:
jasmine/no-spec-dupes:
- warn
- branch
- no-console: off
prefer-arrow-callback: off
import/no-unresolved:
- error
diff --git a/spec/javascripts/autosave_spec.js b/spec/javascripts/autosave_spec.js
index dcb1c781591..38ae5b7e00c 100644
--- a/spec/javascripts/autosave_spec.js
+++ b/spec/javascripts/autosave_spec.js
@@ -59,10 +59,12 @@ describe('Autosave', () => {
Autosave.prototype.restore.call(autosave);
- expect(field.trigger).toHaveBeenCalled();
+ expect(
+ field.trigger,
+ ).toHaveBeenCalled();
});
- it('triggers native event', done => {
+ it('triggers native event', (done) => {
autosave.field.get(0).addEventListener('change', () => {
done();
});
@@ -79,7 +81,9 @@ describe('Autosave', () => {
it('does not trigger event', () => {
spyOn(field, 'trigger').and.callThrough();
- expect(field.trigger).not.toHaveBeenCalled();
+ expect(
+ field.trigger,
+ ).not.toHaveBeenCalled();
});
});
});
diff --git a/spec/javascripts/avatar_helper_spec.js b/spec/javascripts/avatar_helper_spec.js
new file mode 100644
index 00000000000..b2f80678ae7
--- /dev/null
+++ b/spec/javascripts/avatar_helper_spec.js
@@ -0,0 +1,98 @@
+import { TEST_HOST } from 'spec/test_constants';
+import { getFirstCharacterCapitalized } from '~/lib/utils/text_utility';
+import {
+ DEFAULT_SIZE_CLASS,
+ IDENTICON_BG_COUNT,
+ renderAvatar,
+ renderIdenticon,
+ getIdenticonBackgroundClass,
+ getIdenticonTitle,
+} from '~/helpers/avatar_helper';
+
+function matchAll(str) {
+ return new RegExp(`^${str}$`);
+}
+
+describe('avatar_helper', () => {
+ describe('getIdenticonBackgroundClass', () => {
+ it('returns identicon bg class from id', () => {
+ expect(getIdenticonBackgroundClass(1)).toEqual('bg2');
+ });
+
+ it(`wraps around if id is bigger than ${IDENTICON_BG_COUNT}`, () => {
+ expect(getIdenticonBackgroundClass(IDENTICON_BG_COUNT + 4)).toEqual('bg5');
+ expect(getIdenticonBackgroundClass((IDENTICON_BG_COUNT * 5) + 6)).toEqual('bg7');
+ });
+ });
+
+ describe('getIdenticonTitle', () => {
+ it('returns identicon title from name', () => {
+ expect(getIdenticonTitle('Lorem')).toEqual('L');
+ expect(getIdenticonTitle('dolar-sit-amit')).toEqual('D');
+ expect(getIdenticonTitle('%-with-special-chars')).toEqual('%');
+ });
+
+ it('returns space if name is falsey', () => {
+ expect(getIdenticonTitle('')).toEqual(' ');
+ expect(getIdenticonTitle(null)).toEqual(' ');
+ });
+ });
+
+ describe('renderIdenticon', () => {
+ it('renders with the first letter as title and bg based on id', () => {
+ const entity = {
+ id: IDENTICON_BG_COUNT + 3,
+ name: 'Xavior',
+ };
+ const options = {
+ sizeClass: 's32',
+ };
+
+ const result = renderIdenticon(entity, options);
+
+ expect(result).toHaveClass(`identicon ${options.sizeClass} bg4`);
+ expect(result).toHaveText(matchAll(getFirstCharacterCapitalized(entity.name)));
+ });
+
+ it('renders with defaults, if no options are given', () => {
+ const entity = {
+ id: 1,
+ name: 'tanuki',
+ };
+
+ const result = renderIdenticon(entity);
+
+ expect(result).toHaveClass(`identicon ${DEFAULT_SIZE_CLASS} bg2`);
+ expect(result).toHaveText(matchAll(getFirstCharacterCapitalized(entity.name)));
+ });
+ });
+
+ describe('renderAvatar', () => {
+ it('renders an image with the avatarUrl', () => {
+ const avatarUrl = `${TEST_HOST}/not-real-assets/test.png`;
+
+ const result = renderAvatar({
+ avatar_url: avatarUrl,
+ });
+
+ expect(result).toBeMatchedBy('img');
+ expect(result).toHaveAttr('src', avatarUrl);
+ expect(result).toHaveClass(DEFAULT_SIZE_CLASS);
+ });
+
+ it('renders an identicon if no avatarUrl', () => {
+ const entity = {
+ id: 1,
+ name: 'walrus',
+ };
+ const options = {
+ sizeClass: 's16',
+ };
+
+ const result = renderAvatar(entity, options);
+
+ expect(result).toHaveClass(`identicon ${options.sizeClass} bg2`);
+ expect(result).toHaveText(matchAll(getFirstCharacterCapitalized(entity.name)));
+ });
+ });
+});
diff --git a/spec/javascripts/boards/boards_store_spec.js b/spec/javascripts/boards/boards_store_spec.js
index f7af099b3bf..1ee6f4cf680 100644
--- a/spec/javascripts/boards/boards_store_spec.js
+++ b/spec/javascripts/boards/boards_store_spec.js
@@ -161,6 +161,28 @@ describe('Store', () => {
}, 0);
});
+ it('moves an issue from backlog to a list', (done) => {
+ const backlog = gl.issueBoards.BoardsStore.addList({
+ ...listObj,
+ list_type: 'backlog',
+ });
+ const listTwo = gl.issueBoards.BoardsStore.addList(listObjDuplicate);
+
+ expect(gl.issueBoards.BoardsStore.state.lists.length).toBe(2);
+
+ setTimeout(() => {
+ expect(backlog.issues.length).toBe(1);
+ expect(listTwo.issues.length).toBe(1);
+
+ gl.issueBoards.BoardsStore.moveIssueToList(backlog, listTwo, backlog.findIssue(1));
+
+ expect(backlog.issues.length).toBe(0);
+ expect(listTwo.issues.length).toBe(1);
+
+ done();
+ }, 0);
+ });
+
it('moves issue to top of another list', (done) => {
const listOne = gl.issueBoards.BoardsStore.addList(listObj);
const listTwo = gl.issueBoards.BoardsStore.addList(listObjDuplicate);
diff --git a/spec/javascripts/datetime_utility_spec.js b/spec/javascripts/datetime_utility_spec.js
index e224ed46d18..492171684dc 100644
--- a/spec/javascripts/datetime_utility_spec.js
+++ b/spec/javascripts/datetime_utility_spec.js
@@ -162,7 +162,6 @@ describe('getTimeframeWindowFrom', () => {
const timeframe = datetimeUtility.getTimeframeWindowFrom(startDate, 5);
expect(timeframe.length).toBe(5);
timeframe.forEach((timeframeItem, index) => {
- console.log(timeframeItem);
expect(timeframeItem.getFullYear() === mockTimeframe[index].getFullYear()).toBe(true);
expect(timeframeItem.getMonth() === mockTimeframe[index].getMonth()).toBe(true);
expect(timeframeItem.getDate() === mockTimeframe[index].getDate()).toBeTruthy();
diff --git a/spec/javascripts/diffs/components/diff_file_header_spec.js b/spec/javascripts/diffs/components/diff_file_header_spec.js
index 241ff07026e..92b2004c4d7 100644
--- a/spec/javascripts/diffs/components/diff_file_header_spec.js
+++ b/spec/javascripts/diffs/components/diff_file_header_spec.js
@@ -11,7 +11,9 @@ const discussionFixture = 'merge_requests/diff_discussion.json';
describe('diff_file_header', () => {
let vm;
let props;
+ const diffDiscussionMock = getJSONFixture(discussionFixture)[0];
const Component = Vue.extend(DiffFileHeader);
+
const store = new Vuex.Store({
modules: {
diffs: diffsModule,
@@ -20,7 +22,6 @@ describe('diff_file_header', () => {
});
beforeEach(() => {
- const diffDiscussionMock = getJSONFixture(discussionFixture)[0];
const diffFile = convertObjectPropsToCamelCase(diffDiscussionMock.diff_file, { deep: true });
props = {
diffFile,
@@ -303,7 +304,7 @@ describe('diff_file_header', () => {
const button = vm.$el.querySelector('.btn-clipboard');
expect(button).not.toBe(null);
- expect(button.dataset.clipboardText).toBe(props.diffFile.filePath);
+ expect(button.dataset.clipboardText).toBe('{"text":"files/ruby/popen.rb","gfm":"`files/ruby/popen.rb`"}');
});
describe('file mode', () => {
@@ -409,7 +410,7 @@ describe('diff_file_header', () => {
});
describe('handles toggle discussions', () => {
- it('dispatches toggleFileDiscussions when user clicks on toggle discussions button', () => {
+ it('renders a disabled button when diff has no discussions', () => {
const propsCopy = Object.assign({}, props);
propsCopy.diffFile.submodule = false;
propsCopy.diffFile.blob = {
@@ -428,11 +429,44 @@ describe('diff_file_header', () => {
store,
});
- spyOn(vm, 'toggleFileDiscussions');
-
- vm.$el.querySelector('.js-btn-vue-toggle-comments').click();
-
- expect(vm.toggleFileDiscussions).toHaveBeenCalled();
+ expect(
+ vm.$el.querySelector('.js-btn-vue-toggle-comments').getAttribute('disabled'),
+ ).toEqual('disabled');
+ });
+
+ describe('with discussions', () => {
+ it('dispatches toggleFileDiscussions when user clicks on toggle discussions button', () => {
+ const propsCopy = Object.assign({}, props);
+ propsCopy.diffFile.submodule = false;
+ propsCopy.diffFile.blob = {
+ id: '848ed9407c6730ff16edb3dd24485a0eea24292a',
+ path: 'lib/base.js',
+ name: 'base.js',
+ mode: '100644',
+ readableText: true,
+ icon: 'file-text-o',
+ };
+ propsCopy.addMergeRequestButtons = true;
+ propsCopy.diffFile.deletedFile = true;
+
+ const discussionGetter = () => [diffDiscussionMock];
+ notesModule.getters.discussions = discussionGetter;
+ vm = mountComponentWithStore(Component, {
+ props: propsCopy,
+ store: new Vuex.Store({
+ modules: {
+ diffs: diffsModule,
+ notes: notesModule,
+ },
+ }),
+ });
+
+ spyOn(vm, 'toggleFileDiscussions');
+
+ vm.$el.querySelector('.js-btn-vue-toggle-comments').click();
+
+ expect(vm.toggleFileDiscussions).toHaveBeenCalled();
+ });
});
});
});
diff --git a/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js b/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js
index bdc94131fc2..2d136a63c52 100644
--- a/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js
+++ b/spec/javascripts/diffs/components/diff_line_gutter_content_spec.js
@@ -18,12 +18,10 @@ describe('DiffLineGutterContent', () => {
};
const setDiscussions = component => {
component.$store.dispatch('setInitialNotes', getDiscussionsMockData());
- component.$store.commit('diffs/SET_DIFF_DATA', { diffFiles: [getDiffFileMock()] });
};
const resetDiscussions = component => {
component.$store.dispatch('setInitialNotes', []);
- component.$store.commit('diffs/SET_DIFF_DATA', {});
};
describe('computed', () => {
@@ -50,11 +48,7 @@ describe('DiffLineGutterContent', () => {
it('should return discussions for the given lineCode', () => {
const { lineCode } = getDiffFileMock().highlightedDiffLines[1];
- const component = createComponent({
- lineCode,
- showCommentButton: true,
- discussions: getDiscussionsMockData(),
- });
+ const component = createComponent({ lineCode, showCommentButton: true });
setDiscussions(component);
diff --git a/spec/javascripts/diffs/components/diff_line_note_form_spec.js b/spec/javascripts/diffs/components/diff_line_note_form_spec.js
index 6fe5fdaf7f9..4600aaea70b 100644
--- a/spec/javascripts/diffs/components/diff_line_note_form_spec.js
+++ b/spec/javascripts/diffs/components/diff_line_note_form_spec.js
@@ -3,7 +3,6 @@ import DiffLineNoteForm from '~/diffs/components/diff_line_note_form.vue';
import store from '~/mr_notes/stores';
import { createComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import diffFileMockData from '../mock_data/diff_file';
-import { noteableDataMock } from '../../notes/mock_data';
describe('DiffLineNoteForm', () => {
let component;
@@ -22,9 +21,10 @@ describe('DiffLineNoteForm', () => {
noteTargetLine: diffLines[0],
});
- Object.defineProperties(component, {
- noteableData: { value: noteableDataMock },
- isLoggedIn: { value: true },
+ Object.defineProperty(component, 'isLoggedIn', {
+ get() {
+ return true;
+ },
});
component.$mount();
@@ -32,37 +32,12 @@ describe('DiffLineNoteForm', () => {
describe('methods', () => {
describe('handleCancelCommentForm', () => {
- it('should ask for confirmation when shouldConfirm and isDirty passed as truthy', () => {
- spyOn(window, 'confirm').and.returnValue(false);
-
- component.handleCancelCommentForm(true, true);
- expect(window.confirm).toHaveBeenCalled();
- });
-
- it('should ask for confirmation when one of the params false', () => {
- spyOn(window, 'confirm').and.returnValue(false);
-
- component.handleCancelCommentForm(true, false);
- expect(window.confirm).not.toHaveBeenCalled();
-
- component.handleCancelCommentForm(false, true);
- expect(window.confirm).not.toHaveBeenCalled();
- });
-
- it('should call cancelCommentForm with lineCode', done => {
- spyOn(window, 'confirm');
+ it('should call cancelCommentForm with lineCode', () => {
spyOn(component, 'cancelCommentForm');
- spyOn(component, 'resetAutoSave');
component.handleCancelCommentForm();
- expect(window.confirm).not.toHaveBeenCalled();
- component.$nextTick(() => {
- expect(component.cancelCommentForm).toHaveBeenCalledWith({
- lineCode: diffLines[0].lineCode,
- });
- expect(component.resetAutoSave).toHaveBeenCalled();
-
- done();
+ expect(component.cancelCommentForm).toHaveBeenCalledWith({
+ lineCode: diffLines[0].lineCode,
});
});
});
@@ -91,7 +66,7 @@ describe('DiffLineNoteForm', () => {
describe('mounted', () => {
it('should init autosave', () => {
- const key = 'autosave/Note/Issue/98//DiffNote//1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1';
+ const key = 'autosave/Note/issue///DiffNote//1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_1';
expect(component.autosave).toBeDefined();
expect(component.autosave.key).toEqual(key);
diff --git a/spec/javascripts/diffs/components/inline_diff_view_spec.js b/spec/javascripts/diffs/components/inline_diff_view_spec.js
index 90dfa5c5a58..b02328dd359 100644
--- a/spec/javascripts/diffs/components/inline_diff_view_spec.js
+++ b/spec/javascripts/diffs/components/inline_diff_view_spec.js
@@ -33,7 +33,6 @@ describe('InlineDiffView', () => {
it('should render discussions', done => {
const el = component.$el;
component.$store.dispatch('setInitialNotes', getDiscussionsMockData());
- component.$store.commit('diffs/SET_DIFF_DATA', { diffFiles: [getDiffFileMock()] });
Vue.nextTick(() => {
expect(el.querySelectorAll('.notes_holder').length).toEqual(1);
diff --git a/spec/javascripts/diffs/mock_data/diff_discussions.js b/spec/javascripts/diffs/mock_data/diff_discussions.js
index 8cd57d2248b..41d0dfd8939 100644
--- a/spec/javascripts/diffs/mock_data/diff_discussions.js
+++ b/spec/javascripts/diffs/mock_data/diff_discussions.js
@@ -12,17 +12,6 @@ export default {
head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
},
},
- original_position: {
- formatter: {
- old_line: null,
- new_line: 2,
- old_path: 'CHANGELOG',
- new_path: 'CHANGELOG',
- base_sha: 'e63f41fe459e62e1228fcef60d7189127aeba95a',
- start_sha: 'd9eaefe5a676b820c57ff18cf5b68316025f7962',
- head_sha: 'c48ee0d1bf3b30453f5b32250ce03134beaa6d13',
- },
- },
line_code: '1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2',
expanded: true,
notes: [
diff --git a/spec/javascripts/diffs/store/getters_spec.js b/spec/javascripts/diffs/store/getters_spec.js
index f5628a01a55..7706c32d24d 100644
--- a/spec/javascripts/diffs/store/getters_spec.js
+++ b/spec/javascripts/diffs/store/getters_spec.js
@@ -2,7 +2,6 @@ import * as getters from '~/diffs/store/getters';
import state from '~/diffs/store/modules/diff_state';
import { PARALLEL_DIFF_VIEW_TYPE, INLINE_DIFF_VIEW_TYPE } from '~/diffs/constants';
import discussion from '../mock_data/diff_discussions';
-import diffFile from '../mock_data/diff_file';
describe('Diffs Module Getters', () => {
let localState;
@@ -167,6 +166,24 @@ describe('Diffs Module Getters', () => {
});
});
+ describe('diffHasDiscussions', () => {
+ it('returns true when getDiffFileDiscussions returns discussions', () => {
+ expect(
+ getters.diffHasDiscussions(localState, {
+ getDiffFileDiscussions: () => [discussionMock],
+ })(diffFileMock),
+ ).toEqual(true);
+ });
+
+ it('returns false when getDiffFileDiscussions returns no discussions', () => {
+ expect(
+ getters.diffHasDiscussions(localState, {
+ getDiffFileDiscussions: () => [],
+ })(diffFileMock),
+ ).toEqual(false);
+ });
+ });
+
describe('getDiffFileDiscussions', () => {
it('returns an array with discussions when fileHash matches and the discussion belongs to a diff', () => {
discussionMock.diff_file.file_hash = diffFileMock.fileHash;
@@ -204,38 +221,4 @@ describe('Diffs Module Getters', () => {
expect(getters.getDiffFileByHash(localState)('123')).toBeUndefined();
});
});
-
- describe('discussionsByLineCode', () => {
- let mockState;
-
- beforeEach(() => {
- mockState = { diffFiles: [diffFile] };
- });
-
- it('should return a map of diff lines with their line codes', () => {
- const mockGetters = { discussions: [discussionMock] };
-
- const map = getters.discussionsByLineCode(mockState, {}, {}, mockGetters);
- expect(map['1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2']).toBeDefined();
- expect(Object.keys(map).length).toEqual(1);
- });
-
- it('should have the diff discussion on the map if the original position matches', () => {
- discussionMock.position.formatter.base_sha = 'ff9200';
- const mockGetters = { discussions: [discussionMock] };
-
- const map = getters.discussionsByLineCode(mockState, {}, {}, mockGetters);
- expect(map['1c497fbb3a46b78edf04cc2a2fa33f67e3ffbe2a_1_2']).toBeDefined();
- expect(Object.keys(map).length).toEqual(1);
- });
-
- it('should not add an outdated diff discussion to the returned map', () => {
- discussionMock.position.formatter.base_sha = 'ff9200';
- discussionMock.original_position.formatter.base_sha = 'ff9200';
- const mockGetters = { discussions: [discussionMock] };
-
- const map = getters.discussionsByLineCode(mockState, {}, {}, mockGetters);
- expect(Object.keys(map).length).toEqual(0);
- });
- });
});
diff --git a/spec/javascripts/diffs/store/utils_spec.js b/spec/javascripts/diffs/store/utils_spec.js
index 8e7bd8afca4..32136d9ebff 100644
--- a/spec/javascripts/diffs/store/utils_spec.js
+++ b/spec/javascripts/diffs/store/utils_spec.js
@@ -207,24 +207,4 @@ describe('DiffsStoreUtils', () => {
expect(utils.trimFirstCharOfLineContent()).toEqual({});
});
});
-
- describe('getDiffRefsByLineCode', () => {
- it('should return diffRefs for all highlightedDiffLines', () => {
- const diffFile = getDiffFileMock();
- const map = utils.getDiffRefsByLineCode([diffFile]);
- const { highlightedDiffLines } = diffFile;
- const lineCodeCount = highlightedDiffLines.reduce(
- (acc, line) => (line.lineCode ? acc + 1 : acc),
- 0,
- );
-
- const { baseSha, headSha, startSha } = diffFile.diffRefs;
- const targetLine = map[highlightedDiffLines[4].lineCode];
-
- expect(Object.keys(map).length).toEqual(lineCodeCount);
- expect(targetLine.baseSha).toEqual(baseSha);
- expect(targetLine.headSha).toEqual(headSha);
- expect(targetLine.startSha).toEqual(startSha);
- });
- });
});
diff --git a/spec/javascripts/fixtures/graph.html.haml b/spec/javascripts/fixtures/graph.html.haml
deleted file mode 100644
index 4fedb0f1ded..00000000000
--- a/spec/javascripts/fixtures/graph.html.haml
+++ /dev/null
@@ -1 +0,0 @@
-#js-pipeline-graph-vue{ data: { endpoint: "foo" } }
diff --git a/spec/javascripts/helpers/vue_mount_component_helper.js b/spec/javascripts/helpers/vue_mount_component_helper.js
index 5ba17ecf5b5..1057f0aca3e 100644
--- a/spec/javascripts/helpers/vue_mount_component_helper.js
+++ b/spec/javascripts/helpers/vue_mount_component_helper.js
@@ -15,4 +15,14 @@ export const mountComponentWithStore = (Component, { el, props, store }) =>
propsData: props || {},
}).$mount(el);
+export const mountComponentWithSlots = (Component, { props, slots }) => {
+ const component = new Component({
+ propsData: props || {},
+ });
+
+ component.$slots = slots;
+
+ return component.$mount();
+};
+
export default mountComponent;
diff --git a/spec/javascripts/ide/components/changed_file_icon_spec.js b/spec/javascripts/ide/components/changed_file_icon_spec.js
index 541864e912e..7308219f705 100644
--- a/spec/javascripts/ide/components/changed_file_icon_spec.js
+++ b/spec/javascripts/ide/components/changed_file_icon_spec.js
@@ -33,14 +33,14 @@ describe('IDE changed file icon', () => {
});
describe('changedIconClass', () => {
- it('includes multi-file-modified when not a temp file', () => {
- expect(vm.changedIconClass).toContain('multi-file-modified');
+ it('includes ide-file-modified when not a temp file', () => {
+ expect(vm.changedIconClass).toContain('ide-file-modified');
});
- it('includes multi-file-addition when a temp file', () => {
+ it('includes ide-file-addition when a temp file', () => {
vm.file.tempFile = true;
- expect(vm.changedIconClass).toContain('multi-file-addition');
+ expect(vm.changedIconClass).toContain('ide-file-addition');
});
});
});
diff --git a/spec/javascripts/ide/components/commit_sidebar/actions_spec.js b/spec/javascripts/ide/components/commit_sidebar/actions_spec.js
index 27f10caccb1..3a5d6c8a90b 100644
--- a/spec/javascripts/ide/components/commit_sidebar/actions_spec.js
+++ b/spec/javascripts/ide/components/commit_sidebar/actions_spec.js
@@ -46,4 +46,12 @@ describe('IDE commit sidebar actions', () => {
done();
});
});
+
+ describe('commitToCurrentBranchText', () => {
+ it('escapes current branch', () => {
+ vm.$store.state.currentBranchId = '<img src="x" />';
+
+ expect(vm.commitToCurrentBranchText).not.toContain('<img src="x" />');
+ });
+ });
});
diff --git a/spec/javascripts/ide/components/commit_sidebar/list_item_spec.js b/spec/javascripts/ide/components/commit_sidebar/list_item_spec.js
index bf96170f703..41d8bfff7e7 100644
--- a/spec/javascripts/ide/components/commit_sidebar/list_item_spec.js
+++ b/spec/javascripts/ide/components/commit_sidebar/list_item_spec.js
@@ -76,17 +76,29 @@ describe('Multi-file editor commit sidebar list item', () => {
expect(vm.iconName).toBe('file-addition');
});
+
+ it('returns deletion', () => {
+ f.deleted = true;
+
+ expect(vm.iconName).toBe('file-deletion');
+ });
});
describe('iconClass', () => {
it('returns modified when not a tempFile', () => {
- expect(vm.iconClass).toContain('multi-file-modified');
+ expect(vm.iconClass).toContain('ide-file-modified');
});
it('returns addition when not a tempFile', () => {
f.tempFile = true;
- expect(vm.iconClass).toContain('multi-file-addition');
+ expect(vm.iconClass).toContain('ide-file-addition');
+ });
+
+ it('returns deletion', () => {
+ f.deleted = true;
+
+ expect(vm.iconClass).toContain('ide-file-deletion');
});
});
});
diff --git a/spec/javascripts/ide/components/ide_spec.js b/spec/javascripts/ide/components/ide_spec.js
index 708c9fe69af..49b8e934cdd 100644
--- a/spec/javascripts/ide/components/ide_spec.js
+++ b/spec/javascripts/ide/components/ide_spec.js
@@ -45,6 +45,33 @@ describe('ide component', () => {
});
});
+ describe('onBeforeUnload', () => {
+ it('returns undefined when no staged files or changed files', () => {
+ expect(vm.onBeforeUnload()).toBe(undefined);
+ });
+
+ it('returns warning text when their are changed files', () => {
+ vm.$store.state.changedFiles.push(file());
+
+ expect(vm.onBeforeUnload()).toBe('Are you sure you want to lose unsaved changes?');
+ });
+
+ it('returns warning text when their are staged files', () => {
+ vm.$store.state.stagedFiles.push(file());
+
+ expect(vm.onBeforeUnload()).toBe('Are you sure you want to lose unsaved changes?');
+ });
+
+ it('updates event object', () => {
+ const event = {};
+ vm.$store.state.stagedFiles.push(file());
+
+ vm.onBeforeUnload(event);
+
+ expect(event.returnValue).toBe('Are you sure you want to lose unsaved changes?');
+ });
+ });
+
describe('file finder', () => {
beforeEach(done => {
spyOn(vm, 'toggleFileFinder');
diff --git a/spec/javascripts/ide/components/new_dropdown/index_spec.js b/spec/javascripts/ide/components/new_dropdown/index_spec.js
index 4d704b80209..8a8cbd2cee4 100644
--- a/spec/javascripts/ide/components/new_dropdown/index_spec.js
+++ b/spec/javascripts/ide/components/new_dropdown/index_spec.js
@@ -14,6 +14,7 @@ describe('new dropdown component', () => {
branch: 'master',
path: '',
mouseOver: false,
+ type: 'tree',
});
vm.$store.state.currentProjectId = 'abcproject';
@@ -61,10 +62,22 @@ describe('new dropdown component', () => {
vm.dropdownOpen = true;
setTimeout(() => {
- expect(vm.$refs.dropdownMenu.scrollIntoView).toHaveBeenCalled();
+ expect(vm.$refs.dropdownMenu.scrollIntoView).toHaveBeenCalledWith({
+ block: 'nearest',
+ });
done();
});
});
});
+
+ describe('delete entry', () => {
+ it('calls delete action', () => {
+ spyOn(vm, 'deleteEntry');
+
+ vm.$el.querySelectorAll('.dropdown-menu button')[4].click();
+
+ expect(vm.deleteEntry).toHaveBeenCalledWith('');
+ });
+ });
});
diff --git a/spec/javascripts/ide/components/new_dropdown/modal_spec.js b/spec/javascripts/ide/components/new_dropdown/modal_spec.js
index 70651535e87..595a2f927e9 100644
--- a/spec/javascripts/ide/components/new_dropdown/modal_spec.js
+++ b/spec/javascripts/ide/components/new_dropdown/modal_spec.js
@@ -15,7 +15,7 @@ describe('new file modal component', () => {
describe(type, () => {
beforeEach(() => {
const store = createStore();
- store.state.newEntryModal = {
+ store.state.entryModal = {
type,
path: '',
};
@@ -45,7 +45,7 @@ describe('new file modal component', () => {
it('$emits create', () => {
spyOn(vm, 'createTempEntry');
- vm.createEntryInStore();
+ vm.submitForm();
expect(vm.createTempEntry).toHaveBeenCalledWith({
name: 'testing',
@@ -55,4 +55,47 @@ describe('new file modal component', () => {
});
});
});
+
+ describe('rename entry', () => {
+ beforeEach(() => {
+ const store = createStore();
+ store.state.entryModal = {
+ type: 'rename',
+ path: '',
+ entry: {
+ name: 'test',
+ type: 'blob',
+ },
+ };
+
+ vm = createComponentWithStore(Component, store).$mount();
+ });
+
+ ['tree', 'blob'].forEach(type => {
+ it(`renders title and button for renaming ${type}`, done => {
+ const text = type === 'tree' ? 'folder' : 'file';
+
+ vm.$store.state.entryModal.entry.type = type;
+
+ vm.$nextTick(() => {
+ expect(vm.$el.querySelector('.modal-title').textContent.trim()).toBe(`Rename ${text}`);
+ expect(vm.$el.querySelector('.btn-success').textContent.trim()).toBe(`Rename ${text}`);
+
+ done();
+ });
+ });
+ });
+
+ describe('entryName', () => {
+ it('returns entries name', () => {
+ expect(vm.entryName).toBe('test');
+ });
+
+ it('updated name', () => {
+ vm.name = 'index.js';
+
+ expect(vm.entryName).toBe('index.js');
+ });
+ });
+ });
});
diff --git a/spec/javascripts/ide/components/repo_editor_spec.js b/spec/javascripts/ide/components/repo_editor_spec.js
index 2256deb7dac..0e2e246defd 100644
--- a/spec/javascripts/ide/components/repo_editor_spec.js
+++ b/spec/javascripts/ide/components/repo_editor_spec.js
@@ -1,5 +1,6 @@
import Vue from 'vue';
import MockAdapter from 'axios-mock-adapter';
+import '~/behaviors/markdown/render_gfm';
import axios from '~/lib/utils/axios_utils';
import store from '~/ide/stores';
import repoEditor from '~/ide/components/repo_editor.vue';
@@ -25,6 +26,8 @@ describe('RepoEditor', () => {
vm.$store.state.openFiles.push(f);
Vue.set(vm.$store.state.entries, f.path, f);
+ spyOn(vm, 'getFileData').and.returnValue(Promise.resolve());
+
vm.$mount();
Vue.nextTick(() => setTimeout(done));
diff --git a/spec/javascripts/ide/components/repo_file_spec.js b/spec/javascripts/ide/components/repo_file_spec.js
index 156233653ab..f99d1f9890a 100644
--- a/spec/javascripts/ide/components/repo_file_spec.js
+++ b/spec/javascripts/ide/components/repo_file_spec.js
@@ -91,25 +91,6 @@ describe('RepoFile', () => {
done();
});
});
-
- it('disables action dropdown', done => {
- createComponent({
- file: {
- ...file('t4'),
- type: 'tree',
- branchId: 'master',
- projectId: 'project',
- },
- level: 0,
- disableActionDropdown: true,
- });
-
- setTimeout(() => {
- expect(vm.$el.querySelector('.ide-new-btn')).toBeNull();
-
- done();
- });
- });
});
describe('locked file', () => {
diff --git a/spec/javascripts/ide/components/repo_tab_spec.js b/spec/javascripts/ide/components/repo_tab_spec.js
index fc0695a4263..278a0753322 100644
--- a/spec/javascripts/ide/components/repo_tab_spec.js
+++ b/spec/javascripts/ide/components/repo_tab_spec.js
@@ -93,13 +93,13 @@ describe('RepoTab', () => {
Vue.nextTick()
.then(() => {
- expect(vm.$el.querySelector('.multi-file-modified')).toBeNull();
+ expect(vm.$el.querySelector('.ide-file-modified')).toBeNull();
vm.$el.dispatchEvent(new Event('mouseout'));
})
.then(Vue.nextTick)
.then(() => {
- expect(vm.$el.querySelector('.multi-file-modified')).not.toBeNull();
+ expect(vm.$el.querySelector('.ide-file-modified')).not.toBeNull();
done();
})
diff --git a/spec/javascripts/ide/stores/actions/file_spec.js b/spec/javascripts/ide/stores/actions/file_spec.js
index f570c0b16bd..72eb20bdc87 100644
--- a/spec/javascripts/ide/stores/actions/file_spec.js
+++ b/spec/javascripts/ide/stores/actions/file_spec.js
@@ -366,6 +366,23 @@ describe('IDE store file actions', () => {
});
});
+ describe('return JSON', () => {
+ beforeEach(() => {
+ mock.onGet(/(.*)/).replyOnce(200, JSON.stringify({ test: '123' }));
+ });
+
+ it('does not parse returned JSON', done => {
+ store
+ .dispatch('getRawFileData', { path: tmpFile.path })
+ .then(() => {
+ expect(tmpFile.raw).toEqual('{"test":"123"}');
+
+ done();
+ })
+ .catch(done.fail);
+ });
+ });
+
describe('error', () => {
beforeEach(() => {
mock.onGet(/(.*)/).networkError();
diff --git a/spec/javascripts/ide/stores/actions_spec.js b/spec/javascripts/ide/stores/actions_spec.js
index 8b665a6d79e..d84f1717a61 100644
--- a/spec/javascripts/ide/stores/actions_spec.js
+++ b/spec/javascripts/ide/stores/actions_spec.js
@@ -7,6 +7,8 @@ import actions, {
updateActivityBarView,
updateTempFlagForEntry,
setErrorMessage,
+ deleteEntry,
+ renameEntry,
} from '~/ide/stores/actions';
import store from '~/ide/stores';
import * as types from '~/ide/stores/mutation_types';
@@ -457,4 +459,73 @@ describe('Multi-file store actions', () => {
);
});
});
+
+ describe('deleteEntry', () => {
+ it('commits entry deletion', done => {
+ store.state.entries.path = 'testing';
+
+ testAction(
+ deleteEntry,
+ 'path',
+ store.state,
+ [{ type: types.DELETE_ENTRY, payload: 'path' }],
+ [{ type: 'burstUnusedSeal' }],
+ done,
+ );
+ });
+ });
+
+ describe('renameEntry', () => {
+ it('renames entry', done => {
+ store.state.entries.test = {
+ tree: [],
+ };
+
+ testAction(
+ renameEntry,
+ { path: 'test', name: 'new-name' },
+ store.state,
+ [
+ {
+ type: types.RENAME_ENTRY,
+ payload: { path: 'test', name: 'new-name', entryPath: null },
+ },
+ ],
+ [{ type: 'deleteEntry', payload: 'test' }],
+ done,
+ );
+ });
+
+ it('renames all entries in tree', done => {
+ store.state.entries.test = {
+ type: 'tree',
+ tree: [
+ {
+ path: 'tree-1',
+ },
+ {
+ path: 'tree-2',
+ },
+ ],
+ };
+
+ testAction(
+ renameEntry,
+ { path: 'test', name: 'new-name' },
+ store.state,
+ [
+ {
+ type: types.RENAME_ENTRY,
+ payload: { path: 'test', name: 'new-name', entryPath: null },
+ },
+ ],
+ [
+ { type: 'renameEntry', payload: { path: 'test', name: 'new-name', entryPath: 'tree-1' } },
+ { type: 'renameEntry', payload: { path: 'test', name: 'new-name', entryPath: 'tree-2' } },
+ { type: 'deleteEntry', payload: 'test' },
+ ],
+ done,
+ );
+ });
+ });
});
diff --git a/spec/javascripts/ide/stores/modules/commit/actions_spec.js b/spec/javascripts/ide/stores/modules/commit/actions_spec.js
index 133ad627f34..24a7d76f30b 100644
--- a/spec/javascripts/ide/stores/modules/commit/actions_spec.js
+++ b/spec/javascripts/ide/stores/modules/commit/actions_spec.js
@@ -294,9 +294,10 @@ describe('IDE commit module actions', () => {
{
action: 'update',
file_path: jasmine.anything(),
- content: jasmine.anything(),
+ content: undefined,
encoding: jasmine.anything(),
last_commit_id: undefined,
+ previous_path: undefined,
},
],
start_branch: 'master',
@@ -320,9 +321,10 @@ describe('IDE commit module actions', () => {
{
action: 'update',
file_path: jasmine.anything(),
- content: jasmine.anything(),
+ content: undefined,
encoding: jasmine.anything(),
last_commit_id: '123456789',
+ previous_path: undefined,
},
],
start_branch: undefined,
diff --git a/spec/javascripts/ide/stores/modules/commit/getters_spec.js b/spec/javascripts/ide/stores/modules/commit/getters_spec.js
index 44c941d6dbb..3f4bf407a1f 100644
--- a/spec/javascripts/ide/stores/modules/commit/getters_spec.js
+++ b/spec/javascripts/ide/stores/modules/commit/getters_spec.js
@@ -123,6 +123,22 @@ describe('IDE commit module getters', () => {
'Update test-file, index.js files',
);
});
+
+ it('returns commitMessage with deleted files', () => {
+ rootState[key].push(
+ {
+ path: 'test-file',
+ deleted: true,
+ },
+ {
+ path: 'index.js',
+ },
+ );
+
+ expect(getters.preBuiltCommitMessage(state, null, rootState)).toBe(
+ 'Update index.js\nDeleted test-file',
+ );
+ });
});
});
});
diff --git a/spec/javascripts/ide/stores/mutations/file_spec.js b/spec/javascripts/ide/stores/mutations/file_spec.js
index 52f83be8e8c..efd0d86552b 100644
--- a/spec/javascripts/ide/stores/mutations/file_spec.js
+++ b/spec/javascripts/ide/stores/mutations/file_spec.js
@@ -94,6 +94,35 @@ describe('IDE store file mutations', () => {
expect(localFile.raw).toBe('testing');
});
+
+ it('adds raw data to open pending file', () => {
+ localState.openFiles.push({
+ ...localFile,
+ pending: true,
+ });
+
+ mutations.SET_FILE_RAW_DATA(localState, {
+ file: localFile,
+ raw: 'testing',
+ });
+
+ expect(localState.openFiles[0].raw).toBe('testing');
+ });
+
+ it('does not add raw data to open pending tempFile file', () => {
+ localState.openFiles.push({
+ ...localFile,
+ pending: true,
+ tempFile: true,
+ });
+
+ mutations.SET_FILE_RAW_DATA(localState, {
+ file: localFile,
+ raw: 'testing',
+ });
+
+ expect(localState.openFiles[0].raw).not.toBe('testing');
+ });
});
describe('SET_FILE_BASE_RAW_DATA', () => {
@@ -205,6 +234,11 @@ describe('IDE store file mutations', () => {
beforeEach(() => {
localFile.content = 'test';
localFile.changed = true;
+ localState.currentProjectId = 'gitlab-ce';
+ localState.currentBranchId = 'master';
+ localState.trees['gitlab-ce/master'] = {
+ tree: [],
+ };
});
it('resets content and changed', () => {
@@ -213,6 +247,36 @@ describe('IDE store file mutations', () => {
expect(localFile.content).toBe('');
expect(localFile.changed).toBeFalsy();
});
+
+ it('adds to root tree if deleted', () => {
+ localFile.deleted = true;
+
+ mutations.DISCARD_FILE_CHANGES(localState, localFile.path);
+
+ expect(localState.trees['gitlab-ce/master'].tree).toEqual([
+ {
+ ...localFile,
+ deleted: false,
+ },
+ ]);
+ });
+
+ it('adds to parent tree if deleted', () => {
+ localFile.deleted = true;
+ localFile.parentPath = 'parentPath';
+ localState.entries.parentPath = {
+ tree: [],
+ };
+
+ mutations.DISCARD_FILE_CHANGES(localState, localFile.path);
+
+ expect(localState.entries.parentPath.tree).toEqual([
+ {
+ ...localFile,
+ deleted: false,
+ },
+ ]);
+ });
});
describe('ADD_FILE_TO_CHANGED', () => {
diff --git a/spec/javascripts/ide/stores/mutations_spec.js b/spec/javascripts/ide/stores/mutations_spec.js
index 98016f593aa..1e836dbc3f9 100644
--- a/spec/javascripts/ide/stores/mutations_spec.js
+++ b/spec/javascripts/ide/stores/mutations_spec.js
@@ -156,4 +156,161 @@ describe('Multi-file store mutations', () => {
expect(localState.errorMessage).toBe('error');
});
});
+
+ describe('DELETE_ENTRY', () => {
+ beforeEach(() => {
+ localState.currentProjectId = 'gitlab-ce';
+ localState.currentBranchId = 'master';
+ localState.trees['gitlab-ce/master'] = {
+ tree: [],
+ };
+ });
+
+ it('sets deleted flag', () => {
+ localState.entries.filePath = {
+ deleted: false,
+ };
+
+ mutations.DELETE_ENTRY(localState, 'filePath');
+
+ expect(localState.entries.filePath.deleted).toBe(true);
+ });
+
+ it('removes from root tree', () => {
+ localState.entries.filePath = {
+ path: 'filePath',
+ deleted: false,
+ };
+ localState.trees['gitlab-ce/master'].tree.push(localState.entries.filePath);
+
+ mutations.DELETE_ENTRY(localState, 'filePath');
+
+ expect(localState.trees['gitlab-ce/master'].tree).toEqual([]);
+ });
+
+ it('removes from parent tree', () => {
+ localState.entries.filePath = {
+ path: 'filePath',
+ deleted: false,
+ parentPath: 'parentPath',
+ };
+ localState.entries.parentPath = {
+ tree: [localState.entries.filePath],
+ };
+
+ mutations.DELETE_ENTRY(localState, 'filePath');
+
+ expect(localState.entries.parentPath.tree).toEqual([]);
+ });
+
+ it('adds to changedFiles', () => {
+ localState.entries.filePath = {
+ deleted: false,
+ type: 'blob',
+ };
+
+ mutations.DELETE_ENTRY(localState, 'filePath');
+
+ expect(localState.changedFiles).toEqual([localState.entries.filePath]);
+ });
+ });
+
+ describe('UPDATE_FILE_AFTER_COMMIT', () => {
+ it('updates URLs if prevPath is set', () => {
+ const f = {
+ ...file(),
+ path: 'test',
+ prevPath: 'testing-123',
+ rawPath: `${gl.TEST_HOST}/testing-123`,
+ permalink: `${gl.TEST_HOST}/testing-123`,
+ commitsPath: `${gl.TEST_HOST}/testing-123`,
+ blamePath: `${gl.TEST_HOST}/testing-123`,
+ };
+ localState.entries.test = f;
+ localState.changedFiles.push(f);
+
+ mutations.UPDATE_FILE_AFTER_COMMIT(localState, { file: f, lastCommit: { commit: {} } });
+
+ expect(f.rawPath).toBe(`${gl.TEST_HOST}/test`);
+ expect(f.permalink).toBe(`${gl.TEST_HOST}/test`);
+ expect(f.commitsPath).toBe(`${gl.TEST_HOST}/test`);
+ expect(f.blamePath).toBe(`${gl.TEST_HOST}/test`);
+ });
+ });
+
+ describe('OPEN_NEW_ENTRY_MODAL', () => {
+ it('sets entryModal', () => {
+ localState.entries.testPath = {
+ ...file(),
+ };
+
+ mutations.OPEN_NEW_ENTRY_MODAL(localState, { type: 'test', path: 'testPath' });
+
+ expect(localState.entryModal).toEqual({
+ type: 'test',
+ path: 'testPath',
+ entry: localState.entries.testPath,
+ });
+ });
+ });
+
+ describe('RENAME_ENTRY', () => {
+ beforeEach(() => {
+ localState.trees = {
+ 'gitlab-ce/master': { tree: [] },
+ };
+ localState.currentProjectId = 'gitlab-ce';
+ localState.currentBranchId = 'master';
+ localState.entries.oldPath = {
+ ...file(),
+ type: 'blob',
+ name: 'oldPath',
+ path: 'oldPath',
+ url: `${gl.TEST_HOST}/oldPath`,
+ };
+ });
+
+ it('creates new renamed entry', () => {
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.entries.newPath).toEqual({
+ ...localState.entries.oldPath,
+ id: 'newPath',
+ name: 'newPath',
+ key: 'newPath-blob-name',
+ path: 'newPath',
+ tempFile: true,
+ prevPath: 'oldPath',
+ tree: [],
+ parentPath: '',
+ url: `${gl.TEST_HOST}/newPath`,
+ moved: jasmine.anything(),
+ movedPath: jasmine.anything(),
+ });
+ });
+
+ it('adds new entry to changedFiles', () => {
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.changedFiles.length).toBe(1);
+ expect(localState.changedFiles[0].path).toBe('newPath');
+ });
+
+ it('sets oldEntry as moved', () => {
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.entries.oldPath.moved).toBe(true);
+ });
+
+ it('adds to parents tree', () => {
+ localState.entries.oldPath.parentPath = 'parentPath';
+ localState.entries.parentPath = {
+ ...file(),
+ };
+
+ mutations.RENAME_ENTRY(localState, { path: 'oldPath', name: 'newPath' });
+
+ expect(localState.entries.parentPath.tree.length).toBe(1);
+ });
+ });
});
diff --git a/spec/javascripts/ide/stores/utils_spec.js b/spec/javascripts/ide/stores/utils_spec.js
index 6c5980cfae4..9f18034f8a3 100644
--- a/spec/javascripts/ide/stores/utils_spec.js
+++ b/spec/javascripts/ide/stores/utils_spec.js
@@ -86,6 +86,11 @@ describe('Multi-file store utils', () => {
base64: true,
lastCommitSha: '123456789',
},
+ {
+ ...file('deletedFile'),
+ path: 'deletedFile',
+ deleted: true,
+ },
],
currentBranchId: 'master',
};
@@ -107,6 +112,7 @@ describe('Multi-file store utils', () => {
content: 'updated file content',
encoding: 'text',
last_commit_id: '123456789',
+ previous_path: undefined,
},
{
action: 'create',
@@ -114,6 +120,15 @@ describe('Multi-file store utils', () => {
content: 'new file content',
encoding: 'base64',
last_commit_id: '123456789',
+ previous_path: undefined,
+ },
+ {
+ action: 'delete',
+ file_path: 'deletedFile',
+ content: undefined,
+ encoding: 'text',
+ last_commit_id: undefined,
+ previous_path: undefined,
},
],
start_branch: undefined,
@@ -160,6 +175,7 @@ describe('Multi-file store utils', () => {
content: 'updated file content',
encoding: 'text',
last_commit_id: '123456789',
+ previous_path: undefined,
},
{
action: 'create',
@@ -167,10 +183,56 @@ describe('Multi-file store utils', () => {
content: 'new file content',
encoding: 'base64',
last_commit_id: '123456789',
+ previous_path: undefined,
},
],
start_branch: undefined,
});
});
});
+
+ describe('commitActionForFile', () => {
+ it('returns deleted for deleted file', () => {
+ expect(utils.commitActionForFile({ deleted: true })).toBe('delete');
+ });
+
+ it('returns create for tempFile', () => {
+ expect(utils.commitActionForFile({ tempFile: true })).toBe('create');
+ });
+
+ it('returns move for moved file', () => {
+ expect(utils.commitActionForFile({ prevPath: 'test' })).toBe('move');
+ });
+
+ it('returns update by default', () => {
+ expect(utils.commitActionForFile({})).toBe('update');
+ });
+ });
+
+ describe('getCommitFiles', () => {
+ it('returns list of files excluding moved files', () => {
+ const files = [
+ {
+ path: 'a',
+ type: 'blob',
+ deleted: true,
+ },
+ {
+ path: 'c',
+ type: 'blob',
+ moved: true,
+ },
+ ];
+
+ const flattendFiles = utils.getCommitFiles(files);
+
+ expect(flattendFiles).toEqual([
+ {
+ path: 'a',
+ type: 'blob',
+ deleted: true,
+ },
+ ]);
+ });
+ });
});
diff --git a/spec/javascripts/issue_show/components/app_spec.js b/spec/javascripts/issue_show/components/app_spec.js
index eb5e0bddb74..36328382448 100644
--- a/spec/javascripts/issue_show/components/app_spec.js
+++ b/spec/javascripts/issue_show/components/app_spec.js
@@ -76,7 +76,7 @@ describe('Issuable output', () => {
expect(vm.$el.querySelector('.wiki').innerHTML).toContain('<p>this is a description!</p>');
expect(vm.$el.querySelector('.js-task-list-field').value).toContain('this is a description');
expect(formatText(editedText.innerText)).toMatch(/Edited[\s\S]+?by Some User/);
- expect(editedText.querySelector('.author_link').href).toMatch(/\/some_user$/);
+ expect(editedText.querySelector('.author-link').href).toMatch(/\/some_user$/);
expect(editedText.querySelector('time')).toBeTruthy();
})
.then(() => {
@@ -90,7 +90,7 @@ describe('Issuable output', () => {
expect(vm.$el.querySelector('.js-task-list-field').value).toContain('42');
expect(vm.$el.querySelector('.edited-text')).toBeTruthy();
expect(formatText(vm.$el.querySelector('.edited-text').innerText)).toMatch(/Edited[\s\S]+?by Other User/);
- expect(editedText.querySelector('.author_link').href).toMatch(/\/other_user$/);
+ expect(editedText.querySelector('.author-link').href).toMatch(/\/other_user$/);
expect(editedText.querySelector('time')).toBeTruthy();
})
.then(done)
diff --git a/spec/javascripts/issue_show/components/edited_spec.js b/spec/javascripts/issue_show/components/edited_spec.js
index 2061def699b..7f09db837bb 100644
--- a/spec/javascripts/issue_show/components/edited_spec.js
+++ b/spec/javascripts/issue_show/components/edited_spec.js
@@ -18,7 +18,7 @@ describe('edited', () => {
}).$mount();
expect(formatText(editedComponent.$el.innerText)).toMatch(/Edited[\s\S]+?by Some User/);
- expect(editedComponent.$el.querySelector('.author_link').href).toMatch(/\/some_user$/);
+ expect(editedComponent.$el.querySelector('.author-link').href).toMatch(/\/some_user$/);
expect(editedComponent.$el.querySelector('time')).toBeTruthy();
});
@@ -31,7 +31,7 @@ describe('edited', () => {
}).$mount();
expect(formatText(editedComponent.$el.innerText)).toMatch(/Edited by Some User/);
- expect(editedComponent.$el.querySelector('.author_link').href).toMatch(/\/some_user$/);
+ expect(editedComponent.$el.querySelector('.author-link').href).toMatch(/\/some_user$/);
expect(editedComponent.$el.querySelector('time')).toBeFalsy();
});
@@ -43,7 +43,7 @@ describe('edited', () => {
}).$mount();
expect(formatText(editedComponent.$el.innerText)).not.toMatch(/by Some User/);
- expect(editedComponent.$el.querySelector('.author_link')).toBeFalsy();
+ expect(editedComponent.$el.querySelector('.author-link')).toBeFalsy();
expect(editedComponent.$el.querySelector('time')).toBeTruthy();
});
diff --git a/spec/javascripts/lib/utils/poll_spec.js b/spec/javascripts/lib/utils/poll_spec.js
index 9b8f68f1676..523f4997bc0 100644
--- a/spec/javascripts/lib/utils/poll_spec.js
+++ b/spec/javascripts/lib/utils/poll_spec.js
@@ -1,4 +1,5 @@
import Poll from '~/lib/utils/poll';
+import { successCodes } from '~/lib/utils/http_status';
const waitForAllCallsToFinish = (service, waitForCount, successCallback) => {
const timer = () => {
@@ -91,28 +92,32 @@ describe('Poll', () => {
}).catch(done.fail);
});
- it('starts polling when http status is 200 and interval header is provided', (done) => {
- mockServiceCall(service, { status: 200, headers: { 'poll-interval': 1 } });
+ describe('for 2xx status code', () => {
+ successCodes.forEach(httpCode => {
+ it(`starts polling when http status is ${httpCode} and interval header is provided`, (done) => {
+ mockServiceCall(service, { status: httpCode, headers: { 'poll-interval': 1 } });
- const Polling = new Poll({
- resource: service,
- method: 'fetch',
- data: { page: 1 },
- successCallback: callbacks.success,
- errorCallback: callbacks.error,
- });
+ const Polling = new Poll({
+ resource: service,
+ method: 'fetch',
+ data: { page: 1 },
+ successCallback: callbacks.success,
+ errorCallback: callbacks.error,
+ });
- Polling.makeRequest();
+ Polling.makeRequest();
- waitForAllCallsToFinish(service, 2, () => {
- Polling.stop();
+ waitForAllCallsToFinish(service, 2, () => {
+ Polling.stop();
- expect(service.fetch.calls.count()).toEqual(2);
- expect(service.fetch).toHaveBeenCalledWith({ page: 1 });
- expect(callbacks.success).toHaveBeenCalled();
- expect(callbacks.error).not.toHaveBeenCalled();
+ expect(service.fetch.calls.count()).toEqual(2);
+ expect(service.fetch).toHaveBeenCalledWith({ page: 1 });
+ expect(callbacks.success).toHaveBeenCalled();
+ expect(callbacks.error).not.toHaveBeenCalled();
- done();
+ done();
+ });
+ });
});
});
diff --git a/spec/javascripts/lib/utils/text_utility_spec.js b/spec/javascripts/lib/utils/text_utility_spec.js
index 33987574f00..d60485b1308 100644
--- a/spec/javascripts/lib/utils/text_utility_spec.js
+++ b/spec/javascripts/lib/utils/text_utility_spec.js
@@ -112,4 +112,21 @@ describe('text_utility', () => {
expect(textUtils.splitCamelCase('HelloWorld')).toBe('Hello World');
});
});
+
+ describe('getFirstCharacterCapitalized', () => {
+ it('returns the first character captialized, if first character is alphabetic', () => {
+ expect(textUtils.getFirstCharacterCapitalized('loremIpsumDolar')).toEqual('L');
+ expect(textUtils.getFirstCharacterCapitalized('Sit amit !')).toEqual('S');
+ });
+
+ it('returns the first character, if first character is non-alphabetic', () => {
+ expect(textUtils.getFirstCharacterCapitalized(' lorem')).toEqual(' ');
+ expect(textUtils.getFirstCharacterCapitalized('%#!')).toEqual('%');
+ });
+
+ it('returns an empty string, if string is falsey', () => {
+ expect(textUtils.getFirstCharacterCapitalized('')).toEqual('');
+ expect(textUtils.getFirstCharacterCapitalized(null)).toEqual('');
+ });
+ });
});
diff --git a/spec/javascripts/notes/components/discussion_counter_spec.js b/spec/javascripts/notes/components/discussion_counter_spec.js
index d09bc5037ef..a3869cc6498 100644
--- a/spec/javascripts/notes/components/discussion_counter_spec.js
+++ b/spec/javascripts/notes/components/discussion_counter_spec.js
@@ -46,7 +46,7 @@ describe('DiscussionCounter component', () => {
discussions,
});
setFixtures(`
- <div class="discussion" data-discussion-id="${firstDiscussionId}"></div>
+ <div data-discussion-id="${firstDiscussionId}"></div>
`);
vm.jumpToFirstUnresolvedDiscussion();
diff --git a/spec/javascripts/notes/components/noteable_discussion_spec.js b/spec/javascripts/notes/components/noteable_discussion_spec.js
index 2a01bd85520..7da931fd9cb 100644
--- a/spec/javascripts/notes/components/noteable_discussion_spec.js
+++ b/spec/javascripts/notes/components/noteable_discussion_spec.js
@@ -14,7 +14,6 @@ describe('noteable_discussion component', () => {
preloadFixtures(discussionWithTwoUnresolvedNotes);
beforeEach(() => {
- window.mrTabs = {};
store = createStore();
store.dispatch('setNoteableData', noteableDataMock);
store.dispatch('setNotesData', notesDataMock);
@@ -47,15 +46,10 @@ describe('noteable_discussion component', () => {
it('should toggle reply form', done => {
vm.$el.querySelector('.js-vue-discussion-reply').click();
-
Vue.nextTick(() => {
+ expect(vm.$refs.noteForm).not.toBeNull();
expect(vm.isReplying).toEqual(true);
-
- // There is a watcher for `isReplying` which will init autosave in the next tick
- Vue.nextTick(() => {
- expect(vm.$refs.noteForm).not.toBeNull();
- done();
- });
+ done();
});
});
@@ -107,29 +101,33 @@ describe('noteable_discussion component', () => {
describe('methods', () => {
describe('jumpToNextDiscussion', () => {
- it('expands next unresolved discussion', done => {
- const discussion2 = getJSONFixture(discussionWithTwoUnresolvedNotes)[0];
- discussion2.resolved = false;
- discussion2.id = 'next'; // prepare this for being identified as next one (to be jumped to)
- vm.$store.dispatch('setInitialNotes', [discussionMock, discussion2]);
- window.mrTabs.currentAction = 'show';
-
- Vue.nextTick()
- .then(() => {
- spyOn(vm, 'expandDiscussion').and.stub();
-
- const nextDiscussionId = discussion2.id;
-
- setFixtures(`
- <div class="discussion" data-discussion-id="${nextDiscussionId}"></div>
- `);
+ it('expands next unresolved discussion', () => {
+ spyOn(vm, 'expandDiscussion').and.stub();
+ const discussions = [
+ discussionMock,
+ {
+ ...discussionMock,
+ id: discussionMock.id + 1,
+ notes: [{ ...discussionMock.notes[0], resolvable: true, resolved: true }],
+ },
+ {
+ ...discussionMock,
+ id: discussionMock.id + 2,
+ notes: [{ ...discussionMock.notes[0], resolvable: true, resolved: false }],
+ },
+ ];
+ const nextDiscussionId = discussionMock.id + 2;
+ store.replaceState({
+ ...store.state,
+ discussions,
+ });
+ setFixtures(`
+ <div data-discussion-id="${nextDiscussionId}"></div>
+ `);
- vm.jumpToNextDiscussion();
+ vm.jumpToNextDiscussion();
- expect(vm.expandDiscussion).toHaveBeenCalledWith({ discussionId: nextDiscussionId });
- })
- .then(done)
- .catch(done.fail);
+ expect(vm.expandDiscussion).toHaveBeenCalledWith({ discussionId: nextDiscussionId });
});
});
});
diff --git a/spec/javascripts/notes/mock_data.js b/spec/javascripts/notes/mock_data.js
index 67f6a9629d9..be2a8ba67fe 100644
--- a/spec/javascripts/notes/mock_data.js
+++ b/spec/javascripts/notes/mock_data.js
@@ -1168,87 +1168,3 @@ export const collapsedSystemNotes = [
diff_discussion: false,
},
];
-
-export const discussion1 = {
- id: 'abc1',
- resolvable: true,
- resolved: false,
- diff_file: {
- file_path: 'about.md',
- },
- position: {
- formatter: {
- new_line: 50,
- old_line: null,
- },
- },
- notes: [
- {
- created_at: '2018-07-04T16:25:41.749Z',
- },
- ],
-};
-
-export const resolvedDiscussion1 = {
- id: 'abc1',
- resolvable: true,
- resolved: true,
- diff_file: {
- file_path: 'about.md',
- },
- position: {
- formatter: {
- new_line: 50,
- old_line: null,
- },
- },
- notes: [
- {
- created_at: '2018-07-04T16:25:41.749Z',
- },
- ],
-};
-
-export const discussion2 = {
- id: 'abc2',
- resolvable: true,
- resolved: false,
- diff_file: {
- file_path: 'README.md',
- },
- position: {
- formatter: {
- new_line: null,
- old_line: 20,
- },
- },
- notes: [
- {
- created_at: '2018-07-04T12:05:41.749Z',
- },
- ],
-};
-
-export const discussion3 = {
- id: 'abc3',
- resolvable: true,
- resolved: false,
- diff_file: {
- file_path: 'README.md',
- },
- position: {
- formatter: {
- new_line: 21,
- old_line: null,
- },
- },
- notes: [
- {
- created_at: '2018-07-05T17:25:41.749Z',
- },
- ],
-};
-
-export const unresolvableDiscussion = {
- resolvable: false,
-};
diff --git a/spec/javascripts/notes/stores/getters_spec.js b/spec/javascripts/notes/stores/getters_spec.js
index 7f8ede51508..41599e00122 100644
--- a/spec/javascripts/notes/stores/getters_spec.js
+++ b/spec/javascripts/notes/stores/getters_spec.js
@@ -5,11 +5,6 @@ import {
noteableDataMock,
individualNote,
collapseNotesMock,
- discussion1,
- discussion2,
- discussion3,
- resolvedDiscussion1,
- unresolvableDiscussion,
} from '../mock_data';
const discussionWithTwoUnresolvedNotes = 'merge_requests/resolved_diff_discussion.json';
@@ -114,154 +109,4 @@ describe('Getters Notes Store', () => {
expect(getters.isNotesFetched(state)).toBeFalsy();
});
});
-
- describe('allResolvableDiscussions', () => {
- it('should return only resolvable discussions in same order', () => {
- const localGetters = {
- allDiscussions: [
- discussion3,
- unresolvableDiscussion,
- discussion1,
- unresolvableDiscussion,
- discussion2,
- ],
- };
-
- expect(getters.allResolvableDiscussions(state, localGetters)).toEqual([
- discussion3,
- discussion1,
- discussion2,
- ]);
- });
-
- it('should return empty array if there are no resolvable discussions', () => {
- const localGetters = {
- allDiscussions: [unresolvableDiscussion, unresolvableDiscussion],
- };
-
- expect(getters.allResolvableDiscussions(state, localGetters)).toEqual([]);
- });
- });
-
- describe('unresolvedDiscussionsIdsByDiff', () => {
- it('should return all discussions IDs in diff order', () => {
- const localGetters = {
- allResolvableDiscussions: [discussion3, discussion1, discussion2],
- };
-
- expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters)).toEqual([
- 'abc1',
- 'abc2',
- 'abc3',
- ]);
- });
-
- it('should return empty array if all discussions have been resolved', () => {
- const localGetters = {
- allResolvableDiscussions: [resolvedDiscussion1],
- };
-
- expect(getters.unresolvedDiscussionsIdsByDiff(state, localGetters)).toEqual([]);
- });
- });
-
- describe('unresolvedDiscussionsIdsByDate', () => {
- it('should return all discussions in date ascending order', () => {
- const localGetters = {
- allResolvableDiscussions: [discussion3, discussion1, discussion2],
- };
-
- expect(getters.unresolvedDiscussionsIdsByDate(state, localGetters)).toEqual([
- 'abc2',
- 'abc1',
- 'abc3',
- ]);
- });
-
- it('should return empty array if all discussions have been resolved', () => {
- const localGetters = {
- allResolvableDiscussions: [resolvedDiscussion1],
- };
-
- expect(getters.unresolvedDiscussionsIdsByDate(state, localGetters)).toEqual([]);
- });
- });
-
- describe('unresolvedDiscussionsIdsOrdered', () => {
- const localGetters = {
- unresolvedDiscussionsIdsByDate: ['123', '456'],
- unresolvedDiscussionsIdsByDiff: ['abc', 'def'],
- };
-
- it('should return IDs ordered by diff when diffOrder param is true', () => {
- expect(getters.unresolvedDiscussionsIdsOrdered(state, localGetters)(true)).toEqual([
- 'abc',
- 'def',
- ]);
- });
-
- it('should return IDs ordered by date when diffOrder param is not true', () => {
- expect(getters.unresolvedDiscussionsIdsOrdered(state, localGetters)(false)).toEqual([
- '123',
- '456',
- ]);
- expect(getters.unresolvedDiscussionsIdsOrdered(state, localGetters)(undefined)).toEqual([
- '123',
- '456',
- ]);
- });
- });
-
- describe('isLastUnresolvedDiscussion', () => {
- const localGetters = {
- unresolvedDiscussionsIdsOrdered: () => ['123', '456', '789'],
- };
-
- it('should return true if the discussion id provided is the last', () => {
- expect(getters.isLastUnresolvedDiscussion(state, localGetters)('789')).toBe(true);
- });
-
- it('should return false if the discussion id provided is not the last', () => {
- expect(getters.isLastUnresolvedDiscussion(state, localGetters)('123')).toBe(false);
- expect(getters.isLastUnresolvedDiscussion(state, localGetters)('456')).toBe(false);
- });
- });
-
- describe('nextUnresolvedDiscussionId', () => {
- const localGetters = {
- unresolvedDiscussionsIdsOrdered: () => ['123', '456', '789'],
- };
-
- it('should return the ID of the discussion after the ID provided', () => {
- expect(getters.nextUnresolvedDiscussionId(state, localGetters)('123')).toBe('456');
- expect(getters.nextUnresolvedDiscussionId(state, localGetters)('456')).toBe('789');
- expect(getters.nextUnresolvedDiscussionId(state, localGetters)('789')).toBe(undefined);
- });
- });
-
- describe('firstUnresolvedDiscussionId', () => {
- const localGetters = {
- unresolvedDiscussionsIdsByDate: ['123', '456'],
- unresolvedDiscussionsIdsByDiff: ['abc', 'def'],
- };
-
- it('should return the first discussion id by diff when diffOrder param is true', () => {
- expect(getters.firstUnresolvedDiscussionId(state, localGetters)(true)).toBe('abc');
- });
-
- it('should return the first discussion id by date when diffOrder param is not true', () => {
- expect(getters.firstUnresolvedDiscussionId(state, localGetters)(false)).toBe('123');
- expect(getters.firstUnresolvedDiscussionId(state, localGetters)(undefined)).toBe('123');
- });
-
- it('should be falsy if all discussions are resolved', () => {
- const localGettersFalsy = {
- unresolvedDiscussionsIdsByDiff: [],
- unresolvedDiscussionsIdsByDate: [],
- };
-
- expect(getters.firstUnresolvedDiscussionId(state, localGettersFalsy)(true)).toBeFalsy();
- expect(getters.firstUnresolvedDiscussionId(state, localGettersFalsy)(false)).toBeFalsy();
- });
- });
});
diff --git a/spec/javascripts/pdf/page_spec.js b/spec/javascripts/pdf/page_spec.js
index 9c686748c10..ff1bfd7f650 100644
--- a/spec/javascripts/pdf/page_spec.js
+++ b/spec/javascripts/pdf/page_spec.js
@@ -30,7 +30,7 @@ describe('Page component', () => {
done();
})
.catch((error) => {
- console.error(error);
+ done.fail(error);
});
});
diff --git a/spec/javascripts/pipelines/graph/dropdown_job_component_spec.js b/spec/javascripts/pipelines/graph/dropdown_job_component_spec.js
new file mode 100644
index 00000000000..ff584396d61
--- /dev/null
+++ b/spec/javascripts/pipelines/graph/dropdown_job_component_spec.js
@@ -0,0 +1,93 @@
+import Vue from 'vue';
+import component from '~/pipelines/components/graph/dropdown_job_component.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+
+describe('dropdown job component', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ const mock = {
+ jobs: [
+ {
+ id: 4256,
+ name: '<img src=x onerror=alert(document.domain)>',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ tooltip: 'passed',
+ group: 'success',
+ details_path: '/root/ci-mock/builds/4256',
+ has_details: true,
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/root/ci-mock/builds/4256/retry',
+ method: 'post',
+ },
+ },
+ },
+ {
+ id: 4299,
+ name: 'test',
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ tooltip: 'passed',
+ group: 'success',
+ details_path: '/root/ci-mock/builds/4299',
+ has_details: true,
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/root/ci-mock/builds/4299/retry',
+ method: 'post',
+ },
+ },
+ },
+ ],
+ name: 'rspec:linux',
+ size: 2,
+ status: {
+ icon: 'status_success',
+ text: 'passed',
+ label: 'passed',
+ tooltip: 'passed',
+ group: 'success',
+ details_path: '/root/ci-mock/builds/4256',
+ has_details: true,
+ action: {
+ icon: 'retry',
+ title: 'Retry',
+ path: '/root/ci-mock/builds/4256/retry',
+ method: 'post',
+ },
+ },
+ };
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ beforeEach(() => {
+ vm = mountComponent(Component, { job: mock });
+ });
+
+ it('renders button with job name and size', () => {
+ expect(vm.$el.querySelector('button').textContent).toContain(mock.name);
+ expect(vm.$el.querySelector('button').textContent).toContain(mock.size);
+ });
+
+ it('renders dropdown with jobs', () => {
+ expect(vm.$el.querySelectorAll('.scrollable-menu>ul>li').length).toEqual(mock.jobs.length);
+ });
+
+ it('escapes tooltip title', () => {
+ expect(
+ vm.$el.querySelector('.js-pipeline-graph-job-link').getAttribute('data-original-title'),
+ ).toEqual(
+ '&lt;img src=x onerror=alert(document.domain)&gt; - passed',
+ );
+ });
+});
diff --git a/spec/javascripts/pipelines/graph/graph_component_spec.js b/spec/javascripts/pipelines/graph/graph_component_spec.js
index 713baa65a17..b6fa4272c8b 100644
--- a/spec/javascripts/pipelines/graph/graph_component_spec.js
+++ b/spec/javascripts/pipelines/graph/graph_component_spec.js
@@ -1,37 +1,33 @@
import Vue from 'vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
import graphComponent from '~/pipelines/components/graph/graph_component.vue';
import graphJSON from './mock_data';
describe('graph component', () => {
- preloadFixtures('static/graph.html.raw');
+ const GraphComponent = Vue.extend(graphComponent);
+ let component;
- let GraphComponent;
-
- beforeEach(() => {
- loadFixtures('static/graph.html.raw');
- GraphComponent = Vue.extend(graphComponent);
+ afterEach(() => {
+ component.$destroy();
});
describe('while is loading', () => {
it('should render a loading icon', () => {
- const component = new GraphComponent({
- propsData: {
- isLoading: true,
- pipeline: {},
- },
- }).$mount('#js-pipeline-graph-vue');
+ component = mountComponent(GraphComponent, {
+ isLoading: true,
+ pipeline: {},
+ });
+
expect(component.$el.querySelector('.loading-icon')).toBeDefined();
});
});
describe('with data', () => {
it('should render the graph', () => {
- const component = new GraphComponent({
- propsData: {
- isLoading: false,
- pipeline: graphJSON,
- },
- }).$mount('#js-pipeline-graph-vue');
+ component = mountComponent(GraphComponent, {
+ isLoading: false,
+ pipeline: graphJSON,
+ });
expect(component.$el.classList.contains('js-pipeline-graph')).toEqual(true);
@@ -52,4 +48,15 @@ describe('graph component', () => {
expect(component.$el.querySelector('.stage-column-list')).toBeDefined();
});
});
+
+ describe('capitalizeStageName', () => {
+ it('capitalizes and escapes stage name', () => {
+ component = mountComponent(GraphComponent, {
+ isLoading: false,
+ pipeline: graphJSON,
+ });
+
+ expect(component.$el.querySelector('.stage-column:nth-child(2) .stage-name').textContent.trim()).toEqual('Deploy &lt;img src=x onerror=alert(document.domain)&gt;');
+ });
+ });
});
diff --git a/spec/javascripts/pipelines/graph/job_component_spec.js b/spec/javascripts/pipelines/graph/job_component_spec.js
index 56476253ad0..215ce1e81b5 100644
--- a/spec/javascripts/pipelines/graph/job_component_spec.js
+++ b/spec/javascripts/pipelines/graph/job_component_spec.js
@@ -3,7 +3,7 @@ import jobComponent from '~/pipelines/components/graph/job_component.vue';
import mountComponent from 'spec/helpers/vue_mount_component_helper';
describe('pipeline graph job component', () => {
- let JobComponent;
+ const JobComponent = Vue.extend(jobComponent);
let component;
const mockJob = {
@@ -26,10 +26,6 @@ describe('pipeline graph job component', () => {
},
};
- beforeEach(() => {
- JobComponent = Vue.extend(jobComponent);
- });
-
afterEach(() => {
component.$destroy();
});
@@ -165,4 +161,24 @@ describe('pipeline graph job component', () => {
expect(component.$el.querySelector(tooltipBoundary)).toBeNull();
});
});
+
+ describe('tooltipText', () => {
+ it('escapes job name', () => {
+ component = mountComponent(JobComponent, {
+ job: {
+ id: 4259,
+ name: '<img src=x onerror=alert(document.domain)>',
+ status: {
+ icon: 'status_success',
+ label: 'success',
+ tooltip: 'failed',
+ },
+ },
+ });
+
+ expect(
+ component.$el.querySelector('.js-job-component-tooltip').getAttribute('data-original-title'),
+ ).toEqual('&lt;img src=x onerror=alert(document.domain)&gt; - failed');
+ });
+ });
});
diff --git a/spec/javascripts/pipelines/graph/mock_data.js b/spec/javascripts/pipelines/graph/mock_data.js
index b2161d54bce..a4a5d78f906 100644
--- a/spec/javascripts/pipelines/graph/mock_data.js
+++ b/spec/javascripts/pipelines/graph/mock_data.js
@@ -91,7 +91,7 @@ export default {
dropdown_path: '/root/ci-mock/pipelines/123/stage.json?stage=test',
},
{
- name: 'deploy',
+ name: 'deploy <img src=x onerror=alert(document.domain)>',
title: 'deploy: passed',
groups: [
{
diff --git a/spec/javascripts/pipelines/graph/stage_column_component_spec.js b/spec/javascripts/pipelines/graph/stage_column_component_spec.js
index 9d1e71fd117..f6e6bd3132e 100644
--- a/spec/javascripts/pipelines/graph/stage_column_component_spec.js
+++ b/spec/javascripts/pipelines/graph/stage_column_component_spec.js
@@ -1,8 +1,11 @@
import Vue from 'vue';
import stageColumnComponent from '~/pipelines/components/graph/stage_column_component.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
describe('stage column component', () => {
let component;
+ const StageColumnComponent = Vue.extend(stageColumnComponent);
+
const mockJob = {
id: 4250,
name: 'test',
@@ -22,7 +25,6 @@ describe('stage column component', () => {
};
beforeEach(() => {
- const StageColumnComponent = Vue.extend(stageColumnComponent);
const mockJobs = [];
for (let i = 0; i < 3; i += 1) {
@@ -31,12 +33,10 @@ describe('stage column component', () => {
mockJobs.push(mockedJob);
}
- component = new StageColumnComponent({
- propsData: {
- title: 'foo',
- jobs: mockJobs,
- },
- }).$mount();
+ component = mountComponent(StageColumnComponent, {
+ title: 'foo',
+ jobs: mockJobs,
+ });
});
it('should render provided title', () => {
@@ -46,4 +46,27 @@ describe('stage column component', () => {
it('should render the provided jobs', () => {
expect(component.$el.querySelectorAll('.builds-container > ul > li').length).toEqual(3);
});
+
+ describe('jobId', () => {
+ it('escapes job name', () => {
+ component = mountComponent(StageColumnComponent, {
+ jobs: [
+ {
+ id: 4259,
+ name: '<img src=x onerror=alert(document.domain)>',
+ status: {
+ icon: 'icon_status_success',
+ label: 'success',
+ tooltip: '<img src=x onerror=alert(document.domain)>',
+ },
+ },
+ ],
+ title: 'test',
+ });
+
+ expect(
+ component.$el.querySelector('.builds-container li').getAttribute('id'),
+ ).toEqual('ci-badge-&lt;img src=x onerror=alert(document.domain)&gt;');
+ });
+ });
});
diff --git a/spec/javascripts/reports/components/grouped_test_reports_app_spec.js b/spec/javascripts/reports/components/grouped_test_reports_app_spec.js
new file mode 100644
index 00000000000..d86e565036c
--- /dev/null
+++ b/spec/javascripts/reports/components/grouped_test_reports_app_spec.js
@@ -0,0 +1,163 @@
+import Vue from 'vue';
+import MockAdapter from 'axios-mock-adapter';
+import axios from '~/lib/utils/axios_utils';
+import state from '~/reports/store/state';
+import component from '~/reports/components/grouped_test_reports_app.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+import newFailedTestReports from '../mock_data/new_failures_report.json';
+import successTestReports from '../mock_data/no_failures_report.json';
+import mixedResultsTestReports from '../mock_data/new_and_fixed_failures_report.json';
+
+describe('Grouped Test Reports App', () => {
+ let vm;
+ let mock;
+ const Component = Vue.extend(component);
+
+ beforeEach(() => {
+ mock = new MockAdapter(axios);
+ });
+
+ afterEach(() => {
+ vm.$store.replaceState(state());
+ vm.$destroy();
+ mock.restore();
+ });
+
+ describe('with success result', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(200, successTestReports, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders success summary text', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.fa-spinner')).toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary contained no changed test results out of 11 total tests',
+ );
+
+ expect(vm.$el.textContent).toContain(
+ 'rspec:pg found no changed test results out of 8 total tests',
+ );
+ expect(vm.$el.textContent).toContain(
+ 'java ant found no changed test results out of 3 total tests',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with 204 result', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(204, {}, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders success summary text', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.fa-spinner')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary results are being parsed',
+ );
+
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with new failed result', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(200, newFailedTestReports, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders failed summary text + new badge', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.fa-spinner')).toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary contained 2 failed test results out of 11 total tests',
+ );
+
+ expect(vm.$el.textContent).toContain(
+ 'rspec:pg found 2 failed test results out of 8 total tests',
+ );
+ expect(vm.$el.textContent).toContain('New');
+ expect(vm.$el.textContent).toContain(
+ 'java ant found no changed test results out of 3 total tests',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with mixed results', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(200, mixedResultsTestReports, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders summary text', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.fa-spinner')).toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary contained 2 failed test results and 2 fixed test results out of 11 total tests',
+ );
+
+ expect(vm.$el.textContent).toContain(
+ 'rspec:pg found 1 failed test result and 2 fixed test results out of 8 total tests',
+ );
+ expect(vm.$el.textContent).toContain('New');
+ expect(vm.$el.textContent).toContain(
+ ' java ant found 1 failed test result out of 3 total tests',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('with error', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(500, {}, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders loading summary text with loading icon', done => {
+ setTimeout(() => {
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary failed loading results',
+ );
+ done();
+ }, 0);
+ });
+ });
+
+ describe('while loading', () => {
+ beforeEach(() => {
+ mock.onGet('test_results.json').reply(200, {}, {});
+ vm = mountComponent(Component, {
+ endpoint: 'test_results.json',
+ });
+ });
+
+ it('renders loading summary text with loading icon', done => {
+ expect(vm.$el.querySelector('.fa-spinner')).not.toBeNull();
+ expect(vm.$el.querySelector('.js-code-text').textContent.trim()).toEqual(
+ 'Test summary results are being parsed',
+ );
+
+ setTimeout(() => {
+ done();
+ }, 0);
+ });
+ });
+});
diff --git a/spec/javascripts/reports/components/modal_spec.js b/spec/javascripts/reports/components/modal_spec.js
new file mode 100644
index 00000000000..3a567c40eca
--- /dev/null
+++ b/spec/javascripts/reports/components/modal_spec.js
@@ -0,0 +1,45 @@
+import Vue from 'vue';
+import component from '~/reports/components/modal.vue';
+import state from '~/reports/store/state';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+import { trimText } from '../../helpers/vue_component_helper';
+
+describe('Grouped Test Reports Modal', () => {
+ const Component = Vue.extend(component);
+ const modalDataStructure = state().modal.data;
+
+ // populate data
+ modalDataStructure.execution_time.value = 0.009411;
+ modalDataStructure.system_output.value = 'Failure/Error: is_expected.to eq(3)\n\n';
+ modalDataStructure.class.value = 'link';
+
+ let vm;
+
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ title: 'Test#sum when a is 1 and b is 2 returns summary',
+ modalData: modalDataStructure,
+ });
+ });
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders code block', () => {
+ expect(vm.$el.querySelector('code').textContent).toEqual(modalDataStructure.system_output.value);
+ });
+
+ it('renders link', () => {
+ expect(vm.$el.querySelector('.js-modal-link').getAttribute('href')).toEqual(modalDataStructure.class.value);
+ expect(trimText(vm.$el.querySelector('.js-modal-link').textContent)).toEqual(modalDataStructure.class.value);
+ });
+
+ it('renders miliseconds', () => {
+ expect(vm.$el.textContent).toContain(`${modalDataStructure.execution_time.value} ms`);
+ });
+
+ it('render title', () => {
+ expect(trimText(vm.$el.querySelector('.modal-title').textContent)).toEqual('Test#sum when a is 1 and b is 2 returns summary');
+ });
+});
diff --git a/spec/javascripts/reports/components/test_issue_body_spec.js b/spec/javascripts/reports/components/test_issue_body_spec.js
new file mode 100644
index 00000000000..0ea81f714e7
--- /dev/null
+++ b/spec/javascripts/reports/components/test_issue_body_spec.js
@@ -0,0 +1,71 @@
+import Vue from 'vue';
+import component from '~/reports/components/test_issue_body.vue';
+import createStore from '~/reports/store';
+import { mountComponentWithStore } from '../../helpers/vue_mount_component_helper';
+import { trimText } from '../../helpers/vue_component_helper';
+import { issue } from '../mock_data/mock_data';
+
+describe('Test Issue body', () => {
+ let vm;
+ const Component = Vue.extend(component);
+ const store = createStore();
+
+ const commonProps = {
+ issue,
+ status: 'failed',
+ };
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ describe('on click', () => {
+ it('calls openModal action', () => {
+ vm = mountComponentWithStore(Component, {
+ store,
+ props: commonProps,
+ });
+
+ spyOn(vm, 'openModal');
+
+ vm.$el.querySelector('button').click();
+ expect(vm.openModal).toHaveBeenCalledWith({
+ issue: commonProps.issue,
+ });
+ });
+ });
+
+ describe('is new', () => {
+ beforeEach(() => {
+ vm = mountComponentWithStore(Component, {
+ store,
+ props: Object.assign({}, commonProps, { isNew: true }),
+ });
+ });
+
+ it('renders issue name', () => {
+ expect(vm.$el.textContent).toContain(commonProps.issue.name);
+ });
+
+ it('renders new badge', () => {
+ expect(trimText(vm.$el.querySelector('.badge').textContent)).toEqual('New');
+ });
+ });
+
+ describe('not new', () => {
+ beforeEach(() => {
+ vm = mountComponentWithStore(Component, {
+ store,
+ props: commonProps,
+ });
+ });
+
+ it('renders issue name', () => {
+ expect(vm.$el.textContent).toContain(commonProps.issue.name);
+ });
+
+ it('does not renders new badge', () => {
+ expect(vm.$el.querySelector('.badge')).toEqual(null);
+ });
+ });
+});
diff --git a/spec/javascripts/reports/mock_data/mock_data.js b/spec/javascripts/reports/mock_data/mock_data.js
new file mode 100644
index 00000000000..0d90253bad2
--- /dev/null
+++ b/spec/javascripts/reports/mock_data/mock_data.js
@@ -0,0 +1,8 @@
+// eslint-disable-next-line import/prefer-default-export
+export const issue = {
+ result: 'failure',
+ name: 'Test#sum when a is 1 and b is 2 returns summary',
+ execution_time: 0.009411,
+ system_output:
+ "Failure/Error: is_expected.to eq(3)\n\n expected: 3\n got: -1\n\n (compared using ==)\n./spec/test_spec.rb:12:in `block (4 levels) in \u003ctop (required)\u003e'",
+};
diff --git a/spec/javascripts/reports/mock_data/new_and_fixed_failures_report.json b/spec/javascripts/reports/mock_data/new_and_fixed_failures_report.json
new file mode 100644
index 00000000000..ceaf894375a
--- /dev/null
+++ b/spec/javascripts/reports/mock_data/new_and_fixed_failures_report.json
@@ -0,0 +1 @@
+{"status":"failed","summary":{"total":11,"resolved":2,"failed":2},"suites":[{"name":"rspec:pg","status":"failed","summary":{"total":8,"resolved":2,"failed":1},"new_failures":[{"status":"failed","name":"Test#subtract when a is 2 and b is 1 returns correct result","execution_time":0.00908,"system_output":"Failure/Error: is_expected.to eq(1)\n\n expected: 1\n got: 3\n\n (compared using ==)\n./spec/test_spec.rb:43:in `block (4 levels) in <top (required)>'"}],"resolved_failures":[{"status":"success","name":"Test#sum when a is 1 and b is 2 returns summary","execution_time":0.000318,"system_output":null},{"status":"success","name":"Test#sum when a is 100 and b is 200 returns summary","execution_time":0.000074,"system_output":null}],"existing_failures":[]},{"name":"java ant","status":"failed","summary":{"total":3,"resolved":0,"failed":1},"new_failures":[],"resolved_failures":[],"existing_failures":[{"status":"failed","name":"sumTest","execution_time":0.004,"system_output":"junit.framework.AssertionFailedError: expected:<3> but was:<-1>\n\tat CalculatorTest.sumTest(Unknown Source)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n"}]}]} \ No newline at end of file
diff --git a/spec/javascripts/reports/mock_data/new_failures_report.json b/spec/javascripts/reports/mock_data/new_failures_report.json
new file mode 100644
index 00000000000..930efe16f65
--- /dev/null
+++ b/spec/javascripts/reports/mock_data/new_failures_report.json
@@ -0,0 +1 @@
+{"summary":{"total":11,"resolved":0,"failed":2},"suites":[{"name":"rspec:pg","summary":{"total":8,"resolved":0,"failed":2},"new_failures":[{"result":"failure","name":"Test#sum when a is 1 and b is 2 returns summary","execution_time":0.009411,"system_output":"Failure/Error: is_expected.to eq(3)\n\n expected: 3\n got: -1\n\n (compared using ==)\n./spec/test_spec.rb:12:in `block (4 levels) in <top (required)>'"},{"result":"failure","name":"Test#sum when a is 100 and b is 200 returns summary","execution_time":0.000162,"system_output":"Failure/Error: is_expected.to eq(300)\n\n expected: 300\n got: -100\n\n (compared using ==)\n./spec/test_spec.rb:21:in `block (4 levels) in <top (required)>'"}],"resolved_failures":[],"existing_failures":[]},{"name":"java ant","summary":{"total":3,"resolved":0,"failed":0},"new_failures":[],"resolved_failures":[],"existing_failures":[]}]} \ No newline at end of file
diff --git a/spec/javascripts/reports/mock_data/no_failures_report.json b/spec/javascripts/reports/mock_data/no_failures_report.json
new file mode 100644
index 00000000000..6c0675ff7dc
--- /dev/null
+++ b/spec/javascripts/reports/mock_data/no_failures_report.json
@@ -0,0 +1 @@
+{"status":"success","summary":{"total":11,"resolved":0,"failed":0},"suites":[{"name":"rspec:pg","status":"success","summary":{"total":8,"resolved":0,"failed":0},"new_failures":[],"resolved_failures":[],"existing_failures":[]},{"name":"java ant","status":"success","summary":{"total":3,"resolved":0,"failed":0},"new_failures":[],"resolved_failures":[],"existing_failures":[]}]} \ No newline at end of file
diff --git a/spec/javascripts/reports/store/actions_spec.js b/spec/javascripts/reports/store/actions_spec.js
index c714c5af156..41137b50847 100644
--- a/spec/javascripts/reports/store/actions_spec.js
+++ b/spec/javascripts/reports/store/actions_spec.js
@@ -8,6 +8,8 @@ import {
clearEtagPoll,
receiveReportsSuccess,
receiveReportsError,
+ openModal,
+ setModalData,
} from '~/reports/store/actions';
import state from '~/reports/store/state';
import * as types from '~/reports/store/mutation_types';
@@ -56,7 +58,9 @@ describe('Reports Store Actions', () => {
describe('success', () => {
it('dispatches requestReports and receiveReportsSuccess ', done => {
- mock.onGet(`${TEST_HOST}/endpoint.json`).replyOnce(200, { summary: {}, suites: [{ name: 'rspec' }] });
+ mock
+ .onGet(`${TEST_HOST}/endpoint.json`)
+ .replyOnce(200, { summary: {}, suites: [{ name: 'rspec' }] });
testAction(
fetchReports,
@@ -68,7 +72,7 @@ describe('Reports Store Actions', () => {
type: 'requestReports',
},
{
- payload: { summary: {}, suites: [{ name: 'rspec' }] },
+ payload: { data: { summary: {}, suites: [{ name: 'rspec' }] }, status: 200 },
type: 'receiveReportsSuccess',
},
],
@@ -103,16 +107,27 @@ describe('Reports Store Actions', () => {
});
describe('receiveReportsSuccess', () => {
- it('should commit RECEIVE_REPORTS_SUCCESS mutation', done => {
+ it('should commit RECEIVE_REPORTS_SUCCESS mutation with 200', done => {
testAction(
receiveReportsSuccess,
- { summary: {} },
+ { data: { summary: {} }, status: 200 },
mockedState,
[{ type: types.RECEIVE_REPORTS_SUCCESS, payload: { summary: {} } }],
[],
done,
);
});
+
+ it('should not commit RECEIVE_REPORTS_SUCCESS mutation with 204', done => {
+ testAction(
+ receiveReportsSuccess,
+ { data: { summary: {} }, status: 204 },
+ mockedState,
+ [],
+ [],
+ done,
+ );
+ });
});
describe('receiveReportsError', () => {
@@ -127,4 +142,30 @@ describe('Reports Store Actions', () => {
);
});
});
+
+ describe('openModal', () => {
+ it('should dispatch setModalData', done => {
+ testAction(
+ openModal,
+ { name: 'foo' },
+ mockedState,
+ [],
+ [{ type: 'setModalData', payload: { name: 'foo' } }],
+ done,
+ );
+ });
+ });
+
+ describe('setModalData', () => {
+ it('should commit SET_ISSUE_MODAL_DATA', done => {
+ testAction(
+ setModalData,
+ { name: 'foo' },
+ mockedState,
+ [{ type: types.SET_ISSUE_MODAL_DATA, payload: { name: 'foo' } }],
+ [],
+ done,
+ );
+ });
+ });
});
diff --git a/spec/javascripts/reports/store/mutations_spec.js b/spec/javascripts/reports/store/mutations_spec.js
index 3e0b15438c3..8f99d2675a5 100644
--- a/spec/javascripts/reports/store/mutations_spec.js
+++ b/spec/javascripts/reports/store/mutations_spec.js
@@ -1,6 +1,7 @@
import state from '~/reports/store/state';
import mutations from '~/reports/store/mutations';
import * as types from '~/reports/store/mutation_types';
+import { issue } from '../mock_data/mock_data';
describe('Reports Store Mutations', () => {
let stateCopy;
@@ -42,24 +43,21 @@ describe('Reports Store Mutations', () => {
{
name: 'StringHelper#concatenate when a is git and b is lab returns summary',
execution_time: 0.0092435,
- system_output:
- 'Failure/Error: is_expected.to eq(\'gitlab\')',
+ system_output: "Failure/Error: is_expected.to eq('gitlab')",
},
],
resolved_failures: [
{
name: 'StringHelper#concatenate when a is git and b is lab returns summary',
execution_time: 0.009235,
- system_output:
- 'Failure/Error: is_expected.to eq(\'gitlab\')',
+ system_output: "Failure/Error: is_expected.to eq('gitlab')",
},
],
existing_failures: [
{
name: 'StringHelper#concatenate when a is git and b is lab returns summary',
execution_time: 1232.08,
- system_output:
- 'Failure/Error: is_expected.to eq(\'gitlab\')',
+ system_output: "Failure/Error: is_expected.to eq('gitlab')",
},
],
},
@@ -89,6 +87,7 @@ describe('Reports Store Mutations', () => {
beforeEach(() => {
mutations[types.RECEIVE_REPORTS_ERROR](stateCopy);
});
+
it('should reset isLoading', () => {
expect(stateCopy.isLoading).toEqual(false);
});
@@ -97,5 +96,25 @@ describe('Reports Store Mutations', () => {
expect(stateCopy.hasError).toEqual(true);
});
+ it('should reset reports', () => {
+ expect(stateCopy.reports).toEqual([]);
+ });
+ });
+
+ describe('SET_ISSUE_MODAL_DATA', () => {
+ beforeEach(() => {
+ mutations[types.SET_ISSUE_MODAL_DATA](stateCopy, {
+ issue,
+ });
+ });
+
+ it('should set modal title', () => {
+ expect(stateCopy.modal.title).toEqual(issue.name);
+ });
+
+ it('should set modal data', () => {
+ expect(stateCopy.modal.data.execution_time.value).toEqual(issue.execution_time);
+ expect(stateCopy.modal.data.system_output.value).toEqual(issue.system_output);
+ });
});
});
diff --git a/spec/javascripts/reports/store/utils_spec.js b/spec/javascripts/reports/store/utils_spec.js
new file mode 100644
index 00000000000..1679d120db2
--- /dev/null
+++ b/spec/javascripts/reports/store/utils_spec.js
@@ -0,0 +1,138 @@
+import * as utils from '~/reports/store/utils';
+import {
+ STATUS_FAILED,
+ STATUS_SUCCESS,
+ ICON_WARNING,
+ ICON_SUCCESS,
+ ICON_NOTFOUND,
+} from '~/reports/constants';
+
+describe('Reports store utils', () => {
+ describe('summaryTextbuilder', () => {
+ it('should render text for no changed results in multiple tests', () => {
+ const name = 'Test summary';
+ const data = { total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe('Test summary contained no changed test results out of 10 total tests');
+ });
+
+ it('should render text for no changed results in one test', () => {
+ const name = 'Test summary';
+ const data = { total: 1 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe('Test summary contained no changed test results out of 1 total test');
+ });
+
+ it('should render text for multiple failed results', () => {
+ const name = 'Test summary';
+ const data = { failed: 3, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe('Test summary contained 3 failed test results out of 10 total tests');
+ });
+
+ it('should render text for multiple fixed results', () => {
+ const name = 'Test summary';
+ const data = { resolved: 4, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe('Test summary contained 4 fixed test results out of 10 total tests');
+ });
+
+ it('should render text for multiple fixed, and multiple failed results', () => {
+ const name = 'Test summary';
+ const data = { failed: 3, resolved: 4, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary contained 3 failed test results and 4 fixed test results out of 10 total tests',
+ );
+ });
+
+ it('should render text for a singular fixed, and a singular failed result', () => {
+ const name = 'Test summary';
+ const data = { failed: 1, resolved: 1, total: 10 };
+ const result = utils.summaryTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Test summary contained 1 failed test result and 1 fixed test result out of 10 total tests',
+ );
+ });
+ });
+
+ describe('reportTextBuilder', () => {
+ it('should render text for no changed results in multiple tests', () => {
+ const name = 'Rspec';
+ const data = { total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe('Rspec found no changed test results out of 10 total tests');
+ });
+
+ it('should render text for no changed results in one test', () => {
+ const name = 'Rspec';
+ const data = { total: 1 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe('Rspec found no changed test results out of 1 total test');
+ });
+
+ it('should render text for multiple failed results', () => {
+ const name = 'Rspec';
+ const data = { failed: 3, total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe('Rspec found 3 failed test results out of 10 total tests');
+ });
+
+ it('should render text for multiple fixed results', () => {
+ const name = 'Rspec';
+ const data = { resolved: 4, total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe('Rspec found 4 fixed test results out of 10 total tests');
+ });
+
+ it('should render text for multiple fixed, and multiple failed results', () => {
+ const name = 'Rspec';
+ const data = { failed: 3, resolved: 4, total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Rspec found 3 failed test results and 4 fixed test results out of 10 total tests',
+ );
+ });
+
+ it('should render text for a singular fixed, and a singular failed result', () => {
+ const name = 'Rspec';
+ const data = { failed: 1, resolved: 1, total: 10 };
+ const result = utils.reportTextBuilder(name, data);
+
+ expect(result).toBe(
+ 'Rspec found 1 failed test result and 1 fixed test result out of 10 total tests',
+ );
+ });
+ });
+
+ describe('statusIcon', () => {
+ describe('with failed status', () => {
+ it('returns ICON_WARNING', () => {
+ expect(utils.statusIcon(STATUS_FAILED)).toEqual(ICON_WARNING);
+ });
+ });
+
+ describe('with success status', () => {
+ it('returns ICON_SUCCESS', () => {
+ expect(utils.statusIcon(STATUS_SUCCESS)).toEqual(ICON_SUCCESS);
+ });
+ });
+
+ describe('without a status', () => {
+ it('returns ICON_NOTFOUND', () => {
+ expect(utils.statusIcon()).toEqual(ICON_NOTFOUND);
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/sidebar/assignees_spec.js b/spec/javascripts/sidebar/assignees_spec.js
index 4e4343812bd..843e7002180 100644
--- a/spec/javascripts/sidebar/assignees_spec.js
+++ b/spec/javascripts/sidebar/assignees_spec.js
@@ -102,13 +102,13 @@ describe('Assignee component', () => {
},
}).$mount();
- expect(component.$el.querySelector('.author_link')).not.toBeNull();
+ expect(component.$el.querySelector('.author-link')).not.toBeNull();
// The image
- expect(component.$el.querySelector('.author_link img').getAttribute('src')).toEqual(UsersMock.user.avatar);
+ expect(component.$el.querySelector('.author-link img').getAttribute('src')).toEqual(UsersMock.user.avatar);
// Author name
- expect(component.$el.querySelector('.author_link .author').innerText.trim()).toEqual(UsersMock.user.name);
+ expect(component.$el.querySelector('.author-link .author').innerText.trim()).toEqual(UsersMock.user.name);
// Username
- expect(component.$el.querySelector('.author_link .username').innerText.trim()).toEqual(`@${UsersMock.user.username}`);
+ expect(component.$el.querySelector('.author-link .username').innerText.trim()).toEqual(`@${UsersMock.user.username}`);
});
it('has the root url present in the assigneeUrl method', () => {
diff --git a/spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js b/spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js
index b58de607ece..9dff52a9d49 100644
--- a/spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js
+++ b/spec/javascripts/sidebar/components/time_tracking/time_tracker_spec.js
@@ -1,4 +1,3 @@
-import $ from 'jquery';
import Vue from 'vue';
import TimeTracker from '~/sidebar/components/time_tracking/time_tracker.vue';
@@ -94,21 +93,14 @@ describe('Issuable Time Tracker', () => {
describe('Remaining meter', () => {
it('should display the remaining meter with the correct width', done => {
Vue.nextTick(() => {
- const meterWidth = vm.$el.querySelector('.time-tracking-comparison-pane .meter-fill')
- .style.width;
- const correctWidth = '5%';
-
- expect(meterWidth).toBe(correctWidth);
+ expect(vm.$el.querySelector('.time-tracking-comparison-pane .progress[value="5"]')).not.toBeNull();
done();
});
});
it('should display the remaining meter with the correct background color when within estimate', done => {
Vue.nextTick(() => {
- const styledMeter = $(vm.$el).find(
- '.time-tracking-comparison-pane .within_estimate .meter-fill',
- );
- expect(styledMeter.length).toBe(1);
+ expect(vm.$el.querySelector('.time-tracking-comparison-pane .progress[variant="primary"]')).not.toBeNull();
done();
});
});
@@ -117,10 +109,7 @@ describe('Issuable Time Tracker', () => {
vm.time_estimate = 100000;
vm.time_spent = 20000000;
Vue.nextTick(() => {
- const styledMeter = $(vm.$el).find(
- '.time-tracking-comparison-pane .over_estimate .meter-fill',
- );
- expect(styledMeter.length).toBe(1);
+ expect(vm.$el.querySelector('.time-tracking-comparison-pane .progress[variant="danger"]')).not.toBeNull();
done();
});
});
diff --git a/spec/javascripts/test_bundle.js b/spec/javascripts/test_bundle.js
index bc00fdfd73c..5f4f4c26d74 100644
--- a/spec/javascripts/test_bundle.js
+++ b/spec/javascripts/test_bundle.js
@@ -1,4 +1,6 @@
-/* eslint-disable jasmine/no-global-setup, jasmine/no-unsafe-spy, no-underscore-dangle */
+/* eslint-disable
+ jasmine/no-global-setup, jasmine/no-unsafe-spy, no-underscore-dangle, no-console
+*/
import $ from 'jquery';
import 'vendor/jasmine-jquery';
@@ -91,6 +93,19 @@ beforeEach(() => {
Vue.http.interceptors = builtinVueHttpInterceptors.slice();
});
+let longRunningTestTimeoutHandle;
+
+beforeEach((done) => {
+ longRunningTestTimeoutHandle = setTimeout(() => {
+ done.fail('Test is running too long!');
+ }, 2000);
+ done();
+});
+
+afterEach(() => {
+ clearTimeout(longRunningTestTimeoutHandle);
+});
+
const axiosDefaultAdapter = getDefaultAdapter();
// render all of our tests
diff --git a/spec/javascripts/vue_shared/components/bar_chart_spec.js b/spec/javascripts/vue_shared/components/bar_chart_spec.js
new file mode 100644
index 00000000000..7e91cd6f63f
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/bar_chart_spec.js
@@ -0,0 +1,85 @@
+import Vue from 'vue';
+import BarChart from '~/vue_shared/components/bar_chart.vue';
+import mountComponent from 'spec/helpers/vue_mount_component_helper';
+
+function getRandomArbitrary(min, max) {
+ return Math.random() * (max - min) + min;
+}
+
+function generateRandomData(dataNumber) {
+ const randomGraphData = [];
+
+ for (let i = 1; i <= dataNumber; i += 1) {
+ randomGraphData.push({
+ name: `random ${i}`,
+ value: parseInt(getRandomArbitrary(1, 8), 10),
+ });
+ }
+
+ return randomGraphData;
+}
+
+describe('Bar chart component', () => {
+ let barChart;
+ const graphData = generateRandomData(10);
+
+ beforeEach(() => {
+ const BarChartComponent = Vue.extend(BarChart);
+
+ barChart = mountComponent(BarChartComponent, {
+ graphData,
+ yAxisLabel: 'data',
+ });
+ });
+
+ afterEach(() => {
+ barChart.$destroy();
+ });
+
+ it('calculates the padding for even distribution across bars', () => {
+ barChart.vbWidth = 1000;
+ const result = barChart.calculatePadding(30);
+
+ // since padding can't be higher than 1 and lower than 0
+ // for more info: https://github.com/d3/d3-scale#band-scales
+ expect(result).not.toBeLessThan(0);
+ expect(result).not.toBeGreaterThan(1);
+ });
+
+ it('formats the tooltip title', () => {
+ const tooltipTitle = barChart.setTooltipTitle(barChart.graphData[0]);
+
+ expect(tooltipTitle).toContain('random 1:');
+ });
+
+ it('has a translates the bar graphs on across the X axis', () => {
+ barChart.panX = 100;
+
+ expect(barChart.barTranslationTransform).toEqual('translate(100, 0)');
+ });
+
+ it('translates the scroll indicator to the far right side', () => {
+ barChart.vbWidth = 500;
+
+ expect(barChart.scrollIndicatorTransform).toEqual('translate(420, 0)');
+ });
+
+ it('translates the x-axis to the bottom of the viewbox and pan coordinates', () => {
+ barChart.panX = 100;
+ barChart.vbHeight = 250;
+
+ expect(barChart.xAxisLocation).toEqual('translate(100, 250)');
+ });
+
+ it('Contains a total of 4 ticks across the y axis', () => {
+ const ticks = barChart.$el.querySelector('.y-axis').querySelectorAll('.tick').length;
+
+ expect(ticks).toEqual(4);
+ });
+
+ it('rotates the x axis labels a total of 90 degress (CCW)', () => {
+ const xAxisLabel = barChart.$el.querySelector('.x-axis').querySelectorAll('text')[0];
+
+ expect(xAxisLabel.getAttribute('transform')).toEqual('rotate(-90)');
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/clipboard_button_spec.js b/spec/javascripts/vue_shared/components/clipboard_button_spec.js
index e135690349e..ea525b1e44f 100644
--- a/spec/javascripts/vue_shared/components/clipboard_button_spec.js
+++ b/spec/javascripts/vue_shared/components/clipboard_button_spec.js
@@ -6,31 +6,47 @@ describe('clipboard button', () => {
const Component = Vue.extend(clipboardButton);
let vm;
- beforeEach(() => {
- vm = mountComponent(Component, {
- text: 'copy me',
- title: 'Copy this value into Clipboard!',
- cssClass: 'btn-danger',
- });
- });
-
afterEach(() => {
vm.$destroy();
});
- it('renders a button for clipboard', () => {
- expect(vm.$el.tagName).toEqual('BUTTON');
- expect(vm.$el.getAttribute('data-clipboard-text')).toEqual('copy me');
- expect(vm.$el).toHaveSpriteIcon('duplicate');
- });
+ describe('without gfm', () => {
+ beforeEach(() => {
+ vm = mountComponent(Component, {
+ text: 'copy me',
+ title: 'Copy this value into Clipboard!',
+ cssClass: 'btn-danger',
+ });
+ });
- it('should have a tooltip with default values', () => {
- expect(vm.$el.getAttribute('data-original-title')).toEqual('Copy this value into Clipboard!');
- expect(vm.$el.getAttribute('data-placement')).toEqual('top');
- expect(vm.$el.getAttribute('data-container')).toEqual(null);
+ it('renders a button for clipboard', () => {
+ expect(vm.$el.tagName).toEqual('BUTTON');
+ expect(vm.$el.getAttribute('data-clipboard-text')).toEqual('copy me');
+ expect(vm.$el).toHaveSpriteIcon('duplicate');
+ });
+
+ it('should have a tooltip with default values', () => {
+ expect(vm.$el.getAttribute('data-original-title')).toEqual('Copy this value into Clipboard!');
+ expect(vm.$el.getAttribute('data-placement')).toEqual('top');
+ expect(vm.$el.getAttribute('data-container')).toEqual(null);
+ });
+
+ it('should render provided classname', () => {
+ expect(vm.$el.classList).toContain('btn-danger');
+ });
});
- it('should render provided classname', () => {
- expect(vm.$el.classList).toContain('btn-danger');
+ describe('with gfm', () => {
+ it('sets data-clipboard-text with gfm', () => {
+ vm = mountComponent(Component, {
+ text: 'copy me',
+ gfm: '`path/to/file`',
+ title: 'Copy this value into Clipboard!',
+ cssClass: 'btn-danger',
+ });
+ expect(vm.$el.getAttribute('data-clipboard-text')).toEqual(
+ '{"text":"copy me","gfm":"`path/to/file`"}',
+ );
+ });
});
});
diff --git a/spec/javascripts/vue_shared/components/code_block_spec.js b/spec/javascripts/vue_shared/components/code_block_spec.js
new file mode 100644
index 00000000000..6b91a20ff76
--- /dev/null
+++ b/spec/javascripts/vue_shared/components/code_block_spec.js
@@ -0,0 +1,33 @@
+import Vue from 'vue';
+import component from '~/vue_shared/components/code_block.vue';
+import mountComponent from '../../helpers/vue_mount_component_helper';
+
+describe('Code Block', () => {
+ const Component = Vue.extend(component);
+ let vm;
+
+ afterEach(() => {
+ vm.$destroy();
+ });
+
+ it('renders a code block with the provided code', () => {
+ const code =
+ "Failure/Error: is_expected.to eq(3)\n\n expected: 3\n got: -1\n\n (compared using ==)\n./spec/test_spec.rb:12:in `block (4 levels) in \u003ctop (required)\u003e'";
+
+ vm = mountComponent(Component, {
+ code,
+ });
+
+ expect(vm.$el.querySelector('code').textContent).toEqual(code);
+ });
+
+ it('escapes XSS injections', () => {
+ const code = 'CCC&lt;img src=x onerror=alert(document.domain)&gt;';
+
+ vm = mountComponent(Component, {
+ code,
+ });
+
+ expect(vm.$el.querySelector('code').textContent).toEqual(code);
+ });
+});
diff --git a/spec/javascripts/vue_shared/components/gl_modal_spec.js b/spec/javascripts/vue_shared/components/gl_modal_spec.js
index e4737714312..263824a102a 100644
--- a/spec/javascripts/vue_shared/components/gl_modal_spec.js
+++ b/spec/javascripts/vue_shared/components/gl_modal_spec.js
@@ -29,7 +29,7 @@ describe('GlModal', () => {
describe('without id', () => {
beforeEach(() => {
- vm = mountComponent(modalComponent, { });
+ vm = mountComponent(modalComponent, {});
});
it('does not add an id attribute to the modal', () => {
@@ -83,7 +83,7 @@ describe('GlModal', () => {
});
});
- it('works with data-toggle="modal"', (done) => {
+ it('works with data-toggle="modal"', done => {
setFixtures(`
<button id="modal-button" data-toggle="modal" data-target="#my-modal"></button>
<div id="modal-container"></div>
@@ -91,9 +91,13 @@ describe('GlModal', () => {
const modalContainer = document.getElementById('modal-container');
const modalButton = document.getElementById('modal-button');
- vm = mountComponent(modalComponent, {
- id: 'my-modal',
- }, modalContainer);
+ vm = mountComponent(
+ modalComponent,
+ {
+ id: 'my-modal',
+ },
+ modalContainer,
+ );
$(vm.$el).on('shown.bs.modal', () => done());
modalButton.click();
@@ -103,7 +107,7 @@ describe('GlModal', () => {
const dummyEvent = 'not really an event';
beforeEach(() => {
- vm = mountComponent(modalComponent, { });
+ vm = mountComponent(modalComponent, {});
spyOn(vm, '$emit');
});
@@ -122,11 +126,27 @@ describe('GlModal', () => {
expect(vm.$emit).toHaveBeenCalledWith('submit', dummyEvent);
});
});
+
+ describe('opened', () => {
+ it('emits a open event', () => {
+ vm.opened();
+
+ expect(vm.$emit).toHaveBeenCalledWith('open');
+ });
+ });
+
+ describe('closed', () => {
+ it('emits a closed event', () => {
+ vm.closed();
+
+ expect(vm.$emit).toHaveBeenCalledWith('closed');
+ });
+ });
});
describe('slots', () => {
const slotContent = 'this should go into the slot';
- const modalWithSlot = (slotName) => {
+ const modalWithSlot = slotName => {
let template;
if (slotName) {
template = `
diff --git a/spec/javascripts/vue_shared/components/identicon_spec.js b/spec/javascripts/vue_shared/components/identicon_spec.js
index 647680f00f7..0719800c682 100644
--- a/spec/javascripts/vue_shared/components/identicon_spec.js
+++ b/spec/javascripts/vue_shared/components/identicon_spec.js
@@ -25,19 +25,12 @@ describe('IdenticonComponent', () => {
vm.$destroy();
});
- describe('identiconStyles', () => {
- it('should return styles attribute value with `background-color` property', () => {
+ describe('identiconBackgroundClass', () => {
+ it('should return bg class based on entityId', () => {
vm.entityId = 4;
- expect(vm.identiconStyles).toBeDefined();
- expect(vm.identiconStyles.indexOf('background-color: #E0F2F1;') > -1).toBeTruthy();
- });
-
- it('should return styles attribute value with `color` property', () => {
- vm.entityId = 4;
-
- expect(vm.identiconStyles).toBeDefined();
- expect(vm.identiconStyles.indexOf('color: #555;') > -1).toBeTruthy();
+ expect(vm.identiconBackgroundClass).toBeDefined();
+ expect(vm.identiconBackgroundClass).toBe('bg5');
});
});
@@ -58,7 +51,7 @@ describe('IdenticonComponent', () => {
expect(vm.$el.nodeName).toBe('DIV');
expect(vm.$el.classList.contains('identicon')).toBeTruthy();
expect(vm.$el.classList.contains('s40')).toBeTruthy();
- expect(vm.$el.getAttribute('style').indexOf('background-color') > -1).toBeTruthy();
+ expect(vm.$el.classList.contains('bg2')).toBeTruthy();
vm.$destroy();
});
diff --git a/spec/javascripts/vue_shared/components/panel_resizer_spec.js b/spec/javascripts/vue_shared/components/panel_resizer_spec.js
index 8efcb54659d..f1e62069462 100644
--- a/spec/javascripts/vue_shared/components/panel_resizer_spec.js
+++ b/spec/javascripts/vue_shared/components/panel_resizer_spec.js
@@ -29,7 +29,7 @@ describe('Panel Resizer component', () => {
});
expect(vm.$el.tagName).toEqual('DIV');
- expect(vm.$el.getAttribute('class')).toBe('dragHandle dragleft');
+ expect(vm.$el.getAttribute('class')).toBe('drag-handle drag-left');
expect(vm.$el.getAttribute('style')).toBe('cursor: ew-resize;');
});
@@ -40,7 +40,7 @@ describe('Panel Resizer component', () => {
});
expect(vm.$el.tagName).toEqual('DIV');
- expect(vm.$el.getAttribute('class')).toBe('dragHandle dragright');
+ expect(vm.$el.getAttribute('class')).toBe('drag-handle drag-right');
});
it('drag the resizer', () => {
diff --git a/spec/javascripts/vue_shared/components/reports/report_issues_spec.js b/spec/javascripts/vue_shared/components/reports/report_issues_spec.js
deleted file mode 100644
index e69de29bb2d..00000000000
--- a/spec/javascripts/vue_shared/components/reports/report_issues_spec.js
+++ /dev/null
diff --git a/spec/javascripts/vue_shared/components/reports/report_section_spec.js b/spec/javascripts/vue_shared/components/reports/report_section_spec.js
index 07401181ffd..4e3986acb16 100644
--- a/spec/javascripts/vue_shared/components/reports/report_section_spec.js
+++ b/spec/javascripts/vue_shared/components/reports/report_section_spec.js
@@ -1,6 +1,6 @@
import Vue from 'vue';
import reportSection from '~/vue_shared/components/reports/report_section.vue';
-import mountComponent from 'spec/helpers/vue_mount_component_helper';
+import mountComponent, { mountComponentWithSlots } from 'spec/helpers/vue_mount_component_helper';
describe('Report section', () => {
let vm;
@@ -23,7 +23,7 @@ describe('Report section', () => {
describe('computed', () => {
beforeEach(() => {
vm = mountComponent(ReportSection, {
- type: 'codequality',
+ component: '',
status: 'SUCCESS',
loadingText: 'Loading codeclimate report',
errorText: 'foo',
@@ -89,7 +89,7 @@ describe('Report section', () => {
describe('when it is loading', () => {
it('should render loading indicator', () => {
vm = mountComponent(ReportSection, {
- type: 'codequality',
+ component: '',
status: 'LOADING',
loadingText: 'Loading codeclimate report',
errorText: 'foo',
@@ -103,7 +103,7 @@ describe('Report section', () => {
describe('with success status', () => {
beforeEach(() => {
vm = mountComponent(ReportSection, {
- type: 'codequality',
+ component: '',
status: 'SUCCESS',
loadingText: 'Loading codeclimate report',
errorText: 'foo',
@@ -161,7 +161,7 @@ describe('Report section', () => {
describe('with failed request', () => {
it('should render error indicator', () => {
vm = mountComponent(ReportSection, {
- type: 'codequality',
+ component: '',
status: 'ERROR',
loadingText: 'Loading codeclimate report',
errorText: 'Failed to load codeclimate report',
@@ -171,4 +171,27 @@ describe('Report section', () => {
expect(vm.$el.textContent.trim()).toEqual('Failed to load codeclimate report');
});
});
+
+ describe('with action buttons passed to the slot', () => {
+ beforeEach(() => {
+ vm = mountComponentWithSlots(ReportSection, {
+ props: {
+ status: 'SUCCESS',
+ successText: 'success',
+ hasIssues: true,
+ },
+ slots: {
+ actionButtons: ['Action!'],
+ },
+ });
+ });
+
+ it('should render the passed button', () => {
+ expect(vm.$el.textContent.trim()).toContain('Action!');
+ });
+
+ it('should still render the expand/collapse button', () => {
+ expect(vm.$el.querySelector('.js-collapse-btn').textContent.trim()).toEqual('Expand');
+ });
+ });
});
diff --git a/spec/lib/backup/repository_spec.rb b/spec/lib/backup/repository_spec.rb
index 92a27e308d2..c5a854b5660 100644
--- a/spec/lib/backup/repository_spec.rb
+++ b/spec/lib/backup/repository_spec.rb
@@ -73,37 +73,27 @@ describe Backup::Repository do
end
end
- describe '#delete_all_repositories', :seed_helper do
- shared_examples('delete_all_repositories') do
- before do
- allow(FileUtils).to receive(:mkdir_p).and_call_original
- allow(FileUtils).to receive(:mv).and_call_original
- end
-
- after(:all) do
- ensure_seeds
- end
-
- it 'removes all repositories' do
- # Sanity check: there should be something for us to delete
- expect(list_repositories).to include(File.join(SEED_STORAGE_PATH, TEST_REPO_PATH))
+ describe '#prepare_directories', :seed_helper do
+ before do
+ allow(FileUtils).to receive(:mkdir_p).and_call_original
+ allow(FileUtils).to receive(:mv).and_call_original
+ end
- subject.delete_all_repositories('default', Gitlab.config.repositories.storages['default'])
+ after(:all) do
+ ensure_seeds
+ end
- expect(list_repositories).to be_empty
- end
+ it' removes all repositories' do
+ # Sanity check: there should be something for us to delete
+ expect(list_repositories).to include(File.join(SEED_STORAGE_PATH, TEST_REPO_PATH))
- def list_repositories
- Dir[File.join(SEED_STORAGE_PATH, '*.git')]
- end
- end
+ subject.prepare_directories
- context 'with gitaly' do
- it_behaves_like 'delete_all_repositories'
+ expect(list_repositories).to be_empty
end
- context 'without gitaly', :skip_gitaly_mock do
- it_behaves_like 'delete_all_repositories'
+ def list_repositories
+ Dir[File.join(SEED_STORAGE_PATH, '*.git')]
end
end
diff --git a/spec/lib/banzai/filter/sanitization_filter_spec.rb b/spec/lib/banzai/filter/sanitization_filter_spec.rb
index d930c608b18..0b3c2390304 100644
--- a/spec/lib/banzai/filter/sanitization_filter_spec.rb
+++ b/spec/lib/banzai/filter/sanitization_filter_spec.rb
@@ -54,6 +54,18 @@ describe Banzai::Filter::SanitizationFilter do
expect(instance.whitelist[:transformers].size).to eq control_count
end
+ it 'customizes the whitelist only once for different instances' do
+ instance1 = described_class.new('Foo1')
+ instance2 = described_class.new('Foo2')
+ control_count = instance1.whitelist[:transformers].size
+
+ instance1.whitelist
+ instance2.whitelist
+
+ expect(instance1.whitelist[:transformers].size).to eq control_count
+ expect(instance2.whitelist[:transformers].size).to eq control_count
+ end
+
it 'sanitizes `class` attribute from all elements' do
act = %q{<pre class="code highlight white c"><code>&lt;span class="k"&gt;def&lt;/span&gt;</code></pre>}
exp = %q{<pre><code>&lt;span class="k"&gt;def&lt;/span&gt;</code></pre>}
diff --git a/spec/lib/banzai/pipeline/emoji_pipeline_spec.rb b/spec/lib/banzai/pipeline/emoji_pipeline_spec.rb
new file mode 100644
index 00000000000..744df3e0b96
--- /dev/null
+++ b/spec/lib/banzai/pipeline/emoji_pipeline_spec.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Banzai::Pipeline::EmojiPipeline do
+ def parse(text)
+ described_class.to_html(text, {})
+ end
+
+ it 'replaces emoji' do
+ expected_result = "Hello world #{Gitlab::Emoji.gl_emoji_tag('100')}"
+
+ expect(parse('Hello world :100:')).to eq(expected_result)
+ end
+
+ it 'filters out HTML tags' do
+ expected_result = "Hello &lt;b&gt;world&lt;/b&gt; #{Gitlab::Emoji.gl_emoji_tag('100')}"
+
+ expect(parse('Hello <b>world</b> :100:')).to eq(expected_result)
+ end
+end
diff --git a/spec/lib/gitlab/auth/activity_spec.rb b/spec/lib/gitlab/auth/activity_spec.rb
new file mode 100644
index 00000000000..07854cb1eba
--- /dev/null
+++ b/spec/lib/gitlab/auth/activity_spec.rb
@@ -0,0 +1,30 @@
+require 'fast_spec_helper'
+
+describe Gitlab::Auth::Activity do
+ describe '.each_counter' do
+ it 'has all static counters defined' do
+ described_class.each_counter do |counter|
+ expect(described_class).to respond_to(counter)
+ end
+ end
+
+ it 'has all static incrementers defined' do
+ described_class.each_counter do |counter|
+ expect(described_class).to respond_to("#{counter}_increment!")
+ end
+ end
+
+ it 'has all counters starting with `user_`' do
+ described_class.each_counter do |counter|
+ expect(counter).to start_with('user_')
+ end
+ end
+
+ it 'yields counter method, name and description' do
+ described_class.each_counter do |method, name, description|
+ expect(method).to eq "#{name}_counter"
+ expect(description).to start_with('Counter of')
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/auth/blocked_user_tracker_spec.rb b/spec/lib/gitlab/auth/blocked_user_tracker_spec.rb
index 43b68e69131..f39863fdda1 100644
--- a/spec/lib/gitlab/auth/blocked_user_tracker_spec.rb
+++ b/spec/lib/gitlab/auth/blocked_user_tracker_spec.rb
@@ -1,62 +1,30 @@
require 'spec_helper'
describe Gitlab::Auth::BlockedUserTracker do
- set(:user) { create(:user) }
+ describe '#log_blocked_user_activity!' do
+ context 'when user is not blocked' do
+ it 'does not log blocked user activity' do
+ expect_any_instance_of(SystemHooksService)
+ .not_to receive(:execute_hooks_for)
+ expect(Gitlab::AppLogger).not_to receive(:info)
- describe '.log_if_user_blocked' do
- it 'does not log if user failed to login due to undefined reason' do
- expect_any_instance_of(SystemHooksService).not_to receive(:execute_hooks_for)
+ user = create(:user)
- expect(described_class.log_if_user_blocked({})).to be_nil
- end
-
- it 'gracefully handles malformed environment variables' do
- env = { 'warden.options' => 'test' }
-
- expect(described_class.log_if_user_blocked(env)).to be_nil
- end
-
- context 'failed login due to blocked user' do
- let(:base_env) { { 'warden.options' => { message: User::BLOCKED_MESSAGE } } }
- let(:env) { base_env.merge(request_env) }
-
- subject { described_class.log_if_user_blocked(env) }
-
- before do
- expect_any_instance_of(SystemHooksService).to receive(:execute_hooks_for).with(user, :failed_login)
- end
-
- context 'via GitLab login' do
- let(:request_env) { { described_class::ACTIVE_RECORD_REQUEST_PARAMS => { 'user' => { 'login' => user.username } } } }
-
- it 'logs a blocked user' do
- user.block!
-
- expect(subject).to be_truthy
- end
-
- it 'logs a blocked user by e-mail' do
- user.block!
- env[described_class::ACTIVE_RECORD_REQUEST_PARAMS]['user']['login'] = user.email
-
- expect(subject).to be_truthy
- end
+ described_class.new(user, spy('auth')).log_activity!
end
+ end
- context 'via LDAP login' do
- let(:request_env) { { described_class::ACTIVE_RECORD_REQUEST_PARAMS => { 'username' => user.username } } }
-
- it 'logs a blocked user' do
- user.block!
-
- expect(subject).to be_truthy
- end
+ context 'when user is not blocked' do
+ it 'logs blocked user activity' do
+ user = create(:user, :blocked)
- it 'logs a LDAP blocked user' do
- user.ldap_block!
+ expect_any_instance_of(SystemHooksService)
+ .to receive(:execute_hooks_for)
+ .with(user, :failed_login)
+ expect(Gitlab::AppLogger).to receive(:info)
+ .with(/Failed login for blocked user/)
- expect(subject).to be_truthy
- end
+ described_class.new(user, spy('auth')).log_activity!
end
end
end
diff --git a/spec/lib/gitlab/background_migration/delete_diff_files_spec.rb b/spec/lib/gitlab/background_migration/delete_diff_files_spec.rb
index 64c994a268f..1969aed51da 100644
--- a/spec/lib/gitlab/background_migration/delete_diff_files_spec.rb
+++ b/spec/lib/gitlab/background_migration/delete_diff_files_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::BackgroundMigration::DeleteDiffFiles, :migration, schema: 20180619121030 do
+describe Gitlab::BackgroundMigration::DeleteDiffFiles, :migration, :sidekiq, schema: 20180619121030 do
describe '#perform' do
context 'when diff files can be deleted' do
let(:merge_request) { create(:merge_request, :merged) }
diff --git a/spec/lib/gitlab/background_migration/schedule_diff_files_deletion_spec.rb b/spec/lib/gitlab/background_migration/schedule_diff_files_deletion_spec.rb
index fb5093b0bd1..ec8ba0ce127 100644
--- a/spec/lib/gitlab/background_migration/schedule_diff_files_deletion_spec.rb
+++ b/spec/lib/gitlab/background_migration/schedule_diff_files_deletion_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::BackgroundMigration::ScheduleDiffFilesDeletion, :migration, schema: 20180619121030 do
+describe Gitlab::BackgroundMigration::ScheduleDiffFilesDeletion, :migration, :sidekiq, schema: 20180619121030 do
describe '#perform' do
let(:merge_request_diffs) { table(:merge_request_diffs) }
let(:merge_requests) { table(:merge_requests) }
diff --git a/spec/lib/gitlab/bare_repository_import/importer_spec.rb b/spec/lib/gitlab/bare_repository_import/importer_spec.rb
index 468f6ff6d24..6e21c846c0a 100644
--- a/spec/lib/gitlab/bare_repository_import/importer_spec.rb
+++ b/spec/lib/gitlab/bare_repository_import/importer_spec.rb
@@ -1,10 +1,11 @@
require 'spec_helper'
-describe Gitlab::BareRepositoryImport::Importer, repository: true do
+describe Gitlab::BareRepositoryImport::Importer, :seed_helper do
let!(:admin) { create(:admin) }
let!(:base_dir) { Dir.mktmpdir + '/' }
let(:bare_repository) { Gitlab::BareRepositoryImport::Repository.new(base_dir, File.join(base_dir, "#{project_path}.git")) }
let(:gitlab_shell) { Gitlab::Shell.new }
+ let(:source_project) { TEST_REPO_PATH }
subject(:importer) { described_class.new(admin, bare_repository) }
@@ -17,16 +18,11 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
after do
FileUtils.rm_rf(base_dir)
+ TestEnv.clean_test_path
+ ensure_seeds
Rainbow.enabled = @rainbow
end
- around do |example|
- # TODO migrate BareRepositoryImport https://gitlab.com/gitlab-org/gitaly/issues/953
- Gitlab::GitalyClient::StorageSettings.allow_disk_access do
- example.run
- end
- end
-
shared_examples 'importing a repository' do
describe '.execute' do
it 'creates a project for a repository in storage' do
@@ -86,8 +82,8 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
importer.create_project_if_needed
end
- it 'creates the Git repo on disk with the proper symlink for hooks' do
- create_bare_repository("#{project_path}.git")
+ it 'creates the Git repo on disk' do
+ prepare_repository("#{project_path}.git", source_project)
importer.create_project_if_needed
@@ -97,9 +93,6 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
expect(gitlab_shell.exists?(project.repository_storage, repo_path)).to be(true)
expect(gitlab_shell.exists?(project.repository_storage, hook_path)).to be(true)
-
- full_hook_path = File.join(project.repository.path_to_repo, 'hooks')
- expect(File.readlink(full_hook_path)).to eq(Gitlab.config.gitlab_shell.hooks_path)
end
context 'hashed storage enabled' do
@@ -148,7 +141,7 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
end
it 'creates the Git repo in disk' do
- create_bare_repository("#{project_path}.git")
+ prepare_repository("#{project_path}.git", source_project)
importer.create_project_if_needed
@@ -158,23 +151,23 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
expect(gitlab_shell.exists?(project.repository_storage, project.disk_path + '.wiki.git')).to be(true)
end
- it 'moves an existing project to the correct path' do
+ context 'with a repository already on disk' do
+ let!(:base_dir) { TestEnv.repos_path }
# This is a quick way to get a valid repository instead of copying an
# existing one. Since it's not persisted, the importer will try to
# create the project.
- project = build(:project, :legacy_storage, :repository)
- original_commit_count = project.repository.commit_count
-
- legacy_path = Gitlab.config.repositories.storages[project.repository_storage].legacy_disk_path
+ let(:project) { build(:project, :legacy_storage, :repository) }
+ let(:project_path) { project.full_path }
- bare_repo = Gitlab::BareRepositoryImport::Repository.new(legacy_path, project.repository.path)
- gitlab_importer = described_class.new(admin, bare_repo)
+ it 'moves an existing project to the correct path' do
+ original_commit_count = project.repository.commit_count
- expect(gitlab_importer).to receive(:create_project).and_call_original
+ expect(importer).to receive(:create_project).and_call_original
- new_project = gitlab_importer.create_project_if_needed
+ new_project = importer.create_project_if_needed
- expect(new_project.repository.commit_count).to eq(original_commit_count)
+ expect(new_project.repository.commit_count).to eq(original_commit_count)
+ end
end
end
@@ -185,8 +178,8 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
it_behaves_like 'importing a repository'
it 'creates the Wiki git repo in disk' do
- create_bare_repository("#{project_path}.git")
- create_bare_repository("#{project_path}.wiki.git")
+ prepare_repository("#{project_path}.git", source_project)
+ prepare_repository("#{project_path}.wiki.git", source_project)
expect(Projects::CreateService).to receive(:new).with(admin, hash_including(skip_wiki: true,
import_type: 'bare_repository')).and_call_original
@@ -213,8 +206,13 @@ describe Gitlab::BareRepositoryImport::Importer, repository: true do
end
end
- def create_bare_repository(project_path)
+ def prepare_repository(project_path, source_project)
repo_path = File.join(base_dir, project_path)
- Gitlab::Git::Repository.create(repo_path, bare: true)
+
+ return create_bare_repository(repo_path) unless source_project
+
+ cmd = %W(#{Gitlab.config.git.bin_path} clone --bare #{source_project} #{repo_path})
+
+ system(git_env, *cmd, chdir: SEED_STORAGE_PATH, out: '/dev/null', err: '/dev/null')
end
end
diff --git a/spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb b/spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb
new file mode 100644
index 00000000000..384329dda18
--- /dev/null
+++ b/spec/lib/gitlab/ci/build/artifacts/gzip_file_adapter_spec.rb
@@ -0,0 +1,56 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Build::Artifacts::GzipFileAdapter do
+ describe '#initialize' do
+ context 'when stream is passed' do
+ let(:stream) { File.open(expand_fixture_path('junit/junit.xml.gz'), 'rb') }
+
+ it 'initialized' do
+ expect { described_class.new(stream) }.not_to raise_error
+ end
+ end
+
+ context 'when stream is not passed' do
+ let(:stream) { nil }
+
+ it 'raises an error' do
+ expect { described_class.new(stream) }.to raise_error(described_class::InvalidStreamError)
+ end
+ end
+ end
+
+ describe '#each_blob' do
+ let(:adapter) { described_class.new(stream) }
+
+ context 'when stream is gzip file' do
+ context 'when gzip file contains one file' do
+ let(:stream) { File.open(expand_fixture_path('junit/junit.xml.gz'), 'rb') }
+
+ it 'iterates content and file_name' do
+ expect { |b| adapter.each_blob(&b) }
+ .to yield_with_args(fixture_file('junit/junit.xml'), 'rspec.xml')
+ end
+ end
+
+ context 'when gzip file contains three files' do
+ let(:stream) { File.open(expand_fixture_path('junit/junit_with_three_testsuites.xml.gz'), 'rb') }
+
+ it 'iterates content and file_name' do
+ expect { |b| adapter.each_blob(&b) }
+ .to yield_successive_args(
+ [fixture_file('junit/junit_with_three_testsuites_1.xml'), 'rspec-3.xml'],
+ [fixture_file('junit/junit_with_three_testsuites_2.xml'), 'rspec-1.xml'],
+ [fixture_file('junit/junit_with_three_testsuites_3.xml'), 'rspec-2.xml'])
+ end
+ end
+ end
+
+ context 'when stream is zip file' do
+ let(:stream) { File.open(expand_fixture_path('ci_build_artifacts.zip'), 'rb') }
+
+ it 'raises an error' do
+ expect { |b| adapter.each_blob(&b) }.to raise_error(described_class::InvalidStreamError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb b/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
index 5c31423fdee..d48aac15f28 100644
--- a/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/artifacts_spec.rb
@@ -18,6 +18,14 @@ describe Gitlab::Ci::Config::Entry::Artifacts do
expect(entry).to be_valid
end
end
+
+ context "when value includes 'reports' keyword" do
+ let(:config) { { paths: %w[public/], reports: { junit: 'junit.xml' } } }
+
+ it 'returns general artifact and report-type artifacts configuration' do
+ expect(entry.value).to eq config
+ end
+ end
end
context 'when entry value is not correct' do
@@ -39,6 +47,15 @@ describe Gitlab::Ci::Config::Entry::Artifacts do
.to include 'artifacts config contains unknown keys: test'
end
end
+
+ context "when 'reports' keyword is not hash" do
+ let(:config) { { paths: %w[public/], reports: 'junit.xml' } }
+
+ it 'reports error' do
+ expect(entry.errors)
+ .to include 'artifacts reports should be a hash'
+ end
+ end
end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/commands_spec.rb b/spec/lib/gitlab/ci/config/entry/commands_spec.rb
index afa4a089418..8934aeb83db 100644
--- a/spec/lib/gitlab/ci/config/entry/commands_spec.rb
+++ b/spec/lib/gitlab/ci/config/entry/commands_spec.rb
@@ -41,8 +41,7 @@ describe Gitlab::Ci::Config::Entry::Commands do
describe '#errors' do
it 'saves errors' do
expect(entry.errors)
- .to include 'commands config should be a ' \
- 'string or an array of strings'
+ .to include 'commands config should be an array of strings or a string'
end
end
end
diff --git a/spec/lib/gitlab/ci/config/entry/reports_spec.rb b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
new file mode 100644
index 00000000000..b3a3a6bee1d
--- /dev/null
+++ b/spec/lib/gitlab/ci/config/entry/reports_spec.rb
@@ -0,0 +1,53 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Config::Entry::Reports do
+ let(:entry) { described_class.new(config) }
+
+ describe 'validation' do
+ context 'when entry config value is correct' do
+ let(:config) { { junit: %w[junit.xml] } }
+
+ describe '#value' do
+ it 'returns artifacs configuration' do
+ expect(entry.value).to eq config
+ end
+ end
+
+ describe '#valid?' do
+ it 'is valid' do
+ expect(entry).to be_valid
+ end
+ end
+
+ context 'when value is not array' do
+ let(:config) { { junit: 'junit.xml' } }
+
+ it 'converts to array' do
+ expect(entry.value).to eq({ junit: ['junit.xml'] } )
+ end
+ end
+ end
+
+ context 'when entry value is not correct' do
+ describe '#errors' do
+ context 'when value of attribute is invalid' do
+ let(:config) { { junit: 10 } }
+
+ it 'reports error' do
+ expect(entry.errors)
+ .to include 'reports junit should be an array of strings or a string'
+ end
+ end
+
+ context 'when there is an unknown key present' do
+ let(:config) { { codeclimate: 'codeclimate.json' } }
+
+ it 'reports error' do
+ expect(entry.errors)
+ .to include 'reports config contains unknown keys: codeclimate'
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/parsers/junit_spec.rb b/spec/lib/gitlab/ci/parsers/junit_spec.rb
new file mode 100644
index 00000000000..f7ec86f5385
--- /dev/null
+++ b/spec/lib/gitlab/ci/parsers/junit_spec.rb
@@ -0,0 +1,118 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Parsers::Junit do
+ describe '#parse!' do
+ subject { described_class.new.parse!(junit, test_suite) }
+
+ let(:test_suite) { Gitlab::Ci::Reports::TestSuite.new('rspec') }
+ let(:test_cases) { flattened_test_cases(test_suite) }
+
+ context 'when data is JUnit style XML' do
+ context 'when there are no test cases' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuite></testsuite>
+ EOF
+ end
+
+ it 'raises an error and does not add any test cases' do
+ expect { subject }.to raise_error(described_class::JunitParserError)
+
+ expect(test_cases.count).to eq(0)
+ end
+ end
+
+ context 'when there is a test case' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuite>
+ <testcase classname='Calculator' name='sumTest1' time='0.01'></testcase>
+ </testsuite>
+ EOF
+ end
+
+ it 'parses XML and adds a test case to a suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases[0].classname).to eq('Calculator')
+ expect(test_cases[0].name).to eq('sumTest1')
+ expect(test_cases[0].execution_time).to eq(0.01)
+ end
+ end
+
+ context 'when there are two test cases' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuite>
+ <testcase classname='Calculator' name='sumTest1' time='0.01'></testcase>
+ <testcase classname='Calculator' name='sumTest2' time='0.02'></testcase>
+ </testsuite>
+ EOF
+ end
+
+ it 'parses XML and adds test cases to a suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases[0].classname).to eq('Calculator')
+ expect(test_cases[0].name).to eq('sumTest1')
+ expect(test_cases[0].execution_time).to eq(0.01)
+ expect(test_cases[1].classname).to eq('Calculator')
+ expect(test_cases[1].name).to eq('sumTest2')
+ expect(test_cases[1].execution_time).to eq(0.02)
+ end
+ end
+
+ context 'when there are two test suites' do
+ let(:junit) do
+ <<-EOF.strip_heredoc
+ <testsuites>
+ <testsuite>
+ <testcase classname='Calculator' name='sumTest1' time='0.01'></testcase>
+ <testcase classname='Calculator' name='sumTest2' time='0.02'></testcase>
+ </testsuite>
+ <testsuite>
+ <testcase classname='Statemachine' name='happy path' time='100'></testcase>
+ <testcase classname='Statemachine' name='unhappy path' time='200'></testcase>
+ </testsuite>
+ </testsuites>
+ EOF
+ end
+
+ it 'parses XML and adds test cases to a suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_cases[0].classname).to eq('Calculator')
+ expect(test_cases[0].name).to eq('sumTest1')
+ expect(test_cases[0].execution_time).to eq(0.01)
+ expect(test_cases[1].classname).to eq('Calculator')
+ expect(test_cases[1].name).to eq('sumTest2')
+ expect(test_cases[1].execution_time).to eq(0.02)
+ expect(test_cases[2].classname).to eq('Statemachine')
+ expect(test_cases[2].name).to eq('happy path')
+ expect(test_cases[2].execution_time).to eq(100)
+ expect(test_cases[3].classname).to eq('Statemachine')
+ expect(test_cases[3].name).to eq('unhappy path')
+ expect(test_cases[3].execution_time).to eq(200)
+ end
+ end
+ end
+
+ context 'when data is not JUnit style XML' do
+ let(:junit) { { testsuite: 'abc' }.to_json }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(described_class::JunitParserError)
+ end
+ end
+
+ private
+
+ def flattened_test_cases(test_suite)
+ test_suite.test_cases.map do |status, value|
+ value.map do |key, test_case|
+ test_case
+ end
+ end.flatten
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/parsers_spec.rb b/spec/lib/gitlab/ci/parsers_spec.rb
new file mode 100644
index 00000000000..2fa83c4abae
--- /dev/null
+++ b/spec/lib/gitlab/ci/parsers_spec.rb
@@ -0,0 +1,23 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Parsers do
+ describe '.fabricate!' do
+ subject { described_class.fabricate!(file_type) }
+
+ context 'when file_type exists' do
+ let(:file_type) { 'junit' }
+
+ it 'fabricates the class' do
+ is_expected.to be_a(described_class::Junit)
+ end
+ end
+
+ context 'when file_type does not exist' do
+ let(:file_type) { 'undefined' }
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(NameError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_case_spec.rb b/spec/lib/gitlab/ci/reports/test_case_spec.rb
new file mode 100644
index 00000000000..6932f79f0ce
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_case_spec.rb
@@ -0,0 +1,90 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestCase do
+ describe '#initialize' do
+ let(:test_case) { described_class.new(**params)}
+
+ context 'when both classname and name are given' do
+ context 'when test case is passed' do
+ let(:params) do
+ {
+ name: 'test-1',
+ classname: 'trace',
+ file: 'spec/trace_spec.rb',
+ execution_time: 1.23,
+ status: described_class::STATUS_SUCCESS,
+ system_output: nil
+ }
+ end
+
+ it 'initializes an instance' do
+ expect { test_case }.not_to raise_error
+
+ expect(test_case.name).to eq('test-1')
+ expect(test_case.classname).to eq('trace')
+ expect(test_case.file).to eq('spec/trace_spec.rb')
+ expect(test_case.execution_time).to eq(1.23)
+ expect(test_case.status).to eq(described_class::STATUS_SUCCESS)
+ expect(test_case.system_output).to be_nil
+ end
+ end
+
+ context 'when test case is failed' do
+ let(:params) do
+ {
+ name: 'test-1',
+ classname: 'trace',
+ file: 'spec/trace_spec.rb',
+ execution_time: 1.23,
+ status: described_class::STATUS_FAILED,
+ system_output: "Failure/Error: is_expected.to eq(300) expected: 300 got: -100"
+ }
+ end
+
+ it 'initializes an instance' do
+ expect { test_case }.not_to raise_error
+
+ expect(test_case.name).to eq('test-1')
+ expect(test_case.classname).to eq('trace')
+ expect(test_case.file).to eq('spec/trace_spec.rb')
+ expect(test_case.execution_time).to eq(1.23)
+ expect(test_case.status).to eq(described_class::STATUS_FAILED)
+ expect(test_case.system_output)
+ .to eq('Failure/Error: is_expected.to eq(300) expected: 300 got: -100')
+ end
+ end
+ end
+
+ context 'when classname is missing' do
+ let(:params) do
+ {
+ name: 'test-1',
+ file: 'spec/trace_spec.rb',
+ execution_time: 1.23,
+ status: described_class::STATUS_SUCCESS,
+ system_output: nil
+ }
+ end
+
+ it 'raises an error' do
+ expect { test_case }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when name is missing' do
+ let(:params) do
+ {
+ classname: 'trace',
+ file: 'spec/trace_spec.rb',
+ execution_time: 1.23,
+ status: described_class::STATUS_SUCCESS,
+ system_output: nil
+ }
+ end
+
+ it 'raises an error' do
+ expect { test_case }.to raise_error(ArgumentError)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb b/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb
new file mode 100644
index 00000000000..71c61e0345f
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_reports_comparer_spec.rb
@@ -0,0 +1,134 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestReportsComparer do
+ include TestReportsHelper
+
+ let(:comparer) { described_class.new(base_reports, head_reports) }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+
+ describe '#suite_comparers' do
+ subject { comparer.suite_comparers }
+
+ context 'when head and base reports include two test suites' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns test suite comparers with specified values' do
+ expect(subject[0]).to be_a(Gitlab::Ci::Reports::TestSuiteComparer)
+ expect(subject[0].name).to eq('rspec')
+ expect(subject[0].head_suite).to eq(head_reports.get_suite('rspec'))
+ expect(subject[0].base_suite).to eq(base_reports.get_suite('rspec'))
+ expect(subject[1]).to be_a(Gitlab::Ci::Reports::TestSuiteComparer)
+ expect(subject[1].name).to eq('junit')
+ expect(subject[1].head_suite).to eq(head_reports.get_suite('junit'))
+ expect(subject[1].base_suite).to eq(base_reports.get_suite('junit'))
+ end
+ end
+ end
+
+ describe '#total_status' do
+ subject { comparer.total_status }
+
+ context 'when all tests cases are success in head suites' do
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns the total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is a failed test case in head suites' do
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns the total status in head suite' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+ end
+
+ describe '#total_count' do
+ subject { comparer.total_count }
+
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns the total test counts in head suites' do
+ is_expected.to eq(2)
+ end
+ end
+
+ describe '#resolved_count' do
+ subject { comparer.resolved_count }
+
+ context 'when there is a resolved test case in head suites' do
+ let(:create_test_case_java_resolved) do
+ create_test_case_java_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_resolved)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(1)
+ end
+ end
+
+ context 'when there are no resolved test cases in head suites' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(0)
+ end
+ end
+ end
+
+ describe '#failed_count' do
+ subject { comparer.failed_count }
+
+ context 'when there is a failed test case in head suites' do
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(1)
+ end
+ end
+
+ context 'when there are no failed test cases in head suites' do
+ before do
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_rspec_success)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(0)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_reports_spec.rb b/spec/lib/gitlab/ci/reports/test_reports_spec.rb
new file mode 100644
index 00000000000..74ff134b239
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_reports_spec.rb
@@ -0,0 +1,132 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestReports do
+ include TestReportsHelper
+
+ let(:test_reports) { described_class.new }
+
+ describe '#get_suite' do
+ subject { test_reports.get_suite(suite_name) }
+
+ context 'when suite name is rspec' do
+ let(:suite_name) { 'rspec' }
+
+ it { expect(subject.name).to eq('rspec') }
+
+ it 'initializes a new test suite and returns it' do
+ expect(Gitlab::Ci::Reports::TestSuite).to receive(:new).and_call_original
+
+ is_expected.to be_a(Gitlab::Ci::Reports::TestSuite)
+ end
+
+ context 'when suite name is already allocated' do
+ before do
+ subject
+ end
+
+ it 'does not initialize a new test suite' do
+ expect(Gitlab::Ci::Reports::TestSuite).not_to receive(:new)
+
+ is_expected.to be_a(Gitlab::Ci::Reports::TestSuite)
+ end
+ end
+ end
+ end
+
+ describe '#total_time' do
+ subject { test_reports.total_time }
+
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns the total time' do
+ is_expected.to eq(6.66)
+ end
+ end
+
+ describe '#total_count' do
+ subject { test_reports.total_count }
+
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns the total count' do
+ is_expected.to eq(2)
+ end
+ end
+
+ describe '#total_status' do
+ subject { test_reports.total_status }
+
+ context 'when all test cases succeeded' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is a failed test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+
+ context 'when there is a skipped test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_skipped)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is an error test case' do
+ before do
+ test_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ test_reports.get_suite('junit').add_test_case(create_test_case_java_error)
+ end
+
+ it 'returns correct total status' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+ end
+
+ Gitlab::Ci::Reports::TestCase::STATUS_TYPES.each do |status_type|
+ describe "##{status_type}_count" do
+ subject { test_reports.public_send("#{status_type}_count") }
+
+ context "when #{status_type} test case exists" do
+ before do
+ test_reports.get_suite('rspec').add_test_case(public_send("create_test_case_rspec_#{status_type}"))
+ test_reports.get_suite('junit').add_test_case(public_send("create_test_case_java_#{status_type}"))
+ end
+
+ it 'returns the count' do
+ is_expected.to eq(2)
+ end
+ end
+
+ context "when #{status_type} test case do not exist" do
+ it 'returns nothing' do
+ is_expected.to be(0)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb b/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb
new file mode 100644
index 00000000000..6ab16e5518d
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb
@@ -0,0 +1,225 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestSuiteComparer do
+ include TestReportsHelper
+
+ let(:comparer) { described_class.new(name, base_suite, head_suite) }
+ let(:name) { 'rpsec' }
+ let(:base_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
+ let(:head_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
+ let(:test_case_success) { create_test_case_rspec_success }
+ let(:test_case_failed) { create_test_case_rspec_failed }
+
+ let(:test_case_resolved) do
+ create_test_case_rspec_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ describe '#new_failures' do
+ subject { comparer.new_failures }
+
+ context 'when head sutie has a newly failed test case which does not exist in base' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the failed test case' do
+ is_expected.to eq([test_case_failed])
+ end
+ end
+
+ context 'when head sutie still has a failed test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when head sutie has a success test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_resolved)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to be_empty
+ end
+ end
+ end
+
+ describe '#existing_failures' do
+ subject { comparer.existing_failures }
+
+ context 'when head sutie has a newly failed test case which does not exist in base' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the failed test case' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when head sutie still has a failed test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to eq([test_case_failed])
+ end
+ end
+
+ context 'when head sutie has a success test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_resolved)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to be_empty
+ end
+ end
+ end
+
+ describe '#resolved_failures' do
+ subject { comparer.resolved_failures }
+
+ context 'when head sutie has a newly failed test case which does not exist in base' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the failed test case' do
+ is_expected.to be_empty
+ end
+
+ it 'returns the correct resolved count' do
+ expect(comparer.resolved_count).to eq(0)
+ end
+ end
+
+ context 'when head sutie still has a failed test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'does not return the failed test case' do
+ is_expected.to be_empty
+ end
+
+ it 'returns the correct resolved count' do
+ expect(comparer.resolved_count).to eq(0)
+ end
+ end
+
+ context 'when head sutie has a success test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_resolved)
+ end
+
+ it 'does not return the resolved test case' do
+ is_expected.to eq([test_case_resolved])
+ end
+
+ it 'returns the correct resolved count' do
+ expect(comparer.resolved_count).to eq(1)
+ end
+ end
+ end
+
+ describe '#total_count' do
+ subject { comparer.total_count }
+
+ before do
+ head_suite.add_test_case(test_case_success)
+ end
+
+ it 'returns the total test counts in head suite' do
+ is_expected.to eq(1)
+ end
+ end
+
+ describe '#failed_count' do
+ subject { comparer.failed_count }
+
+ context 'when there are a new failure and an existing failure' do
+ let(:test_case_1_success) { create_test_case_rspec_success }
+ let(:test_case_2_failed) { create_test_case_rspec_failed }
+
+ let(:test_case_1_failed) do
+ create_test_case_rspec_success.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+
+ before do
+ base_suite.add_test_case(test_case_1_success)
+ base_suite.add_test_case(test_case_2_failed)
+ head_suite.add_test_case(test_case_1_failed)
+ head_suite.add_test_case(test_case_2_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(2)
+ end
+ end
+
+ context 'when there is a new failure' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(1)
+ end
+ end
+
+ context 'when there is an existing failure' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the correct count' do
+ is_expected.to eq(1)
+ end
+ end
+ end
+
+ describe '#total_status' do
+ subject { comparer.total_status }
+
+ context 'when all test cases in head suite are success' do
+ before do
+ head_suite.add_test_case(test_case_success)
+ end
+
+ it 'returns the total status in head suite' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ context 'when there is a failed test case in head suite' do
+ before do
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'returns the total status in head suite' do
+ is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/reports/test_suite_spec.rb b/spec/lib/gitlab/ci/reports/test_suite_spec.rb
new file mode 100644
index 00000000000..cd34dbaf62f
--- /dev/null
+++ b/spec/lib/gitlab/ci/reports/test_suite_spec.rb
@@ -0,0 +1,120 @@
+require 'spec_helper'
+
+describe Gitlab::Ci::Reports::TestSuite do
+ include TestReportsHelper
+
+ let(:test_suite) { described_class.new('Rspec') }
+ let(:test_case_success) { create_test_case_rspec_success }
+ let(:test_case_failed) { create_test_case_rspec_failed }
+ let(:test_case_skipped) { create_test_case_rspec_skipped }
+ let(:test_case_error) { create_test_case_rspec_error }
+
+ it { expect(test_suite.name).to eq('Rspec') }
+
+ describe '#add_test_case' do
+ context 'when status of the test case is success' do
+ it 'stores data correctly' do
+ test_suite.add_test_case(test_case_success)
+
+ expect(test_suite.test_cases[test_case_success.status][test_case_success.key])
+ .to eq(test_case_success)
+ expect(test_suite.total_time).to eq(1.11)
+ end
+ end
+
+ context 'when status of the test case is failed' do
+ it 'stores data correctly' do
+ test_suite.add_test_case(test_case_failed)
+
+ expect(test_suite.test_cases[test_case_failed.status][test_case_failed.key])
+ .to eq(test_case_failed)
+ expect(test_suite.total_time).to eq(2.22)
+ end
+ end
+
+ context 'when two test cases are added' do
+ it 'sums up total time' do
+ test_suite.add_test_case(test_case_success)
+ test_suite.add_test_case(test_case_failed)
+
+ expect(test_suite.total_time).to eq(3.33)
+ end
+ end
+ end
+
+ describe '#total_count' do
+ subject { test_suite.total_count }
+
+ before do
+ test_suite.add_test_case(test_case_success)
+ test_suite.add_test_case(test_case_failed)
+ end
+
+ it { is_expected.to eq(2) }
+ end
+
+ describe '#total_status' do
+ subject { test_suite.total_status }
+
+ context 'when all test cases succeeded' do
+ before do
+ test_suite.add_test_case(test_case_success)
+ end
+
+ it { is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS) }
+ end
+
+ context 'when a test case failed' do
+ before do
+ test_suite.add_test_case(test_case_success)
+ test_suite.add_test_case(test_case_failed)
+ end
+
+ it { is_expected.to eq(Gitlab::Ci::Reports::TestCase::STATUS_FAILED) }
+ end
+ end
+
+ Gitlab::Ci::Reports::TestCase::STATUS_TYPES.each do |status_type|
+ describe "##{status_type}" do
+ subject { test_suite.public_send("#{status_type}") }
+
+ context "when #{status_type} test case exists" do
+ before do
+ test_suite.add_test_case(public_send("test_case_#{status_type}"))
+ end
+
+ it 'returns all success test cases' do
+ is_expected.to eq( { public_send("test_case_#{status_type}").key => public_send("test_case_#{status_type}") })
+ end
+ end
+
+ context "when #{status_type} test case do not exist" do
+ it 'returns nothing' do
+ is_expected.to be_empty
+ end
+ end
+ end
+ end
+
+ Gitlab::Ci::Reports::TestCase::STATUS_TYPES.each do |status_type|
+ describe "##{status_type}_count" do
+ subject { test_suite.public_send("#{status_type}_count") }
+
+ context "when #{status_type} test case exists" do
+ before do
+ test_suite.add_test_case(public_send("test_case_#{status_type}"))
+ end
+
+ it 'returns the count' do
+ is_expected.to eq(1)
+ end
+ end
+
+ context "when #{status_type} test case do not exist" do
+ it 'returns nothing' do
+ is_expected.to be(0)
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/ci/status/build/failed_spec.rb b/spec/lib/gitlab/ci/status/build/failed_spec.rb
index cadb424ea2c..b6676b40fd3 100644
--- a/spec/lib/gitlab/ci/status/build/failed_spec.rb
+++ b/spec/lib/gitlab/ci/status/build/failed_spec.rb
@@ -80,4 +80,31 @@ describe Gitlab::Ci::Status::Build::Failed do
end
end
end
+
+ describe 'covers all failure reasons' do
+ let(:status) { Gitlab::Ci::Status::Failed.new(build, user) }
+ let(:tooltip) { subject.status_tooltip }
+
+ CommitStatus.failure_reasons.keys.each do |failure_reason|
+ context failure_reason do
+ before do
+ build.failure_reason = failure_reason
+ end
+
+ it "is a valid status" do
+ expect { tooltip }.not_to raise_error
+ end
+ end
+ end
+
+ context 'invalid failure message' do
+ before do
+ expect(build).to receive(:failure_reason) { 'invalid failure message' }
+ end
+
+ it "is an invalid status" do
+ expect { tooltip }.to raise_error(/key not found:/)
+ end
+ end
+ end
end
diff --git a/spec/lib/gitlab/cleanup/project_uploads_spec.rb b/spec/lib/gitlab/cleanup/project_uploads_spec.rb
new file mode 100644
index 00000000000..37b38776775
--- /dev/null
+++ b/spec/lib/gitlab/cleanup/project_uploads_spec.rb
@@ -0,0 +1,278 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::Cleanup::ProjectUploads do
+ subject { described_class.new(logger: logger) }
+ let(:logger) { double(:logger) }
+
+ before do
+ allow(logger).to receive(:info).at_least(1).times
+ allow(logger).to receive(:debug).at_least(1).times
+ end
+
+ describe '#run!' do
+ shared_examples_for 'moves the file' do
+ shared_examples_for 'a real run' do
+ let(:args) { [dry_run: false] }
+
+ it 'moves the file to its proper location' do
+ subject.run!(*args)
+
+ expect(File.exist?(path)).to be_falsey
+ expect(File.exist?(new_path)).to be_truthy
+ end
+
+ it 'logs action as done' do
+ expect(logger).to receive(:info).with("Looking for orphaned project uploads to clean up...")
+ expect(logger).to receive(:info).with("Did #{action}")
+
+ subject.run!(*args)
+ end
+ end
+
+ shared_examples_for 'a dry run' do
+ it 'does not move the file' do
+ subject.run!(*args)
+
+ expect(File.exist?(path)).to be_truthy
+ expect(File.exist?(new_path)).to be_falsey
+ end
+
+ it 'logs action as able to be done' do
+ expect(logger).to receive(:info).with("Looking for orphaned project uploads to clean up. Dry run...")
+ expect(logger).to receive(:info).with("Can #{action}")
+
+ subject.run!(*args)
+ end
+ end
+
+ context 'when dry_run is false' do
+ let(:args) { [dry_run: false] }
+
+ it_behaves_like 'a real run'
+ end
+
+ context 'when dry_run is nil' do
+ let(:args) { [dry_run: nil] }
+
+ it_behaves_like 'a real run'
+ end
+
+ context 'when dry_run is true' do
+ let(:args) { [dry_run: true] }
+
+ it_behaves_like 'a dry run'
+ end
+
+ context 'with dry_run not specified' do
+ let(:args) { [] }
+
+ it_behaves_like 'a dry run'
+ end
+ end
+
+ shared_examples_for 'moves the file to lost and found' do
+ let(:action) { "move to lost and found #{path} -> #{new_path}" }
+
+ it_behaves_like 'moves the file'
+ end
+
+ shared_examples_for 'fixes the file' do
+ let(:action) { "fix #{path} -> #{new_path}" }
+
+ it_behaves_like 'moves the file'
+ end
+
+ context 'orphaned project upload file' do
+ context 'when an upload record matching the secret and filename is found' do
+ context 'when the project is still in legacy storage' do
+ let(:orphaned) { create(:upload, :issuable_upload, :with_file, model: create(:project, :legacy_storage)) }
+ let(:new_path) { orphaned.absolute_path }
+ let(:path) { File.join(FileUploader.root, 'some', 'wrong', 'location', orphaned.path) }
+
+ before do
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.mv(new_path, path)
+ end
+
+ it_behaves_like 'fixes the file'
+ end
+
+ context 'when the project was moved to hashed storage' do
+ let(:orphaned) { create(:upload, :issuable_upload, :with_file) }
+ let(:new_path) { orphaned.absolute_path }
+ let(:path) { File.join(FileUploader.root, 'some', 'wrong', 'location', orphaned.path) }
+
+ before do
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.mv(new_path, path)
+ end
+
+ it_behaves_like 'fixes the file'
+ end
+
+ context 'when the project is missing (the upload *record* is an orphan)' do
+ let(:orphaned) { create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage)) }
+ let!(:path) { orphaned.absolute_path }
+ let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', orphaned.model.full_path, orphaned.path) }
+
+ before do
+ orphaned.model.delete
+ end
+
+ it_behaves_like 'moves the file to lost and found'
+ end
+
+ # We will probably want to add logic (Reschedule background upload) to
+ # cover Case 2 in https://gitlab.com/gitlab-org/gitlab-ce/issues/46535#note_75355104
+ context 'when the file should be in object storage' do
+ context 'when the file otherwise has the correct local path' do
+ let!(:orphaned) { create(:upload, :issuable_upload, :object_storage, model: build(:project, :legacy_storage)) }
+ let!(:path) { File.join(FileUploader.root, orphaned.model.full_path, orphaned.path) }
+
+ before do
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.touch(path)
+ end
+
+ it 'does not move the file' do
+ expect(File.exist?(path)).to be_truthy
+
+ subject.run!(dry_run: false)
+
+ expect(File.exist?(path)).to be_truthy
+ end
+ end
+
+ # E.g. the upload file was orphaned, and then uploads were migrated to
+ # object storage
+ context 'when the file has the wrong local path' do
+ let!(:orphaned) { create(:upload, :issuable_upload, :object_storage, model: build(:project, :legacy_storage)) }
+ let!(:path) { File.join(FileUploader.root, 'wrong', orphaned.path) }
+ let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', 'wrong', orphaned.path) }
+
+ before do
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.touch(path)
+ end
+
+ it_behaves_like 'moves the file to lost and found'
+ end
+ end
+ end
+
+ context 'when a matching upload record can not be found' do
+ context 'when the file path fits the known pattern' do
+ let!(:orphaned) { create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage)) }
+ let!(:path) { orphaned.absolute_path }
+ let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', orphaned.model.full_path, orphaned.path) }
+
+ before do
+ orphaned.delete
+ end
+
+ it_behaves_like 'moves the file to lost and found'
+ end
+
+ context 'when the file path does not fit the known pattern' do
+ let!(:invalid_path) { File.join('group', 'file.jpg') }
+ let!(:path) { File.join(FileUploader.root, invalid_path) }
+ let!(:new_path) { File.join(FileUploader.root, '-', 'project-lost-found', invalid_path) }
+
+ before do
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.touch(path)
+ end
+
+ after do
+ File.delete(path) if File.exist?(path)
+ end
+
+ it_behaves_like 'moves the file to lost and found'
+ end
+ end
+ end
+
+ context 'non-orphaned project upload file' do
+ it 'does not move the file' do
+ tracked = create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage))
+ tracked_path = tracked.absolute_path
+
+ expect(logger).not_to receive(:info).with(/move|fix/i)
+ expect(File.exist?(tracked_path)).to be_truthy
+
+ subject.run!(dry_run: false)
+
+ expect(File.exist?(tracked_path)).to be_truthy
+ end
+ end
+
+ context 'ignorable cases' do
+ # Because we aren't concerned about these, and can save a lot of
+ # processing time by ignoring them. If we wish to cleanup hashed storage
+ # directories, it should simply require removing this test and modifying
+ # the find command.
+ context 'when the file is already in hashed storage' do
+ let(:project) { create(:project) }
+
+ before do
+ expect(logger).not_to receive(:info).with(/move|fix/i)
+ end
+
+ it 'does not move even an orphan file' do
+ orphaned = create(:upload, :issuable_upload, :with_file, model: project)
+ path = orphaned.absolute_path
+ orphaned.delete
+
+ expect(File.exist?(path)).to be_truthy
+
+ subject.run!(dry_run: false)
+
+ expect(File.exist?(path)).to be_truthy
+ end
+ end
+
+ it 'does not move any non-project (FileUploader) uploads' do
+ paths = []
+ orphaned1 = create(:upload, :personal_snippet_upload, :with_file)
+ orphaned2 = create(:upload, :namespace_upload, :with_file)
+ orphaned3 = create(:upload, :attachment_upload, :with_file)
+ paths << orphaned1.absolute_path
+ paths << orphaned2.absolute_path
+ paths << orphaned3.absolute_path
+ Upload.delete_all
+
+ expect(logger).not_to receive(:info).with(/move|fix/i)
+ paths.each do |path|
+ expect(File.exist?(path)).to be_truthy
+ end
+
+ subject.run!(dry_run: false)
+
+ paths.each do |path|
+ expect(File.exist?(path)).to be_truthy
+ end
+ end
+
+ it 'does not move any uploads in tmp (which would interfere with ongoing upload activity)' do
+ path = File.join(FileUploader.root, 'tmp', 'foo.jpg')
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.touch(path)
+
+ expect(logger).not_to receive(:info).with(/move|fix/i)
+ expect(File.exist?(path)).to be_truthy
+
+ subject.run!(dry_run: false)
+
+ expect(File.exist?(path)).to be_truthy
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb
index 782e4e45a91..7d76519dddd 100644
--- a/spec/lib/gitlab/database_spec.rb
+++ b/spec/lib/gitlab/database_spec.rb
@@ -65,6 +65,28 @@ describe Gitlab::Database do
end
end
+ describe '.postgresql_9_or_less?' do
+ it 'returns false when using MySQL' do
+ allow(described_class).to receive(:postgresql?).and_return(false)
+
+ expect(described_class.postgresql_9_or_less?).to eq(false)
+ end
+
+ it 'returns true when using PostgreSQL 9.6' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('9.6')
+
+ expect(described_class.postgresql_9_or_less?).to eq(true)
+ end
+
+ it 'returns false when using PostgreSQL 10 or newer' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('10')
+
+ expect(described_class.postgresql_9_or_less?).to eq(false)
+ end
+ end
+
describe '.join_lateral_supported?' do
it 'returns false when using MySQL' do
allow(described_class).to receive(:postgresql?).and_return(false)
@@ -109,6 +131,70 @@ describe Gitlab::Database do
end
end
+ describe '.pg_wal_lsn_diff' do
+ it 'returns old name when using PostgreSQL 9.6' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('9.6')
+
+ expect(described_class.pg_wal_lsn_diff).to eq('pg_xlog_location_diff')
+ end
+
+ it 'returns new name when using PostgreSQL 10 or newer' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('10')
+
+ expect(described_class.pg_wal_lsn_diff).to eq('pg_wal_lsn_diff')
+ end
+ end
+
+ describe '.pg_current_wal_insert_lsn' do
+ it 'returns old name when using PostgreSQL 9.6' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('9.6')
+
+ expect(described_class.pg_current_wal_insert_lsn).to eq('pg_current_xlog_insert_location')
+ end
+
+ it 'returns new name when using PostgreSQL 10 or newer' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('10')
+
+ expect(described_class.pg_current_wal_insert_lsn).to eq('pg_current_wal_insert_lsn')
+ end
+ end
+
+ describe '.pg_last_wal_receive_lsn' do
+ it 'returns old name when using PostgreSQL 9.6' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('9.6')
+
+ expect(described_class.pg_last_wal_receive_lsn).to eq('pg_last_xlog_receive_location')
+ end
+
+ it 'returns new name when using PostgreSQL 10 or newer' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('10')
+
+ expect(described_class.pg_last_wal_receive_lsn).to eq('pg_last_wal_receive_lsn')
+ end
+ end
+
+ describe '.pg_last_wal_replay_lsn' do
+ it 'returns old name when using PostgreSQL 9.6' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('9.6')
+
+ expect(described_class.pg_last_wal_replay_lsn).to eq('pg_last_xlog_replay_location')
+ end
+
+ it 'returns new name when using PostgreSQL 10 or newer' do
+ allow(described_class).to receive(:postgresql?).and_return(true)
+ allow(described_class).to receive(:version).and_return('10')
+
+ expect(described_class.pg_last_wal_replay_lsn).to eq('pg_last_wal_replay_lsn')
+ end
+ end
+
describe '.nulls_last_order' do
context 'when using PostgreSQL' do
before do
diff --git a/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb b/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
index 5d22dcfb508..ca067a29174 100644
--- a/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
+++ b/spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Git::AttributesAtRefParser, seed_helper: true do
+describe Gitlab::Git::AttributesAtRefParser, :seed_helper do
let(:project) { create(:project, :repository) }
let(:repository) { project.repository }
diff --git a/spec/lib/gitlab/git/attributes_parser_spec.rb b/spec/lib/gitlab/git/attributes_parser_spec.rb
index 2d103123998..18ebfef38f0 100644
--- a/spec/lib/gitlab/git/attributes_parser_spec.rb
+++ b/spec/lib/gitlab/git/attributes_parser_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Git::AttributesParser, seed_helper: true do
+describe Gitlab::Git::AttributesParser, :seed_helper do
let(:attributes_path) { File.join(SEED_STORAGE_PATH, 'with-git-attributes.git', 'info', 'attributes') }
let(:data) { File.read(attributes_path) }
diff --git a/spec/lib/gitlab/git/blame_spec.rb b/spec/lib/gitlab/git/blame_spec.rb
index ba790b717ae..e704d1c673c 100644
--- a/spec/lib/gitlab/git/blame_spec.rb
+++ b/spec/lib/gitlab/git/blame_spec.rb
@@ -1,7 +1,7 @@
# coding: utf-8
require "spec_helper"
-describe Gitlab::Git::Blame, seed_helper: true do
+describe Gitlab::Git::Blame, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:blame) do
Gitlab::Git::Blame.new(repository, SeedRepo::Commit::ID, "CONTRIBUTING.md")
diff --git a/spec/lib/gitlab/git/blob_snippet_spec.rb b/spec/lib/gitlab/git/blob_snippet_spec.rb
index d6d365f6492..6effec8295c 100644
--- a/spec/lib/gitlab/git/blob_snippet_spec.rb
+++ b/spec/lib/gitlab/git/blob_snippet_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe Gitlab::Git::BlobSnippet, seed_helper: true do
+describe Gitlab::Git::BlobSnippet, :seed_helper do
describe '#data' do
context 'empty lines' do
let(:snippet) { Gitlab::Git::BlobSnippet.new('master', nil, nil, nil) }
diff --git a/spec/lib/gitlab/git/blob_spec.rb b/spec/lib/gitlab/git/blob_spec.rb
index 034b89a46fa..ea49502ae2e 100644
--- a/spec/lib/gitlab/git/blob_spec.rb
+++ b/spec/lib/gitlab/git/blob_spec.rb
@@ -2,7 +2,7 @@
require "spec_helper"
-describe Gitlab::Git::Blob, seed_helper: true do
+describe Gitlab::Git::Blob, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
describe 'initialize' do
diff --git a/spec/lib/gitlab/git/branch_spec.rb b/spec/lib/gitlab/git/branch_spec.rb
index a8c5627e678..79ccbb79966 100644
--- a/spec/lib/gitlab/git/branch_spec.rb
+++ b/spec/lib/gitlab/git/branch_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"
-describe Gitlab::Git::Branch, seed_helper: true do
+describe Gitlab::Git::Branch, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:rugged) do
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb
index 0adb684765d..2718a3c5e49 100644
--- a/spec/lib/gitlab/git/commit_spec.rb
+++ b/spec/lib/gitlab/git/commit_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"
-describe Gitlab::Git::Commit, seed_helper: true do
+describe Gitlab::Git::Commit, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:commit) { described_class.find(repository, SeedRepo::Commit::ID) }
let(:rugged_commit) do
diff --git a/spec/lib/gitlab/git/committer_with_hooks_spec.rb b/spec/lib/gitlab/git/committer_with_hooks_spec.rb
index 2100690f873..c7626058acd 100644
--- a/spec/lib/gitlab/git/committer_with_hooks_spec.rb
+++ b/spec/lib/gitlab/git/committer_with_hooks_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Git::CommitterWithHooks, seed_helper: true do
+describe Gitlab::Git::CommitterWithHooks, :seed_helper do
# TODO https://gitlab.com/gitlab-org/gitaly/issues/1234
skip 'needs to be moved to gitaly-ruby test suite' do
shared_examples 'calling wiki hooks' do
diff --git a/spec/lib/gitlab/git/compare_spec.rb b/spec/lib/gitlab/git/compare_spec.rb
index b6a42e422b5..7cc6f52f8ee 100644
--- a/spec/lib/gitlab/git/compare_spec.rb
+++ b/spec/lib/gitlab/git/compare_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"
-describe Gitlab::Git::Compare, seed_helper: true do
+describe Gitlab::Git::Compare, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:compare) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, straight: false) }
let(:compare_straight) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, straight: true) }
diff --git a/spec/lib/gitlab/git/diff_collection_spec.rb b/spec/lib/gitlab/git/diff_collection_spec.rb
index 65edc750f39..81658874be7 100644
--- a/spec/lib/gitlab/git/diff_collection_spec.rb
+++ b/spec/lib/gitlab/git/diff_collection_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Git::DiffCollection, seed_helper: true do
+describe Gitlab::Git::DiffCollection, :seed_helper do
subject do
Gitlab::Git::DiffCollection.new(
iterator,
diff --git a/spec/lib/gitlab/git/diff_spec.rb b/spec/lib/gitlab/git/diff_spec.rb
index 11ab376ab8f..87d9fcee39e 100644
--- a/spec/lib/gitlab/git/diff_spec.rb
+++ b/spec/lib/gitlab/git/diff_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"
-describe Gitlab::Git::Diff, seed_helper: true do
+describe Gitlab::Git::Diff, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
before do
diff --git a/spec/lib/gitlab/git/hooks_service_spec.rb b/spec/lib/gitlab/git/hooks_service_spec.rb
index 9337aa39e13..55ffced36ac 100644
--- a/spec/lib/gitlab/git/hooks_service_spec.rb
+++ b/spec/lib/gitlab/git/hooks_service_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Git::HooksService, seed_helper: true do
+describe Gitlab::Git::HooksService, :seed_helper do
let(:gl_id) { 'user-456' }
let(:gl_username) { 'janedoe' }
let(:user) { Gitlab::Git::User.new(gl_username, 'Jane Doe', 'janedoe@example.com', gl_id) }
diff --git a/spec/lib/gitlab/git/index_spec.rb b/spec/lib/gitlab/git/index_spec.rb
index e51b875be11..c4edd6961e1 100644
--- a/spec/lib/gitlab/git/index_spec.rb
+++ b/spec/lib/gitlab/git/index_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Git::Index, seed_helper: true do
+describe Gitlab::Git::Index, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:index) { described_class.new(repository) }
diff --git a/spec/lib/gitlab/git/remote_repository_spec.rb b/spec/lib/gitlab/git/remote_repository_spec.rb
index eb148cc3804..53ed7c5a13a 100644
--- a/spec/lib/gitlab/git/remote_repository_spec.rb
+++ b/spec/lib/gitlab/git/remote_repository_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Gitlab::Git::RemoteRepository, seed_helper: true do
+describe Gitlab::Git::RemoteRepository, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
subject { described_class.new(repository) }
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 62396af1ebe..35a6fc94753 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -1,7 +1,7 @@
# coding: utf-8
require "spec_helper"
-describe Gitlab::Git::Repository, seed_helper: true do
+describe Gitlab::Git::Repository, :seed_helper do
include Gitlab::EncodingHelper
using RSpec::Parameterized::TableSyntax
diff --git a/spec/lib/gitlab/git/tag_spec.rb b/spec/lib/gitlab/git/tag_spec.rb
index be2f5bfb819..2d9db576a6c 100644
--- a/spec/lib/gitlab/git/tag_spec.rb
+++ b/spec/lib/gitlab/git/tag_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"
-describe Gitlab::Git::Tag, seed_helper: true do
+describe Gitlab::Git::Tag, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
shared_examples 'Gitlab::Git::Repository#tags' do
diff --git a/spec/lib/gitlab/git/tree_spec.rb b/spec/lib/gitlab/git/tree_spec.rb
index 001e406a930..3792d6bf67b 100644
--- a/spec/lib/gitlab/git/tree_spec.rb
+++ b/spec/lib/gitlab/git/tree_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"
-describe Gitlab::Git::Tree, seed_helper: true do
+describe Gitlab::Git::Tree, :seed_helper do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
context :repo do
diff --git a/spec/lib/gitlab/git/wiki_spec.rb b/spec/lib/gitlab/git/wiki_spec.rb
index b63658e1b3b..c5666e4ec61 100644
--- a/spec/lib/gitlab/git/wiki_spec.rb
+++ b/spec/lib/gitlab/git/wiki_spec.rb
@@ -6,6 +6,31 @@ describe Gitlab::Git::Wiki do
let(:project_wiki) { ProjectWiki.new(project, user) }
subject { project_wiki.wiki }
+ describe '#pages' do
+ before do
+ create_page('page1', 'content')
+ create_page('page2', 'content2')
+ end
+
+ after do
+ destroy_page('page1')
+ destroy_page('page2')
+ end
+
+ it 'returns all the pages' do
+ expect(subject.pages.count).to eq(2)
+ expect(subject.pages.first.title).to eq 'page1'
+ expect(subject.pages.last.title).to eq 'page2'
+ end
+
+ it 'returns only one page' do
+ pages = subject.pages(limit: 1)
+
+ expect(pages.count).to eq(1)
+ expect(pages.first.title).to eq 'page1'
+ end
+ end
+
describe '#page' do
before do
create_page('page1', 'content')
diff --git a/spec/lib/gitlab/gitaly_client/storage_service_spec.rb b/spec/lib/gitlab/gitaly_client/storage_service_spec.rb
new file mode 100644
index 00000000000..6c25e2d6ebd
--- /dev/null
+++ b/spec/lib/gitlab/gitaly_client/storage_service_spec.rb
@@ -0,0 +1,13 @@
+require 'spec_helper'
+
+describe Gitlab::GitalyClient::StorageService do
+ describe '#delete_all_repositories' do
+ let!(:project) { create(:project, :repository) }
+
+ it 'removes all repositories' do
+ described_class.new(project.repository_storage).delete_all_repositories
+
+ expect(project.repository.exists?).to be(false)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb b/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
index 6ad9f5ef766..5f67fe6b952 100644
--- a/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/wiki_service_spec.rb
@@ -70,6 +70,15 @@ describe Gitlab::GitalyClient::WikiService do
subject
end
+ it 'sends a limit of 0 to wiki_get_all_pages' do
+ expect_any_instance_of(Gitaly::WikiService::Stub)
+ .to receive(:wiki_get_all_pages)
+ .with(gitaly_request_with_params(limit: 0), kind_of(Hash))
+ .and_return([].each)
+
+ subject
+ end
+
it 'concatenates the raw data and returns a pair of WikiPage and WikiPageVersion for each page' do
expect_any_instance_of(Gitaly::WikiService::Stub)
.to receive(:wiki_get_all_pages)
@@ -84,5 +93,18 @@ describe Gitlab::GitalyClient::WikiService do
expect(wiki_page_2.raw_data).to eq('cd')
expect(wiki_page_2_version.format).to eq('markdown')
end
+
+ context 'with limits' do
+ subject { client.get_all_pages(limit: 1) }
+
+ it 'sends a request with the limit' do
+ expect_any_instance_of(Gitaly::WikiService::Stub)
+ .to receive(:wiki_get_all_pages)
+ .with(gitaly_request_with_params(limit: 1), kind_of(Hash))
+ .and_return([].each)
+
+ subject
+ end
+ end
end
end
diff --git a/spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb
index b2e544e6fed..c51985f00a2 100644
--- a/spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb
+++ b/spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb
@@ -158,7 +158,6 @@ describe Gitlab::GithubImport::Importer::PullRequestsImporter do
expect(importer.repository_updates_counter)
.to receive(:increment)
- .with(project: project.path_with_namespace)
.and_call_original
Timecop.freeze do
diff --git a/spec/lib/gitlab/graphql/authorize/authorize_resource_spec.rb b/spec/lib/gitlab/graphql/authorize/authorize_resource_spec.rb
new file mode 100644
index 00000000000..95bf7685ade
--- /dev/null
+++ b/spec/lib/gitlab/graphql/authorize/authorize_resource_spec.rb
@@ -0,0 +1,103 @@
+require 'spec_helper'
+
+describe Gitlab::Graphql::Authorize::AuthorizeResource do
+ let(:fake_class) do
+ Class.new do
+ include Gitlab::Graphql::Authorize::AuthorizeResource
+
+ attr_reader :user, :found_object
+
+ authorize :read_the_thing
+
+ def initialize(user, found_object)
+ @user, @found_object = user, found_object
+ end
+
+ def find_object
+ found_object
+ end
+
+ def current_user
+ user
+ end
+ end
+ end
+
+ let(:user) { build(:user) }
+ let(:project) { build(:project) }
+ subject(:loading_resource) { fake_class.new(user, project) }
+
+ context 'when the user is allowed to perform the action' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :read_the_thing, project, scope: :user) do
+ true
+ end
+ end
+
+ describe '#authorized_find' do
+ it 'returns the object' do
+ expect(loading_resource.authorized_find).to eq(project)
+ end
+ end
+
+ describe '#authorized_find!' do
+ it 'returns the object' do
+ expect(loading_resource.authorized_find!).to eq(project)
+ end
+ end
+
+ describe '#authorize!' do
+ it 'does not raise an error' do
+ expect { loading_resource.authorize!(project) }.not_to raise_error
+ end
+ end
+
+ describe '#authorized?' do
+ it 'is true' do
+ expect(loading_resource.authorized?(project)).to be(true)
+ end
+ end
+ end
+
+ context 'when the user is not allowed to perform the action' do
+ before do
+ allow(Ability).to receive(:allowed?).with(user, :read_the_thing, project, scope: :user) do
+ false
+ end
+ end
+
+ describe '#authorized_find' do
+ it 'returns `nil`' do
+ expect(loading_resource.authorized_find).to be_nil
+ end
+ end
+
+ describe '#authorized_find!' do
+ it 'raises an error' do
+ expect { loading_resource.authorize!(project) }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ describe '#authorize!' do
+ it 'does not raise an error' do
+ expect { loading_resource.authorize!(project) }.to raise_error(Gitlab::Graphql::Errors::ResourceNotAvailable)
+ end
+ end
+
+ describe '#authorized?' do
+ it 'is false' do
+ expect(loading_resource.authorized?(project)).to be(false)
+ end
+ end
+ end
+
+ context 'when the class does not define #find_object' do
+ let(:fake_class) do
+ Class.new { include Gitlab::Graphql::Authorize::AuthorizeResource }
+ end
+
+ it 'raises a comprehensive error message' do
+ expect { fake_class.new.find_object }.to raise_error(/Implement #find_object in #{fake_class.name}/)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/graphql/authorize_spec.rb b/spec/lib/gitlab/graphql/authorize_spec.rb
new file mode 100644
index 00000000000..9c17a3b0e4b
--- /dev/null
+++ b/spec/lib/gitlab/graphql/authorize_spec.rb
@@ -0,0 +1,20 @@
+require 'spec_helper'
+
+describe Gitlab::Graphql::Authorize do
+ describe '#authorize' do
+ it 'adds permissions from subclasses to those of superclasses when used on classes' do
+ base_class = Class.new do
+ extend Gitlab::Graphql::Authorize
+
+ authorize :base_authorization
+ end
+ sub_class = Class.new(base_class) do
+ authorize :sub_authorization
+ end
+
+ expect(base_class.required_permissions).to contain_exactly(:base_authorization)
+ expect(sub_class.required_permissions)
+ .to contain_exactly(:base_authorization, :sub_authorization)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/graphs/commits_spec.rb b/spec/lib/gitlab/graphs/commits_spec.rb
index b2084f56640..530d4a981bf 100644
--- a/spec/lib/gitlab/graphs/commits_spec.rb
+++ b/spec/lib/gitlab/graphs/commits_spec.rb
@@ -29,7 +29,7 @@ describe Gitlab::Graphs::Commits do
context 'with commits from yesterday and today' do
subject { described_class.new([commit2, commit1_yesterday]) }
describe '#commit_per_day' do
- it { expect(subject.commit_per_day).to eq 1 }
+ it { expect(subject.commit_per_day).to eq 1.0 }
end
describe '#duration' do
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index db5aab0cd76..b3e3ead9c5e 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -7,6 +7,7 @@ issues:
- updated_by
- milestone
- notes
+- resource_label_events
- label_links
- labels
- last_edited_by
@@ -76,6 +77,7 @@ merge_requests:
- updated_by
- milestone
- notes
+- resource_label_events
- label_links
- labels
- last_edited_by
@@ -295,6 +297,7 @@ project:
- settings
- ci_cd_settings
- import_export_upload
+- repository_languages
award_emoji:
- awardable
- user
diff --git a/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb b/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb
new file mode 100644
index 00000000000..287745eb40e
--- /dev/null
+++ b/spec/lib/gitlab/import_export/file_importer_object_storage_spec.rb
@@ -0,0 +1,89 @@
+require 'spec_helper'
+
+describe Gitlab::ImportExport::FileImporter do
+ let(:shared) { Gitlab::ImportExport::Shared.new(nil) }
+ let(:storage_path) { "#{Dir.tmpdir}/file_importer_spec" }
+ let(:valid_file) { "#{shared.export_path}/valid.json" }
+ let(:symlink_file) { "#{shared.export_path}/invalid.json" }
+ let(:hidden_symlink_file) { "#{shared.export_path}/.hidden" }
+ let(:subfolder_symlink_file) { "#{shared.export_path}/subfolder/invalid.json" }
+ let(:evil_symlink_file) { "#{shared.export_path}/.\nevil" }
+
+ before do
+ stub_const('Gitlab::ImportExport::FileImporter::MAX_RETRIES', 0)
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+
+ allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(storage_path)
+ allow_any_instance_of(Gitlab::ImportExport::CommandLineUtil).to receive(:untar_zxf).and_return(true)
+ allow_any_instance_of(Gitlab::ImportExport::Shared).to receive(:relative_archive_path).and_return('test')
+ allow(SecureRandom).to receive(:hex).and_return('abcd')
+ setup_files
+ end
+
+ after do
+ FileUtils.rm_rf(storage_path)
+ end
+
+ context 'normal run' do
+ before do
+ described_class.import(project: build(:project), archive_file: '', shared: shared)
+ end
+
+ it 'removes symlinks in root folder' do
+ expect(File.exist?(symlink_file)).to be false
+ end
+
+ it 'removes hidden symlinks in root folder' do
+ expect(File.exist?(hidden_symlink_file)).to be false
+ end
+
+ it 'removes evil symlinks in root folder' do
+ expect(File.exist?(evil_symlink_file)).to be false
+ end
+
+ it 'removes symlinks in subfolders' do
+ expect(File.exist?(subfolder_symlink_file)).to be false
+ end
+
+ it 'does not remove a valid file' do
+ expect(File.exist?(valid_file)).to be true
+ end
+
+ it 'creates the file in the right subfolder' do
+ expect(shared.export_path).to include('test/abcd')
+ end
+ end
+
+ context 'error' do
+ before do
+ allow_any_instance_of(described_class).to receive(:wait_for_archived_file).and_raise(StandardError)
+ described_class.import(project: build(:project), archive_file: '', shared: shared)
+ end
+
+ it 'removes symlinks in root folder' do
+ expect(File.exist?(symlink_file)).to be false
+ end
+
+ it 'removes hidden symlinks in root folder' do
+ expect(File.exist?(hidden_symlink_file)).to be false
+ end
+
+ it 'removes symlinks in subfolders' do
+ expect(File.exist?(subfolder_symlink_file)).to be false
+ end
+
+ it 'does not remove a valid file' do
+ expect(File.exist?(valid_file)).to be true
+ end
+ end
+
+ def setup_files
+ FileUtils.mkdir_p("#{shared.export_path}/subfolder/")
+ FileUtils.touch(valid_file)
+ FileUtils.ln_s(valid_file, symlink_file)
+ FileUtils.ln_s(valid_file, subfolder_symlink_file)
+ FileUtils.ln_s(valid_file, hidden_symlink_file)
+ FileUtils.ln_s(valid_file, evil_symlink_file)
+ end
+end
diff --git a/spec/lib/gitlab/import_export/file_importer_spec.rb b/spec/lib/gitlab/import_export/file_importer_spec.rb
index 265937f899e..78fccdf1dfc 100644
--- a/spec/lib/gitlab/import_export/file_importer_spec.rb
+++ b/spec/lib/gitlab/import_export/file_importer_spec.rb
@@ -24,7 +24,7 @@ describe Gitlab::ImportExport::FileImporter do
context 'normal run' do
before do
- described_class.import(archive_file: '', shared: shared)
+ described_class.import(project: nil, archive_file: '', shared: shared)
end
it 'removes symlinks in root folder' do
@@ -55,7 +55,7 @@ describe Gitlab::ImportExport::FileImporter do
context 'error' do
before do
allow_any_instance_of(described_class).to receive(:wait_for_archived_file).and_raise(StandardError)
- described_class.import(archive_file: '', shared: shared)
+ described_class.import(project: nil, archive_file: '', shared: shared)
end
it 'removes symlinks in root folder' do
diff --git a/spec/lib/gitlab/import_export/importer_object_storage_spec.rb b/spec/lib/gitlab/import_export/importer_object_storage_spec.rb
new file mode 100644
index 00000000000..24a994b3611
--- /dev/null
+++ b/spec/lib/gitlab/import_export/importer_object_storage_spec.rb
@@ -0,0 +1,115 @@
+require 'spec_helper'
+
+describe Gitlab::ImportExport::Importer do
+ let(:user) { create(:user) }
+ let(:test_path) { "#{Dir.tmpdir}/importer_spec" }
+ let(:shared) { project.import_export_shared }
+ let(:project) { create(:project) }
+ let(:import_file) { fixture_file_upload('spec/features/projects/import_export/test_project_export.tar.gz') }
+
+ subject(:importer) { described_class.new(project) }
+
+ before do
+ allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(test_path)
+ allow_any_instance_of(Gitlab::ImportExport::FileImporter).to receive(:remove_import_file)
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
+
+ FileUtils.mkdir_p(shared.export_path)
+ ImportExportUpload.create(project: project, import_file: import_file)
+ end
+
+ after do
+ FileUtils.rm_rf(test_path)
+ end
+
+ describe '#execute' do
+ it 'succeeds' do
+ importer.execute
+
+ expect(shared.errors).to be_empty
+ end
+
+ it 'extracts the archive' do
+ expect(Gitlab::ImportExport::FileImporter).to receive(:import).and_call_original
+
+ importer.execute
+ end
+
+ it 'checks the version' do
+ expect(Gitlab::ImportExport::VersionChecker).to receive(:check!).and_call_original
+
+ importer.execute
+ end
+
+ context 'all restores are executed' do
+ [
+ Gitlab::ImportExport::AvatarRestorer,
+ Gitlab::ImportExport::RepoRestorer,
+ Gitlab::ImportExport::WikiRestorer,
+ Gitlab::ImportExport::UploadsRestorer,
+ Gitlab::ImportExport::LfsRestorer,
+ Gitlab::ImportExport::StatisticsRestorer
+ ].each do |restorer|
+ it "calls the #{restorer}" do
+ fake_restorer = double(restorer.to_s)
+
+ expect(fake_restorer).to receive(:restore).and_return(true).at_least(1)
+ expect(restorer).to receive(:new).and_return(fake_restorer).at_least(1)
+
+ importer.execute
+ end
+ end
+
+ it 'restores the ProjectTree' do
+ expect(Gitlab::ImportExport::ProjectTreeRestorer).to receive(:new).and_call_original
+
+ importer.execute
+ end
+
+ it 'removes the import file' do
+ expect(importer).to receive(:remove_import_file).and_call_original
+
+ importer.execute
+
+ expect(project.import_export_upload.import_file&.file).to be_nil
+ end
+ end
+
+ context 'when project successfully restored' do
+ let!(:existing_project) { create(:project, namespace: user.namespace) }
+ let(:project) { create(:project, namespace: user.namespace, name: 'whatever', path: 'whatever') }
+
+ before do
+ restorers = double(:restorers, all?: true)
+
+ allow(subject).to receive(:import_file).and_return(true)
+ allow(subject).to receive(:check_version!).and_return(true)
+ allow(subject).to receive(:restorers).and_return(restorers)
+ allow(project).to receive(:import_data).and_return(double(data: { 'original_path' => existing_project.path }))
+ end
+
+ context 'when import_data' do
+ context 'has original_path' do
+ it 'overwrites existing project' do
+ expect_any_instance_of(::Projects::OverwriteProjectService).to receive(:execute).with(existing_project)
+
+ subject.execute
+ end
+ end
+
+ context 'has not original_path' do
+ before do
+ allow(project).to receive(:import_data).and_return(double(data: {}))
+ end
+
+ it 'does not call the overwrite service' do
+ expect_any_instance_of(::Projects::OverwriteProjectService).not_to receive(:execute).with(existing_project)
+
+ subject.execute
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/import_export/importer_spec.rb b/spec/lib/gitlab/import_export/importer_spec.rb
index c074e61da26..f07946824c4 100644
--- a/spec/lib/gitlab/import_export/importer_spec.rb
+++ b/spec/lib/gitlab/import_export/importer_spec.rb
@@ -10,9 +10,10 @@ describe Gitlab::ImportExport::Importer do
before do
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(test_path)
+ allow_any_instance_of(Gitlab::ImportExport::FileImporter).to receive(:remove_import_file)
+
FileUtils.mkdir_p(shared.export_path)
FileUtils.cp(Rails.root.join('spec/features/projects/import_export/test_project_export.tar.gz'), test_path)
- allow(subject).to receive(:remove_import_file)
end
after do
@@ -69,7 +70,7 @@ describe Gitlab::ImportExport::Importer do
let(:project) { create(:project, namespace: user.namespace, name: 'whatever', path: 'whatever') }
before do
- restorers = double
+ restorers = double(:restorers, all?: true)
allow(subject).to receive(:import_file).and_return(true)
allow(subject).to receive(:check_version!).and_return(true)
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 bac5693c830..a88ac0a091e 100644
--- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
+++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb
@@ -16,7 +16,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do
@shared = @project.import_export_shared
allow(@shared).to receive(:export_path).and_return('spec/lib/gitlab/import_export/')
- allow_any_instance_of(Repository).to receive(:fetch_ref).and_return(true)
+ allow_any_instance_of(Repository).to receive(:fetch_source_branch!).and_return(true)
allow_any_instance_of(Gitlab::Git::Repository).to receive(:branch_exists?).and_return(false)
expect_any_instance_of(Gitlab::Git::Repository).to receive(:create_branch).with('feature', 'DCBA')
diff --git a/spec/lib/gitlab/kubernetes/config_map_spec.rb b/spec/lib/gitlab/kubernetes/config_map_spec.rb
index 33dfa461202..e253b291277 100644
--- a/spec/lib/gitlab/kubernetes/config_map_spec.rb
+++ b/spec/lib/gitlab/kubernetes/config_map_spec.rb
@@ -22,4 +22,10 @@ describe Gitlab::Kubernetes::ConfigMap do
is_expected.to eq(resource)
end
end
+
+ describe '#config_map_name' do
+ it 'returns the config_map name' do
+ expect(config_map.config_map_name).to eq("values-content-configuration-#{application.name}")
+ end
+ end
end
diff --git a/spec/lib/gitlab/kubernetes/helm/api_spec.rb b/spec/lib/gitlab/kubernetes/helm/api_spec.rb
index aa7e43dfb16..6e9b4ca0869 100644
--- a/spec/lib/gitlab/kubernetes/helm/api_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/api_spec.rb
@@ -49,33 +49,33 @@ describe Gitlab::Kubernetes::Helm::Api do
end
end
- describe '#installation_status' do
+ describe '#status' do
let(:phase) { Gitlab::Kubernetes::Pod::RUNNING }
let(:pod) { Kubeclient::Resource.new(status: { phase: phase }) } # partial representation
it 'fetches POD phase from kubernetes cluster' do
expect(client).to receive(:get_pod).with(command.pod_name, gitlab_namespace).once.and_return(pod)
- expect(subject.installation_status(command.pod_name)).to eq(phase)
+ expect(subject.status(command.pod_name)).to eq(phase)
end
end
- describe '#installation_log' do
+ describe '#log' do
let(:log) { 'some output' }
let(:response) { RestClient::Response.new(log) }
it 'fetches POD phase from kubernetes cluster' do
expect(client).to receive(:get_pod_log).with(command.pod_name, gitlab_namespace).once.and_return(response)
- expect(subject.installation_log(command.pod_name)).to eq(log)
+ expect(subject.log(command.pod_name)).to eq(log)
end
end
- describe '#delete_installation_pod!' do
+ describe '#delete_pod!' do
it 'deletes the POD from kubernetes cluster' do
expect(client).to receive(:delete_pod).with(command.pod_name, gitlab_namespace).once
- subject.delete_installation_pod!(command.pod_name)
+ subject.delete_pod!(command.pod_name)
end
end
end
diff --git a/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb b/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
index 25c6fa3b9a3..cd456a45287 100644
--- a/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
+++ b/spec/lib/gitlab/kubernetes/helm/install_command_spec.rb
@@ -14,7 +14,7 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
let(:commands) do
<<~EOS
helm init --client-only >/dev/null
- helm install #{application.chart} --name #{application.name} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
+ helm install #{application.chart} --name #{application.name} --version #{application.version} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
EOS
end
end
@@ -42,7 +42,7 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
<<~EOS
helm init --client-only >/dev/null
helm repo add #{application.name} #{application.repository}
- helm install #{application.chart} --name #{application.name} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
+ helm install #{application.chart} --name #{application.name} --version #{application.version} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
EOS
end
end
@@ -56,7 +56,7 @@ describe Gitlab::Kubernetes::Helm::InstallCommand do
<<~EOS
helm init --client-only >/dev/null
helm repo add #{application.name} #{application.repository}
- helm install #{application.chart} --name #{application.name} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
+ helm install #{application.chart} --name #{application.name} --version #{application.version} --namespace #{namespace} -f /data/helm/#{application.name}/config/values.yaml >/dev/null
EOS
end
end
diff --git a/spec/lib/gitlab/language_detection_spec.rb b/spec/lib/gitlab/language_detection_spec.rb
new file mode 100644
index 00000000000..9636fbd401b
--- /dev/null
+++ b/spec/lib/gitlab/language_detection_spec.rb
@@ -0,0 +1,85 @@
+require 'spec_helper'
+
+describe Gitlab::LanguageDetection do
+ set(:project) { create(:project, :repository) }
+ set(:ruby) { create(:programming_language, name: 'Ruby') }
+ set(:haskell) { create(:programming_language, name: 'Haskell') }
+ let(:repository) { project.repository }
+ let(:detection) do
+ [{ value: 66.63, label: "Ruby", color: "#701516", highlight: "#701516" },
+ { value: 12.96, label: "JavaScript", color: "#f1e05a", highlight: "#f1e05a" },
+ { value: 7.9, label: "Elixir", color: "#e34c26", highlight: "#e34c26" },
+ { value: 2.51, label: "CoffeeScript", color: "#244776", highlight: "#244776" },
+ { value: 1.51, label: "Go", color: "#2a4776", highlight: "#244776" },
+ { value: 1.1, label: "MepmepLang", color: "#2a4776", highlight: "#244776" }]
+ end
+ let(:repository_languages) do
+ [RepositoryLanguage.new(share: 10, programming_language: ruby)]
+ end
+
+ subject { described_class.new(repository, repository_languages) }
+
+ before do
+ allow(repository).to receive(:languages).and_return(detection)
+ end
+
+ describe '#languages' do
+ it 'returns the language names' do
+ expect(subject.languages).to eq(%w[Ruby JavaScript Elixir CoffeeScript Go])
+ end
+ end
+
+ describe '#insertions' do
+ let(:programming_languages) { [ruby, haskell] }
+ let(:detection) do
+ [{ value: 10, label: haskell.name, color: haskell.color }]
+ end
+
+ it 'only includes new languages' do
+ insertions = subject.insertions(programming_languages)
+
+ expect(insertions).not_to be_empty
+ expect(insertions.first[:project_id]).to be(project.id)
+ expect(insertions.first[:programming_language_id]).to be(haskell.id)
+ expect(insertions.first[:share]).to be(10)
+ end
+ end
+
+ describe '#updates' do
+ it 'updates the share of languages' do
+ first_update = subject.updates.first
+
+ expect(first_update).not_to be_nil
+ expect(first_update[:programming_language_id]).to eq(ruby.id)
+ expect(first_update[:share]).to eq(66.63)
+ end
+
+ it 'does not include languages to be removed' do
+ ids = subject.updates.map { |h| h[:programming_language_id] }
+
+ expect(ids).not_to include(haskell.id)
+ end
+
+ context 'when silent writes occur' do
+ let(:repository_languages) do
+ [RepositoryLanguage.new(share: 66.63, programming_language: ruby)]
+ end
+
+ it "doesn't include them in the result" do
+ expect(subject.updates).to be_empty
+ end
+ end
+ end
+
+ describe '#deletions' do
+ let(:repository_languages) do
+ [RepositoryLanguage.new(share: 10, programming_language: ruby),
+ RepositoryLanguage.new(share: 5, programming_language: haskell)]
+ end
+
+ it 'lists undetected languages' do
+ expect(subject.deletions).not_to be_empty
+ expect(subject.deletions).to include(haskell.id)
+ end
+ end
+end
diff --git a/spec/lib/gitlab/middleware/basic_health_check_spec.rb b/spec/lib/gitlab/middleware/basic_health_check_spec.rb
new file mode 100644
index 00000000000..187d903a5e1
--- /dev/null
+++ b/spec/lib/gitlab/middleware/basic_health_check_spec.rb
@@ -0,0 +1,57 @@
+require 'spec_helper'
+
+describe Gitlab::Middleware::BasicHealthCheck do
+ let(:app) { double(:app) }
+ let(:middleware) { described_class.new(app) }
+ let(:env) { {} }
+
+ describe '#call' do
+ context 'outside IP' do
+ before do
+ env['REMOTE_ADDR'] = '8.8.8.8'
+ end
+
+ it 'returns a 404' do
+ env['PATH_INFO'] = described_class::HEALTH_PATH
+
+ response = middleware.call(env)
+
+ expect(response[0]).to eq(404)
+ end
+
+ it 'forwards the call for other paths' do
+ env['PATH_INFO'] = '/'
+
+ expect(app).to receive(:call)
+
+ middleware.call(env)
+ end
+ end
+
+ context 'whitelisted IP' do
+ before do
+ env['REMOTE_ADDR'] = '127.0.0.1'
+ end
+
+ it 'returns 200 response when endpoint is hit' do
+ env['PATH_INFO'] = described_class::HEALTH_PATH
+
+ expect(app).not_to receive(:call)
+
+ response = middleware.call(env)
+
+ expect(response[0]).to eq(200)
+ expect(response[1]).to eq({ 'Content-Type' => 'text/plain' })
+ expect(response[2]).to eq(['GitLab OK'])
+ end
+
+ it 'forwards the call for other paths' do
+ env['PATH_INFO'] = '/-/readiness'
+
+ expect(app).to receive(:call)
+
+ middleware.call(env)
+ end
+ end
+ end
+end
diff --git a/spec/migrations/add_foreign_key_from_notification_settings_to_users_spec.rb b/spec/migrations/add_foreign_key_from_notification_settings_to_users_spec.rb
new file mode 100644
index 00000000000..656d4f75e3b
--- /dev/null
+++ b/spec/migrations/add_foreign_key_from_notification_settings_to_users_spec.rb
@@ -0,0 +1,36 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20180710162338_add_foreign_key_from_notification_settings_to_users.rb')
+
+describe AddForeignKeyFromNotificationSettingsToUsers, :migration do
+ let(:notification_settings) { table(:notification_settings) }
+ let(:users) { table(:users) }
+ let(:projects) { table(:projects) }
+
+ before do
+ users.create!(email: 'email@email.com', name: 'foo', username: 'foo', projects_limit: 0)
+ projects.create!(name: 'gitlab', path: 'gitlab-org/gitlab-ce', namespace_id: 1)
+ end
+
+ describe 'removal of orphans without user' do
+ let!(:notification_setting_without_user) { create_notification_settings!(user_id: 123) }
+ let!(:notification_setting_with_user) { create_notification_settings!(user_id: users.last.id) }
+
+ it 'removes orphaned notification_settings without user' do
+ expect { migrate! }.to change { notification_settings.count }.by(-1)
+ end
+
+ it "doesn't remove notification_settings with valid user" do
+ expect { migrate! }.not_to change { notification_setting_with_user.reload }
+ end
+ end
+
+ def create_notification_settings!(**opts)
+ notification_settings.create!(
+ source_id: projects.last.id,
+ source_type: 'Project',
+ user_id: users.last.id,
+ **opts)
+ end
+end
diff --git a/spec/migrations/generate_missing_routes_spec.rb b/spec/migrations/generate_missing_routes_spec.rb
new file mode 100644
index 00000000000..32515d353b0
--- /dev/null
+++ b/spec/migrations/generate_missing_routes_spec.rb
@@ -0,0 +1,84 @@
+require 'spec_helper'
+require Rails.root.join('db', 'migrate', '20180702134423_generate_missing_routes.rb')
+
+describe GenerateMissingRoutes, :migration do
+ describe '#up' do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:routes) { table(:routes) }
+
+ it 'creates routes for projects without a route' do
+ namespace = namespaces.create!(name: 'GitLab', path: 'gitlab')
+
+ routes.create!(
+ path: 'gitlab',
+ source_type: 'Namespace',
+ source_id: namespace.id
+ )
+
+ project = projects.create!(
+ name: 'GitLab CE',
+ path: 'gitlab-ce',
+ namespace_id: namespace.id
+ )
+
+ described_class.new.up
+
+ route = routes.where(source_type: 'Project').take
+
+ expect(route.source_id).to eq(project.id)
+ expect(route.path).to eq("gitlab/gitlab-ce-#{project.id}")
+ end
+
+ it 'creates routes for namespaces without a route' do
+ namespace = namespaces.create!(name: 'GitLab', path: 'gitlab')
+
+ described_class.new.up
+
+ route = routes.where(source_type: 'Namespace').take
+
+ expect(route.source_id).to eq(namespace.id)
+ expect(route.path).to eq("gitlab-#{namespace.id}")
+ end
+
+ it 'does not create routes for namespaces that already have a route' do
+ namespace = namespaces.create!(name: 'GitLab', path: 'gitlab')
+
+ routes.create!(
+ path: 'gitlab',
+ source_type: 'Namespace',
+ source_id: namespace.id
+ )
+
+ described_class.new.up
+
+ expect(routes.count).to eq(1)
+ end
+
+ it 'does not create routes for projects that already have a route' do
+ namespace = namespaces.create!(name: 'GitLab', path: 'gitlab')
+
+ routes.create!(
+ path: 'gitlab',
+ source_type: 'Namespace',
+ source_id: namespace.id
+ )
+
+ project = projects.create!(
+ name: 'GitLab CE',
+ path: 'gitlab-ce',
+ namespace_id: namespace.id
+ )
+
+ routes.create!(
+ path: 'gitlab/gitlab-ce',
+ source_type: 'Project',
+ source_id: project.id
+ )
+
+ described_class.new.up
+
+ expect(routes.count).to eq(2)
+ end
+ end
+end
diff --git a/spec/models/ci/build_runner_session_spec.rb b/spec/models/ci/build_runner_session_spec.rb
index 7183957aa50..35622366829 100644
--- a/spec/models/ci/build_runner_session_spec.rb
+++ b/spec/models/ci/build_runner_session_spec.rb
@@ -29,7 +29,7 @@ describe Ci::BuildRunnerSession, model: true do
it 'adds Authorization header if authorization is present' do
subject.authorization = 'whatever'
- expect(terminal_specification[:headers]).to include(Authorization: 'whatever')
+ expect(terminal_specification[:headers]).to include(Authorization: ['whatever'])
end
end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 67199eb6d26..32b8755ee9a 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -151,6 +151,42 @@ describe Ci::Build do
end
end
+ describe '.with_test_reports' do
+ subject { described_class.with_test_reports }
+
+ context 'when build has a test report' do
+ let!(:build) { create(:ci_build, :success, :test_reports) }
+
+ it 'selects the build' do
+ is_expected.to eq([build])
+ end
+ end
+
+ context 'when build does not have test reports' do
+ let!(:build) { create(:ci_build, :success, :trace_artifact) }
+
+ it 'does not select the build' do
+ is_expected.to be_empty
+ end
+ end
+
+ context 'when there are multiple builds with test reports' do
+ let!(:builds) { create_list(:ci_build, 5, :success, :test_reports) }
+
+ it 'does not execute a query for selecting job artifact one by one' do
+ recorded = ActiveRecord::QueryRecorder.new do
+ subject.each do |build|
+ Ci::JobArtifact::TEST_REPORT_FILE_TYPES.each do |file_type|
+ build.public_send("job_artifacts_#{file_type}").file.exists?
+ end
+ end
+ end
+
+ expect(recorded.count).to eq(2)
+ end
+ end
+ end
+
describe '#actionize' do
context 'when build is a created' do
before do
@@ -514,6 +550,44 @@ describe Ci::Build do
end
end
+ describe '#has_test_reports?' do
+ subject { build.has_test_reports? }
+
+ context 'when build has a test report' do
+ let(:build) { create(:ci_build, :test_reports) }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when build does not have test reports' do
+ let(:build) { create(:ci_build, :artifacts) }
+
+ it { is_expected.to be_falsy }
+ end
+ end
+
+ describe '#erase_test_reports!' do
+ subject { build.erase_test_reports! }
+
+ context 'when build has a test report' do
+ let!(:build) { create(:ci_build, :test_reports) }
+
+ it 'removes a test report' do
+ subject
+
+ expect(build.has_test_reports?).to be_falsy
+ end
+ end
+
+ context 'when build does not have test reports' do
+ let!(:build) { create(:ci_build, :artifacts) }
+
+ it 'does not erase anything' do
+ expect { subject }.not_to change { Ci::JobArtifact.count }
+ end
+ end
+ end
+
describe '#has_old_trace?' do
subject { build.has_old_trace? }
@@ -776,6 +850,10 @@ describe Ci::Build do
expect(build.artifacts_metadata.exists?).to be_falsy
end
+ it 'removes test reports' do
+ expect(build.job_artifacts.test_reports.count).to eq(0)
+ end
+
it 'erases build trace in trace file' do
expect(build).not_to have_trace
end
@@ -807,7 +885,7 @@ describe Ci::Build do
context 'build is erasable' do
context 'new artifacts' do
- let!(:build) { create(:ci_build, :trace_artifact, :success, :artifacts) }
+ let!(:build) { create(:ci_build, :test_reports, :trace_artifact, :success, :artifacts) }
describe '#erase' do
before do
@@ -2367,18 +2445,18 @@ describe Ci::Build do
end
end
- describe 'state transition: any => [:running]' do
+ describe '#has_valid_build_dependencies?' do
shared_examples 'validation is active' do
context 'when depended job has not been completed yet' do
let!(:pre_stage_job) { create(:ci_build, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) }
- it { expect { job.run! }.not_to raise_error }
+ it { expect(job).to have_valid_build_dependencies }
end
context 'when artifacts of depended job has been expired' do
let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
- it { expect { job.run! }.to raise_error(Ci::Build::MissingDependenciesError) }
+ it { expect(job).not_to have_valid_build_dependencies }
end
context 'when artifacts of depended job has been erased' do
@@ -2388,7 +2466,7 @@ describe Ci::Build do
pre_stage_job.erase
end
- it { expect { job.run! }.to raise_error(Ci::Build::MissingDependenciesError) }
+ it { expect(job).not_to have_valid_build_dependencies }
end
end
@@ -2396,12 +2474,13 @@ describe Ci::Build do
context 'when depended job has not been completed yet' do
let!(:pre_stage_job) { create(:ci_build, :manual, pipeline: pipeline, name: 'test', stage_idx: 0) }
- it { expect { job.run! }.not_to raise_error }
+ it { expect(job).to have_valid_build_dependencies }
end
+
context 'when artifacts of depended job has been expired' do
let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
- it { expect { job.run! }.not_to raise_error }
+ it { expect(job).to have_valid_build_dependencies }
end
context 'when artifacts of depended job has been erased' do
@@ -2411,7 +2490,7 @@ describe Ci::Build do
pre_stage_job.erase
end
- it { expect { job.run! }.not_to raise_error }
+ it { expect(job).to have_valid_build_dependencies }
end
end
@@ -2427,13 +2506,13 @@ describe Ci::Build do
context 'when "dependencies" keyword is not defined' do
let(:options) { {} }
- it { expect { job.run! }.not_to raise_error }
+ it { expect(job).to have_valid_build_dependencies }
end
context 'when "dependencies" keyword is empty' do
let(:options) { { dependencies: [] } }
- it { expect { job.run! }.not_to raise_error }
+ it { expect(job).to have_valid_build_dependencies }
end
context 'when "dependencies" keyword is specified' do
@@ -2717,6 +2796,60 @@ describe Ci::Build do
end
end
+ describe '#collect_test_reports!' do
+ subject { build.collect_test_reports!(test_reports) }
+
+ let(:test_reports) { Gitlab::Ci::Reports::TestReports.new }
+
+ it { expect(test_reports.get_suite(build.name).total_count).to eq(0) }
+
+ context 'when build has a test report' do
+ context 'when there is a JUnit test report from rspec test suite' do
+ before do
+ create(:ci_job_artifact, :junit, job: build, project: build.project)
+ end
+
+ it 'parses blobs and add the results to the test suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_reports.get_suite(build.name).total_count).to eq(4)
+ expect(test_reports.get_suite(build.name).success_count).to be(2)
+ expect(test_reports.get_suite(build.name).failed_count).to be(2)
+ end
+ end
+
+ context 'when there is a JUnit test report from java ant test suite' do
+ before do
+ create(:ci_job_artifact, :junit_with_ant, job: build, project: build.project)
+ end
+
+ it 'parses blobs and add the results to the test suite' do
+ expect { subject }.not_to raise_error
+
+ expect(test_reports.get_suite(build.name).total_count).to eq(3)
+ expect(test_reports.get_suite(build.name).success_count).to be(3)
+ expect(test_reports.get_suite(build.name).failed_count).to be(0)
+ end
+ end
+
+ context 'when there is a corrupted JUnit test report' do
+ before do
+ create(:ci_job_artifact, :junit_with_corrupted_data, job: build, project: build.project)
+ end
+
+ it 'raises an error' do
+ expect { subject }.to raise_error(Gitlab::Ci::Parsers::Junit::JunitParserError)
+ end
+ end
+ end
+
+ context 'when build does not have test reports' do
+ it 'raises an error' do
+ expect { subject }.to raise_error(NoMethodError)
+ end
+ end
+ end
+
describe '#artifacts_metadata_entry' do
set(:build) { create(:ci_build, project: project) }
let(:path) { 'other_artifacts_0.1.2/another-subdirectory/banana_sample.gif' }
@@ -2770,4 +2903,76 @@ describe Ci::Build do
end
end
end
+
+ describe '#publishes_artifacts_reports?' do
+ let(:build) { create(:ci_build, options: options) }
+
+ subject { build.publishes_artifacts_reports? }
+
+ context 'when artifacts reports are defined' do
+ let(:options) do
+ { artifacts: { reports: { junit: "junit.xml" } } }
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when artifacts reports missing defined' do
+ let(:options) do
+ { artifacts: { paths: ["file.txt"] } }
+ end
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when options are missing' do
+ let(:options) { nil }
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#runner_required_feature_names' do
+ let(:build) { create(:ci_build, options: options) }
+
+ subject { build.runner_required_feature_names }
+
+ context 'when artifacts reports are defined' do
+ let(:options) do
+ { artifacts: { reports: { junit: "junit.xml" } } }
+ end
+
+ it { is_expected.to include(:upload_multiple_artifacts) }
+ end
+ end
+
+ describe '#supported_runner?' do
+ set(:build) { create(:ci_build) }
+
+ subject { build.supported_runner?(runner_features) }
+
+ context 'when feature is required by build' do
+ before do
+ expect(build).to receive(:runner_required_feature_names) do
+ [:upload_multiple_artifacts]
+ end
+ end
+
+ context 'when runner provides given feature' do
+ let(:runner_features) do
+ { upload_multiple_artifacts: true }
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when runner does not provide given feature' do
+ let(:runner_features) do
+ {}
+ end
+
+ it { is_expected.to be_falsey }
+ end
+ end
+ end
end
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index 0fd7612c011..1bf338f4c70 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -15,6 +15,22 @@ describe Ci::JobArtifact do
it { is_expected.to delegate_method(:open).to(:file) }
it { is_expected.to delegate_method(:exists?).to(:file) }
+ describe '.test_reports' do
+ subject { described_class.test_reports }
+
+ context 'when there is a test report' do
+ let!(:artifact) { create(:ci_job_artifact, :junit) }
+
+ it { is_expected.to eq([artifact]) }
+ end
+
+ context 'when there are no test reports' do
+ let!(:artifact) { create(:ci_job_artifact, :archive) }
+
+ it { is_expected.to be_empty }
+ end
+ end
+
describe 'callbacks' do
subject { create(:ci_job_artifact, :archive) }
@@ -87,6 +103,40 @@ describe Ci::JobArtifact do
end
end
+ describe 'validates file format' do
+ subject { artifact }
+
+ context 'when archive type with zip format' do
+ let(:artifact) { build(:ci_job_artifact, :archive, file_format: :zip) }
+
+ it { is_expected.to be_valid }
+ end
+
+ context 'when archive type with gzip format' do
+ let(:artifact) { build(:ci_job_artifact, :archive, file_format: :gzip) }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when archive type without format specification' do
+ let(:artifact) { build(:ci_job_artifact, :archive, file_format: nil) }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when junit type with zip format' do
+ let(:artifact) { build(:ci_job_artifact, :junit, file_format: :zip) }
+
+ it { is_expected.not_to be_valid }
+ end
+
+ context 'when junit type with gzip format' do
+ let(:artifact) { build(:ci_job_artifact, :junit, file_format: :gzip) }
+
+ it { is_expected.to be_valid }
+ end
+ end
+
describe '#file' do
subject { artifact.file }
@@ -97,6 +147,34 @@ describe Ci::JobArtifact do
end
end
+ describe '#each_blob' do
+ context 'when file format is gzip' do
+ context 'when gzip file contains one file' do
+ let(:artifact) { build(:ci_job_artifact, :junit) }
+
+ it 'iterates blob once' do
+ expect { |b| artifact.each_blob(&b) }.to yield_control.once
+ end
+ end
+
+ context 'when gzip file contains three files' do
+ let(:artifact) { build(:ci_job_artifact, :junit_with_three_testsuites) }
+
+ it 'iterates blob three times' do
+ expect { |b| artifact.each_blob(&b) }.to yield_control.exactly(3).times
+ end
+ end
+ end
+
+ context 'when there are no adapters for the file format' do
+ let(:artifact) { build(:ci_job_artifact, :junit, file_format: :zip) }
+
+ it 'raises an error' do
+ expect { |b| artifact.each_blob(&b) }.to raise_error(described_class::NotSupportedAdapterError)
+ end
+ end
+ end
+
describe '#expire_in' do
subject { artifact.expire_in }
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index a41657b53b7..3512ba6aee5 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -1851,6 +1851,62 @@ describe Ci::Pipeline, :mailer do
end
end
+ describe '#has_test_reports?' do
+ subject { pipeline.has_test_reports? }
+
+ context 'when pipeline has builds with test reports' do
+ before do
+ create(:ci_build, pipeline: pipeline, project: project).tap do |build|
+ create(:ci_job_artifact, :junit, job: build, project: build.project)
+ end
+ end
+
+ context 'when pipeline status is running' do
+ let(:pipeline) { create(:ci_pipeline, :running, project: project) }
+
+ it { is_expected.to be_falsey }
+ end
+
+ context 'when pipeline status is success' do
+ let(:pipeline) { create(:ci_pipeline, :success, project: project) }
+
+ it { is_expected.to be_truthy }
+ end
+ end
+
+ context 'when pipeline does not have builds with test reports' do
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#test_reports' do
+ subject { pipeline.test_reports }
+
+ context 'when pipeline has multiple builds with test reports' do
+ before do
+ create(:ci_build, :success, name: 'rspec', pipeline: pipeline, project: project).tap do |build|
+ create(:ci_job_artifact, :junit, job: build, project: build.project)
+ end
+
+ create(:ci_build, :success, name: 'java', pipeline: pipeline, project: project).tap do |build|
+ create(:ci_job_artifact, :junit_with_ant, job: build, project: build.project)
+ end
+ end
+
+ it 'returns test reports with collected data' do
+ expect(subject.total_count).to be(7)
+ expect(subject.success_count).to be(5)
+ expect(subject.failed_count).to be(2)
+ end
+ end
+
+ context 'when pipeline does not have any builds with test reports' do
+ it 'returns empty test reports' do
+ expect(subject.total_count).to be(0)
+ end
+ end
+ end
+
describe '#total_size' do
let!(:build_job1) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
let!(:build_job2) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
diff --git a/spec/models/clusters/applications/ingress_spec.rb b/spec/models/clusters/applications/ingress_spec.rb
index bb5b2ef3a47..d378248d5d6 100644
--- a/spec/models/clusters/applications/ingress_spec.rb
+++ b/spec/models/clusters/applications/ingress_spec.rb
@@ -23,6 +23,20 @@ describe Clusters::Applications::Ingress do
it { is_expected.to contain_exactly(cluster) }
end
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_ingress, :scheduled, version: '0.22.0') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('0.23.0')
+ end
+ end
+ end
+
describe '#make_installed!' do
before do
application.make_installed!
@@ -73,9 +87,17 @@ describe Clusters::Applications::Ingress do
it 'should be initialized with ingress arguments' do
expect(subject.name).to eq('ingress')
expect(subject.chart).to eq('stable/nginx-ingress')
- expect(subject.version).to be_nil
+ expect(subject.version).to eq('0.23.0')
expect(subject.values).to eq(ingress.values)
end
+
+ context 'application failed to install previously' do
+ let(:ingress) { create(:clusters_applications_ingress, :errored, version: 'nginx') }
+
+ it 'should be initialized with the locked version' do
+ expect(subject.version).to eq('0.23.0')
+ end
+ end
end
describe '#values' do
diff --git a/spec/models/clusters/applications/jupyter_spec.rb b/spec/models/clusters/applications/jupyter_spec.rb
index 65750141e65..e0d57ac65f7 100644
--- a/spec/models/clusters/applications/jupyter_spec.rb
+++ b/spec/models/clusters/applications/jupyter_spec.rb
@@ -25,6 +25,20 @@ describe Clusters::Applications::Jupyter do
end
end
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_jupyter, :scheduled, version: 'v0.5') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('v0.6')
+ end
+ end
+ end
+
describe '#install_command' do
let!(:ingress) { create(:clusters_applications_ingress, :installed, external_ip: '127.0.0.1') }
let!(:jupyter) { create(:clusters_applications_jupyter, cluster: ingress.cluster) }
@@ -36,10 +50,18 @@ describe Clusters::Applications::Jupyter do
it 'should be initialized with 4 arguments' do
expect(subject.name).to eq('jupyter')
expect(subject.chart).to eq('jupyter/jupyterhub')
- expect(subject.version).to be_nil
+ expect(subject.version).to eq('v0.6')
expect(subject.repository).to eq('https://jupyterhub.github.io/helm-chart/')
expect(subject.values).to eq(jupyter.values)
end
+
+ context 'application failed to install previously' do
+ let(:jupyter) { create(:clusters_applications_jupyter, :errored, version: '0.0.1') }
+
+ it 'should be initialized with the locked version' do
+ expect(subject.version).to eq('v0.6')
+ end
+ end
end
describe '#values' do
diff --git a/spec/models/clusters/applications/prometheus_spec.rb b/spec/models/clusters/applications/prometheus_spec.rb
index efd57040005..3812c65b3b6 100644
--- a/spec/models/clusters/applications/prometheus_spec.rb
+++ b/spec/models/clusters/applications/prometheus_spec.rb
@@ -16,6 +16,20 @@ describe Clusters::Applications::Prometheus do
it { is_expected.to contain_exactly(cluster) }
end
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_prometheus, :scheduled, version: '6.7.2') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('6.7.3')
+ end
+ end
+ end
+
describe 'transition to installed' do
let(:project) { create(:project) }
let(:cluster) { create(:cluster, projects: [project]) }
@@ -34,6 +48,47 @@ describe Clusters::Applications::Prometheus do
end
end
+ describe '#ready' do
+ let(:project) { create(:project) }
+ let(:cluster) { create(:cluster, projects: [project]) }
+
+ it 'returns true when installed' do
+ application = build(:clusters_applications_prometheus, :installed, cluster: cluster)
+
+ expect(application).to be_ready
+ end
+
+ it 'returns false when not_installable' do
+ application = build(:clusters_applications_prometheus, :not_installable, cluster: cluster)
+
+ expect(application).not_to be_ready
+ end
+
+ it 'returns false when installable' do
+ application = build(:clusters_applications_prometheus, :installable, cluster: cluster)
+
+ expect(application).not_to be_ready
+ end
+
+ it 'returns false when scheduled' do
+ application = build(:clusters_applications_prometheus, :scheduled, cluster: cluster)
+
+ expect(application).not_to be_ready
+ end
+
+ it 'returns false when installing' do
+ application = build(:clusters_applications_prometheus, :installing, cluster: cluster)
+
+ expect(application).not_to be_ready
+ end
+
+ it 'returns false when errored' do
+ application = build(:clusters_applications_prometheus, :errored, cluster: cluster)
+
+ expect(application).not_to be_ready
+ end
+ end
+
describe '#prometheus_client' do
context 'cluster is nil' do
it 'returns nil' do
@@ -102,15 +157,25 @@ describe Clusters::Applications::Prometheus do
let(:kubeclient) { double('kubernetes client') }
let(:prometheus) { create(:clusters_applications_prometheus) }
- subject { prometheus.install_command }
-
- it { is_expected.to be_an_instance_of(Gitlab::Kubernetes::Helm::InstallCommand) }
+ it 'returns an instance of Gitlab::Kubernetes::Helm::InstallCommand' do
+ expect(prometheus.install_command).to be_an_instance_of(Gitlab::Kubernetes::Helm::InstallCommand)
+ end
it 'should be initialized with 3 arguments' do
- expect(subject.name).to eq('prometheus')
- expect(subject.chart).to eq('stable/prometheus')
- expect(subject.version).to eq('6.7.3')
- expect(subject.values).to eq(prometheus.values)
+ command = prometheus.install_command
+
+ expect(command.name).to eq('prometheus')
+ expect(command.chart).to eq('stable/prometheus')
+ expect(command.version).to eq('6.7.3')
+ expect(command.values).to eq(prometheus.values)
+ end
+
+ context 'application failed to install previously' do
+ let(:prometheus) { create(:clusters_applications_prometheus, :errored, version: '2.0.0') }
+
+ it 'should be initialized with the locked version' do
+ expect(subject.version).to eq('6.7.3')
+ end
end
end
diff --git a/spec/models/clusters/applications/runner_spec.rb b/spec/models/clusters/applications/runner_spec.rb
index b12500d0acd..526300755b5 100644
--- a/spec/models/clusters/applications/runner_spec.rb
+++ b/spec/models/clusters/applications/runner_spec.rb
@@ -8,6 +8,20 @@ describe Clusters::Applications::Runner do
it { is_expected.to belong_to(:runner) }
+ describe '#make_installing!' do
+ before do
+ application.make_installing!
+ end
+
+ context 'application install previously errored with older version' do
+ let(:application) { create(:clusters_applications_runner, :scheduled, version: '0.1.30') }
+
+ it 'updates the application version' do
+ expect(application.reload.version).to eq('0.1.31')
+ end
+ end
+ end
+
describe '.installed' do
subject { described_class.installed }
@@ -31,10 +45,18 @@ describe Clusters::Applications::Runner do
it 'should be initialized with 4 arguments' do
expect(subject.name).to eq('runner')
expect(subject.chart).to eq('runner/gitlab-runner')
- expect(subject.version).to be_nil
+ expect(subject.version).to eq('0.1.31')
expect(subject.repository).to eq('https://charts.gitlab.io')
expect(subject.values).to eq(gitlab_runner.values)
end
+
+ context 'application failed to install previously' do
+ let(:gitlab_runner) { create(:clusters_applications_runner, :errored, runner: ci_runner, version: '0.1.13') }
+
+ it 'should be initialized with the locked version' do
+ expect(subject.version).to eq('0.1.31')
+ end
+ end
end
describe '#values' do
diff --git a/spec/models/concerns/reactive_caching_spec.rb b/spec/models/concerns/reactive_caching_spec.rb
index 0f156619e9e..79f75c0ffa0 100644
--- a/spec/models/concerns/reactive_caching_spec.rb
+++ b/spec/models/concerns/reactive_caching_spec.rb
@@ -125,6 +125,13 @@ describe ReactiveCaching, :use_clean_rails_memory_store_caching do
go!
end
+ it "calls a reactive_cache_updated only once if content did not change on subsequent update" do
+ expect(instance).to receive(:calculate_reactive_cache).twice
+ expect(instance).to receive(:reactive_cache_updated).once
+
+ 2.times { instance.exclusively_update_reactive_cache! }
+ end
+
context 'and #calculate_reactive_cache raises an exception' do
before do
stub_reactive_cache(instance, "preexisting")
diff --git a/spec/models/concerns/routable_spec.rb b/spec/models/concerns/routable_spec.rb
index ed3e28fbeca..565266321d3 100644
--- a/spec/models/concerns/routable_spec.rb
+++ b/spec/models/concerns/routable_spec.rb
@@ -12,16 +12,6 @@ describe Group, 'Routable' do
it { is_expected.to have_many(:redirect_routes).dependent(:destroy) }
end
- describe 'GitLab read-only instance' do
- it 'does not save route if route is not present' do
- group.route.path = ''
- allow(Gitlab::Database).to receive(:read_only?).and_return(true)
- expect(group).to receive(:update_route).and_call_original
-
- expect { group.full_path }.to change { Route.count }.by(0)
- end
- end
-
describe 'Callbacks' do
it 'creates route record on create' do
expect(group.route.path).to eq(group.path)
@@ -131,29 +121,6 @@ describe Group, 'Routable' do
it { expect(group.full_path).to eq(group.path) }
it { expect(nested_group.full_path).to eq("#{group.full_path}/#{nested_group.path}") }
-
- context 'with RequestStore active', :request_store do
- it 'does not load the route table more than once' do
- group.expires_full_path_cache
- expect(group).to receive(:uncached_full_path).once.and_call_original
-
- 3.times { group.full_path }
- expect(group.full_path).to eq(group.path)
- end
- end
- end
-
- describe '#expires_full_path_cache' do
- context 'with RequestStore active', :request_store do
- it 'expires the full_path cache' do
- expect(group.full_path).to eq('foo')
-
- group.route.update(path: 'bar', name: 'bar')
- group.expires_full_path_cache
-
- expect(group.full_path).to eq('bar')
- end
- end
end
describe '#full_name' do
diff --git a/spec/models/deploy_token_spec.rb b/spec/models/deploy_token_spec.rb
index cd84a684fec..3435f93c999 100644
--- a/spec/models/deploy_token_spec.rb
+++ b/spec/models/deploy_token_spec.rb
@@ -74,6 +74,14 @@ describe DeployToken do
expect(deploy_token.active?).to be_falsy
end
end
+
+ context "when it hasn't been revoked and has no expiry" do
+ let(:deploy_token) { create(:deploy_token, expires_at: nil) }
+
+ it 'should return true' do
+ expect(deploy_token.active?).to be_truthy
+ end
+ end
end
describe '#username' do
diff --git a/spec/models/internal_id_spec.rb b/spec/models/internal_id_spec.rb
index 581fd0293cc..20600f5fa38 100644
--- a/spec/models/internal_id_spec.rb
+++ b/spec/models/internal_id_spec.rb
@@ -79,6 +79,46 @@ describe InternalId do
end
end
+ describe '.track_greatest' do
+ let(:value) { 9001 }
+ subject { described_class.track_greatest(issue, scope, usage, value, init) }
+
+ context 'in the absence of a record' do
+ it 'creates a record if not yet present' do
+ expect { subject }.to change { described_class.count }.from(0).to(1)
+ end
+ end
+
+ it 'stores record attributes' do
+ subject
+
+ described_class.first.tap do |record|
+ expect(record.project).to eq(project)
+ expect(record.usage).to eq(usage.to_s)
+ expect(record.last_value).to eq(value)
+ end
+ end
+
+ context 'with existing issues' do
+ before do
+ create(:issue, project: project)
+ described_class.delete_all
+ end
+
+ it 'still returns the last value to that of the given value' do
+ expect(subject).to eq(value)
+ end
+ end
+
+ context 'when value is less than the current last_value' do
+ it 'returns the current last_value' do
+ described_class.create!(**scope, usage: usage, last_value: 10_001)
+
+ expect(subject).to eq 10_001
+ end
+ end
+ end
+
describe '#increment_and_save!' do
let(:id) { create(:internal_id) }
subject { id.increment_and_save! }
@@ -103,4 +143,30 @@ describe InternalId do
end
end
end
+
+ describe '#track_greatest_and_save!' do
+ let(:id) { create(:internal_id) }
+ let(:new_last_value) { 9001 }
+ subject { id.track_greatest_and_save!(new_last_value) }
+
+ it 'returns new last value' do
+ expect(subject).to eq new_last_value
+ end
+
+ it 'saves the record' do
+ subject
+
+ expect(id.changed?).to be_falsey
+ end
+
+ context 'when new last value is lower than the max' do
+ it 'does not update the last value' do
+ id.update!(last_value: 10_001)
+
+ subject
+
+ expect(id.reload.last_value).to eq 10_001
+ end
+ end
+ end
end
diff --git a/spec/models/label_spec.rb b/spec/models/label_spec.rb
index 8914845ea82..99670af786a 100644
--- a/spec/models/label_spec.rb
+++ b/spec/models/label_spec.rb
@@ -139,4 +139,20 @@ describe Label do
end
end
end
+
+ describe '.search' do
+ let(:label) { create(:label, title: 'bug', description: 'incorrect behavior') }
+
+ it 'returns labels with a partially matching title' do
+ expect(described_class.search(label.title[0..2])).to eq([label])
+ end
+
+ it 'returns labels with a partially matching description' do
+ expect(described_class.search(label.description[0..5])).to eq([label])
+ end
+
+ it 'returns nothing' do
+ expect(described_class.search('feature')).to be_empty
+ end
+ end
end
diff --git a/spec/models/merge_request_diff_spec.rb b/spec/models/merge_request_diff_spec.rb
index 0aee78ac12d..90cce826b6c 100644
--- a/spec/models/merge_request_diff_spec.rb
+++ b/spec/models/merge_request_diff_spec.rb
@@ -127,6 +127,13 @@ describe MergeRequestDiff do
expect(diffs.map(&:new_path)).to contain_exactly('files/ruby/popen.rb')
end
+ it 'only serializes diff files found by query' do
+ expect(diff_with_commits.merge_request_diff_files.count).to be > 10
+ expect_any_instance_of(MergeRequestDiffFile).to receive(:to_hash).once
+
+ diffs
+ end
+
it 'uses the diffs from the DB' do
expect(diff_with_commits).to receive(:load_diffs)
diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb
index b0d9d03bf6c..ffdec09deef 100644
--- a/spec/models/merge_request_spec.rb
+++ b/spec/models/merge_request_spec.rb
@@ -3,6 +3,7 @@ require 'spec_helper'
describe MergeRequest do
include RepoHelpers
include ProjectForksHelper
+ include ReactiveCachingHelpers
subject { create(:merge_request) }
@@ -1079,6 +1080,86 @@ describe MergeRequest do
end
end
+ describe '#has_test_reports?' do
+ subject { merge_request.has_test_reports? }
+
+ let(:project) { create(:project, :repository) }
+
+ context 'when head pipeline has test reports' do
+ let(:merge_request) { create(:merge_request, :with_test_reports, source_project: project) }
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when head pipeline does not have test reports' do
+ let(:merge_request) { create(:merge_request, source_project: project) }
+
+ it { is_expected.to be_falsey }
+ end
+ end
+
+ describe '#compare_test_reports' do
+ subject { merge_request.compare_test_reports }
+
+ let(:project) { create(:project, :repository) }
+ let(:merge_request) { create(:merge_request, source_project: project) }
+
+ let!(:base_pipeline) do
+ create(:ci_pipeline,
+ :with_test_reports,
+ project: project,
+ ref: merge_request.target_branch,
+ sha: merge_request.diff_base_sha)
+ end
+
+ before do
+ merge_request.update!(head_pipeline_id: head_pipeline.id)
+ end
+
+ context 'when head pipeline has test reports' do
+ let!(:head_pipeline) do
+ create(:ci_pipeline,
+ :with_test_reports,
+ project: project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha)
+ end
+
+ context 'when reactive cache worker is parsing asynchronously' do
+ it 'returns status' do
+ expect(subject[:status]).to eq(:parsing)
+ end
+ end
+
+ context 'when reactive cache worker is inline' do
+ before do
+ synchronous_reactive_cache(merge_request)
+ end
+
+ it 'returns status and data' do
+ expect_any_instance_of(Ci::CompareTestReportsService)
+ .to receive(:execute).with(base_pipeline.iid, head_pipeline.iid)
+
+ subject
+ end
+ end
+ end
+
+ context 'when head pipeline does not have test reports' do
+ let!(:head_pipeline) do
+ create(:ci_pipeline,
+ project: project,
+ ref: merge_request.source_branch,
+ sha: merge_request.diff_head_sha)
+ end
+
+ it 'returns status and error message' do
+ expect(subject[:status]).to eq(:error)
+ expect(subject[:status_reason]).to eq('This merge request does not have test reports')
+ end
+ end
+ end
+
describe '#all_commit_shas' do
context 'when merge request is persisted' do
let(:all_commit_shas) do
@@ -2010,6 +2091,26 @@ describe MergeRequest do
end
end
+ describe '#base_pipeline' do
+ let(:pipeline_arguments) do
+ {
+ project: project,
+ ref: merge_request.target_branch,
+ sha: merge_request.diff_base_sha
+ }
+ end
+
+ let(:project) { create(:project, :public, :repository) }
+ let(:merge_request) { create(:merge_request, source_project: project) }
+
+ let!(:first_pipeline) { create(:ci_pipeline_without_jobs, pipeline_arguments) }
+ let!(:last_pipeline) { create(:ci_pipeline_without_jobs, pipeline_arguments) }
+
+ it 'returns latest pipeline' do
+ expect(merge_request.base_pipeline).to eq(last_pipeline)
+ end
+ end
+
describe '#has_commits?' do
before do
allow(subject.merge_request_diff).to receive(:commits_count)
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb
index 204d6b47832..55b984faecf 100644
--- a/spec/models/milestone_spec.rb
+++ b/spec/models/milestone_spec.rb
@@ -310,4 +310,24 @@ describe Milestone do
expect(milestone.participants).to eq [user]
end
end
+
+ describe '.sort_by_attribute' do
+ set(:milestone_1) { create(:milestone, title: 'Foo') }
+ set(:milestone_2) { create(:milestone, title: 'Bar') }
+ set(:milestone_3) { create(:milestone, title: 'Zoo') }
+
+ context 'ordering by name ascending' do
+ it 'sorts by title ascending' do
+ expect(described_class.sort_by_attribute('name_asc'))
+ .to eq([milestone_2, milestone_1, milestone_3])
+ end
+ end
+
+ context 'ordering by name descending' do
+ it 'sorts by title descending' do
+ expect(described_class.sort_by_attribute('name_desc'))
+ .to eq([milestone_3, milestone_1, milestone_2])
+ end
+ end
+ end
end
diff --git a/spec/models/namespace_spec.rb b/spec/models/namespace_spec.rb
index c1b385aaf76..9b7f932ec3a 100644
--- a/spec/models/namespace_spec.rb
+++ b/spec/models/namespace_spec.rb
@@ -205,6 +205,34 @@ describe Namespace do
expect(gitlab_shell.exists?(project.repository_storage, "#{namespace.path}/#{project.path}.git")).to be_truthy
end
+ context 'when #write_projects_repository_config raises an error' do
+ context 'in test environment' do
+ it 'raises an exception' do
+ expect(namespace).to receive(:write_projects_repository_config).and_raise('foo')
+
+ expect do
+ namespace.update(path: namespace.full_path + '_new')
+ end.to raise_error('foo')
+ end
+ end
+
+ context 'in production environment' do
+ it 'does not cancel later callbacks' do
+ expect(namespace).to receive(:write_projects_repository_config).and_raise('foo')
+ expect(namespace).to receive(:move_dir).and_wrap_original do |m, *args|
+ move_dir_result = m.call(*args)
+
+ expect(move_dir_result).to be_truthy # Must be truthy, or else later callbacks would be canceled
+
+ move_dir_result
+ end
+ expect(Gitlab::Sentry).to receive(:should_raise?).and_return(false) # like prod
+
+ namespace.update(path: namespace.full_path + '_new')
+ end
+ end
+ end
+
context 'with subgroups', :nested_groups do
let(:parent) { create(:group, name: 'parent', path: 'parent') }
let(:new_parent) { create(:group, name: 'new_parent', path: 'new_parent') }
@@ -295,6 +323,16 @@ describe Namespace do
parent.update(path: 'mygroup_new')
+ # Routes are loaded when creating the projects, so we need to manually
+ # reload them for the below code to be aware of the above UPDATE.
+ [
+ project_in_parent_group,
+ hashed_project_in_subgroup,
+ legacy_project_in_subgroup
+ ].each do |project|
+ project.route.reload
+ end
+
expect(project_rugged(project_in_parent_group).config['gitlab.fullpath']).to eq "mygroup_new/#{project_in_parent_group.path}"
expect(project_rugged(hashed_project_in_subgroup).config['gitlab.fullpath']).to eq "mygroup_new/mysubgroup/#{hashed_project_in_subgroup.path}"
expect(project_rugged(legacy_project_in_subgroup).config['gitlab.fullpath']).to eq "mygroup_new/mysubgroup/#{legacy_project_in_subgroup.path}"
diff --git a/spec/models/programming_language_spec.rb b/spec/models/programming_language_spec.rb
new file mode 100644
index 00000000000..99cd358f863
--- /dev/null
+++ b/spec/models/programming_language_spec.rb
@@ -0,0 +1,11 @@
+require 'spec_helper'
+
+describe ProgrammingLanguage do
+ it { is_expected.to respond_to(:name) }
+ it { is_expected.to respond_to(:color) }
+
+ it { is_expected.to validate_presence_of(:name) }
+ it { is_expected.to allow_value("#000000").for(:color) }
+ it { is_expected.not_to allow_value("000000").for(:color) }
+ it { is_expected.not_to allow_value("#0z0000").for(:color) }
+end
diff --git a/spec/models/project_feature_spec.rb b/spec/models/project_feature_spec.rb
index cd7f77024da..10617edec0f 100644
--- a/spec/models/project_feature_spec.rb
+++ b/spec/models/project_feature_spec.rb
@@ -119,4 +119,46 @@ describe ProjectFeature do
end
end
end
+
+ context 'Site Statistics' do
+ set(:project_with_wiki) { create(:project, :wiki_enabled) }
+ set(:project_without_wiki) { create(:project, :wiki_disabled) }
+
+ context 'when creating a project' do
+ it 'tracks wiki availability when wikis are enabled by default' do
+ expect { create(:project) }.to change { SiteStatistic.fetch.wikis_count }.by(1)
+ end
+
+ it 'does not track wiki availability when wikis are disabled by default' do
+ expect { create(:project, :wiki_disabled) }.not_to change { SiteStatistic.fetch.wikis_count }
+ end
+ end
+
+ context 'when updating a project_feature' do
+ it 'untracks wiki availability when disabling wiki access' do
+ expect { project_with_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::DISABLED) }
+ .to change { SiteStatistic.fetch.wikis_count }.by(-1)
+ end
+
+ it 'tracks again wiki availability when re-enabling wiki access as public' do
+ expect { project_without_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::ENABLED) }
+ .to change { SiteStatistic.fetch.wikis_count }.by(1)
+ end
+
+ it 'tracks again wiki availability when re-enabling wiki access as private' do
+ expect { project_without_wiki.project_feature.update_attribute(:wiki_access_level, ProjectFeature::PRIVATE) }
+ .to change { SiteStatistic.fetch.wikis_count }.by(1)
+ end
+ end
+
+ context 'when removing a project' do
+ it 'untracks wiki availability when removing a project with previous wiki access' do
+ expect { project_with_wiki.destroy }.to change { SiteStatistic.fetch.wikis_count }.by(-1)
+ end
+
+ it 'does not untrack wiki availability when removing a project without wiki access' do
+ expect { project_without_wiki.destroy }.not_to change { SiteStatistic.fetch.wikis_count }
+ end
+ end
+ end
end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index b0ec725bf70..4313d52d60a 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -69,6 +69,7 @@ describe Project do
it { is_expected.to have_many(:pages_domains) }
it { is_expected.to have_many(:labels).class_name('ProjectLabel') }
it { is_expected.to have_many(:users_star_projects) }
+ it { is_expected.to have_many(:repository_languages) }
it { is_expected.to have_many(:environments) }
it { is_expected.to have_many(:deployments) }
it { is_expected.to have_many(:todos) }
@@ -102,6 +103,22 @@ describe Project do
end
end
+ context 'Site Statistics' do
+ context 'when creating a new project' do
+ it 'tracks project in SiteStatistic' do
+ expect { create(:project) }.to change { SiteStatistic.fetch.repositories_count }.by(1)
+ end
+ end
+
+ context 'when deleting a project' do
+ it 'untracks project in SiteStatistic' do
+ project = create(:project)
+
+ expect { project.destroy }.to change { SiteStatistic.fetch.repositories_count }.by(-1)
+ end
+ end
+ end
+
context 'updating cd_cd_settings' do
it 'does not raise an error' do
project = create(:project)
@@ -2942,8 +2959,6 @@ describe Project do
expect(project).to receive(:expire_caches_before_rename)
- expect(project).to receive(:expires_full_path_cache)
-
project.rename_repo
end
@@ -3092,6 +3107,19 @@ describe Project do
allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
end
+ context 'migration to hashed storage' do
+ it 'calls HashedStorageMigrationService with correct options' do
+ project = create(:project, :repository, :legacy_storage)
+ allow(project).to receive(:previous_changes).and_return('path' => ['foo'])
+
+ expect_next_instance_of(::Projects::HashedStorageMigrationService) do |service|
+ expect(service).to receive(:execute).and_return(true)
+ end
+
+ project.rename_repo
+ end
+ end
+
it 'renames a repository' do
stub_container_registry_config(enabled: false)
@@ -3103,8 +3131,6 @@ describe Project do
expect(project).to receive(:expire_caches_before_rename)
- expect(project).to receive(:expires_full_path_cache)
-
project.rename_repo
end
@@ -3140,8 +3166,10 @@ describe Project do
context 'when not rolled out' do
let(:project) { create(:project, :repository, storage_version: 1, skip_disk_validation: true) }
- it 'moves pages folder to new location' do
- expect_any_instance_of(Gitlab::UploadsTransfer).to receive(:rename_project)
+ it 'moves pages folder to hashed storage' do
+ expect_next_instance_of(Projects::HashedStorage::MigrateAttachmentsService) do |service|
+ expect(service).to receive(:execute)
+ end
project.rename_repo
end
@@ -3865,6 +3893,16 @@ describe Project do
end
end
+ context '#commits_by' do
+ let(:project) { create(:project, :repository) }
+ let(:commits) { project.repository.commits('HEAD', limit: 3).commits }
+ let(:commit_shas) { commits.map(&:id) }
+
+ it 'retrieves several commits from the repository by oid' do
+ expect(project.commits_by(oids: commit_shas)).to eq commits
+ end
+ end
+
def rugged_config
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
project.repository.rugged.config
diff --git a/spec/models/project_statistics_spec.rb b/spec/models/project_statistics_spec.rb
index 38a3590ad12..64c39f09e33 100644
--- a/spec/models/project_statistics_spec.rb
+++ b/spec/models/project_statistics_spec.rb
@@ -128,6 +128,12 @@ describe ProjectStatistics do
.by(13)
end
+ it 'increases also storage size by that amount' do
+ expect { described_class.increment_statistic(project.id, :build_artifacts_size, 20) }
+ .to change { statistics.reload.storage_size }
+ .by(20)
+ end
+
context 'when the amount is 0' do
it 'does not execute a query' do
project
diff --git a/spec/models/repository_language_spec.rb b/spec/models/repository_language_spec.rb
new file mode 100644
index 00000000000..e2e4beb512f
--- /dev/null
+++ b/spec/models/repository_language_spec.rb
@@ -0,0 +1,16 @@
+require 'spec_helper'
+
+describe RepositoryLanguage do
+ let(:repository_language) { build(:repository_language) }
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:project) }
+ it { is_expected.to belong_to(:programming_language) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to allow_value(0).for(:share) }
+ it { is_expected.to allow_value(100.0).for(:share) }
+ it { is_expected.not_to allow_value(100.1).for(:share) }
+ end
+end
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 5d64602ca56..52ec8dbe25a 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -1129,16 +1129,12 @@ describe Repository do
end
it 'raises Rugged::ReferenceError' do
- raise_reference_error = raise_error(Rugged::ReferenceError) do |err|
- expect(err.cause).to be_nil
- end
-
expect do
Gitlab::Git::OperationService.new(git_user, target_project.repository.raw_repository)
.with_branch('feature',
start_repository: project.repository.raw_repository,
&:itself)
- end.to raise_reference_error
+ end.to raise_error(Gitlab::Git::CommandError)
end
end
diff --git a/spec/models/resource_label_event_spec.rb b/spec/models/resource_label_event_spec.rb
new file mode 100644
index 00000000000..4756caa1b97
--- /dev/null
+++ b/spec/models/resource_label_event_spec.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe ResourceLabelEvent, type: :model do
+ subject { build(:resource_label_event) }
+ let(:issue) { create(:issue) }
+ let(:merge_request) { create(:merge_request) }
+
+ describe 'associations' do
+ it { is_expected.to belong_to(:user) }
+ it { is_expected.to belong_to(:issue) }
+ it { is_expected.to belong_to(:merge_request) }
+ it { is_expected.to belong_to(:label) }
+ end
+
+ describe 'validations' do
+ it { is_expected.to be_valid }
+ it { is_expected.to validate_presence_of(:label) }
+ it { is_expected.to validate_presence_of(:user) }
+
+ describe 'Issuable validation' do
+ it 'is invalid if issue_id and merge_request_id are missing' do
+ subject.attributes = { issue: nil, merge_request: nil }
+
+ expect(subject).to be_invalid
+ end
+
+ it 'is invalid if issue_id and merge_request_id are set' do
+ subject.attributes = { issue: issue, merge_request: merge_request }
+
+ expect(subject).to be_invalid
+ end
+
+ it 'is valid if only issue_id is set' do
+ subject.attributes = { issue: issue, merge_request: nil }
+
+ expect(subject).to be_valid
+ end
+
+ it 'is valid if only merge_request_id is set' do
+ subject.attributes = { merge_request: merge_request, issue: nil }
+
+ expect(subject).to be_valid
+ end
+ end
+ end
+end
diff --git a/spec/models/site_statistic_spec.rb b/spec/models/site_statistic_spec.rb
new file mode 100644
index 00000000000..9b056fbf332
--- /dev/null
+++ b/spec/models/site_statistic_spec.rb
@@ -0,0 +1,83 @@
+require 'spec_helper'
+
+describe SiteStatistic do
+ describe '.fetch' do
+ context 'existing record' do
+ it 'returns existing SiteStatistic model' do
+ statistics = create(:site_statistics)
+
+ expect(described_class.fetch).to be_a(described_class)
+ expect(described_class.fetch).to eq(statistics)
+ end
+ end
+
+ context 'non existing record' do
+ it 'creates a new SiteStatistic model' do
+ expect(described_class.first).to be_nil
+ expect(described_class.fetch).to be_a(described_class)
+ end
+ end
+ end
+
+ describe '.track' do
+ context 'with allowed attributes' do
+ let(:statistics) { create(:site_statistics) }
+
+ it 'increases the attribute counter' do
+ expect { described_class.track('repositories_count') }.to change { statistics.reload.repositories_count }.by(1)
+ expect { described_class.track('wikis_count') }.to change { statistics.reload.wikis_count }.by(1)
+ end
+
+ it 'doesnt increase the attribute counter when an exception happens during transaction' do
+ expect do
+ begin
+ described_class.transaction do
+ described_class.track('repositories_count')
+
+ raise StandardError
+ end
+ rescue StandardError
+ # no-op
+ end
+ end.not_to change { statistics.reload.repositories_count }
+ end
+ end
+
+ context 'with not allowed attributes' do
+ it 'returns error' do
+ expect { described_class.track('something_else') }.to raise_error(ArgumentError).with_message(/Invalid attribute: \'something_else\' to \'track\' method/)
+ end
+ end
+ end
+
+ describe '.untrack' do
+ context 'with allowed attributes' do
+ let(:statistics) { create(:site_statistics) }
+
+ it 'decreases the attribute counter' do
+ expect { described_class.untrack('repositories_count') }.to change { statistics.reload.repositories_count }.by(-1)
+ expect { described_class.untrack('wikis_count') }.to change { statistics.reload.wikis_count }.by(-1)
+ end
+
+ it 'doesnt decrease the attribute counter when an exception happens during transaction' do
+ expect do
+ begin
+ described_class.transaction do
+ described_class.track('repositories_count')
+
+ raise StandardError
+ end
+ rescue StandardError
+ # no-op
+ end
+ end.not_to change { described_class.fetch.repositories_count }
+ end
+ end
+
+ context 'with not allowed attributes' do
+ it 'returns error' do
+ expect { described_class.untrack('something_else') }.to raise_error(ArgumentError).with_message(/Invalid attribute: \'something_else\' to \'untrack\' method/)
+ end
+ end
+ end
+end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index fc46551c3be..f5e2c977104 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -20,6 +20,7 @@ describe User do
describe 'associations' do
it { is_expected.to have_one(:namespace) }
+ it { is_expected.to have_one(:status) }
it { is_expected.to have_many(:snippets).dependent(:destroy) }
it { is_expected.to have_many(:members) }
it { is_expected.to have_many(:project_members) }
@@ -949,6 +950,7 @@ describe User do
user = create(:user, email: 'foo@example.com')
expect(described_class.find_by_any_email(user.email)).to eq user
+ expect(described_class.find_by_any_email(user.email, confirmed: true)).to eq user
end
it 'finds by secondary email' do
@@ -956,11 +958,19 @@ describe User do
user = email.user
expect(described_class.find_by_any_email(email.email)).to eq user
+ expect(described_class.find_by_any_email(email.email, confirmed: true)).to eq user
end
it 'returns nil when nothing found' do
expect(described_class.find_by_any_email('')).to be_nil
end
+
+ it 'returns nil when user is not confirmed' do
+ user = create(:user, email: 'foo@example.com', confirmed_at: nil)
+
+ expect(described_class.find_by_any_email(user.email, confirmed: false)).to eq(user)
+ expect(described_class.find_by_any_email(user.email, confirmed: true)).to be_nil
+ end
end
describe '.by_any_email' do
@@ -974,6 +984,12 @@ describe User do
expect(described_class.by_any_email(user.email)).to eq([user])
end
+
+ it 'returns a relation of users for confirmed users' do
+ user = create(:user)
+
+ expect(described_class.by_any_email(user.email, confirmed: true)).to eq([user])
+ end
end
describe '.search' do
diff --git a/spec/models/user_status_spec.rb b/spec/models/user_status_spec.rb
new file mode 100644
index 00000000000..fcc01cdae3d
--- /dev/null
+++ b/spec/models/user_status_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe UserStatus do
+ it { is_expected.to validate_presence_of(:user) }
+
+ it { is_expected.to allow_value('smirk').for(:emoji) }
+ it { is_expected.not_to allow_value('hello world').for(:emoji) }
+ it { is_expected.not_to allow_value('').for(:emoji) }
+
+ it { is_expected.to validate_length_of(:message).is_at_most(100) }
+ it { is_expected.to allow_value('').for(:message) }
+
+ it 'is expected to be deleted when the user is deleted' do
+ status = create(:user_status)
+
+ expect { status.user.destroy }.to change { described_class.count }.from(1).to(0)
+ end
+end
diff --git a/spec/policies/concerns/policy_actor_spec.rb b/spec/policies/concerns/policy_actor_spec.rb
new file mode 100644
index 00000000000..27db9710a38
--- /dev/null
+++ b/spec/policies/concerns/policy_actor_spec.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe PolicyActor do
+ it 'implements all the methods from user' do
+ methods = subject.instance_methods
+
+ # User.instance_methods do not return all methods until an instance is
+ # initialized. So here we just use an instance
+ expect(build(:user).methods).to include(*methods)
+ end
+end
diff --git a/spec/policies/global_policy_spec.rb b/spec/policies/global_policy_spec.rb
index a2047b54deb..30d68e7dc9d 100644
--- a/spec/policies/global_policy_spec.rb
+++ b/spec/policies/global_policy_spec.rb
@@ -180,4 +180,38 @@ describe GlobalPolicy do
end
end
end
+
+ describe 'read instance statistics' do
+ context 'regular user' do
+ it { is_expected.to be_allowed(:read_instance_statistics) }
+
+ context 'when instance statistics are set to private' do
+ before do
+ stub_application_setting(instance_statistics_visibility_private: true)
+ end
+
+ it { is_expected.not_to be_allowed(:read_instance_statistics) }
+ end
+ end
+
+ context 'admin' do
+ let(:current_user) { create(:admin) }
+
+ it { is_expected.to be_allowed(:read_instance_statistics) }
+
+ context 'when instance statistics are set to private' do
+ before do
+ stub_application_setting(instance_statistics_visibility_private: true)
+ end
+
+ it { is_expected.to be_allowed(:read_instance_statistics) }
+ end
+ end
+
+ context 'anonymous' do
+ let(:current_user) { nil }
+
+ it { is_expected.not_to be_allowed(:read_instance_statistics) }
+ end
+ end
end
diff --git a/spec/policies/user_policy_spec.rb b/spec/policies/user_policy_spec.rb
index a7a77abc3ee..7e0a1824200 100644
--- a/spec/policies/user_policy_spec.rb
+++ b/spec/policies/user_policy_spec.rb
@@ -35,6 +35,10 @@ describe UserPolicy do
end
end
+ describe "updating a user's status" do
+ it_behaves_like 'changing a user', :update_user_status
+ end
+
describe "destroying a user" do
it_behaves_like 'changing a user', :destroy_user
end
diff --git a/spec/presenters/ci/build_runner_presenter_spec.rb b/spec/presenters/ci/build_runner_presenter_spec.rb
new file mode 100644
index 00000000000..e7019b990dd
--- /dev/null
+++ b/spec/presenters/ci/build_runner_presenter_spec.rb
@@ -0,0 +1,86 @@
+require 'spec_helper'
+
+describe Ci::BuildRunnerPresenter do
+ let(:presenter) { described_class.new(build) }
+ let(:archive) { { paths: ['sample.txt'] } }
+ let(:junit) { { junit: ['junit.xml'] } }
+
+ let(:archive_expectation) do
+ {
+ artifact_type: :archive,
+ artifact_format: :zip,
+ paths: archive[:paths],
+ untracked: archive[:untracked]
+ }
+ end
+
+ let(:junit_expectation) do
+ {
+ name: 'junit.xml',
+ artifact_type: :junit,
+ artifact_format: :gzip,
+ paths: ['junit.xml'],
+ when: 'always'
+ }
+ end
+
+ describe '#artifacts' do
+ context "when option contains archive-type artifacts" do
+ let(:build) { create(:ci_build, options: { artifacts: archive } ) }
+
+ it 'presents correct hash' do
+ expect(presenter.artifacts.first).to include(archive_expectation)
+ end
+
+ context "when untracked is specified" do
+ let(:archive) { { untracked: true } }
+
+ it 'presents correct hash' do
+ expect(presenter.artifacts.first).to include(archive_expectation)
+ end
+ end
+
+ context "when untracked and paths are missing" do
+ let(:archive) { { when: 'always' } }
+
+ it 'does not present hash' do
+ expect(presenter.artifacts).to be_empty
+ end
+ end
+ end
+
+ context "when option has 'junit' keyword" do
+ let(:build) { create(:ci_build, options: { artifacts: { reports: junit } } ) }
+
+ it 'presents correct hash' do
+ expect(presenter.artifacts.first).to include(junit_expectation)
+ end
+ end
+
+ context "when option has both archive and reports specification" do
+ let(:build) { create(:ci_build, options: { script: 'echo', artifacts: { **archive, reports: junit } } ) }
+
+ it 'presents correct hash' do
+ expect(presenter.artifacts.first).to include(archive_expectation)
+ expect(presenter.artifacts.second).to include(junit_expectation)
+ end
+
+ context "when archive specifies 'expire_in' keyword" do
+ let(:archive) { { paths: ['sample.txt'], expire_in: '3 mins 4 sec' } }
+
+ it 'inherits expire_in from archive' do
+ expect(presenter.artifacts.first).to include({ **archive_expectation, expire_in: '3 mins 4 sec' })
+ expect(presenter.artifacts.second).to include({ **junit_expectation, expire_in: '3 mins 4 sec' })
+ end
+ end
+ end
+
+ context "when option has no artifact keywords" do
+ let(:build) { create(:ci_build, :no_options) }
+
+ it 'does not present hash' do
+ expect(presenter.artifacts).to be_nil
+ end
+ end
+ end
+end
diff --git a/spec/presenters/commit_status_presenter_spec.rb b/spec/presenters/commit_status_presenter_spec.rb
index f81ee44e371..2b7742ddbb8 100644
--- a/spec/presenters/commit_status_presenter_spec.rb
+++ b/spec/presenters/commit_status_presenter_spec.rb
@@ -12,4 +12,30 @@ describe CommitStatusPresenter do
it 'inherits from Gitlab::View::Presenter::Delegated' do
expect(described_class.superclass).to eq(Gitlab::View::Presenter::Delegated)
end
+
+ describe 'covers all failure reasons' do
+ let(:message) { presenter.callout_failure_message }
+
+ CommitStatus.failure_reasons.keys.each do |failure_reason|
+ context failure_reason do
+ before do
+ build.failure_reason = failure_reason
+ end
+
+ it "is a valid status" do
+ expect { message }.not_to raise_error
+ end
+ end
+ end
+
+ context 'invalid failure message' do
+ before do
+ expect(build).to receive(:failure_reason) { 'invalid failure message' }
+ end
+
+ it "is an invalid status" do
+ expect { message }.to raise_error(/key not found:/)
+ end
+ end
+ end
end
diff --git a/spec/requests/api/files_spec.rb b/spec/requests/api/files_spec.rb
index 4bc5d3ee899..0aec186f738 100644
--- a/spec/requests/api/files_spec.rb
+++ b/spec/requests/api/files_spec.rb
@@ -13,6 +13,24 @@ describe API::Files do
let(:author_email) { 'user@example.org' }
let(:author_name) { 'John Doe' }
+ let(:helper) do
+ fake_class = Class.new do
+ include ::API::Helpers::HeadersHelpers
+
+ attr_reader :headers
+
+ def initialize
+ @headers = {}
+ end
+
+ def header(key, value)
+ @headers[key] = value
+ end
+ end
+
+ fake_class.new
+ end
+
before do
project.add_developer(user)
end
@@ -21,6 +39,18 @@ describe API::Files do
"/projects/#{project.id}/repository/files/#{file_path}"
end
+ context 'http headers' do
+ it 'converts value into string' do
+ helper.set_http_headers(test: 1)
+
+ expect(helper.headers).to eq({ 'X-Gitlab-Test' => '1' })
+ end
+
+ it 'raises exception if value is an Enumerable' do
+ expect { helper.set_http_headers(test: [1]) }.to raise_error(ArgumentError)
+ end
+ end
+
describe "HEAD /projects/:id/repository/files/:file_path" do
shared_examples_for 'repository files' do
it 'returns file attributes in headers' do
diff --git a/spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb b/spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb
new file mode 100644
index 00000000000..8f427d71a32
--- /dev/null
+++ b/spec/requests/api/graphql/mutations/merge_requests/set_wip_spec.rb
@@ -0,0 +1,68 @@
+require 'spec_helper'
+
+describe 'Setting WIP status of a merge request' do
+ include GraphqlHelpers
+
+ let(:current_user) { create(:user) }
+ let(:merge_request) { create(:merge_request) }
+ let(:project) { merge_request.project }
+ let(:input) { { wip: true } }
+
+ let(:mutation) do
+ variables = {
+ project_path: project.full_path,
+ iid: merge_request.iid
+ }
+ graphql_mutation(:merge_request_set_wip, variables.merge(input))
+ end
+
+ def mutation_response
+ graphql_mutation_response(:merge_request_set_wip)
+ end
+
+ before do
+ project.add_developer(current_user)
+ end
+
+ it 'returns an error if the user is not allowed to update the merge request' do
+ post_graphql_mutation(mutation, current_user: create(:user))
+
+ expect(graphql_errors).not_to be_empty
+ end
+
+ it 'marks the merge request as WIP' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['mergeRequest']['title']).to start_with('WIP:')
+ end
+
+ it 'does not do anything if the merge request was already marked `WIP`' do
+ merge_request.update!(title: 'wip: hello world')
+
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['mergeRequest']['title']).to start_with('wip:')
+ end
+
+ context 'when passing WIP false as input' do
+ let(:input) { { wip: false } }
+
+ it 'does not do anything if the merge reqeust was not marked wip' do
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['mergeRequest']['title']).not_to start_with(/wip\:/)
+ end
+
+ it 'unmarks the merge request as `WIP`' do
+ merge_request.update!(title: 'wip: hello world')
+
+ post_graphql_mutation(mutation, current_user: current_user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(mutation_response['mergeRequest']['title']).not_to start_with('/wip\:/')
+ end
+ end
+end
diff --git a/spec/requests/api/internal_spec.rb b/spec/requests/api/internal_spec.rb
index a2cfa706f58..b537b6e1667 100644
--- a/spec/requests/api/internal_spec.rb
+++ b/spec/requests/api/internal_spec.rb
@@ -152,7 +152,7 @@ describe API::Internal do
context 'user key' do
it 'returns the correct information about the key' do
- lfs_auth(key.id, project)
+ lfs_auth_key(key.id, project)
expect(response).to have_gitlab_http_status(200)
expect(json_response['username']).to eq(user.username)
@@ -161,8 +161,30 @@ describe API::Internal do
expect(json_response['repository_http_path']).to eq(project.http_url_to_repo)
end
+ it 'returns the correct information about the user' do
+ lfs_auth_user(user.id, project)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(json_response['username']).to eq(user.username)
+ expect(json_response['lfs_token']).to eq(Gitlab::LfsToken.new(user).token)
+
+ expect(json_response['repository_http_path']).to eq(project.http_url_to_repo)
+ end
+
+ it 'returns a 404 when no key or user is provided' do
+ lfs_auth_project(project)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
it 'returns a 404 when the wrong key is provided' do
- lfs_auth(nil, project)
+ lfs_auth_key(key.id + 12345, project)
+
+ expect(response).to have_gitlab_http_status(404)
+ end
+
+ it 'returns a 404 when the wrong user is provided' do
+ lfs_auth_user(user.id + 12345, project)
expect(response).to have_gitlab_http_status(404)
end
@@ -172,7 +194,7 @@ describe API::Internal do
let(:key) { create(:deploy_key) }
it 'returns the correct information about the key' do
- lfs_auth(key.id, project)
+ lfs_auth_key(key.id, project)
expect(response).to have_gitlab_http_status(200)
expect(json_response['username']).to eq("lfs+deploy-key-#{key.id}")
@@ -183,13 +205,29 @@ describe API::Internal do
end
describe "GET /internal/discover" do
- it do
+ it "finds a user by key id" do
get(api("/internal/discover"), key_id: key.id, secret_token: secret_token)
expect(response).to have_gitlab_http_status(200)
expect(json_response['name']).to eq(user.name)
end
+
+ it "finds a user by user id" do
+ get(api("/internal/discover"), user_id: user.id, secret_token: secret_token)
+
+ expect(response).to have_gitlab_http_status(200)
+
+ expect(json_response['name']).to eq(user.name)
+ end
+
+ it "finds a user by username" do
+ get(api("/internal/discover"), username: user.username, secret_token: secret_token)
+
+ expect(response).to have_gitlab_http_status(200)
+
+ expect(json_response['name']).to eq(user.name)
+ end
end
describe "GET /internal/authorized_keys" do
@@ -871,7 +909,15 @@ describe API::Internal do
)
end
- def lfs_auth(key_id, project)
+ def lfs_auth_project(project)
+ post(
+ api("/internal/lfs_authenticate"),
+ secret_token: secret_token,
+ project: project.full_path
+ )
+ end
+
+ def lfs_auth_key(key_id, project)
post(
api("/internal/lfs_authenticate"),
key_id: key_id,
@@ -879,4 +925,13 @@ describe API::Internal do
project: project.full_path
)
end
+
+ def lfs_auth_user(user_id, project)
+ post(
+ api("/internal/lfs_authenticate"),
+ user_id: user_id,
+ secret_token: secret_token,
+ project: project.full_path
+ )
+ end
end
diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb
index 66eb18229fa..28ba00c7293 100644
--- a/spec/requests/api/issues_spec.rb
+++ b/spec/requests/api/issues_spec.rb
@@ -1002,6 +1002,38 @@ describe API::Issues do
end
end
+ context 'an internal ID is provided' do
+ context 'by an admin' do
+ it 'sets the internal ID on the new issue' do
+ post api("/projects/#{project.id}/issues", admin),
+ title: 'new issue', iid: 9001
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['iid']).to eq 9001
+ end
+ end
+
+ context 'by an owner' do
+ it 'sets the internal ID on the new issue' do
+ post api("/projects/#{project.id}/issues", user),
+ title: 'new issue', iid: 9001
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['iid']).to eq 9001
+ end
+ end
+
+ context 'by another user' do
+ it 'ignores the given internal ID' do
+ post api("/projects/#{project.id}/issues", user2),
+ title: 'new issue', iid: 9001
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(json_response['iid']).not_to eq 9001
+ end
+ end
+ end
+
it 'creates a new project issue' do
post api("/projects/#{project.id}/issues", user),
title: 'new issue', labels: 'label, label2', weight: 3,
diff --git a/spec/requests/api/jobs_spec.rb b/spec/requests/api/jobs_spec.rb
index 8412d0383f7..5814d834572 100644
--- a/spec/requests/api/jobs_spec.rb
+++ b/spec/requests/api/jobs_spec.rb
@@ -655,13 +655,15 @@ describe API::Jobs do
end
context 'job is erasable' do
- let(:job) { create(:ci_build, :trace_artifact, :artifacts, :success, project: project, pipeline: pipeline) }
+ let(:job) { create(:ci_build, :trace_artifact, :artifacts, :test_reports, :success, project: project, pipeline: pipeline) }
it 'erases job content' do
expect(response).to have_gitlab_http_status(201)
+ expect(job.job_artifacts.count).to eq(0)
expect(job.trace.exist?).to be_falsy
expect(job.artifacts_file.exists?).to be_falsy
expect(job.artifacts_metadata.exists?).to be_falsy
+ expect(job.has_test_reports?).to be_falsy
end
it 'updates job' do
diff --git a/spec/requests/api/members_spec.rb b/spec/requests/api/members_spec.rb
index 01bbe7f5ec6..93e1c3a2294 100644
--- a/spec/requests/api/members_spec.rb
+++ b/spec/requests/api/members_spec.rb
@@ -22,10 +22,16 @@ describe API::Members do
end
end
- shared_examples 'GET /:sources/:id/members' do |source_type|
- context "with :sources == #{source_type.pluralize}" do
+ shared_examples 'GET /:source_type/:id/members/(all)' do |source_type, all|
+ let(:members_url) do
+ "/#{source_type.pluralize}/#{source.id}/members".tap do |url|
+ url << "/all" if all
+ end
+ end
+
+ context "with :source_type == #{source_type.pluralize}" do
it_behaves_like 'a 404 response when source is private' do
- let(:route) { get api("/#{source_type.pluralize}/#{source.id}/members", stranger) }
+ let(:route) { get api(members_url, stranger) }
end
%i[maintainer developer access_requester stranger].each do |type|
@@ -33,7 +39,7 @@ describe API::Members do
it 'returns 200' do
user = public_send(type)
- get api("/#{source_type.pluralize}/#{source.id}/members", user)
+ get api(members_url, user)
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
@@ -46,23 +52,23 @@ describe API::Members do
it 'avoids N+1 queries' do
# Establish baseline
- get api("/#{source_type.pluralize}/#{source.id}/members", maintainer)
+ get api(members_url, maintainer)
control = ActiveRecord::QueryRecorder.new do
- get api("/#{source_type.pluralize}/#{source.id}/members", maintainer)
+ get api(members_url, maintainer)
end
project.add_developer(create(:user))
expect do
- get api("/#{source_type.pluralize}/#{source.id}/members", maintainer)
+ get api(members_url, maintainer)
end.not_to exceed_query_limit(control)
end
it 'does not return invitees' do
create(:"#{source_type}_member", invite_token: '123', invite_email: 'test@abc.com', source: source, user: nil)
- get api("/#{source_type.pluralize}/#{source.id}/members", developer)
+ get api(members_url, developer)
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
@@ -72,7 +78,7 @@ describe API::Members do
end
it 'finds members with query string' do
- get api("/#{source_type.pluralize}/#{source.id}/members", developer), query: maintainer.username
+ get api(members_url, developer), query: maintainer.username
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
@@ -82,7 +88,7 @@ describe API::Members do
end
it 'finds all members with no query specified' do
- get api("/#{source_type.pluralize}/#{source.id}/members", developer), query: ''
+ get api(members_url, developer), query: ''
expect(response).to have_gitlab_http_status(200)
expect(response).to include_pagination_headers
@@ -93,8 +99,51 @@ describe API::Members do
end
end
- shared_examples 'GET /:sources/:id/members/:user_id' do |source_type|
- context "with :sources == #{source_type.pluralize}" do
+ describe 'GET /:source_type/:id/members/all', :nested_groups do
+ let(:nested_user) { create(:user) }
+ let(:project_user) { create(:user) }
+ let(:linked_group_user) { create(:user) }
+ let!(:project_group_link) { create(:project_group_link, project: project, group: linked_group) }
+
+ let(:project) do
+ create(:project, :public, group: nested_group) do |project|
+ project.add_developer(project_user)
+ end
+ end
+
+ let(:linked_group) do
+ create(:group) do |linked_group|
+ linked_group.add_developer(linked_group_user)
+ end
+ end
+
+ let(:nested_group) do
+ create(:group, parent: group) do |nested_group|
+ nested_group.add_developer(nested_user)
+ end
+ end
+
+ it 'finds all project members including inherited members' do
+ get api("/projects/#{project.id}/members/all", developer)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.map { |u| u['id'] }).to match_array [maintainer.id, developer.id, nested_user.id, project_user.id, linked_group_user.id]
+ end
+
+ it 'finds all group members including inherited members' do
+ get api("/groups/#{nested_group.id}/members/all", developer)
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(response).to include_pagination_headers
+ expect(json_response).to be_an Array
+ expect(json_response.map { |u| u['id'] }).to match_array [maintainer.id, developer.id, nested_user.id]
+ end
+ end
+
+ shared_examples 'GET /:source_type/:id/members/:user_id' do |source_type|
+ context "with :source_type == #{source_type.pluralize}" do
it_behaves_like 'a 404 response when source is private' do
let(:route) { get api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", stranger) }
end
@@ -124,8 +173,8 @@ describe API::Members do
end
end
- shared_examples 'POST /:sources/:id/members' do |source_type|
- context "with :sources == #{source_type.pluralize}" do
+ shared_examples 'POST /:source_type/:id/members' do |source_type|
+ context "with :source_type == #{source_type.pluralize}" do
it_behaves_like 'a 404 response when source is private' do
let(:route) do
post api("/#{source_type.pluralize}/#{source.id}/members", stranger),
@@ -182,6 +231,14 @@ describe API::Members do
expect(response).to have_gitlab_http_status(409)
end
+ it 'returns 404 when the user_id is not valid' do
+ post api("/#{source_type.pluralize}/#{source.id}/members", maintainer),
+ user_id: 0, access_level: Member::MAINTAINER
+
+ expect(response).to have_gitlab_http_status(404)
+ expect(json_response['message']).to eq('404 User Not Found')
+ end
+
it 'returns 400 when user_id is not given' do
post api("/#{source_type.pluralize}/#{source.id}/members", maintainer),
access_level: Member::MAINTAINER
@@ -205,8 +262,8 @@ describe API::Members do
end
end
- shared_examples 'PUT /:sources/:id/members/:user_id' do |source_type|
- context "with :sources == #{source_type.pluralize}" do
+ shared_examples 'PUT /:source_type/:id/members/:user_id' do |source_type|
+ context "with :source_type == #{source_type.pluralize}" do
it_behaves_like 'a 404 response when source is private' do
let(:route) do
put api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", stranger),
@@ -262,8 +319,8 @@ describe API::Members do
end
end
- shared_examples 'DELETE /:sources/:id/members/:user_id' do |source_type|
- context "with :sources == #{source_type.pluralize}" do
+ shared_examples 'DELETE /:source_type/:id/members/:user_id' do |source_type|
+ context "with :source_type == #{source_type.pluralize}" do
it_behaves_like 'a 404 response when source is private' do
let(:route) { delete api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", stranger) }
end
@@ -323,43 +380,45 @@ describe API::Members do
end
end
- it_behaves_like 'GET /:sources/:id/members', 'project' do
- let(:source) { project }
- end
+ [false, true].each do |all|
+ it_behaves_like 'GET /:source_type/:id/members/(all)', 'project', all do
+ let(:source) { project }
+ end
- it_behaves_like 'GET /:sources/:id/members', 'group' do
- let(:source) { group }
+ it_behaves_like 'GET /:source_type/:id/members/(all)', 'group', all do
+ let(:source) { group }
+ end
end
- it_behaves_like 'GET /:sources/:id/members/:user_id', 'project' do
+ it_behaves_like 'GET /:source_type/:id/members/:user_id', 'project' do
let(:source) { project }
end
- it_behaves_like 'GET /:sources/:id/members/:user_id', 'group' do
+ it_behaves_like 'GET /:source_type/:id/members/:user_id', 'group' do
let(:source) { group }
end
- it_behaves_like 'POST /:sources/:id/members', 'project' do
+ it_behaves_like 'POST /:source_type/:id/members', 'project' do
let(:source) { project }
end
- it_behaves_like 'POST /:sources/:id/members', 'group' do
+ it_behaves_like 'POST /:source_type/:id/members', 'group' do
let(:source) { group }
end
- it_behaves_like 'PUT /:sources/:id/members/:user_id', 'project' do
+ it_behaves_like 'PUT /:source_type/:id/members/:user_id', 'project' do
let(:source) { project }
end
- it_behaves_like 'PUT /:sources/:id/members/:user_id', 'group' do
+ it_behaves_like 'PUT /:source_type/:id/members/:user_id', 'group' do
let(:source) { group }
end
- it_behaves_like 'DELETE /:sources/:id/members/:user_id', 'project' do
+ it_behaves_like 'DELETE /:source_type/:id/members/:user_id', 'project' do
let(:source) { project }
end
- it_behaves_like 'DELETE /:sources/:id/members/:user_id', 'group' do
+ it_behaves_like 'DELETE /:source_type/:id/members/:user_id', 'group' do
let(:source) { group }
end
diff --git a/spec/requests/api/project_import_spec.rb b/spec/requests/api/project_import_spec.rb
index 55332f56508..e3fb6cecce9 100644
--- a/spec/requests/api/project_import_spec.rb
+++ b/spec/requests/api/project_import_spec.rb
@@ -7,6 +7,8 @@ describe API::ProjectImport do
let(:namespace) { create(:group) }
before do
allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path)
+ stub_feature_flags(import_export_object_storage: true)
+ stub_uploads_object_storage(FileUploader)
namespace.add_owner(user)
end
diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb
index d57993ab454..43ceb332cfb 100644
--- a/spec/requests/api/runner_spec.rb
+++ b/spec/requests/api/runner_spec.rb
@@ -424,7 +424,9 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
'untracked' => false,
'paths' => %w(out/),
'when' => 'always',
- 'expire_in' => '7d' }]
+ 'expire_in' => '7d',
+ "artifact_type" => "archive",
+ "artifact_format" => "zip" }]
end
let(:expected_cache) do
@@ -1420,6 +1422,56 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
end
end
end
+
+ context 'when artifact_type is archive' do
+ context 'when artifact_format is zip' do
+ let(:params) { { artifact_type: :archive, artifact_format: :zip } }
+
+ it 'stores junit test report' do
+ upload_artifacts(file_upload, headers_with_token, params)
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(job.reload.job_artifacts_archive).not_to be_nil
+ end
+ end
+
+ context 'when artifact_format is gzip' do
+ let(:params) { { artifact_type: :archive, artifact_format: :gzip } }
+
+ it 'returns an error' do
+ upload_artifacts(file_upload, headers_with_token, params)
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(job.reload.job_artifacts_archive).to be_nil
+ end
+ end
+ end
+
+ context 'when artifact_type is junit' do
+ context 'when artifact_format is gzip' do
+ let(:file_upload) { fixture_file_upload('spec/fixtures/junit/junit.xml.gz') }
+ let(:params) { { artifact_type: :junit, artifact_format: :gzip } }
+
+ it 'stores junit test report' do
+ upload_artifacts(file_upload, headers_with_token, params)
+
+ expect(response).to have_gitlab_http_status(201)
+ expect(job.reload.job_artifacts_junit).not_to be_nil
+ end
+ end
+
+ context 'when artifact_format is raw' do
+ let(:file_upload) { fixture_file_upload('spec/fixtures/junit/junit.xml.gz') }
+ let(:params) { { artifact_type: :junit, artifact_format: :raw } }
+
+ it 'returns an error' do
+ upload_artifacts(file_upload, headers_with_token, params)
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(job.reload.job_artifacts_junit).to be_nil
+ end
+ end
+ end
end
context 'when artifacts are being stored outside of tmp path' do
diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb
index 57adc3ca7a6..3e0f47b84a1 100644
--- a/spec/requests/api/settings_spec.rb
+++ b/spec/requests/api/settings_spec.rb
@@ -25,6 +25,7 @@ describe API::Settings, 'Settings' do
expect(json_response['ed25519_key_restriction']).to eq(0)
expect(json_response['circuitbreaker_failure_count_threshold']).not_to be_nil
expect(json_response['performance_bar_allowed_group_id']).to be_nil
+ expect(json_response['instance_statistics_visibility_private']).to be(false)
expect(json_response).not_to have_key('performance_bar_allowed_group_path')
expect(json_response).not_to have_key('performance_bar_enabled')
end
@@ -64,7 +65,8 @@ describe API::Settings, 'Settings' do
circuitbreaker_check_interval: 2,
enforce_terms: true,
terms: 'Hello world!',
- performance_bar_allowed_group_path: group.full_path
+ performance_bar_allowed_group_path: group.full_path,
+ instance_statistics_visibility_private: true
expect(response).to have_gitlab_http_status(200)
expect(json_response['default_projects_limit']).to eq(3)
@@ -89,6 +91,7 @@ describe API::Settings, 'Settings' do
expect(json_response['enforce_terms']).to be(true)
expect(json_response['terms']).to eq('Hello world!')
expect(json_response['performance_bar_allowed_group_id']).to eq(group.id)
+ expect(json_response['instance_statistics_visibility_private']).to be(true)
end
end
diff --git a/spec/requests/api/users_spec.rb b/spec/requests/api/users_spec.rb
index b3079c0a77b..d48d577afa1 100644
--- a/spec/requests/api/users_spec.rb
+++ b/spec/requests/api/users_spec.rb
@@ -11,6 +11,28 @@ describe API::Users do
let(:ldap_blocked_user) { create(:omniauth_user, provider: 'ldapmain', state: 'ldap_blocked') }
let(:not_existing_user_id) { (User.maximum('id') || 0 ) + 10 }
let(:not_existing_pat_id) { (PersonalAccessToken.maximum('id') || 0 ) + 10 }
+ let(:private_user) { create(:user, private_profile: true) }
+
+ shared_examples 'rendering user status' do
+ it 'returns the status if there was one' do
+ create(:user_status, user: user)
+
+ get api(path, user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response['message']).to be_present
+ expect(json_response['message_html']).to be_present
+ expect(json_response['emoji']).to be_present
+ end
+
+ it 'returns an empty response if there was no status' do
+ get api(path, user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response['message']).to be_nil
+ expect(json_response['emoji']).to be_nil
+ end
+ end
describe 'GET /users' do
context "when unauthenticated" do
@@ -254,6 +276,13 @@ describe API::Users do
expect(response).to match_response_schema('public_api/v4/user/admin')
expect(json_response['is_admin']).to be(false)
end
+
+ it "includes the `created_at` field for private users" do
+ get api("/users/#{private_user.id}", admin)
+
+ expect(response).to match_response_schema('public_api/v4/user/admin')
+ expect(json_response.keys).to include 'created_at'
+ end
end
context 'for an anonymous user' do
@@ -272,6 +301,20 @@ describe API::Users do
expect(response).to have_gitlab_http_status(404)
end
+
+ it "returns the `created_at` field for public users" do
+ get api("/users/#{user.id}")
+
+ expect(response).to match_response_schema('public_api/v4/user/basic')
+ expect(json_response.keys).to include 'created_at'
+ end
+
+ it "does not return the `created_at` field for private users" do
+ get api("/users/#{private_user.id}")
+
+ expect(response).to match_response_schema('public_api/v4/user/basic')
+ expect(json_response.keys).not_to include 'created_at'
+ end
end
it "returns a 404 error if user id not found" do
@@ -288,6 +331,20 @@ describe API::Users do
end
end
+ describe 'GET /users/:id_or_username/status' do
+ context 'when finding the user by id' do
+ it_behaves_like 'rendering user status' do
+ let(:path) { "/users/#{user.id}/status" }
+ end
+ end
+
+ context 'when finding the user by username' do
+ it_behaves_like 'rendering user status' do
+ let(:path) { "/users/#{user.username}/status" }
+ end
+ end
+ end
+
describe "POST /users" do
before do
admin
@@ -374,6 +431,18 @@ describe API::Users do
expect(new_user.recently_sent_password_reset?).to eq(true)
end
+ it "creates user with private profile" do
+ post api('/users', admin), attributes_for(:user, private_profile: true)
+
+ expect(response).to have_gitlab_http_status(201)
+
+ user_id = json_response['id']
+ new_user = User.find(user_id)
+
+ expect(new_user).not_to eq(nil)
+ expect(new_user.private_profile?).to eq(true)
+ end
+
it "does not create user with invalid email" do
post api('/users', admin),
email: 'invalid email',
@@ -583,6 +652,13 @@ describe API::Users do
expect(user.reload.external?).to be_truthy
end
+ it "updates private profile" do
+ put api("/users/#{user.id}", admin), { private_profile: true }
+
+ expect(response).to have_gitlab_http_status(200)
+ expect(user.reload.private_profile).to eq(true)
+ end
+
it "does not update admin status" do
put api("/users/#{admin_user.id}", admin), { can_create_group: false }
@@ -1733,6 +1809,34 @@ describe API::Users do
end
end
+ describe 'GET /user/status' do
+ let(:path) { '/user/status' }
+ it_behaves_like 'rendering user status'
+ end
+
+ describe 'PUT /user/status' do
+ it 'saves the status' do
+ put api('/user/status', user), { emoji: 'smirk', message: 'hello world' }
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(json_response['emoji']).to eq('smirk')
+ end
+
+ it 'renders errors when the status was invalid' do
+ put api('/user/status', user), { emoji: 'does not exist', message: 'hello world' }
+
+ expect(response).to have_gitlab_http_status(400)
+ expect(json_response['message']['emoji']).to be_present
+ end
+
+ it 'deletes the status when passing empty values' do
+ put api('/user/status', user)
+
+ expect(response).to have_gitlab_http_status(:success)
+ expect(user.reload.status).to be_nil
+ end
+ end
+
describe 'GET /users/:user_id/impersonation_tokens' do
let!(:active_personal_access_token) { create(:personal_access_token, user: user) }
let!(:revoked_personal_access_token) { create(:personal_access_token, :revoked, user: user) }
diff --git a/spec/requests/git_http_spec.rb b/spec/requests/git_http_spec.rb
index 0f3e7157e14..c71eae9164a 100644
--- a/spec/requests/git_http_spec.rb
+++ b/spec/requests/git_http_spec.rb
@@ -381,6 +381,10 @@ describe 'Git HTTP requests' do
context "when authentication fails" do
context "when the user is IP banned" do
+ before do
+ Gitlab.config.rack_attack.git_basic_auth['enabled'] = true
+ end
+
it "responds with status 401" do
expect(Rack::Attack::Allow2Ban).to receive(:filter).and_return(true)
allow_any_instance_of(Rack::Request).to receive(:ip).and_return('1.2.3.4')
@@ -420,6 +424,10 @@ describe 'Git HTTP requests' do
end
context "when the user isn't blocked" do
+ before do
+ Gitlab.config.rack_attack.git_basic_auth['enabled'] = true
+ end
+
it "resets the IP in Rack Attack on download" do
expect(Rack::Attack::Allow2Ban).to receive(:reset).twice
diff --git a/spec/requests/jwt_controller_spec.rb b/spec/requests/jwt_controller_spec.rb
index 6f40a02aaa9..e042d772718 100644
--- a/spec/requests/jwt_controller_spec.rb
+++ b/spec/requests/jwt_controller_spec.rb
@@ -70,6 +70,25 @@ describe JwtController do
it { expect(service_class).to have_received(:new).with(nil, user, parameters) }
+ context 'when passing a flat array of scopes' do
+ # We use this trick to make rails to generate a query_string:
+ # scope=scope1&scope=scope2
+ # It works because :scope and 'scope' are the same as string, but different objects
+ let(:parameters) do
+ {
+ :service => service_name,
+ :scope => 'scope1',
+ 'scope' => 'scope2'
+ }
+ end
+
+ let(:service_parameters) do
+ { service: service_name, scopes: %w(scope1 scope2) }
+ end
+
+ it { expect(service_class).to have_received(:new).with(nil, user, service_parameters) }
+ end
+
context 'when user has 2FA enabled' do
let(:user) { create(:user, :two_factor) }
diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb
index c2378646f89..e349181b794 100644
--- a/spec/requests/lfs_http_spec.rb
+++ b/spec/requests/lfs_http_spec.rb
@@ -732,7 +732,7 @@ describe 'Git LFS API and storage' do
expect(json_response['objects'].first['oid']).to eq(sample_oid)
expect(json_response['objects'].first['size']).to eq(sample_size)
expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{Gitlab.config.gitlab.url}/#{project.full_path}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}")
- expect(json_response['objects'].first['actions']['upload']['header']).to eq('Authorization' => authorization)
+ expect(json_response['objects'].first['actions']['upload']['header']).to eq({ 'Authorization' => authorization, 'Content-Type' => 'application/octet-stream' })
end
end
@@ -761,7 +761,7 @@ describe 'Git LFS API and storage' do
expect(lfs_object.projects.pluck(:id)).not_to include(project.id)
expect(lfs_object.projects.pluck(:id)).to include(other_project.id)
expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}/#{sample_size}")
- expect(json_response['objects'].first['actions']['upload']['header']).to eq('Authorization' => authorization)
+ expect(json_response['objects'].first['actions']['upload']['header']).to eq({ 'Authorization' => authorization, 'Content-Type' => 'application/octet-stream' })
end
end
@@ -796,7 +796,7 @@ describe 'Git LFS API and storage' do
expect(json_response['objects'].first['oid']).to eq("91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897")
expect(json_response['objects'].first['size']).to eq(1575078)
expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{project.http_url_to_repo}/gitlab-lfs/objects/91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897/1575078")
- expect(json_response['objects'].first['actions']['upload']['header']).to eq("Authorization" => authorization)
+ expect(json_response['objects'].first['actions']['upload']['header']).to eq({ 'Authorization' => authorization, 'Content-Type' => 'application/octet-stream' })
expect(json_response['objects'].last['oid']).to eq(sample_oid)
expect(json_response['objects'].last['size']).to eq(sample_size)
diff --git a/spec/routing/admin_routing_spec.rb b/spec/routing/admin_routing_spec.rb
index 179fc9733ad..98df5f787f7 100644
--- a/spec/routing/admin_routing_spec.rb
+++ b/spec/routing/admin_routing_spec.rb
@@ -79,7 +79,7 @@ end
# edit_admin_hook GET /admin/hooks/:id(.:format) admin/hooks#edit
describe Admin::HooksController, "routing" do
it "to #test" do
- expect(get("/admin/hooks/1/test")).to route_to('admin/hooks#test', id: '1')
+ expect(post("/admin/hooks/1/test")).to route_to('admin/hooks#test', id: '1')
end
it "to #index" do
diff --git a/spec/routing/instance_statistics_routing_spec.rb b/spec/routing/instance_statistics_routing_spec.rb
new file mode 100644
index 00000000000..b94faabfa1d
--- /dev/null
+++ b/spec/routing/instance_statistics_routing_spec.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'Instance Statistics', 'routing' do
+ include RSpec::Rails::RequestExampleGroup
+
+ it "routes '/-/instance_statistics' to conversational development index" do
+ expect(get('/-/instance_statistics')).to redirect_to('/-/instance_statistics/conversational_development_index')
+ end
+end
diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb
index 56d93095a85..70a7707826e 100644
--- a/spec/routing/project_routing_spec.rb
+++ b/spec/routing/project_routing_spec.rb
@@ -389,7 +389,7 @@ describe 'project routing' do
# DELETE /:project_id/hooks/:id(.:format) hooks#destroy
describe Projects::HooksController, 'routing' do
it 'to #test' do
- expect(get('/gitlab/gitlabhq/hooks/1/test')).to route_to('projects/hooks#test', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
+ expect(post('/gitlab/gitlabhq/hooks/1/test')).to route_to('projects/hooks#test', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1')
end
it_behaves_like 'RESTful project resources' do
diff --git a/spec/serializers/pipeline_serializer_spec.rb b/spec/serializers/pipeline_serializer_spec.rb
index eb4235e3ee6..cf57776346a 100644
--- a/spec/serializers/pipeline_serializer_spec.rb
+++ b/spec/serializers/pipeline_serializer_spec.rb
@@ -125,7 +125,7 @@ describe PipelineSerializer do
it 'verifies number of queries', :request_store do
recorded = ActiveRecord::QueryRecorder.new { subject }
- expect(recorded.count).to be_within(2).of(27)
+ expect(recorded.count).to be_within(2).of(31)
expect(recorded.cached_count).to eq(0)
end
end
@@ -144,7 +144,7 @@ describe PipelineSerializer do
# pipeline. With the same ref this check is cached but if refs are
# different then there is an extra query per ref
# https://gitlab.com/gitlab-org/gitlab-ce/issues/46368
- expect(recorded.count).to be_within(2).of(30)
+ expect(recorded.count).to be_within(2).of(34)
expect(recorded.cached_count).to eq(0)
end
end
diff --git a/spec/serializers/test_case_entity_spec.rb b/spec/serializers/test_case_entity_spec.rb
new file mode 100644
index 00000000000..a55910f98bb
--- /dev/null
+++ b/spec/serializers/test_case_entity_spec.rb
@@ -0,0 +1,31 @@
+require 'spec_helper'
+
+describe TestCaseEntity do
+ include TestReportsHelper
+
+ let(:entity) { described_class.new(test_case) }
+
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ context 'when test case is success' do
+ let(:test_case) { create_test_case_rspec_success }
+
+ it 'contains correct test case details' do
+ expect(subject[:status]).to eq('success')
+ expect(subject[:name]).to eq('Test#sum when a is 1 and b is 3 returns summary')
+ expect(subject[:execution_time]).to eq(1.11)
+ end
+ end
+
+ context 'when test case is failed' do
+ let(:test_case) { create_test_case_rspec_failed }
+
+ it 'contains correct test case details' do
+ expect(subject[:status]).to eq('failed')
+ expect(subject[:name]).to eq('Test#sum when a is 2 and b is 2 returns summary')
+ expect(subject[:execution_time]).to eq(2.22)
+ end
+ end
+ end
+end
diff --git a/spec/serializers/test_reports_comparer_entity_spec.rb b/spec/serializers/test_reports_comparer_entity_spec.rb
new file mode 100644
index 00000000000..59c058fe368
--- /dev/null
+++ b/spec/serializers/test_reports_comparer_entity_spec.rb
@@ -0,0 +1,76 @@
+require 'spec_helper'
+
+describe TestReportsComparerEntity do
+ include TestReportsHelper
+
+ let(:entity) { described_class.new(comparer) }
+ let(:comparer) { Gitlab::Ci::Reports::TestReportsComparer.new(base_reports, head_reports) }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ context 'when head and base reports include two test suites' do
+ context 'when the status of head report is success' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'contains correct compared test reports details' do
+ expect(subject[:status]).to eq('success')
+ expect(subject[:summary]).to include(total: 2, resolved: 0, failed: 0)
+ expect(subject[:suites].first[:name]).to eq('rspec')
+ expect(subject[:suites].first[:status]).to eq('success')
+ expect(subject[:suites].second[:name]).to eq('junit')
+ expect(subject[:suites].second[:status]).to eq('success')
+ end
+ end
+
+ context 'when the status of head report is failed' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'contains correct compared test reports details' do
+ expect(subject[:status]).to eq('failed')
+ expect(subject[:summary]).to include(total: 2, resolved: 0, failed: 1)
+ expect(subject[:suites].first[:name]).to eq('rspec')
+ expect(subject[:suites].first[:status]).to eq('success')
+ expect(subject[:suites].second[:name]).to eq('junit')
+ expect(subject[:suites].second[:status]).to eq('failed')
+ end
+ end
+
+ context 'when the status of head report is resolved' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_resolved)
+ end
+
+ let(:create_test_case_java_resolved) do
+ create_test_case_java_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ it 'contains correct compared test reports details' do
+ expect(subject[:status]).to eq('success')
+ expect(subject[:summary]).to include(total: 2, resolved: 1, failed: 0)
+ expect(subject[:suites].first[:name]).to eq('rspec')
+ expect(subject[:suites].first[:status]).to eq('success')
+ expect(subject[:suites].second[:name]).to eq('junit')
+ expect(subject[:suites].second[:status]).to eq('success')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/serializers/test_reports_comparer_serializer_spec.rb b/spec/serializers/test_reports_comparer_serializer_spec.rb
new file mode 100644
index 00000000000..9ea86c0dd83
--- /dev/null
+++ b/spec/serializers/test_reports_comparer_serializer_spec.rb
@@ -0,0 +1,62 @@
+require 'spec_helper'
+
+describe TestReportsComparerSerializer do
+ include TestReportsHelper
+
+ let(:project) { double(:project) }
+ let(:serializer) { described_class.new(project: project).represent(comparer) }
+ let(:comparer) { Gitlab::Ci::Reports::TestReportsComparer.new(base_reports, head_reports) }
+ let(:base_reports) { Gitlab::Ci::Reports::TestReports.new }
+ let(:head_reports) { Gitlab::Ci::Reports::TestReports.new }
+
+ describe '#to_json' do
+ subject { serializer.to_json }
+
+ context 'when head and base reports include two test suites' do
+ context 'when the status of head report is success' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ end
+
+ it 'matches the schema' do
+ expect(subject).to match_schema('entities/test_reports_comparer')
+ end
+ end
+
+ context 'when the status of head report is failed' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_success)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ end
+
+ it 'matches the schema' do
+ expect(subject).to match_schema('entities/test_reports_comparer')
+ end
+ end
+
+ context 'when the status of head report is resolved' do
+ before do
+ base_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ base_reports.get_suite('junit').add_test_case(create_test_case_java_failed)
+ head_reports.get_suite('rspec').add_test_case(create_test_case_rspec_success)
+ head_reports.get_suite('junit').add_test_case(create_test_case_java_resolved)
+ end
+
+ let(:create_test_case_java_resolved) do
+ create_test_case_java_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ it 'matches the schema' do
+ expect(subject).to match_schema('entities/test_reports_comparer')
+ end
+ end
+ end
+ end
+end
diff --git a/spec/serializers/test_suite_comparer_entity_spec.rb b/spec/serializers/test_suite_comparer_entity_spec.rb
new file mode 100644
index 00000000000..f61331f53a0
--- /dev/null
+++ b/spec/serializers/test_suite_comparer_entity_spec.rb
@@ -0,0 +1,86 @@
+require 'spec_helper'
+
+describe TestSuiteComparerEntity do
+ include TestReportsHelper
+
+ let(:entity) { described_class.new(comparer) }
+ let(:comparer) { Gitlab::Ci::Reports::TestSuiteComparer.new(name, base_suite, head_suite) }
+ let(:name) { 'rpsec' }
+ let(:base_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
+ let(:head_suite) { Gitlab::Ci::Reports::TestSuite.new(name) }
+ let(:test_case_success) { create_test_case_rspec_success }
+ let(:test_case_failed) { create_test_case_rspec_failed }
+
+ let(:test_case_resolved) do
+ create_test_case_rspec_failed.tap do |test_case|
+ test_case.instance_variable_set("@status", Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+ end
+
+ describe '#as_json' do
+ subject { entity.as_json }
+
+ context 'when head sutie has a newly failed test case which does not exist in base' do
+ before do
+ base_suite.add_test_case(test_case_success)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'contains correct compared test suite details' do
+ expect(subject[:name]).to eq(name)
+ expect(subject[:status]).to eq('failed')
+ expect(subject[:summary]).to include(total: 1, resolved: 0, failed: 1)
+ subject[:new_failures].first.tap do |new_failure|
+ expect(new_failure[:status]).to eq(test_case_failed.status)
+ expect(new_failure[:name]).to eq(test_case_failed.name)
+ expect(new_failure[:execution_time]).to eq(test_case_failed.execution_time)
+ expect(new_failure[:system_output]).to eq(test_case_failed.system_output)
+ end
+ expect(subject[:resolved_failures]).to be_empty
+ expect(subject[:existing_failures]).to be_empty
+ end
+ end
+
+ context 'when head sutie still has a failed test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_failed)
+ end
+
+ it 'contains correct compared test suite details' do
+ expect(subject[:name]).to eq(name)
+ expect(subject[:status]).to eq('failed')
+ expect(subject[:summary]).to include(total: 1, resolved: 0, failed: 1)
+ expect(subject[:new_failures]).to be_empty
+ expect(subject[:resolved_failures]).to be_empty
+ subject[:existing_failures].first.tap do |existing_failure|
+ expect(existing_failure[:status]).to eq(test_case_failed.status)
+ expect(existing_failure[:name]).to eq(test_case_failed.name)
+ expect(existing_failure[:execution_time]).to eq(test_case_failed.execution_time)
+ expect(existing_failure[:system_output]).to eq(test_case_failed.system_output)
+ end
+ end
+ end
+
+ context 'when head sutie has a success test case which failed in base' do
+ before do
+ base_suite.add_test_case(test_case_failed)
+ head_suite.add_test_case(test_case_resolved)
+ end
+
+ it 'contains correct compared test suite details' do
+ expect(subject[:name]).to eq(name)
+ expect(subject[:status]).to eq('success')
+ expect(subject[:summary]).to include(total: 1, resolved: 1, failed: 0)
+ expect(subject[:new_failures]).to be_empty
+ subject[:resolved_failures].first.tap do |resolved_failure|
+ expect(resolved_failure[:status]).to eq(test_case_resolved.status)
+ expect(resolved_failure[:name]).to eq(test_case_resolved.name)
+ expect(resolved_failure[:execution_time]).to eq(test_case_resolved.execution_time)
+ expect(resolved_failure[:system_output]).to eq(test_case_resolved.system_output)
+ end
+ expect(subject[:existing_failures]).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/services/auth/container_registry_authentication_service_spec.rb b/spec/services/auth/container_registry_authentication_service_spec.rb
index 037484931b8..c7f88e45c84 100644
--- a/spec/services/auth/container_registry_authentication_service_spec.rb
+++ b/spec/services/auth/container_registry_authentication_service_spec.rb
@@ -142,7 +142,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'for registry catalog' do
let(:current_params) do
- { scope: "registry:catalog:*" }
+ { scopes: ["registry:catalog:*"] }
end
context 'disallow browsing for users without Gitlab admin rights' do
@@ -164,7 +164,7 @@ describe Auth::ContainerRegistryAuthenticationService do
end
let(:current_params) do
- { scope: "repository:#{project.full_path}:push" }
+ { scopes: ["repository:#{project.full_path}:push"] }
end
it_behaves_like 'a pushable'
@@ -177,7 +177,7 @@ describe Auth::ContainerRegistryAuthenticationService do
end
let(:current_params) do
- { scope: "repository:#{project.full_path}:*" }
+ { scopes: ["repository:#{project.full_path}:*"] }
end
it_behaves_like 'an inaccessible'
@@ -191,7 +191,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'when pulling from root level repository' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull" }
+ { scopes: ["repository:#{project.full_path}:pull"] }
end
it_behaves_like 'a pullable'
@@ -205,7 +205,7 @@ describe Auth::ContainerRegistryAuthenticationService do
end
let(:current_params) do
- { scope: "repository:#{project.full_path}:*" }
+ { scopes: ["repository:#{project.full_path}:*"] }
end
it_behaves_like 'an inaccessible'
@@ -218,7 +218,7 @@ describe Auth::ContainerRegistryAuthenticationService do
end
let(:current_params) do
- { scope: "repository:#{project.full_path}:push,pull" }
+ { scopes: ["repository:#{project.full_path}:push,pull"] }
end
it_behaves_like 'a pullable'
@@ -231,7 +231,7 @@ describe Auth::ContainerRegistryAuthenticationService do
end
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull,push" }
+ { scopes: ["repository:#{project.full_path}:pull,push"] }
end
it_behaves_like 'an inaccessible'
@@ -244,7 +244,7 @@ describe Auth::ContainerRegistryAuthenticationService do
end
let(:current_params) do
- { scope: "repository:#{project.full_path}:*" }
+ { scopes: ["repository:#{project.full_path}:*"] }
end
it_behaves_like 'an inaccessible'
@@ -257,7 +257,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'allow anyone to pull images' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull" }
+ { scopes: ["repository:#{project.full_path}:pull"] }
end
it_behaves_like 'a pullable'
@@ -266,7 +266,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'disallow anyone to push images' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:push" }
+ { scopes: ["repository:#{project.full_path}:push"] }
end
it_behaves_like 'an inaccessible'
@@ -275,7 +275,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'disallow anyone to delete images' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:*" }
+ { scopes: ["repository:#{project.full_path}:*"] }
end
it_behaves_like 'an inaccessible'
@@ -284,7 +284,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'when repository name is invalid' do
let(:current_params) do
- { scope: 'repository:invalid:push' }
+ { scopes: ['repository:invalid:push'] }
end
it_behaves_like 'an inaccessible'
@@ -298,7 +298,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'for internal user' do
context 'allow anyone to pull images' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull" }
+ { scopes: ["repository:#{project.full_path}:pull"] }
end
it_behaves_like 'a pullable'
@@ -307,7 +307,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'disallow anyone to push images' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:push" }
+ { scopes: ["repository:#{project.full_path}:push"] }
end
it_behaves_like 'an inaccessible'
@@ -316,7 +316,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'disallow anyone to delete images' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:*" }
+ { scopes: ["repository:#{project.full_path}:*"] }
end
it_behaves_like 'an inaccessible'
@@ -328,7 +328,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'disallow anyone to pull or push images' do
let(:current_user) { create(:user, external: true) }
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull,push" }
+ { scopes: ["repository:#{project.full_path}:pull,push"] }
end
it_behaves_like 'an inaccessible'
@@ -338,7 +338,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'disallow anyone to delete images' do
let(:current_user) { create(:user, external: true) }
let(:current_params) do
- { scope: "repository:#{project.full_path}:*" }
+ { scopes: ["repository:#{project.full_path}:*"] }
end
it_behaves_like 'an inaccessible'
@@ -364,7 +364,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'allow to delete images' do
let(:current_params) do
- { scope: "repository:#{current_project.full_path}:*" }
+ { scopes: ["repository:#{current_project.full_path}:*"] }
end
it_behaves_like 'a deletable' do
@@ -397,7 +397,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'allow to pull and push images' do
let(:current_params) do
- { scope: "repository:#{current_project.full_path}:pull,push" }
+ { scopes: ["repository:#{current_project.full_path}:pull,push"] }
end
it_behaves_like 'a pullable and pushable' do
@@ -411,7 +411,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'disallow to delete images' do
let(:current_params) do
- { scope: "repository:#{current_project.full_path}:*" }
+ { scopes: ["repository:#{current_project.full_path}:*"] }
end
it_behaves_like 'an inaccessible' do
@@ -422,7 +422,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'for other projects' do
context 'when pulling' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull" }
+ { scopes: ["repository:#{project.full_path}:pull"] }
end
context 'allow for public' do
@@ -489,7 +489,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'when pushing' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:push" }
+ { scopes: ["repository:#{project.full_path}:push"] }
end
context 'disallow for all' do
@@ -523,7 +523,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'disallow when pulling' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull" }
+ { scopes: ["repository:#{project.full_path}:pull"] }
end
it_behaves_like 'an inaccessible'
@@ -534,14 +534,66 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'registry catalog browsing authorized as admin' do
let(:current_user) { create(:user, :admin) }
+ let(:project) { create(:project, :public) }
let(:current_params) do
- { scope: "registry:catalog:*" }
+ { scopes: ["registry:catalog:*"] }
end
it_behaves_like 'a browsable'
end
+ context 'support for multiple scopes' do
+ let(:internal_project) { create(:project, :internal) }
+ let(:private_project) { create(:project, :private) }
+
+ let(:current_params) do
+ {
+ scopes: [
+ "repository:#{internal_project.full_path}:pull",
+ "repository:#{private_project.full_path}:pull"
+ ]
+ }
+ end
+
+ context 'user has access to all projects' do
+ let(:current_user) { create(:user, :admin) }
+
+ it_behaves_like 'a browsable' do
+ let(:access) do
+ [
+ { 'type' => 'repository',
+ 'name' => internal_project.full_path,
+ 'actions' => ['pull'] },
+ { 'type' => 'repository',
+ 'name' => private_project.full_path,
+ 'actions' => ['pull'] }
+ ]
+ end
+ end
+ end
+
+ context 'user only has access to internal project' do
+ let(:current_user) { create(:user) }
+
+ it_behaves_like 'a browsable' do
+ let(:access) do
+ [
+ { 'type' => 'repository',
+ 'name' => internal_project.full_path,
+ 'actions' => ['pull'] }
+ ]
+ end
+ end
+ end
+
+ context 'anonymous access is rejected' do
+ let(:current_user) { nil }
+
+ it_behaves_like 'a forbidden'
+ end
+ end
+
context 'unauthorized' do
context 'disallow to use scope-less authentication' do
it_behaves_like 'a forbidden'
@@ -550,7 +602,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'for invalid scope' do
let(:current_params) do
- { scope: 'invalid:aa:bb' }
+ { scopes: ['invalid:aa:bb'] }
end
it_behaves_like 'a forbidden'
@@ -561,7 +613,7 @@ describe Auth::ContainerRegistryAuthenticationService do
let(:project) { create(:project, :private) }
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull" }
+ { scopes: ["repository:#{project.full_path}:pull"] }
end
it_behaves_like 'a forbidden'
@@ -572,7 +624,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'when pulling and pushing' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull,push" }
+ { scopes: ["repository:#{project.full_path}:pull,push"] }
end
it_behaves_like 'a pullable'
@@ -581,7 +633,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'when pushing' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:push" }
+ { scopes: ["repository:#{project.full_path}:push"] }
end
it_behaves_like 'a forbidden'
@@ -591,7 +643,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'for registry catalog' do
let(:current_params) do
- { scope: "registry:catalog:*" }
+ { scopes: ["registry:catalog:*"] }
end
it_behaves_like 'a forbidden'
@@ -601,7 +653,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'for deploy tokens' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:pull" }
+ { scopes: ["repository:#{project.full_path}:pull"] }
end
context 'when deploy token has read_registry as a scope' do
@@ -616,7 +668,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'when pushing' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:push" }
+ { scopes: ["repository:#{project.full_path}:push"] }
end
it_behaves_like 'an inaccessible'
@@ -632,7 +684,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'when pushing' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:push" }
+ { scopes: ["repository:#{project.full_path}:push"] }
end
it_behaves_like 'an inaccessible'
@@ -648,7 +700,7 @@ describe Auth::ContainerRegistryAuthenticationService do
context 'when pushing' do
let(:current_params) do
- { scope: "repository:#{project.full_path}:push" }
+ { scopes: ["repository:#{project.full_path}:push"] }
end
it_behaves_like 'an inaccessible'
@@ -734,4 +786,26 @@ describe Auth::ContainerRegistryAuthenticationService do
end
end
end
+
+ context 'user authorization' do
+ let(:current_user) { create(:user) }
+
+ context 'with multiple scopes' do
+ let(:project) { create(:project) }
+ let(:project2) { create }
+
+ context 'allow developer to push images' do
+ before do
+ project.add_developer(current_user)
+ end
+
+ let(:current_params) do
+ { scopes: ["repository:#{project.full_path}:push"] }
+ end
+
+ it_behaves_like 'a pushable'
+ it_behaves_like 'container repository factory'
+ end
+ end
+ end
end
diff --git a/spec/services/ci/compare_test_reports_service_spec.rb b/spec/services/ci/compare_test_reports_service_spec.rb
new file mode 100644
index 00000000000..d3bbf17cc5c
--- /dev/null
+++ b/spec/services/ci/compare_test_reports_service_spec.rb
@@ -0,0 +1,45 @@
+require 'spec_helper'
+
+describe Ci::CompareTestReportsService do
+ let(:service) { described_class.new(project) }
+ let(:project) { create(:project, :repository) }
+
+ describe '#execute' do
+ subject { service.execute(base_pipeline&.iid, head_pipeline.iid) }
+
+ context 'when head pipeline has test reports' do
+ let!(:base_pipeline) { nil }
+ let!(:head_pipeline) { create(:ci_pipeline, :with_test_reports, project: project) }
+
+ it 'returns status and data' do
+ expect(subject[:status]).to eq(:parsed)
+ expect(subject[:data]).to match_schema('entities/test_reports_comparer')
+ end
+ end
+
+ context 'when base and head pipelines have test reports' do
+ let!(:base_pipeline) { create(:ci_pipeline, :with_test_reports, project: project) }
+ let!(:head_pipeline) { create(:ci_pipeline, :with_test_reports, project: project) }
+
+ it 'returns status and data' do
+ expect(subject[:status]).to eq(:parsed)
+ expect(subject[:data]).to match_schema('entities/test_reports_comparer')
+ end
+ end
+
+ context 'when head pipeline has corrupted test reports' do
+ let!(:base_pipeline) { nil }
+ let!(:head_pipeline) { create(:ci_pipeline, project: project) }
+
+ before do
+ build = create(:ci_build, pipeline: head_pipeline, project: head_pipeline.project)
+ create(:ci_job_artifact, :junit_with_corrupted_data, job: build, project: project)
+ end
+
+ it 'returns status and error message' do
+ expect(subject[:status]).to eq(:error)
+ expect(subject[:status_reason]).to include('XML parsing failed')
+ end
+ end
+ end
+end
diff --git a/spec/services/ci/register_job_service_spec.rb b/spec/services/ci/register_job_service_spec.rb
index dbb5e33bbdc..a6565709641 100644
--- a/spec/services/ci/register_job_service_spec.rb
+++ b/spec/services/ci/register_job_service_spec.rb
@@ -351,6 +351,38 @@ module Ci
end
end
+ context 'runner feature set is verified' do
+ let!(:pending_job) { create(:ci_build, :pending, pipeline: pipeline) }
+
+ before do
+ expect_any_instance_of(Ci::Build).to receive(:runner_required_feature_names) do
+ [:runner_required_feature]
+ end
+ end
+
+ subject { execute(specific_runner, params) }
+
+ context 'when feature is missing by runner' do
+ let(:params) { {} }
+
+ it 'does not pick the build and drops the build' do
+ expect(subject).to be_nil
+ expect(pending_job.reload).to be_failed
+ expect(pending_job).to be_runner_unsupported
+ end
+ end
+
+ context 'when feature is supported by runner' do
+ let(:params) do
+ { info: { features: { runner_required_feature: true } } }
+ end
+
+ it 'does pick job' do
+ expect(subject).not_to be_nil
+ end
+ end
+ end
+
context 'when "dependencies" keyword is specified' do
shared_examples 'not pick' do
it 'does not pick the build and drops the build' do
@@ -403,6 +435,7 @@ module Ci
it { expect(subject).to eq(pending_job) }
end
+
context 'when artifacts of depended job has been expired' do
let!(:pre_stage_job) { create(:ci_build, :success, :expired, pipeline: pipeline, name: 'test', stage_idx: 0) }
diff --git a/spec/services/ci/retry_build_service_spec.rb b/spec/services/ci/retry_build_service_spec.rb
index ecf5d849d3f..18d52082399 100644
--- a/spec/services/ci/retry_build_service_spec.rb
+++ b/spec/services/ci/retry_build_service_spec.rb
@@ -24,7 +24,7 @@ describe Ci::RetryBuildService do
artifacts_file artifacts_metadata artifacts_size created_at
updated_at started_at finished_at queued_at erased_by
erased_at auto_canceled_by job_artifacts job_artifacts_archive
- job_artifacts_metadata job_artifacts_trace].freeze
+ job_artifacts_metadata job_artifacts_trace job_artifacts_junit].freeze
IGNORE_ACCESSORS =
%i[type lock_version target_url base_tags trace_sections
@@ -38,7 +38,7 @@ describe Ci::RetryBuildService do
let(:another_pipeline) { create(:ci_empty_pipeline, project: project) }
let(:build) do
- create(:ci_build, :failed, :artifacts, :expired, :erased,
+ create(:ci_build, :failed, :artifacts, :test_reports, :expired, :erased,
:queued, :coverage, :tags, :allowed_to_fail, :on_tag,
:triggered, :trace_artifact, :teardown_environment,
description: 'my-job', stage: 'test', stage_id: stage.id,
diff --git a/spec/services/clusters/applications/check_installation_progress_service_spec.rb b/spec/services/clusters/applications/check_installation_progress_service_spec.rb
index 6894c1797b0..986f11410fd 100644
--- a/spec/services/clusters/applications/check_installation_progress_service_spec.rb
+++ b/spec/services/clusters/applications/check_installation_progress_service_spec.rb
@@ -43,7 +43,7 @@ describe Clusters::Applications::CheckInstallationProgressService do
service.execute
expect(application).to be_errored
- expect(application.status_reason).to match(/\btimeouted\b/)
+ expect(application.status_reason).to match(/\btimed out\b/)
end
end
end
diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb
index 3f62e7e61e1..a3c9a660c2f 100644
--- a/spec/services/git_push_service_spec.rb
+++ b/spec/services/git_push_service_spec.rb
@@ -3,8 +3,8 @@ require 'spec_helper'
describe GitPushService, services: true do
include RepoHelpers
- let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
+ set(:user) { create(:user) }
+ set(:project) { create(:project, :repository) }
let(:blankrev) { Gitlab::Git::BLANK_SHA }
let(:oldrev) { sample_commit.parent_id }
let(:newrev) { sample_commit.id }
@@ -761,7 +761,7 @@ describe GitPushService, services: true do
end
it 'does not queue a CreateGpgSignatureWorker' do
- expect(CreateGpgSignatureWorker).not_to receive(:perform_async).with(sample_commit.id, project.id)
+ expect(CreateGpgSignatureWorker).not_to receive(:perform_async)
execute_service(project, user, oldrev, newrev, ref)
end
@@ -769,7 +769,15 @@ describe GitPushService, services: true do
context 'when the signature is not yet cached' do
it 'queues a CreateGpgSignatureWorker' do
- expect(CreateGpgSignatureWorker).to receive(:perform_async).with(sample_commit.id, project.id)
+ expect(CreateGpgSignatureWorker).to receive(:perform_async).with([sample_commit.id], project.id)
+
+ execute_service(project, user, oldrev, newrev, ref)
+ end
+
+ it 'can queue several commits to create the gpg signature' do
+ allow(Gitlab::Git::Commit).to receive(:shas_with_signatures).and_return([sample_commit.id, another_sample_commit.id])
+
+ expect(CreateGpgSignatureWorker).to receive(:perform_async).with([sample_commit.id, another_sample_commit.id], project.id)
execute_service(project, user, oldrev, newrev, ref)
end
diff --git a/spec/services/issues/update_service_spec.rb b/spec/services/issues/update_service_spec.rb
index fa98d05c61b..5bcfef46b75 100644
--- a/spec/services/issues/update_service_spec.rb
+++ b/spec/services/issues/update_service_spec.rb
@@ -55,6 +55,8 @@ describe Issues::UpdateService, :mailer do
end
it 'updates the issue with the given params' do
+ expect(TodosDestroyer::ConfidentialIssueWorker).not_to receive(:perform_in)
+
update_issue(opts)
expect(issue).to be_valid
@@ -74,6 +76,21 @@ describe Issues::UpdateService, :mailer do
.to change { project.open_issues_count }.from(1).to(0)
end
+ it 'enqueues ConfidentialIssueWorker when an issue is made confidential' do
+ expect(TodosDestroyer::ConfidentialIssueWorker).to receive(:perform_in).with(1.hour, issue.id)
+
+ update_issue(confidential: true)
+ end
+
+ it 'does not enqueue ConfidentialIssueWorker when an issue is made non confidential' do
+ # set confidentiality to true before the actual update
+ issue.update!(confidential: true)
+
+ expect(TodosDestroyer::ConfidentialIssueWorker).not_to receive(:perform_in)
+
+ update_issue(confidential: false)
+ end
+
it 'updates open issue counter for assignees when issue is reassigned' do
update_issue(assignee_ids: [user2.id])
diff --git a/spec/services/members/destroy_service_spec.rb b/spec/services/members/destroy_service_spec.rb
index ef47b0a450b..0a5220c7c61 100644
--- a/spec/services/members/destroy_service_spec.rb
+++ b/spec/services/members/destroy_service_spec.rb
@@ -20,6 +20,11 @@ describe Members::DestroyService do
end
shared_examples 'a service destroying a member' do
+ before do
+ type = member.is_a?(GroupMember) ? 'Group' : 'Project'
+ expect(TodosDestroyer::EntityLeaveWorker).to receive(:perform_in).with(1.hour, member.user_id, member.source_id, type)
+ end
+
it 'destroys the member' do
expect { described_class.new(current_user).execute(member, opts) }.to change { member.source.members_and_requesters.count }.by(-1)
end
diff --git a/spec/services/projects/create_from_template_service_spec.rb b/spec/services/projects/create_from_template_service_spec.rb
index a43da01f37e..141ccf7c4d8 100644
--- a/spec/services/projects/create_from_template_service_spec.rb
+++ b/spec/services/projects/create_from_template_service_spec.rb
@@ -2,10 +2,11 @@ require 'spec_helper'
describe Projects::CreateFromTemplateService do
let(:user) { create(:user) }
+ let(:template_name) { 'rails' }
let(:project_params) do
{
path: user.to_param,
- template_name: 'rails',
+ template_name: template_name,
description: 'project description',
visibility_level: Gitlab::VisibilityLevel::PUBLIC
}
@@ -14,7 +15,10 @@ describe Projects::CreateFromTemplateService do
subject { described_class.new(user, project_params) }
it 'calls the importer service' do
- expect_any_instance_of(Projects::GitlabProjectsImportService).to receive(:execute)
+ import_service_double = double
+
+ allow(Projects::GitlabProjectsImportService).to receive(:new).and_return(import_service_double)
+ expect(import_service_double).to receive(:execute)
subject.execute
end
@@ -26,6 +30,31 @@ describe Projects::CreateFromTemplateService do
expect(project.import_scheduled?).to be(true)
end
+ context 'when template is not present' do
+ let(:template_name) { 'non_existent' }
+ let(:project) { subject.execute }
+
+ before do
+ expect(project).to be_saved
+ end
+
+ it 'does not set import set import type' do
+ expect(project.import_type).to be nil
+ end
+
+ it 'does not set import set import source' do
+ expect(project.import_source).to be nil
+ end
+
+ it 'is not scheduled' do
+ expect(project.import_scheduled?).to be(false)
+ end
+
+ it 'repository is empty' do
+ expect(project.repository.empty?).to be(true)
+ end
+ end
+
context 'the result project' do
before do
perform_enqueued_jobs do
diff --git a/spec/services/projects/detect_repository_languages_service_spec.rb b/spec/services/projects/detect_repository_languages_service_spec.rb
new file mode 100644
index 00000000000..f90d558938f
--- /dev/null
+++ b/spec/services/projects/detect_repository_languages_service_spec.rb
@@ -0,0 +1,54 @@
+require 'spec_helper'
+
+describe Projects::DetectRepositoryLanguagesService, :clean_gitlab_redis_shared_state do
+ set(:project) { create(:project, :repository) }
+
+ subject { described_class.new(project, project.owner) }
+
+ before do
+ allow(Feature).to receive(:disabled?).and_return(false)
+ end
+
+ describe '#execute' do
+ context 'without previous detection' do
+ it 'inserts new programming languages in the database' do
+ subject.execute
+
+ expect(ProgrammingLanguage.exists?(name: 'Ruby')).to be(true)
+ expect(ProgrammingLanguage.count).to be(4)
+ end
+
+ it 'inserts the repository langauges' do
+ names = subject.execute.map(&:name)
+
+ expect(names).to eq(%w[Ruby JavaScript HTML CoffeeScript])
+ end
+ end
+
+ context 'with a previous detection' do
+ before do
+ subject.execute
+
+ allow(project.repository).to receive(:languages).and_return(
+ [{ value: 99.63, label: "Ruby", color: "#701516", highlight: "#701516" },
+ { value: 0.3, label: "D", color: "#701516", highlight: "#701516" }]
+ )
+ end
+
+ it 'updates the repository languages' do
+ repository_languages = subject.execute.map(&:name)
+
+ expect(repository_languages).to eq(%w[Ruby D])
+ end
+ end
+
+ context 'when no repository exists' do
+ set(:project) { create(:project) }
+
+ it 'has no languages' do
+ expect(subject.execute).to be_empty
+ expect(project.repository_languages).to be_empty
+ end
+ end
+ end
+end
diff --git a/spec/services/projects/gitlab_projects_import_service_spec.rb b/spec/services/projects/gitlab_projects_import_service_spec.rb
index 0a898e9b89b..b5f2c826c97 100644
--- a/spec/services/projects/gitlab_projects_import_service_spec.rb
+++ b/spec/services/projects/gitlab_projects_import_service_spec.rb
@@ -3,63 +3,13 @@ require 'spec_helper'
describe Projects::GitlabProjectsImportService do
set(:namespace) { create(:namespace) }
let(:path) { 'test-path' }
- let(:file) { fixture_file_upload('spec/fixtures/doc_sample.txt', 'text/plain') }
+ let(:file) { fixture_file_upload('spec/fixtures/project_export.tar.gz') }
let(:overwrite) { false }
let(:import_params) { { namespace_id: namespace.id, path: path, file: file, overwrite: overwrite } }
+
subject { described_class.new(namespace.owner, import_params) }
describe '#execute' do
- context 'with an invalid path' do
- let(:path) { '/invalid-path/' }
-
- it 'returns an invalid project' do
- project = subject.execute
-
- expect(project).not_to be_persisted
- expect(project).not_to be_valid
- end
- end
-
- context 'with a valid path' do
- it 'creates a project' do
- project = subject.execute
-
- expect(project).to be_persisted
- expect(project).to be_valid
- end
- end
-
- context 'override params' do
- it 'stores them as import data when passed' do
- project = described_class
- .new(namespace.owner, import_params, description: 'Hello')
- .execute
-
- expect(project.import_data.data['override_params']['description']).to eq('Hello')
- end
- end
-
- context 'when there is a project with the same path' do
- let(:existing_project) { create(:project, namespace: namespace) }
- let(:path) { existing_project.path}
-
- it 'does not create the project' do
- project = subject.execute
-
- expect(project).to be_invalid
- expect(project).not_to be_persisted
- end
-
- context 'when overwrite param is set' do
- let(:overwrite) { true }
-
- it 'creates a project in a temporary full_path' do
- project = subject.execute
-
- expect(project).to be_valid
- expect(project).to be_persisted
- end
- end
- end
+ it_behaves_like 'gitlab projects import validations'
end
end
diff --git a/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb b/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
index fb6d7171ac3..28d8a95fe07 100644
--- a/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
@@ -1,21 +1,22 @@
require 'spec_helper'
describe Projects::HashedStorage::MigrateAttachmentsService do
- subject(:service) { described_class.new(project) }
+ subject(:service) { described_class.new(project, project.full_path, logger: nil) }
+
let(:project) { create(:project, :legacy_storage) }
let(:legacy_storage) { Storage::LegacyProject.new(project) }
let(:hashed_storage) { Storage::HashedProject.new(project) }
let!(:upload) { Upload.find_by(path: file_uploader.upload_path) }
let(:file_uploader) { build(:file_uploader, project: project) }
- let(:old_path) { File.join(base_path(legacy_storage), upload.path) }
- let(:new_path) { File.join(base_path(hashed_storage), upload.path) }
+ let(:old_disk_path) { File.join(base_path(legacy_storage), upload.path) }
+ let(:new_disk_path) { File.join(base_path(hashed_storage), upload.path) }
context '#execute' do
context 'when succeeds' do
it 'moves attachments to hashed storage layout' do
- expect(File.file?(old_path)).to be_truthy
- expect(File.file?(new_path)).to be_falsey
+ expect(File.file?(old_disk_path)).to be_truthy
+ expect(File.file?(new_disk_path)).to be_falsey
expect(File.exist?(base_path(legacy_storage))).to be_truthy
expect(File.exist?(base_path(hashed_storage))).to be_falsey
expect(FileUtils).to receive(:mv).with(base_path(legacy_storage), base_path(hashed_storage)).and_call_original
@@ -24,8 +25,8 @@ describe Projects::HashedStorage::MigrateAttachmentsService do
expect(File.exist?(base_path(hashed_storage))).to be_truthy
expect(File.exist?(base_path(legacy_storage))).to be_falsey
- expect(File.file?(old_path)).to be_falsey
- expect(File.file?(new_path)).to be_truthy
+ expect(File.file?(old_disk_path)).to be_falsey
+ expect(File.file?(new_disk_path)).to be_truthy
end
end
@@ -40,7 +41,7 @@ describe Projects::HashedStorage::MigrateAttachmentsService do
service.execute
expect(File.exist?(base_path(hashed_storage))).to be_falsey
- expect(File.file?(new_path)).to be_falsey
+ expect(File.file?(new_disk_path)).to be_falsey
end
end
diff --git a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
index ed4930313c5..5f67c325223 100644
--- a/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
+++ b/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
@@ -3,10 +3,11 @@ require 'spec_helper'
describe Projects::HashedStorage::MigrateRepositoryService do
let(:gitlab_shell) { Gitlab::Shell.new }
let(:project) { create(:project, :legacy_storage, :repository, :wiki_repo) }
- let(:service) { described_class.new(project) }
let(:legacy_storage) { Storage::LegacyProject.new(project) }
let(:hashed_storage) { Storage::HashedProject.new(project) }
+ subject(:service) { described_class.new(project, project.full_path) }
+
describe '#execute' do
before do
allow(service).to receive(:gitlab_shell) { gitlab_shell }
diff --git a/spec/services/projects/hashed_storage_migration_service_spec.rb b/spec/services/projects/hashed_storage_migration_service_spec.rb
index e8e18bb3ac0..5368c3828dd 100644
--- a/spec/services/projects/hashed_storage_migration_service_spec.rb
+++ b/spec/services/projects/hashed_storage_migration_service_spec.rb
@@ -2,14 +2,19 @@ require 'spec_helper'
describe Projects::HashedStorageMigrationService do
let(:project) { create(:project, :empty_repo, :wiki_repo, :legacy_storage) }
- subject(:service) { described_class.new(project) }
+ let(:logger) { double }
+
+ subject(:service) { described_class.new(project, project.full_path, logger: logger) }
describe '#execute' do
context 'repository migration' do
- let(:repository_service) { Projects::HashedStorage::MigrateRepositoryService.new(project, subject.logger) }
+ let(:repository_service) { Projects::HashedStorage::MigrateRepositoryService.new(project, project.full_path, logger: logger) }
it 'delegates migration to Projects::HashedStorage::MigrateRepositoryService' do
- expect(Projects::HashedStorage::MigrateRepositoryService).to receive(:new).with(project, subject.logger).and_return(repository_service)
+ expect(Projects::HashedStorage::MigrateRepositoryService)
+ .to receive(:new)
+ .with(project, project.full_path, logger: logger)
+ .and_return(repository_service)
expect(repository_service).to receive(:execute)
service.execute
@@ -24,10 +29,13 @@ describe Projects::HashedStorageMigrationService do
end
context 'attachments migration' do
- let(:attachments_service) { Projects::HashedStorage::MigrateAttachmentsService.new(project, subject.logger) }
+ let(:attachments_service) { Projects::HashedStorage::MigrateAttachmentsService.new(project, project.full_path, logger: logger) }
it 'delegates migration to Projects::HashedStorage::MigrateRepositoryService' do
- expect(Projects::HashedStorage::MigrateAttachmentsService).to receive(:new).with(project, subject.logger).and_return(attachments_service)
+ expect(Projects::HashedStorage::MigrateAttachmentsService)
+ .to receive(:new)
+ .with(project, project.full_path, logger: logger)
+ .and_return(attachments_service)
expect(attachments_service).to receive(:execute)
service.execute
diff --git a/spec/services/projects/transfer_service_spec.rb b/spec/services/projects/transfer_service_spec.rb
index 7e85f599afb..1a85c52fc97 100644
--- a/spec/services/projects/transfer_service_spec.rb
+++ b/spec/services/projects/transfer_service_spec.rb
@@ -31,12 +31,6 @@ describe Projects::TransferService do
transfer_project(project, user, group)
end
- it 'expires full_path cache' do
- expect(project).to receive(:expires_full_path_cache)
-
- transfer_project(project, user, group)
- end
-
it 'invalidates the user\'s personal_project_count cache' do
expect(user).to receive(:invalidate_personal_projects_count)
diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb
index a4c103e6f30..36b619ba9be 100644
--- a/spec/services/projects/update_pages_service_spec.rb
+++ b/spec/services/projects/update_pages_service_spec.rb
@@ -79,7 +79,7 @@ describe Projects::UpdatePagesService do
context "for a valid job" do
before do
create(:ci_job_artifact, file: file, job: build)
- create(:ci_job_artifact, file_type: :metadata, file: metadata, job: build)
+ create(:ci_job_artifact, file_type: :metadata, file_format: :gzip, file: metadata, job: build)
build.reload
end
diff --git a/spec/services/projects/update_service_spec.rb b/spec/services/projects/update_service_spec.rb
index ecf1ba05618..9572b4110d5 100644
--- a/spec/services/projects/update_service_spec.rb
+++ b/spec/services/projects/update_service_spec.rb
@@ -15,6 +15,8 @@ describe Projects::UpdateService do
context 'when changing visibility level' do
context 'when visibility_level is INTERNAL' do
it 'updates the project to internal' do
+ expect(TodosDestroyer::ProjectPrivateWorker).not_to receive(:perform_in)
+
result = update_project(project, user, visibility_level: Gitlab::VisibilityLevel::INTERNAL)
expect(result).to eq({ status: :success })
@@ -24,12 +26,30 @@ describe Projects::UpdateService do
context 'when visibility_level is PUBLIC' do
it 'updates the project to public' do
+ expect(TodosDestroyer::ProjectPrivateWorker).not_to receive(:perform_in)
+
result = update_project(project, user, visibility_level: Gitlab::VisibilityLevel::PUBLIC)
+
expect(result).to eq({ status: :success })
expect(project).to be_public
end
end
+ context 'when visibility_level is PRIVATE' do
+ before do
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PUBLIC)
+ end
+
+ it 'updates the project to private' do
+ expect(TodosDestroyer::ProjectPrivateWorker).to receive(:perform_in).with(1.hour, project.id)
+
+ result = update_project(project, user, visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+
+ expect(result).to eq({ status: :success })
+ expect(project).to be_private
+ end
+ end
+
context 'when visibility levels are restricted to PUBLIC only' do
before do
stub_application_setting(restricted_visibility_levels: [Gitlab::VisibilityLevel::PUBLIC])
@@ -38,6 +58,7 @@ describe Projects::UpdateService do
context 'when visibility_level is INTERNAL' do
it 'updates the project to internal' do
result = update_project(project, user, visibility_level: Gitlab::VisibilityLevel::INTERNAL)
+
expect(result).to eq({ status: :success })
expect(project).to be_internal
end
@@ -54,6 +75,7 @@ describe Projects::UpdateService do
context 'when updated by an admin' do
it 'updates the project to public' do
result = update_project(project, admin, visibility_level: Gitlab::VisibilityLevel::PUBLIC)
+
expect(result).to eq({ status: :success })
expect(project).to be_public
end
@@ -166,6 +188,20 @@ describe Projects::UpdateService do
end
end
+ context 'when changing feature visibility to private' do
+ it 'updates the visibility correctly' do
+ expect(TodosDestroyer::PrivateFeaturesWorker)
+ .to receive(:perform_in).with(1.hour, project.id)
+
+ result = update_project(project, user, project_feature_attributes:
+ { issues_access_level: ProjectFeature::PRIVATE }
+ )
+
+ expect(result).to eq({ status: :success })
+ expect(project.project_feature.issues_access_level).to be(ProjectFeature::PRIVATE)
+ end
+ end
+
context 'when updating a project that contains container images' do
before do
stub_container_registry_config(enabled: true)
@@ -212,6 +248,21 @@ describe Projects::UpdateService do
expect(project.errors.messages).to have_key(:base)
expect(project.errors.messages[:base]).to include('There is already a repository with that name on disk')
end
+
+ context 'when hashed storage enabled' do
+ before do
+ stub_application_setting(hashed_storage_enabled: true)
+ end
+
+ it 'migrates project to a hashed storage instead of renaming the repo to another legacy name' do
+ result = update_project(project, admin, path: 'new-path')
+
+ expect(result).not_to include(status: :error)
+ expect(project).to be_valid
+ expect(project.errors).to be_empty
+ expect(project.reload.hashed_storage?(:repository)).to be_truthy
+ end
+ end
end
context 'with hashed storage' do
diff --git a/spec/services/resource_events/change_labels_service_spec.rb b/spec/services/resource_events/change_labels_service_spec.rb
new file mode 100644
index 00000000000..41b0fb3eea3
--- /dev/null
+++ b/spec/services/resource_events/change_labels_service_spec.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe ResourceEvents::ChangeLabelsService do
+ set(:project) { create(:project) }
+ set(:author) { create(:user) }
+ let(:resource) { create(:issue, project: project) }
+
+ describe '.change_labels' do
+ subject { described_class.new(resource, author).execute(added_labels: added, removed_labels: removed) }
+
+ let(:labels) { create_list(:label, 2, project: project) }
+
+ def expect_label_event(event, label, action)
+ expect(event.user).to eq(author)
+ expect(event.label).to eq(label)
+ expect(event.action).to eq(action)
+ end
+
+ context 'when adding a label' do
+ let(:added) { [labels[0]] }
+ let(:removed) { [] }
+
+ it 'creates new label event' do
+ expect { subject }.to change { resource.resource_label_events.count }.from(0).to(1)
+
+ expect_label_event(resource.resource_label_events.first, labels[0], 'add')
+ end
+ end
+
+ context 'when removing a label' do
+ let(:added) { [] }
+ let(:removed) { [labels[1]] }
+
+ it 'creates new label event' do
+ expect { subject }.to change { resource.resource_label_events.count }.from(0).to(1)
+
+ expect_label_event(resource.resource_label_events.first, labels[1], 'remove')
+ end
+ end
+
+ context 'when both adding and removing labels' do
+ let(:added) { [labels[0]] }
+ let(:removed) { [labels[1]] }
+
+ it 'creates all label events in a single query' do
+ expect(Gitlab::Database).to receive(:bulk_insert).once.and_call_original
+ expect { subject }.to change { resource.resource_label_events.count }.from(0).to(2)
+ end
+ end
+ end
+end
diff --git a/spec/services/todos/destroy/confidential_issue_service_spec.rb b/spec/services/todos/destroy/confidential_issue_service_spec.rb
new file mode 100644
index 00000000000..54d1d7e83f1
--- /dev/null
+++ b/spec/services/todos/destroy/confidential_issue_service_spec.rb
@@ -0,0 +1,47 @@
+require 'spec_helper'
+
+describe Todos::Destroy::ConfidentialIssueService do
+ let(:project) { create(:project, :public) }
+ let(:user) { create(:user) }
+ let(:author) { create(:user) }
+ let(:assignee) { create(:user) }
+ let(:guest) { create(:user) }
+ let(:project_member) { create(:user) }
+ let(:issue) { create(:issue, project: project, author: author, assignees: [assignee]) }
+
+ let!(:todo_issue_non_member) { create(:todo, user: user, target: issue, project: project) }
+ let!(:todo_issue_member) { create(:todo, user: project_member, target: issue, project: project) }
+ let!(:todo_issue_author) { create(:todo, user: author, target: issue, project: project) }
+ let!(:todo_issue_asignee) { create(:todo, user: assignee, target: issue, project: project) }
+ let!(:todo_issue_guest) { create(:todo, user: guest, target: issue, project: project) }
+ let!(:todo_another_non_member) { create(:todo, user: user, project: project) }
+
+ describe '#execute' do
+ before do
+ project.add_developer(project_member)
+ project.add_guest(guest)
+ end
+
+ subject { described_class.new(issue.id).execute }
+
+ context 'when provided issue is confidential' do
+ before do
+ issue.update!(confidential: true)
+ end
+
+ it 'removes issue todos for a user who is not a project member' do
+ expect { subject }.to change { Todo.count }.from(6).to(4)
+
+ expect(user.todos).to match_array([todo_another_non_member])
+ expect(author.todos).to match_array([todo_issue_author])
+ expect(project_member.todos).to match_array([todo_issue_member])
+ end
+ end
+
+ context 'when provided issue is not confidential' do
+ it 'does not remove any todos' do
+ expect { subject }.not_to change { Todo.count }
+ end
+ end
+ end
+end
diff --git a/spec/services/todos/destroy/entity_leave_service_spec.rb b/spec/services/todos/destroy/entity_leave_service_spec.rb
new file mode 100644
index 00000000000..bad408a314e
--- /dev/null
+++ b/spec/services/todos/destroy/entity_leave_service_spec.rb
@@ -0,0 +1,135 @@
+require 'spec_helper'
+
+describe Todos::Destroy::EntityLeaveService do
+ let(:group) { create(:group, :private) }
+ let(:project) { create(:project, group: group) }
+ let(:user) { create(:user) }
+ let(:user2) { create(:user) }
+ let(:issue) { create(:issue, project: project) }
+ let(:mr) { create(:merge_request, source_project: project) }
+
+ let!(:todo_mr_user) { create(:todo, user: user, target: mr, project: project) }
+ let!(:todo_issue_user) { create(:todo, user: user, target: issue, project: project) }
+ let!(:todo_issue_user2) { create(:todo, user: user2, target: issue, project: project) }
+
+ describe '#execute' do
+ context 'when a user leaves a project' do
+ subject { described_class.new(user.id, project.id, 'Project').execute }
+
+ context 'when project is private' do
+ it 'removes todos for the provided user' do
+ expect { subject }.to change { Todo.count }.from(3).to(1)
+
+ expect(user.todos).to be_empty
+ expect(user2.todos).to match_array([todo_issue_user2])
+ end
+ end
+
+ context 'when project is not private' do
+ before do
+ group.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
+ project.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
+ end
+
+ context 'when a user is not an author of confidential issue' do
+ before do
+ issue.update!(confidential: true)
+ end
+
+ it 'removes only confidential issues todos' do
+ expect { subject }.to change { Todo.count }.from(3).to(2)
+ end
+ end
+
+ context 'when a user is an author of confidential issue' do
+ before do
+ issue.update!(author: user, confidential: true)
+ end
+
+ it 'removes only confidential issues todos' do
+ expect { subject }.not_to change { Todo.count }
+ end
+ end
+
+ context 'when a user is an assignee of confidential issue' do
+ before do
+ issue.update!(confidential: true)
+ issue.assignees << user
+ end
+
+ it 'removes only confidential issues todos' do
+ expect { subject }.not_to change { Todo.count }
+ end
+ end
+
+ context 'feature visibility check' do
+ context 'when issues are visible only to project members' do
+ before do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only users issue todos' do
+ expect { subject }.to change { Todo.count }.from(3).to(2)
+ end
+ end
+ end
+ end
+ end
+
+ context 'when a user leaves a group' do
+ subject { described_class.new(user.id, group.id, 'Group').execute }
+
+ context 'when group is private' do
+ it 'removes todos for the user' do
+ expect { subject }.to change { Todo.count }.from(3).to(1)
+
+ expect(user.todos).to be_empty
+ expect(user2.todos).to match_array([todo_issue_user2])
+ end
+
+ context 'with nested groups', :nested_groups do
+ let(:subgroup) { create(:group, :private, parent: group) }
+ let(:subproject) { create(:project, group: subgroup) }
+
+ let!(:todo_subproject_user) { create(:todo, user: user, project: subproject) }
+ let!(:todo_subproject_user2) { create(:todo, user: user2, project: subproject) }
+
+ it 'removes todos for the user including subprojects todos' do
+ expect { subject }.to change { Todo.count }.from(5).to(2)
+
+ expect(user.todos).to be_empty
+ expect(user2.todos)
+ .to match_array([todo_issue_user2, todo_subproject_user2])
+ end
+ end
+ end
+
+ context 'when group is not private' do
+ before do
+ issue.update!(confidential: true)
+
+ group.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
+ project.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL)
+ end
+
+ it 'removes only confidential issues todos' do
+ expect { subject }.to change { Todo.count }.from(3).to(2)
+ end
+ end
+ end
+
+ context 'when entity type is not valid' do
+ it 'raises an exception' do
+ expect { described_class.new(user.id, group.id, 'GroupWrongly').execute }
+ .to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when entity was not found' do
+ it 'does not remove any todos' do
+ expect { described_class.new(user.id, 999999, 'Group').execute }
+ .not_to change { Todo.count }
+ end
+ end
+ end
+end
diff --git a/spec/services/todos/destroy/private_features_service_spec.rb b/spec/services/todos/destroy/private_features_service_spec.rb
new file mode 100644
index 00000000000..be8b5bb3979
--- /dev/null
+++ b/spec/services/todos/destroy/private_features_service_spec.rb
@@ -0,0 +1,143 @@
+require 'spec_helper'
+
+describe Todos::Destroy::PrivateFeaturesService do
+ let(:project) { create(:project, :public) }
+ let(:user) { create(:user) }
+ let(:another_user) { create(:user) }
+ let(:project_member) { create(:user) }
+ let(:issue) { create(:issue, project: project) }
+ let(:mr) { create(:merge_request, source_project: project) }
+
+ let!(:todo_mr_non_member) { create(:todo, user: user, target: mr, project: project) }
+ let!(:todo_mr_non_member2) { create(:todo, user: another_user, target: mr, project: project) }
+ let!(:todo_mr_member) { create(:todo, user: project_member, target: mr, project: project) }
+ let!(:todo_issue_non_member) { create(:todo, user: user, target: issue, project: project) }
+ let!(:todo_issue_non_member2) { create(:todo, user: another_user, target: issue, project: project) }
+ let!(:todo_issue_member) { create(:todo, user: project_member, target: issue, project: project) }
+ let!(:commit_todo_non_member) { create(:on_commit_todo, user: user, project: project) }
+ let!(:commit_todo_non_member2) { create(:on_commit_todo, user: another_user, project: project) }
+ let!(:commit_todo_member) { create(:on_commit_todo, user: project_member, project: project) }
+
+ before do
+ project.add_developer(project_member)
+ end
+
+ context 'when user_id is provided' do
+ subject { described_class.new(project.id, user.id).execute }
+
+ context 'when all feaures have same visibility as the project' do
+ it 'removes only user issue todos' do
+ expect { subject }.not_to change { Todo.count }
+ end
+ end
+
+ context 'when issues are visible only to project members but the user is a member' do
+ before do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ project.add_developer(user)
+ end
+
+ it 'does not remove any todos' do
+ expect { subject }.not_to change { Todo.count }
+ end
+ end
+
+ context 'when issues are visible only to project members' do
+ before do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only user issue todos' do
+ expect { subject }.to change { Todo.count }.from(9).to(8)
+ end
+ end
+
+ context 'when mrs, builds and repository are visible only to project members' do
+ before do
+ # builds and merge requests cannot have higher visibility than repository
+ project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(builds_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(repository_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only user mr and commit todos' do
+ expect { subject }.to change { Todo.count }.from(9).to(7)
+ end
+ end
+
+ context 'when mrs are visible only to project members' do
+ before do
+ project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only user merge request todo' do
+ expect { subject }.to change { Todo.count }.from(9).to(8)
+ end
+ end
+
+ context 'when mrs and issues are visible only to project members' do
+ before do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only user merge request and issue todos' do
+ expect { subject }.to change { Todo.count }.from(9).to(7)
+ end
+ end
+ end
+
+ context 'when user_id is not provided' do
+ subject { described_class.new(project.id).execute }
+
+ context 'when all feaures have same visibility as the project' do
+ it 'does not remove any todos' do
+ expect { subject }.not_to change { Todo.count }
+ end
+ end
+
+ context 'when issues are visible only to project members' do
+ before do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only non members issue todos' do
+ expect { subject }.to change { Todo.count }.from(9).to(7)
+ end
+ end
+
+ context 'when mrs, builds and repository are visible only to project members' do
+ before do
+ # builds and merge requests cannot have higher visibility than repository
+ project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(builds_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(repository_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only non members mr and commit todos' do
+ expect { subject }.to change { Todo.count }.from(9).to(5)
+ end
+ end
+
+ context 'when mrs are visible only to project members' do
+ before do
+ project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only non members merge request todos' do
+ expect { subject }.to change { Todo.count }.from(9).to(7)
+ end
+ end
+
+ context 'when mrs and issues are visible only to project members' do
+ before do
+ project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
+ project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
+ end
+
+ it 'removes only non members merge request and issue todos' do
+ expect { subject }.to change { Todo.count }.from(9).to(5)
+ end
+ end
+ end
+end
diff --git a/spec/services/todos/destroy/project_private_service_spec.rb b/spec/services/todos/destroy/project_private_service_spec.rb
new file mode 100644
index 00000000000..badf3f913a5
--- /dev/null
+++ b/spec/services/todos/destroy/project_private_service_spec.rb
@@ -0,0 +1,38 @@
+require 'spec_helper'
+
+describe Todos::Destroy::ProjectPrivateService do
+ let(:project) { create(:project, :public) }
+ let(:user) { create(:user) }
+ let(:project_member) { create(:user) }
+
+ let!(:todo_issue_non_member) { create(:todo, user: user, project: project) }
+ let!(:todo_issue_member) { create(:todo, user: project_member, project: project) }
+ let!(:todo_another_non_member) { create(:todo, user: user, project: project) }
+
+ describe '#execute' do
+ before do
+ project.add_developer(project_member)
+ end
+
+ subject { described_class.new(project.id).execute }
+
+ context 'when a project set to private' do
+ before do
+ project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
+ end
+
+ it 'removes issue todos for a user who is not a member' do
+ expect { subject }.to change { Todo.count }.from(3).to(1)
+
+ expect(user.todos).to be_empty
+ expect(project_member.todos).to match_array([todo_issue_member])
+ end
+ end
+
+ context 'when project is not private' do
+ it 'does not remove any todos' do
+ expect { subject }.not_to change { Todo.count }
+ end
+ end
+ end
+end
diff --git a/spec/services/users/activity_service_spec.rb b/spec/services/users/activity_service_spec.rb
index f20849e6924..719b4adf212 100644
--- a/spec/services/users/activity_service_spec.rb
+++ b/spec/services/users/activity_service_spec.rb
@@ -28,6 +28,18 @@ describe Users::ActivityService do
end
end
+ context 'when a bad object is passed' do
+ let(:fake_object) { double(username: 'hello') }
+
+ it 'does not record activity' do
+ service = described_class.new(fake_object, 'pull')
+
+ expect(service).not_to receive(:record_activity)
+
+ service.execute
+ end
+ end
+
context 'when last activity is today' do
let(:last_activity_on) { Date.today }
diff --git a/spec/services/users/set_status_service_spec.rb b/spec/services/users/set_status_service_spec.rb
new file mode 100644
index 00000000000..8a8458ab9de
--- /dev/null
+++ b/spec/services/users/set_status_service_spec.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Users::SetStatusService do
+ let(:current_user) { create(:user) }
+ subject(:service) { described_class.new(current_user, params) }
+
+ describe '#execute' do
+ context 'when when params are set' do
+ let(:params) { { emoji: 'taurus', message: 'a random status' } }
+
+ it 'creates a status' do
+ service.execute
+
+ expect(current_user.status.emoji).to eq('taurus')
+ expect(current_user.status.message).to eq('a random status')
+ end
+
+ it 'updates a status if it already existed' do
+ create(:user_status, user: current_user)
+
+ expect { service.execute }.not_to change { UserStatus.count }
+ expect(current_user.status.message).to eq('a random status')
+ end
+
+ context 'for another user' do
+ let(:target_user) { create(:user) }
+ let(:params) do
+ { emoji: 'taurus', message: 'a random status', user: target_user }
+ end
+
+ context 'the current user is admin' do
+ let(:current_user) { create(:admin) }
+
+ it 'changes the status when the current user is allowed to do that' do
+ expect { service.execute }.to change { target_user.status }
+ end
+ end
+
+ it 'does not update the status if the current user is not allowed' do
+ expect { service.execute }.not_to change { target_user.status }
+ end
+ end
+ end
+
+ context 'without params' do
+ let(:params) { {} }
+
+ it 'deletes the status' do
+ status = create(:user_status, user: current_user)
+
+ expect { service.execute }
+ .to change { current_user.reload.status }.from(status).to(nil)
+ end
+ end
+ end
+end
diff --git a/spec/services/users/update_service_spec.rb b/spec/services/users/update_service_spec.rb
index a4b7fe4674f..529c8485202 100644
--- a/spec/services/users/update_service_spec.rb
+++ b/spec/services/users/update_service_spec.rb
@@ -30,6 +30,27 @@ describe Users::UpdateService do
expect(result[:message]).to eq('Username has already been taken')
end
+ it 'updates the status if status params were given' do
+ update_user(user, status: { message: "On a call" })
+
+ expect(user.status.message).to eq("On a call")
+ end
+
+ it 'does not delete the status if no status param was passed' do
+ create(:user_status, user: user, message: 'Busy!')
+
+ update_user(user, name: 'New name')
+
+ expect(user.status.message).to eq('Busy!')
+ end
+
+ it 'includes status error messages' do
+ result = update_user(user, status: { emoji: "Moo!" })
+
+ expect(result[:status]).to eq(:error)
+ expect(result[:message]).to eq("Emoji is not included in the list")
+ end
+
def update_user(user, opts)
described_class.new(user, opts.merge(user: user)).execute
end
diff --git a/spec/support/helpers/graphql_helpers.rb b/spec/support/helpers/graphql_helpers.rb
index b9322975b5a..75827df80dc 100644
--- a/spec/support/helpers/graphql_helpers.rb
+++ b/spec/support/helpers/graphql_helpers.rb
@@ -1,4 +1,6 @@
module GraphqlHelpers
+ MutationDefinition = Struct.new(:query, :variables)
+
# makes an underscored string look like a fieldname
# "merge_request" => "mergeRequest"
def self.fieldnamerize(underscored_field_name)
@@ -41,6 +43,37 @@ module GraphqlHelpers
QUERY
end
+ def graphql_mutation(name, input, fields = nil)
+ mutation_name = GraphqlHelpers.fieldnamerize(name)
+ input_variable_name = "$#{input_variable_name_for_mutation(name)}"
+ mutation_field = GitlabSchema.mutation.fields[mutation_name]
+ fields ||= all_graphql_fields_for(mutation_field.type)
+
+ query = <<~MUTATION
+ mutation(#{input_variable_name}: #{mutation_field.arguments['input'].type}) {
+ #{mutation_name}(input: #{input_variable_name}) {
+ #{fields}
+ }
+ }
+ MUTATION
+ variables = variables_for_mutation(name, input)
+
+ MutationDefinition.new(query, variables)
+ end
+
+ def variables_for_mutation(name, input)
+ graphql_input = input.map { |name, value| [GraphqlHelpers.fieldnamerize(name), value] }.to_h
+ { input_variable_name_for_mutation(name) => graphql_input }.to_json
+ end
+
+ def input_variable_name_for_mutation(mutation_name)
+ mutation_name = GraphqlHelpers.fieldnamerize(mutation_name)
+ mutation_field = GitlabSchema.mutation.fields[mutation_name]
+ input_type = field_type(mutation_field.arguments['input'])
+
+ GraphqlHelpers.fieldnamerize(input_type)
+ end
+
def query_graphql_field(name, attributes = {}, fields = nil)
fields ||= all_graphql_fields_for(name.classify)
attributes = attributes_to_graphql(attributes)
@@ -73,8 +106,12 @@ module GraphqlHelpers
end.join(", ")
end
- def post_graphql(query, current_user: nil)
- post api('/', current_user, version: 'graphql'), query: query
+ def post_graphql(query, current_user: nil, variables: nil)
+ post api('/', current_user, version: 'graphql'), query: query, variables: variables
+ end
+
+ def post_graphql_mutation(mutation, current_user: nil)
+ post_graphql(mutation.query, current_user: current_user, variables: mutation.variables)
end
def graphql_data
@@ -82,7 +119,11 @@ module GraphqlHelpers
end
def graphql_errors
- json_response['data']
+ json_response['errors']
+ end
+
+ def graphql_mutation_response(mutation_name)
+ graphql_data[GraphqlHelpers.fieldnamerize(mutation_name)]
end
def nested_fields?(field)
@@ -102,10 +143,14 @@ module GraphqlHelpers
end
def field_type(field)
- if field.type.respond_to?(:of_type)
- field.type.of_type
- else
- field.type
- end
+ field_type = field.type
+
+ # The type could be nested. For example `[GraphQL::STRING_TYPE]`:
+ # - List
+ # - String!
+ # - String
+ field_type = field_type.of_type while field_type.respond_to?(:of_type)
+
+ field_type
end
end
diff --git a/spec/support/helpers/reactive_caching_helpers.rb b/spec/support/helpers/reactive_caching_helpers.rb
index e22dd974c6a..a575aa99b79 100644
--- a/spec/support/helpers/reactive_caching_helpers.rb
+++ b/spec/support/helpers/reactive_caching_helpers.rb
@@ -14,8 +14,8 @@ module ReactiveCachingHelpers
end
def synchronous_reactive_cache(subject)
- allow(service).to receive(:with_reactive_cache) do |*args, &block|
- block.call(service.calculate_reactive_cache(*args))
+ allow(subject).to receive(:with_reactive_cache) do |*args, &block|
+ block.call(subject.calculate_reactive_cache(*args))
end
end
diff --git a/spec/support/helpers/seed_helper.rb b/spec/support/helpers/seed_helper.rb
index 8fd107260cc..25781f5e679 100644
--- a/spec/support/helpers/seed_helper.rb
+++ b/spec/support/helpers/seed_helper.rb
@@ -101,10 +101,4 @@ bla/bla.txt
handle.write('# hello'.encode(enc))
end
end
-
- # Prevent developer git configurations from being persisted to test
- # repositories
- def git_env
- { 'GIT_TEMPLATE_DIR' => '' }
- end
end
diff --git a/spec/support/helpers/stub_metrics.rb b/spec/support/helpers/stub_metrics.rb
new file mode 100644
index 00000000000..64983fdf222
--- /dev/null
+++ b/spec/support/helpers/stub_metrics.rb
@@ -0,0 +1,27 @@
+module StubMetrics
+ def authentication_metrics
+ Gitlab::Auth::Activity
+ end
+
+ def stub_authentication_activity_metrics(debug: false)
+ authentication_metrics.each_counter do |name, metric, description|
+ allow(authentication_metrics).to receive(name)
+ .and_return(double("#{metric} - #{description}"))
+ end
+
+ debug_authentication_activity_metrics if debug
+ end
+
+ def debug_authentication_activity_metrics
+ authentication_metrics.tap do |metrics|
+ metrics.each_counter do |name, metric|
+ "#{name}_increment!".tap do |incrementer|
+ allow(metrics).to receive(incrementer).and_wrap_original do |method|
+ puts "Authentication activity metric incremented: #{name}"
+ method.call
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/support/helpers/test_env.rb b/spec/support/helpers/test_env.rb
index e531495d917..8e1d4cfe269 100644
--- a/spec/support/helpers/test_env.rb
+++ b/spec/support/helpers/test_env.rb
@@ -243,6 +243,14 @@ module TestEnv
set_repo_refs(target_repo_path, refs)
end
+ def create_bare_repository(path)
+ FileUtils.mkdir_p(path)
+
+ system(git_env, *%W(#{Gitlab.config.git.bin_path} -C #{path} init --bare),
+ out: '/dev/null',
+ err: '/dev/null')
+ end
+
def repos_path
@repos_path ||= Gitlab.config.repositories.storages[REPOS_STORAGE].legacy_disk_path
end
diff --git a/spec/support/matchers/graphql_matchers.rb b/spec/support/matchers/graphql_matchers.rb
index be6fa4c71a0..7be84838e00 100644
--- a/spec/support/matchers/graphql_matchers.rb
+++ b/spec/support/matchers/graphql_matchers.rb
@@ -34,6 +34,15 @@ RSpec::Matchers.define :have_graphql_field do |field_name|
end
end
+RSpec::Matchers.define :have_graphql_mutation do |mutation_class|
+ match do |mutation_type|
+ field = mutation_type.fields[GraphqlHelpers.fieldnamerize(mutation_class.graphql_name)]
+
+ expect(field).to be_present
+ expect(field.resolver).to eq(mutation_class)
+ end
+end
+
RSpec::Matchers.define :have_graphql_arguments do |*expected|
include GraphqlHelpers
diff --git a/spec/support/matchers/metric_counter_matcher.rb b/spec/support/matchers/metric_counter_matcher.rb
new file mode 100644
index 00000000000..22d5cd17e3f
--- /dev/null
+++ b/spec/support/matchers/metric_counter_matcher.rb
@@ -0,0 +1,11 @@
+RSpec::Matchers.define :increment do |counter|
+ match do |adapter|
+ expect(adapter.send(counter))
+ .to receive(:increment)
+ .exactly(@exactly || :once)
+ end
+
+ chain :twice do
+ @exactly = :twice
+ end
+end
diff --git a/spec/support/matchers/user_status_matcher.rb b/spec/support/matchers/user_status_matcher.rb
new file mode 100644
index 00000000000..3cf240d874a
--- /dev/null
+++ b/spec/support/matchers/user_status_matcher.rb
@@ -0,0 +1,13 @@
+# frozen_string_literal: true
+
+RSpec::Matchers.define :show_user_status do |status|
+ match do |page|
+ expect(page).to have_selector(".user-status-emoji[title='#{status.message}']")
+
+ # The same user status might be displayed multiple times on the page
+ emoji_span = page.first(".user-status-emoji[title='#{status.message}']")
+ page.within(emoji_span) do
+ expect(page).to have_emoji(status.emoji)
+ end
+ end
+end
diff --git a/spec/support/prometheus/additional_metrics_shared_examples.rb b/spec/support/prometheus/additional_metrics_shared_examples.rb
index c7c3346d39e..0fd67531c3b 100644
--- a/spec/support/prometheus/additional_metrics_shared_examples.rb
+++ b/spec/support/prometheus/additional_metrics_shared_examples.rb
@@ -25,7 +25,7 @@ RSpec.shared_examples 'additional metrics query' do
shared_examples 'query context containing environment slug and filter' do
it 'contains ci_environment_slug' do
- expect(subject).to receive(:query_metrics).with(project, hash_including(ci_environment_slug: environment.slug))
+ expect(subject).to receive(:query_metrics).with(project, environment, hash_including(ci_environment_slug: environment.slug))
subject.query(*query_params)
end
@@ -33,6 +33,7 @@ RSpec.shared_examples 'additional metrics query' do
it 'contains environment filter' do
expect(subject).to receive(:query_metrics).with(
project,
+ environment,
hash_including(
environment_filter: "container_name!=\"POD\",environment=\"#{environment.slug}\""
)
@@ -50,7 +51,7 @@ RSpec.shared_examples 'additional metrics query' do
it_behaves_like 'query context containing environment slug and filter'
it 'query context contains kube_namespace' do
- expect(subject).to receive(:query_metrics).with(project, hash_including(kube_namespace: kube_namespace))
+ expect(subject).to receive(:query_metrics).with(project, environment, hash_including(kube_namespace: kube_namespace))
subject.query(*query_params)
end
@@ -74,7 +75,7 @@ RSpec.shared_examples 'additional metrics query' do
it_behaves_like 'query context containing environment slug and filter'
it 'query context contains empty kube_namespace' do
- expect(subject).to receive(:query_metrics).with(project, hash_including(kube_namespace: ''))
+ expect(subject).to receive(:query_metrics).with(project, environment, hash_including(kube_namespace: ''))
subject.query(*query_params)
end
diff --git a/spec/support/rspec.rb b/spec/support/rspec.rb
index 54b8df7aa19..9b8bcebcb3a 100644
--- a/spec/support/rspec.rb
+++ b/spec/support/rspec.rb
@@ -1,4 +1,5 @@
require_relative "helpers/stub_configuration"
+require_relative "helpers/stub_metrics"
require_relative "helpers/stub_object_storage"
require_relative "helpers/stub_env"
@@ -7,6 +8,7 @@ RSpec.configure do |config|
config.raise_errors_for_deprecations!
config.include StubConfiguration
+ config.include StubMetrics
config.include StubObjectStorage
config.include StubENV
diff --git a/spec/support/shared_examples/helm_generated_script.rb b/spec/support/shared_examples/helm_generated_script.rb
index 05d53a13fd3..ef9bb7f5533 100644
--- a/spec/support/shared_examples/helm_generated_script.rb
+++ b/spec/support/shared_examples/helm_generated_script.rb
@@ -7,7 +7,7 @@ shared_examples 'helm commands' do
echo http://mirror.clarkson.edu/alpine/v$ALPINE_VERSION/main >> /etc/apk/repositories
echo http://mirror1.hs-esslingen.de/pub/Mirrors/alpine/v$ALPINE_VERSION/main >> /etc/apk/repositories
apk add -U wget ca-certificates openssl >/dev/null
- wget -q -O - https://kubernetes-helm.storage.googleapis.com/helm-v2.7.0-linux-amd64.tar.gz | tar zxC /tmp >/dev/null
+ wget -q -O - https://kubernetes-helm.storage.googleapis.com/helm-v2.7.2-linux-amd64.tar.gz | tar zxC /tmp >/dev/null
mv /tmp/linux-amd64/helm /usr/bin/
EOS
end
diff --git a/spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb b/spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb
new file mode 100644
index 00000000000..5334af841e1
--- /dev/null
+++ b/spec/support/shared_examples/instance_statistics_controllers_shared_examples.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+shared_examples 'instance statistics availability' do
+ let(:user) { create(:user) }
+
+ before do
+ sign_in(user)
+ end
+
+ describe 'GET #index' do
+ it 'is available when the feature is available publicly' do
+ get :index
+
+ expect(response).to have_gitlab_http_status(:success)
+ end
+
+ it 'renders a 404 when the feature is not available publicly' do
+ stub_application_setting(instance_statistics_visibility_private: true)
+
+ get :index
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+
+ context 'for admins' do
+ let(:user) { create(:admin) }
+
+ it 'allows access when the feature is not available publicly' do
+ stub_application_setting(instance_statistics_visibility_private: true)
+
+ get :index
+
+ expect(response).to have_gitlab_http_status(:success)
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/models/atomic_internal_id_spec.rb b/spec/support/shared_examples/models/atomic_internal_id_spec.rb
index 7ab1041d17c..c659be8f13a 100644
--- a/spec/support/shared_examples/models/atomic_internal_id_spec.rb
+++ b/spec/support/shared_examples/models/atomic_internal_id_spec.rb
@@ -60,6 +60,20 @@ shared_examples_for 'AtomicInternalId' do |validate_presence: true|
expect { subject }.not_to change { instance.public_send(internal_id_attribute) }
end
+
+ context 'when the instance has an internal ID set' do
+ let(:internal_id) { 9001 }
+
+ it 'calls InternalId.update_last_value and sets the `last_value` to that of the instance' do
+ instance.send("#{internal_id_attribute}=", internal_id)
+
+ expect(InternalId)
+ .to receive(:track_greatest)
+ .with(instance, scope_attrs, usage, internal_id, any_args)
+ .and_return(internal_id)
+ subject
+ end
+ end
end
end
end
diff --git a/spec/support/shared_examples/notify_shared_examples.rb b/spec/support/shared_examples/notify_shared_examples.rb
index d176d3fa425..5fb9ced3b63 100644
--- a/spec/support/shared_examples/notify_shared_examples.rb
+++ b/spec/support/shared_examples/notify_shared_examples.rb
@@ -77,7 +77,7 @@ shared_examples 'a thread answer email with reply-by-email enabled' do
aggregate_failures do
is_expected.to have_header('Message-ID', /\A<.*@#{host}>\Z/)
is_expected.to have_header('In-Reply-To', "<#{route_key}@#{host}>")
- is_expected.to have_header('References', /\A<#{route_key}@#{host}> <reply\-.*@#{host}>\Z/ )
+ is_expected.to have_header('References', /\A<reply\-.*@#{host}> <#{route_key}@#{host}>\Z/ )
is_expected.to have_subject(/^Re: /)
end
end
@@ -87,6 +87,10 @@ shared_examples 'an email starting a new thread with reply-by-email enabled' do
include_examples 'an email with X-GitLab headers containing project details'
include_examples 'a new thread email with reply-by-email enabled'
+ it 'includes "Reply to this email directly or <View it on GitLab>"' do
+ expect(subject.default_part.body).to include(%(Reply to this email directly or <a href="#{Gitlab::UrlBuilder.build(model)}">view it on GitLab</a>.))
+ end
+
context 'when reply-by-email is enabled with incoming address with %{key}' do
it 'has a Reply-To header' do
is_expected.to have_header 'Reply-To', /<reply+(.*)@#{Gitlab.config.gitlab.host}>\Z/
diff --git a/spec/support/shared_examples/requests/graphql_shared_examples.rb b/spec/support/shared_examples/requests/graphql_shared_examples.rb
index fe7b7bc306f..04140cad3f0 100644
--- a/spec/support/shared_examples/requests/graphql_shared_examples.rb
+++ b/spec/support/shared_examples/requests/graphql_shared_examples.rb
@@ -5,7 +5,7 @@ shared_examples 'a working graphql query' do
it 'returns a successful response', :aggregate_failures do
expect(response).to have_gitlab_http_status(:success)
- expect(graphql_errors['errors']).to be_nil
+ expect(graphql_errors).to be_nil
expect(json_response.keys).to include('data')
end
end
diff --git a/spec/support/shared_examples/services/boards/issues_list_service.rb b/spec/support/shared_examples/services/boards/issues_list_service.rb
index 3e744323cea..8b879cef084 100644
--- a/spec/support/shared_examples/services/boards/issues_list_service.rb
+++ b/spec/support/shared_examples/services/boards/issues_list_service.rb
@@ -7,6 +7,16 @@ shared_examples 'issues list service' do
described_class.new(parent, user, params).execute
end
+ context '#metadata' do
+ it 'returns issues count for list' do
+ params = { board_id: board.id, id: list1.id }
+
+ metadata = described_class.new(parent, user, params).metadata
+
+ expect(metadata[:size]).to eq(3)
+ end
+ end
+
context 'issues are ordered by priority' do
it 'returns opened issues when list_id is missing' do
params = { board_id: board.id }
diff --git a/spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb b/spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb
new file mode 100644
index 00000000000..b8db35a6ef9
--- /dev/null
+++ b/spec/support/shared_examples/services/gitlab_projects_import_service_shared_examples.rb
@@ -0,0 +1,54 @@
+shared_examples 'gitlab projects import validations' do
+ context 'with an invalid path' do
+ let(:path) { '/invalid-path/' }
+
+ it 'returns an invalid project' do
+ project = subject.execute
+
+ expect(project).not_to be_persisted
+ expect(project).not_to be_valid
+ end
+ end
+
+ context 'with a valid path' do
+ it 'creates a project' do
+ project = subject.execute
+
+ expect(project).to be_persisted
+ expect(project).to be_valid
+ end
+ end
+
+ context 'override params' do
+ it 'stores them as import data when passed' do
+ project = described_class
+ .new(namespace.owner, import_params, description: 'Hello')
+ .execute
+
+ expect(project.import_data.data['override_params']['description']).to eq('Hello')
+ end
+ end
+
+ context 'when there is a project with the same path' do
+ let(:existing_project) { create(:project, namespace: namespace) }
+ let(:path) { existing_project.path}
+
+ it 'does not create the project' do
+ project = subject.execute
+
+ expect(project).to be_invalid
+ expect(project).not_to be_persisted
+ end
+
+ context 'when overwrite param is set' do
+ let(:overwrite) { true }
+
+ it 'creates a project in a temporary full_path' do
+ project = subject.execute
+
+ expect(project).to be_valid
+ expect(project).to be_persisted
+ end
+ end
+ end
+end
diff --git a/spec/support/shared_examples/showing_user_status_shared_examples.rb b/spec/support/shared_examples/showing_user_status_shared_examples.rb
new file mode 100644
index 00000000000..eef769de2fc
--- /dev/null
+++ b/spec/support/shared_examples/showing_user_status_shared_examples.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+shared_examples 'showing user status' do
+ let!(:status) { create(:user_status, user: user_with_status, emoji: 'smirk', message: 'Authoring this object') }
+
+ it 'shows the status' do
+ subject
+
+ expect(page).to show_user_status(status)
+ end
+end
diff --git a/spec/support/stored_repositories.rb b/spec/support/stored_repositories.rb
index 21995c89a6e..26f823cb6ef 100644
--- a/spec/support/stored_repositories.rb
+++ b/spec/support/stored_repositories.rb
@@ -1,8 +1,4 @@
RSpec.configure do |config|
- config.before(:each, :repository) do
- TestEnv.clean_test_path
- end
-
config.before(:all, :broken_storage) do
FileUtils.rm_rf Gitlab.config.repositories.storages.broken.legacy_disk_path
end
diff --git a/spec/support/test_reports/test_reports_helper.rb b/spec/support/test_reports/test_reports_helper.rb
new file mode 100644
index 00000000000..45c6e04dbf3
--- /dev/null
+++ b/spec/support/test_reports/test_reports_helper.rb
@@ -0,0 +1,93 @@
+module TestReportsHelper
+ def create_test_case_rspec_success
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'Test#sum when a is 1 and b is 3 returns summary',
+ classname: 'spec.test_spec',
+ file: './spec/test_spec.rb',
+ execution_time: 1.11,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+
+ def create_test_case_rspec_failed
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'Test#sum when a is 2 and b is 2 returns summary',
+ classname: 'spec.test_spec',
+ file: './spec/test_spec.rb',
+ execution_time: 2.22,
+ system_output: sample_rspec_failed_message,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+
+ def create_test_case_rspec_skipped
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'Test#sum when a is 3 and b is 3 returns summary',
+ classname: 'spec.test_spec',
+ file: './spec/test_spec.rb',
+ execution_time: 3.33,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_SKIPPED)
+ end
+
+ def create_test_case_rspec_error
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'Test#sum when a is 4 and b is 4 returns summary',
+ classname: 'spec.test_spec',
+ file: './spec/test_spec.rb',
+ execution_time: 4.44,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_ERROR)
+ end
+
+ def sample_rspec_failed_message
+ <<-EOF.strip_heredoc
+ Failure/Error: is_expected.to eq(3)
+
+ expected: 3
+ got: -1
+
+ (compared using ==)
+ ./spec/test_spec.rb:12:in `block (4 levels) in &lt;top (required)&gt;&apos;
+ EOF
+ end
+
+ def create_test_case_java_success
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'addTest',
+ classname: 'CalculatorTest',
+ execution_time: 5.55,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_SUCCESS)
+ end
+
+ def create_test_case_java_failed
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'subtractTest',
+ classname: 'CalculatorTest',
+ execution_time: 6.66,
+ system_output: sample_java_failed_message,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_FAILED)
+ end
+
+ def create_test_case_java_skipped
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'multiplyTest',
+ classname: 'CalculatorTest',
+ execution_time: 7.77,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_SKIPPED)
+ end
+
+ def create_test_case_java_error
+ Gitlab::Ci::Reports::TestCase.new(
+ name: 'divideTest',
+ classname: 'CalculatorTest',
+ execution_time: 8.88,
+ status: Gitlab::Ci::Reports::TestCase::STATUS_ERROR)
+ end
+
+ def sample_java_failed_message
+ <<-EOF.strip_heredoc
+ junit.framework.AssertionFailedError: expected:&lt;1&gt; but was:&lt;3&gt;
+ at CalculatorTest.subtractExpression(Unknown Source)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+ at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+ at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+ EOF
+ end
+end
diff --git a/spec/tasks/gitlab/backup_rake_spec.rb b/spec/tasks/gitlab/backup_rake_spec.rb
index 93a436cb2b5..3ba6caf1337 100644
--- a/spec/tasks/gitlab/backup_rake_spec.rb
+++ b/spec/tasks/gitlab/backup_rake_spec.rb
@@ -87,6 +87,27 @@ describe 'gitlab:app namespace rake task' do
expect { run_rake_task('gitlab:backup:restore') }.to output.to_stdout
end
end
+
+ context 'when the restore directory is not empty' do
+ before do
+ # We only need a backup of the repositories for this test
+ stub_env('SKIP', 'db,uploads,builds,artifacts,lfs,registry')
+ end
+
+ it 'removes stale data' do
+ expect { run_rake_task('gitlab:backup:create') }.to output.to_stdout
+
+ excluded_project = create(:project, :repository, name: 'mepmep')
+
+ expect { run_rake_task('gitlab:backup:restore') }.to output.to_stdout
+
+ raw_repo = excluded_project.repository.raw
+
+ # The restore will not find the repository in the backup, but will create
+ # an empty one in its place
+ expect(raw_repo.empty?).to be(true)
+ end
+ end
end # backup_restore task
describe 'backup' do
diff --git a/spec/tasks/gitlab/cleanup_rake_spec.rb b/spec/tasks/gitlab/cleanup_rake_spec.rb
index 2bf873c923f..cc2cca10f58 100644
--- a/spec/tasks/gitlab/cleanup_rake_spec.rb
+++ b/spec/tasks/gitlab/cleanup_rake_spec.rb
@@ -5,7 +5,7 @@ describe 'gitlab:cleanup rake tasks' do
Rake.application.rake_require 'tasks/gitlab/cleanup'
end
- describe 'cleanup' do
+ describe 'cleanup namespaces and repos' do
let(:storages) do
{
'default' => Gitlab::GitalyClient::StorageSettings.new(@default_storage_hash.merge('path' => 'tmp/tests/default_storage'))
@@ -67,4 +67,88 @@ describe 'gitlab:cleanup rake tasks' do
end
end
end
+
+ # A single integration test that is redundant with one part of the
+ # Gitlab::Cleanup::ProjectUploads spec.
+ #
+ # Additionally, this tests DRY_RUN env var values, and the extra line of
+ # output that says you can disable DRY_RUN if it's enabled.
+ describe 'cleanup:project_uploads' do
+ let!(:logger) { double(:logger) }
+
+ before do
+ expect(main_object).to receive(:logger).and_return(logger).at_least(1).times
+
+ allow(logger).to receive(:info).at_least(1).times
+ allow(logger).to receive(:debug).at_least(1).times
+ end
+
+ context 'with a fixable orphaned project upload file' do
+ let(:orphaned) { create(:upload, :issuable_upload, :with_file, model: build(:project, :legacy_storage)) }
+ let(:new_path) { orphaned.absolute_path }
+ let(:path) { File.join(FileUploader.root, 'some', 'wrong', 'location', orphaned.path) }
+
+ before do
+ FileUtils.mkdir_p(File.dirname(path))
+ FileUtils.mv(new_path, path)
+ end
+
+ context 'with DRY_RUN disabled' do
+ before do
+ stub_env('DRY_RUN', 'false')
+ end
+
+ it 'moves the file to its proper location' do
+ run_rake_task('gitlab:cleanup:project_uploads')
+
+ expect(File.exist?(path)).to be_falsey
+ expect(File.exist?(new_path)).to be_truthy
+ end
+
+ it 'logs action as done' do
+ expect(logger).to receive(:info).with("Looking for orphaned project uploads to clean up...")
+ expect(logger).to receive(:info).with("Did fix #{path} -> #{new_path}")
+
+ run_rake_task('gitlab:cleanup:project_uploads')
+ end
+ end
+
+ shared_examples_for 'does not move the file' do
+ it 'does not move the file' do
+ run_rake_task('gitlab:cleanup:project_uploads')
+
+ expect(File.exist?(path)).to be_truthy
+ expect(File.exist?(new_path)).to be_falsey
+ end
+
+ it 'logs action as able to be done' do
+ expect(logger).to receive(:info).with("Looking for orphaned project uploads to clean up. Dry run...")
+ expect(logger).to receive(:info).with("Can fix #{path} -> #{new_path}")
+ expect(logger).to receive(:info).with(/To clean up these files run this command with DRY_RUN=false/)
+
+ run_rake_task('gitlab:cleanup:project_uploads')
+ end
+ end
+
+ context 'with DRY_RUN explicitly enabled' do
+ before do
+ stub_env('DRY_RUN', 'true')
+ end
+
+ it_behaves_like 'does not move the file'
+ end
+
+ context 'with DRY_RUN set to an unknown value' do
+ before do
+ stub_env('DRY_RUN', 'foo')
+ end
+
+ it_behaves_like 'does not move the file'
+ end
+
+ context 'with DRY_RUN unset' do
+ it_behaves_like 'does not move the file'
+ end
+ end
+ end
end
diff --git a/spec/tasks/gitlab/git_rake_spec.rb b/spec/tasks/gitlab/git_rake_spec.rb
index d0263ad9a37..57b006e1a39 100644
--- a/spec/tasks/gitlab/git_rake_spec.rb
+++ b/spec/tasks/gitlab/git_rake_spec.rb
@@ -2,45 +2,19 @@ require 'rake_helper'
describe 'gitlab:git rake tasks' do
let(:base_path) { 'tmp/tests/default_storage' }
-
- before(:all) do
- @default_storage_hash = Gitlab.config.repositories.storages.default.to_h
- end
+ let!(:project) { create(:project, :repository) }
before do
Rake.application.rake_require 'tasks/gitlab/git'
- storages = { 'default' => Gitlab::GitalyClient::StorageSettings.new(@default_storage_hash.merge('path' => base_path)) }
-
- path = Settings.absolute("#{base_path}/@hashed/1/2/test.git")
- FileUtils.mkdir_p(path)
- Gitlab::Popen.popen(%W[git -C #{path} init --bare])
- allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
allow_any_instance_of(String).to receive(:color) { |string, _color| string }
stub_warn_user_is_not_gitlab
end
- after do
- FileUtils.rm_rf(Settings.absolute(base_path))
- end
-
describe 'fsck' do
it 'outputs the integrity check for a repo' do
- expect { run_rake_task('gitlab:git:fsck') }.to output(%r{Performed Checking integrity at .*@hashed/1/2/test.git}).to_stdout
- end
-
- it 'errors out about config.lock issues' do
- FileUtils.touch(Settings.absolute("#{base_path}/@hashed/1/2/test.git/config.lock"))
-
- expect { run_rake_task('gitlab:git:fsck') }.to output(/file exists\? ... yes/).to_stdout
- end
-
- it 'errors out about ref lock issues' do
- FileUtils.mkdir_p(Settings.absolute("#{base_path}/@hashed/1/2/test.git/refs/heads"))
- FileUtils.touch(Settings.absolute("#{base_path}/@hashed/1/2/test.git/refs/heads/blah.lock"))
-
- expect { run_rake_task('gitlab:git:fsck') }.to output(/Ref lock files exist:/).to_stdout
+ expect { run_rake_task('gitlab:git:fsck') }.to output(/Performed integrity check for/).to_stdout
end
end
end
diff --git a/spec/views/layouts/_head.html.haml_spec.rb b/spec/views/layouts/_head.html.haml_spec.rb
index e8e6d2e7a75..9d1efcabb80 100644
--- a/spec/views/layouts/_head.html.haml_spec.rb
+++ b/spec/views/layouts/_head.html.haml_spec.rb
@@ -29,6 +29,39 @@ describe 'layouts/_head' do
expect(rendered).to match(%{content="foo&quot; http-equiv=&quot;refresh"})
end
+ context 'when an asset_host is set and feature is activated in the config it will' do
+ let(:asset_host) { 'http://assets' }
+
+ before do
+ stub_feature_flags(asset_host_prefetch: true)
+ allow(ActionController::Base).to receive(:asset_host).and_return(asset_host)
+ end
+
+ it 'add a link dns-prefetch tag' do
+ render
+ expect(rendered).to match('<link href="http://assets" rel="dns-prefetch">')
+ end
+
+ it 'add a link preconnect tag' do
+ render
+ expect(rendered).to match('<link crossorigin="" href="http://assets" rel="preconnnect">')
+ end
+ end
+
+ context 'when an asset_host is set and feature is not activated in the config it will' do
+ let(:asset_host) { 'http://assets' }
+
+ before do
+ stub_feature_flags(asset_host_prefetch: false)
+ allow(ActionController::Base).to receive(:asset_host).and_return(asset_host)
+ end
+
+ it 'not add a link dns-prefetch tag' do
+ render
+ expect(rendered).not_to match('<link href="http://assets" rel="dns-prefetch">')
+ end
+ end
+
def stub_helper_with_safe_string(method)
allow_any_instance_of(PageLayoutHelper).to receive(method)
.and_return(%q{foo" http-equiv="refresh}.html_safe)
diff --git a/spec/views/projects/merge_requests/show.html.haml_spec.rb b/spec/views/projects/merge_requests/show.html.haml_spec.rb
index fe6ad26a6f6..fa6c4ce4ac8 100644
--- a/spec/views/projects/merge_requests/show.html.haml_spec.rb
+++ b/spec/views/projects/merge_requests/show.html.haml_spec.rb
@@ -17,6 +17,13 @@ describe 'projects/merge_requests/show.html.haml' do
author: user)
end
+ def preload_view_requirements
+ # This will load the status fields of the author of the note and merge request
+ # to avoid queries in when rendering the view being tested.
+ closed_merge_request.author.status
+ note.author.status
+ end
+
before do
assign(:project, project)
assign(:merge_request, closed_merge_request)
@@ -26,6 +33,8 @@ describe 'projects/merge_requests/show.html.haml' do
assign(:notes, [])
assign(:pipelines, Ci::Pipeline.none)
+ preload_view_requirements
+
allow(view).to receive_messages(current_user: user,
can?: true,
current_application_settings: Gitlab::CurrentSettings.current_application_settings)
@@ -42,6 +51,7 @@ describe 'projects/merge_requests/show.html.haml' do
it 'does not show the "Reopen" button when the source project does not exist' do
unlink_project.execute
closed_merge_request.reload
+ preload_view_requirements
render
@@ -56,6 +66,7 @@ describe 'projects/merge_requests/show.html.haml' do
forked_project.destroy
# Reload merge request so MergeRequest#source_project turns to `nil`
closed_merge_request.reload
+ preload_view_requirements
render
diff --git a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
index 615462380e0..9c187bead0a 100644
--- a/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
+++ b/spec/workers/concerns/gitlab/github_import/object_importer_spec.rb
@@ -51,7 +51,6 @@ describe Gitlab::GithubImport::ObjectImporter do
expect(worker.counter)
.to receive(:increment)
- .with(project: 'foo/bar')
.and_call_original
worker.import(project, client, { 'number' => 10 })
diff --git a/spec/workers/create_gpg_signature_worker_spec.rb b/spec/workers/create_gpg_signature_worker_spec.rb
index aa6c347d738..f5479e57260 100644
--- a/spec/workers/create_gpg_signature_worker_spec.rb
+++ b/spec/workers/create_gpg_signature_worker_spec.rb
@@ -2,21 +2,46 @@ require 'spec_helper'
describe CreateGpgSignatureWorker do
let(:project) { create(:project, :repository) }
+ let(:commits) { project.repository.commits('HEAD', limit: 3).commits }
+ let(:commit_shas) { commits.map(&:id) }
+ let(:gpg_commit) { instance_double(Gitlab::Gpg::Commit) }
context 'when GpgKey is found' do
- let(:commit_sha) { '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33' }
+ before do
+ allow(Project).to receive(:find_by).with(id: project.id).and_return(project)
+ allow(project).to receive(:commits_by).with(oids: commit_shas).and_return(commits)
+ end
+
+ subject { described_class.new.perform(commit_shas, project.id) }
it 'calls Gitlab::Gpg::Commit#signature' do
- commit = instance_double(Commit)
- gpg_commit = instance_double(Gitlab::Gpg::Commit)
+ commits.each do |commit|
+ expect(Gitlab::Gpg::Commit).to receive(:new).with(commit).and_return(gpg_commit).once
+ end
- allow(Project).to receive(:find_by).with(id: project.id).and_return(project)
- allow(project).to receive(:commit).with(commit_sha).and_return(commit)
+ expect(gpg_commit).to receive(:signature).exactly(commits.size).times
+
+ subject
+ end
+
+ it 'can recover from exception and continue the signature process' do
+ allow(gpg_commit).to receive(:signature)
+ allow(Gitlab::Gpg::Commit).to receive(:new).and_return(gpg_commit)
+ allow(Gitlab::Gpg::Commit).to receive(:new).with(commits.first).and_raise(StandardError)
+
+ expect(gpg_commit).to receive(:signature).exactly(2).times
+
+ subject
+ end
+ end
+
+ context 'handles when a string is passed in for the commit SHA' do
+ it 'creates a signature once' do
+ allow(Gitlab::Gpg::Commit).to receive(:new).with(commits.first).and_return(gpg_commit)
- expect(Gitlab::Gpg::Commit).to receive(:new).with(commit).and_return(gpg_commit)
- expect(gpg_commit).to receive(:signature)
+ expect(gpg_commit).to receive(:signature).once
- described_class.new.perform(commit_sha, project.id)
+ described_class.new.perform(commit_shas.first, project.id)
end
end
@@ -24,7 +49,7 @@ describe CreateGpgSignatureWorker do
let(:nonexisting_commit_sha) { '0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a34' }
it 'does not raise errors' do
- expect { described_class.new.perform(nonexisting_commit_sha, project.id) }.not_to raise_error
+ expect { described_class.new.perform([nonexisting_commit_sha], project.id) }.not_to raise_error
end
end
@@ -32,13 +57,13 @@ describe CreateGpgSignatureWorker do
let(:nonexisting_project_id) { -1 }
it 'does not raise errors' do
- expect { described_class.new.perform(anything, nonexisting_project_id) }.not_to raise_error
+ expect { described_class.new.perform(commit_shas, nonexisting_project_id) }.not_to raise_error
end
it 'does not call Gitlab::Gpg::Commit#signature' do
expect_any_instance_of(Gitlab::Gpg::Commit).not_to receive(:signature)
- described_class.new.perform(anything, nonexisting_project_id)
+ described_class.new.perform(commit_shas, nonexisting_project_id)
end
end
end
diff --git a/spec/workers/detect_repository_languages_worker_spec.rb b/spec/workers/detect_repository_languages_worker_spec.rb
new file mode 100644
index 00000000000..ff3878fbc8e
--- /dev/null
+++ b/spec/workers/detect_repository_languages_worker_spec.rb
@@ -0,0 +1,32 @@
+require 'spec_helper'
+
+describe DetectRepositoryLanguagesWorker do
+ set(:project) { create(:project) }
+ let(:user) { project.owner }
+
+ subject { described_class.new }
+
+ describe '#perform' do
+ it 'calls de DetectRepositoryLanguages service' do
+ service = double
+ allow(::Projects::DetectRepositoryLanguagesService).to receive(:new).and_return(service)
+ expect(service).to receive(:execute)
+
+ subject.perform(project.id, user.id)
+ end
+
+ context 'when invalid ids are used' do
+ it 'does not raise when the project could not be found' do
+ expect do
+ subject.perform(-1, user.id)
+ end.not_to raise_error
+ end
+
+ it 'does not raise when the user could not be found' do
+ expect do
+ subject.perform(project.id, -1)
+ end.not_to raise_error
+ end
+ end
+ end
+end
diff --git a/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb b/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
index 48e7eaf32fc..5b1c6b6010a 100644
--- a/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_diff_note_worker_spec.rb
@@ -33,7 +33,6 @@ describe Gitlab::GithubImport::ImportDiffNoteWorker do
expect(worker.counter)
.to receive(:increment)
- .with(project: 'foo/bar')
.and_call_original
worker.import(project, client, hash)
diff --git a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
index 8cf6ac15919..ab070d6d081 100644
--- a/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_issue_worker_spec.rb
@@ -36,7 +36,6 @@ describe Gitlab::GithubImport::ImportIssueWorker do
expect(worker.counter)
.to receive(:increment)
- .with(project: 'foo/bar')
.and_call_original
worker.import(project, client, hash)
diff --git a/spec/workers/gitlab/github_import/import_note_worker_spec.rb b/spec/workers/gitlab/github_import/import_note_worker_spec.rb
index 677697c02df..3a30f06bb2d 100644
--- a/spec/workers/gitlab/github_import/import_note_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_note_worker_spec.rb
@@ -31,7 +31,6 @@ describe Gitlab::GithubImport::ImportNoteWorker do
expect(worker.counter)
.to receive(:increment)
- .with(project: 'foo/bar')
.and_call_original
worker.import(project, client, hash)
diff --git a/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb b/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
index e287ddbe0d7..3cccd7cab21 100644
--- a/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
+++ b/spec/workers/gitlab/github_import/import_pull_request_worker_spec.rb
@@ -42,7 +42,6 @@ describe Gitlab::GithubImport::ImportPullRequestWorker do
expect(worker.counter)
.to receive(:increment)
- .with(project: 'foo/bar')
.and_call_original
worker.import(project, client, hash)
diff --git a/spec/workers/project_migrate_hashed_storage_worker_spec.rb b/spec/workers/project_migrate_hashed_storage_worker_spec.rb
index 9551e358af1..3703320418b 100644
--- a/spec/workers/project_migrate_hashed_storage_worker_spec.rb
+++ b/spec/workers/project_migrate_hashed_storage_worker_spec.rb
@@ -28,7 +28,7 @@ describe ProjectMigrateHashedStorageWorker, :clean_gitlab_redis_shared_state do
migration_service = spy
allow(::Projects::HashedStorageMigrationService)
- .to receive(:new).with(project, subject.logger)
+ .to receive(:new).with(project, project.full_path, logger: subject.logger)
.and_return(migration_service)
subject.perform(project.id)
diff --git a/spec/workers/todos_destroyer/confidential_issue_worker_spec.rb b/spec/workers/todos_destroyer/confidential_issue_worker_spec.rb
new file mode 100644
index 00000000000..9d7c0b8f560
--- /dev/null
+++ b/spec/workers/todos_destroyer/confidential_issue_worker_spec.rb
@@ -0,0 +1,12 @@
+require 'spec_helper'
+
+describe TodosDestroyer::ConfidentialIssueWorker do
+ it "calls the Todos::Destroy::ConfidentialIssueService with the params it was given" do
+ service = double
+
+ expect(::Todos::Destroy::ConfidentialIssueService).to receive(:new).with(100).and_return(service)
+ expect(service).to receive(:execute)
+
+ described_class.new.perform(100)
+ end
+end
diff --git a/spec/workers/todos_destroyer/entity_leave_worker_spec.rb b/spec/workers/todos_destroyer/entity_leave_worker_spec.rb
new file mode 100644
index 00000000000..955447906aa
--- /dev/null
+++ b/spec/workers/todos_destroyer/entity_leave_worker_spec.rb
@@ -0,0 +1,12 @@
+require 'spec_helper'
+
+describe TodosDestroyer::EntityLeaveWorker do
+ it "calls the Todos::Destroy::EntityLeaveService with the params it was given" do
+ service = double
+
+ expect(::Todos::Destroy::EntityLeaveService).to receive(:new).with(100, 5, 'Group').and_return(service)
+ expect(service).to receive(:execute)
+
+ described_class.new.perform(100, 5, 'Group')
+ end
+end
diff --git a/spec/workers/todos_destroyer/private_features_worker_spec.rb b/spec/workers/todos_destroyer/private_features_worker_spec.rb
new file mode 100644
index 00000000000..9599f5ee071
--- /dev/null
+++ b/spec/workers/todos_destroyer/private_features_worker_spec.rb
@@ -0,0 +1,12 @@
+require 'spec_helper'
+
+describe TodosDestroyer::PrivateFeaturesWorker do
+ it "calls the Todos::Destroy::PrivateFeaturesService with the params it was given" do
+ service = double
+
+ expect(::Todos::Destroy::PrivateFeaturesService).to receive(:new).with(100, nil).and_return(service)
+ expect(service).to receive(:execute)
+
+ described_class.new.perform(100)
+ end
+end
diff --git a/spec/workers/todos_destroyer/project_private_worker_spec.rb b/spec/workers/todos_destroyer/project_private_worker_spec.rb
new file mode 100644
index 00000000000..15d926fa9d5
--- /dev/null
+++ b/spec/workers/todos_destroyer/project_private_worker_spec.rb
@@ -0,0 +1,12 @@
+require 'spec_helper'
+
+describe TodosDestroyer::ProjectPrivateWorker do
+ it "calls the Todos::Destroy::ProjectPrivateService with the params it was given" do
+ service = double
+
+ expect(::Todos::Destroy::ProjectPrivateService).to receive(:new).with(100).and_return(service)
+ expect(service).to receive(:execute)
+
+ described_class.new.perform(100)
+ end
+end
diff --git a/vendor/assets/javascripts/xterm/encoding-indexes.js b/vendor/assets/javascripts/xterm/encoding-indexes.js
deleted file mode 100644
index 5fd98f5577e..00000000000
--- a/vendor/assets/javascripts/xterm/encoding-indexes.js
+++ /dev/null
@@ -1,39 +0,0 @@
-(function(global) {
- 'use strict';
- global["encoding-indexes"] =
-{
- "big5":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188],
- "euc-kr":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
- "gb18030":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565],
- "gb18030-ranges":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]],
- "jis0208":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
- "jis0212":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
- "ibm866":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160],
- "iso-8859-2":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],
- "iso-8859-3":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729],
- "iso-8859-4":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729],
- "iso-8859-5":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119],
- "iso-8859-6":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null],
- "iso-8859-7":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],
- "iso-8859-8":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],
- "iso-8859-10":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312],
- "iso-8859-13":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217],
- "iso-8859-14":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255],
- "iso-8859-15":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],
- "iso-8859-16":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255],
- "koi8-r":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],
- "koi8-u":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],
- "macintosh":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711],
- "windows-874":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null],
- "windows-1250":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],
- "windows-1251":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103],
- "windows-1252":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],
- "windows-1253":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],
- "windows-1254":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255],
- "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],
- "windows-1256":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746],
- "windows-1257":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729],
- "windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255],
- "x-mac-cyrillic":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364]
-}
-;}(this));
diff --git a/vendor/assets/javascripts/xterm/encoding.js b/vendor/assets/javascripts/xterm/encoding.js
deleted file mode 100644
index b5c8904f5a3..00000000000
--- a/vendor/assets/javascripts/xterm/encoding.js
+++ /dev/null
@@ -1,3309 +0,0 @@
-// This is free and unencumbered software released into the public domain.
-// See LICENSE.md for more information.
-
-// If we're in node require encoding-indexes and attach it to the global.
-/**
- * @fileoverview Global |this| required for resolving indexes in node.
- * @suppress {globalThis}
- */
-if (typeof module !== "undefined" && module.exports &&
- !this["encoding-indexes"]) {
- require("./encoding-indexes.js");
-}
-
-(function(global) {
- 'use strict';
-
- //
- // Utilities
- //
-
- /**
- * @param {number} a The number to test.
- * @param {number} min The minimum value in the range, inclusive.
- * @param {number} max The maximum value in the range, inclusive.
- * @return {boolean} True if a >= min and a <= max.
- */
- function inRange(a, min, max) {
- return min <= a && a <= max;
- }
-
- /**
- * @param {!Array.<*>} array The array to check.
- * @param {*} item The item to look for in the array.
- * @return {boolean} True if the item appears in the array.
- */
- function includes(array, item) {
- return array.indexOf(item) !== -1;
- }
-
- var floor = Math.floor;
-
- /**
- * @param {*} o
- * @return {Object}
- */
- function ToDictionary(o) {
- if (o === undefined) return {};
- if (o === Object(o)) return o;
- throw TypeError('Could not convert argument to dictionary');
- }
-
- /**
- * @param {string} string Input string of UTF-16 code units.
- * @return {!Array.<number>} Code points.
- */
- function stringToCodePoints(string) {
- // https://heycam.github.io/webidl/#dfn-obtain-unicode
-
- // 1. Let S be the DOMString value.
- var s = String(string);
-
- // 2. Let n be the length of S.
- var n = s.length;
-
- // 3. Initialize i to 0.
- var i = 0;
-
- // 4. Initialize U to be an empty sequence of Unicode characters.
- var u = [];
-
- // 5. While i < n:
- while (i < n) {
-
- // 1. Let c be the code unit in S at index i.
- var c = s.charCodeAt(i);
-
- // 2. Depending on the value of c:
-
- // c < 0xD800 or c > 0xDFFF
- if (c < 0xD800 || c > 0xDFFF) {
- // Append to U the Unicode character with code point c.
- u.push(c);
- }
-
- // 0xDC00 ≤ c ≤ 0xDFFF
- else if (0xDC00 <= c && c <= 0xDFFF) {
- // Append to U a U+FFFD REPLACEMENT CHARACTER.
- u.push(0xFFFD);
- }
-
- // 0xD800 ≤ c ≤ 0xDBFF
- else if (0xD800 <= c && c <= 0xDBFF) {
- // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT
- // CHARACTER.
- if (i === n - 1) {
- u.push(0xFFFD);
- }
- // 2. Otherwise, i < n−1:
- else {
- // 1. Let d be the code unit in S at index i+1.
- var d = s.charCodeAt(i + 1);
-
- // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then:
- if (0xDC00 <= d && d <= 0xDFFF) {
- // 1. Let a be c & 0x3FF.
- var a = c & 0x3FF;
-
- // 2. Let b be d & 0x3FF.
- var b = d & 0x3FF;
-
- // 3. Append to U the Unicode character with code point
- // 2^16+2^10*a+b.
- u.push(0x10000 + (a << 10) + b);
-
- // 4. Set i to i+1.
- i += 1;
- }
-
- // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a
- // U+FFFD REPLACEMENT CHARACTER.
- else {
- u.push(0xFFFD);
- }
- }
- }
-
- // 3. Set i to i+1.
- i += 1;
- }
-
- // 6. Return U.
- return u;
- }
-
- /**
- * @param {!Array.<number>} code_points Array of code points.
- * @return {string} string String of UTF-16 code units.
- */
- function codePointsToString(code_points) {
- var s = '';
- for (var i = 0; i < code_points.length; ++i) {
- var cp = code_points[i];
- if (cp <= 0xFFFF) {
- s += String.fromCharCode(cp);
- } else {
- cp -= 0x10000;
- s += String.fromCharCode((cp >> 10) + 0xD800,
- (cp & 0x3FF) + 0xDC00);
- }
- }
- return s;
- }
-
-
- //
- // Implementation of Encoding specification
- // https://encoding.spec.whatwg.org/
- //
-
- //
- // 4. Terminology
- //
-
- /**
- * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive.
- * @param {number} a The number to test.
- * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive.
- */
- function isASCIIByte(a) {
- return 0x00 <= a && a <= 0x7F;
- }
-
- /**
- * An ASCII code point is a code point in the range U+0000 to
- * U+007F, inclusive.
- */
- var isASCIICodePoint = isASCIIByte;
-
-
- /**
- * End-of-stream is a special token that signifies no more tokens
- * are in the stream.
- * @const
- */ var end_of_stream = -1;
-
- /**
- * A stream represents an ordered sequence of tokens.
- *
- * @constructor
- * @param {!(Array.<number>|Uint8Array)} tokens Array of tokens that provide
- * the stream.
- */
- function Stream(tokens) {
- /** @type {!Array.<number>} */
- this.tokens = [].slice.call(tokens);
- // Reversed as push/pop is more efficient than shift/unshift.
- this.tokens.reverse();
- }
-
- Stream.prototype = {
- /**
- * @return {boolean} True if end-of-stream has been hit.
- */
- endOfStream: function() {
- return !this.tokens.length;
- },
-
- /**
- * When a token is read from a stream, the first token in the
- * stream must be returned and subsequently removed, and
- * end-of-stream must be returned otherwise.
- *
- * @return {number} Get the next token from the stream, or
- * end_of_stream.
- */
- read: function() {
- if (!this.tokens.length)
- return end_of_stream;
- return this.tokens.pop();
- },
-
- /**
- * When one or more tokens are prepended to a stream, those tokens
- * must be inserted, in given order, before the first token in the
- * stream.
- *
- * @param {(number|!Array.<number>)} token The token(s) to prepend to the
- * stream.
- */
- prepend: function(token) {
- if (Array.isArray(token)) {
- var tokens = /**@type {!Array.<number>}*/(token);
- while (tokens.length)
- this.tokens.push(tokens.pop());
- } else {
- this.tokens.push(token);
- }
- },
-
- /**
- * When one or more tokens are pushed to a stream, those tokens
- * must be inserted, in given order, after the last token in the
- * stream.
- *
- * @param {(number|!Array.<number>)} token The tokens(s) to push to the
- * stream.
- */
- push: function(token) {
- if (Array.isArray(token)) {
- var tokens = /**@type {!Array.<number>}*/(token);
- while (tokens.length)
- this.tokens.unshift(tokens.shift());
- } else {
- this.tokens.unshift(token);
- }
- }
- };
-
- //
- // 5. Encodings
- //
-
- // 5.1 Encoders and decoders
-
- /** @const */
- var finished = -1;
-
- /**
- * @param {boolean} fatal If true, decoding errors raise an exception.
- * @param {number=} opt_code_point Override the standard fallback code point.
- * @return {number} The code point to insert on a decoding error.
- */
- function decoderError(fatal, opt_code_point) {
- if (fatal)
- throw TypeError('Decoder error');
- return opt_code_point || 0xFFFD;
- }
-
- /**
- * @param {number} code_point The code point that could not be encoded.
- * @return {number} Always throws, no value is actually returned.
- */
- function encoderError(code_point) {
- throw TypeError('The code point ' + code_point + ' could not be encoded.');
- }
-
- /** @interface */
- function Decoder() {}
- Decoder.prototype = {
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point, or |finished|.
- */
- handler: function(stream, bite) {}
- };
-
- /** @interface */
- function Encoder() {}
- Encoder.prototype = {
- /**
- * @param {Stream} stream The stream of code points being encoded.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit, or |finished|.
- */
- handler: function(stream, code_point) {}
- };
-
- // 5.2 Names and labels
-
- // TODO: Define @typedef for Encoding: {name:string,labels:Array.<string>}
- // https://github.com/google/closure-compiler/issues/247
-
- /**
- * @param {string} label The encoding label.
- * @return {?{name:string,labels:Array.<string>}}
- */
- function getEncoding(label) {
- // 1. Remove any leading and trailing ASCII whitespace from label.
- label = String(label).trim().toLowerCase();
-
- // 2. If label is an ASCII case-insensitive match for any of the
- // labels listed in the table below, return the corresponding
- // encoding, and failure otherwise.
- if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) {
- return label_to_encoding[label];
- }
- return null;
- }
-
- /**
- * Encodings table: https://encoding.spec.whatwg.org/encodings.json
- * @const
- * @type {!Array.<{
- * heading: string,
- * encodings: Array.<{name:string,labels:Array.<string>}>
- * }>}
- */
- var encodings = [
- {
- "encodings": [
- {
- "labels": [
- "unicode-1-1-utf-8",
- "utf-8",
- "utf8"
- ],
- "name": "UTF-8"
- }
- ],
- "heading": "The Encoding"
- },
- {
- "encodings": [
- {
- "labels": [
- "866",
- "cp866",
- "csibm866",
- "ibm866"
- ],
- "name": "IBM866"
- },
- {
- "labels": [
- "csisolatin2",
- "iso-8859-2",
- "iso-ir-101",
- "iso8859-2",
- "iso88592",
- "iso_8859-2",
- "iso_8859-2:1987",
- "l2",
- "latin2"
- ],
- "name": "ISO-8859-2"
- },
- {
- "labels": [
- "csisolatin3",
- "iso-8859-3",
- "iso-ir-109",
- "iso8859-3",
- "iso88593",
- "iso_8859-3",
- "iso_8859-3:1988",
- "l3",
- "latin3"
- ],
- "name": "ISO-8859-3"
- },
- {
- "labels": [
- "csisolatin4",
- "iso-8859-4",
- "iso-ir-110",
- "iso8859-4",
- "iso88594",
- "iso_8859-4",
- "iso_8859-4:1988",
- "l4",
- "latin4"
- ],
- "name": "ISO-8859-4"
- },
- {
- "labels": [
- "csisolatincyrillic",
- "cyrillic",
- "iso-8859-5",
- "iso-ir-144",
- "iso8859-5",
- "iso88595",
- "iso_8859-5",
- "iso_8859-5:1988"
- ],
- "name": "ISO-8859-5"
- },
- {
- "labels": [
- "arabic",
- "asmo-708",
- "csiso88596e",
- "csiso88596i",
- "csisolatinarabic",
- "ecma-114",
- "iso-8859-6",
- "iso-8859-6-e",
- "iso-8859-6-i",
- "iso-ir-127",
- "iso8859-6",
- "iso88596",
- "iso_8859-6",
- "iso_8859-6:1987"
- ],
- "name": "ISO-8859-6"
- },
- {
- "labels": [
- "csisolatingreek",
- "ecma-118",
- "elot_928",
- "greek",
- "greek8",
- "iso-8859-7",
- "iso-ir-126",
- "iso8859-7",
- "iso88597",
- "iso_8859-7",
- "iso_8859-7:1987",
- "sun_eu_greek"
- ],
- "name": "ISO-8859-7"
- },
- {
- "labels": [
- "csiso88598e",
- "csisolatinhebrew",
- "hebrew",
- "iso-8859-8",
- "iso-8859-8-e",
- "iso-ir-138",
- "iso8859-8",
- "iso88598",
- "iso_8859-8",
- "iso_8859-8:1988",
- "visual"
- ],
- "name": "ISO-8859-8"
- },
- {
- "labels": [
- "csiso88598i",
- "iso-8859-8-i",
- "logical"
- ],
- "name": "ISO-8859-8-I"
- },
- {
- "labels": [
- "csisolatin6",
- "iso-8859-10",
- "iso-ir-157",
- "iso8859-10",
- "iso885910",
- "l6",
- "latin6"
- ],
- "name": "ISO-8859-10"
- },
- {
- "labels": [
- "iso-8859-13",
- "iso8859-13",
- "iso885913"
- ],
- "name": "ISO-8859-13"
- },
- {
- "labels": [
- "iso-8859-14",
- "iso8859-14",
- "iso885914"
- ],
- "name": "ISO-8859-14"
- },
- {
- "labels": [
- "csisolatin9",
- "iso-8859-15",
- "iso8859-15",
- "iso885915",
- "iso_8859-15",
- "l9"
- ],
- "name": "ISO-8859-15"
- },
- {
- "labels": [
- "iso-8859-16"
- ],
- "name": "ISO-8859-16"
- },
- {
- "labels": [
- "cskoi8r",
- "koi",
- "koi8",
- "koi8-r",
- "koi8_r"
- ],
- "name": "KOI8-R"
- },
- {
- "labels": [
- "koi8-ru",
- "koi8-u"
- ],
- "name": "KOI8-U"
- },
- {
- "labels": [
- "csmacintosh",
- "mac",
- "macintosh",
- "x-mac-roman"
- ],
- "name": "macintosh"
- },
- {
- "labels": [
- "dos-874",
- "iso-8859-11",
- "iso8859-11",
- "iso885911",
- "tis-620",
- "windows-874"
- ],
- "name": "windows-874"
- },
- {
- "labels": [
- "cp1250",
- "windows-1250",
- "x-cp1250"
- ],
- "name": "windows-1250"
- },
- {
- "labels": [
- "cp1251",
- "windows-1251",
- "x-cp1251"
- ],
- "name": "windows-1251"
- },
- {
- "labels": [
- "ansi_x3.4-1968",
- "ascii",
- "cp1252",
- "cp819",
- "csisolatin1",
- "ibm819",
- "iso-8859-1",
- "iso-ir-100",
- "iso8859-1",
- "iso88591",
- "iso_8859-1",
- "iso_8859-1:1987",
- "l1",
- "latin1",
- "us-ascii",
- "windows-1252",
- "x-cp1252"
- ],
- "name": "windows-1252"
- },
- {
- "labels": [
- "cp1253",
- "windows-1253",
- "x-cp1253"
- ],
- "name": "windows-1253"
- },
- {
- "labels": [
- "cp1254",
- "csisolatin5",
- "iso-8859-9",
- "iso-ir-148",
- "iso8859-9",
- "iso88599",
- "iso_8859-9",
- "iso_8859-9:1989",
- "l5",
- "latin5",
- "windows-1254",
- "x-cp1254"
- ],
- "name": "windows-1254"
- },
- {
- "labels": [
- "cp1255",
- "windows-1255",
- "x-cp1255"
- ],
- "name": "windows-1255"
- },
- {
- "labels": [
- "cp1256",
- "windows-1256",
- "x-cp1256"
- ],
- "name": "windows-1256"
- },
- {
- "labels": [
- "cp1257",
- "windows-1257",
- "x-cp1257"
- ],
- "name": "windows-1257"
- },
- {
- "labels": [
- "cp1258",
- "windows-1258",
- "x-cp1258"
- ],
- "name": "windows-1258"
- },
- {
- "labels": [
- "x-mac-cyrillic",
- "x-mac-ukrainian"
- ],
- "name": "x-mac-cyrillic"
- }
- ],
- "heading": "Legacy single-byte encodings"
- },
- {
- "encodings": [
- {
- "labels": [
- "chinese",
- "csgb2312",
- "csiso58gb231280",
- "gb2312",
- "gb_2312",
- "gb_2312-80",
- "gbk",
- "iso-ir-58",
- "x-gbk"
- ],
- "name": "GBK"
- },
- {
- "labels": [
- "gb18030"
- ],
- "name": "gb18030"
- }
- ],
- "heading": "Legacy multi-byte Chinese (simplified) encodings"
- },
- {
- "encodings": [
- {
- "labels": [
- "big5",
- "big5-hkscs",
- "cn-big5",
- "csbig5",
- "x-x-big5"
- ],
- "name": "Big5"
- }
- ],
- "heading": "Legacy multi-byte Chinese (traditional) encodings"
- },
- {
- "encodings": [
- {
- "labels": [
- "cseucpkdfmtjapanese",
- "euc-jp",
- "x-euc-jp"
- ],
- "name": "EUC-JP"
- },
- {
- "labels": [
- "csiso2022jp",
- "iso-2022-jp"
- ],
- "name": "ISO-2022-JP"
- },
- {
- "labels": [
- "csshiftjis",
- "ms932",
- "ms_kanji",
- "shift-jis",
- "shift_jis",
- "sjis",
- "windows-31j",
- "x-sjis"
- ],
- "name": "Shift_JIS"
- }
- ],
- "heading": "Legacy multi-byte Japanese encodings"
- },
- {
- "encodings": [
- {
- "labels": [
- "cseuckr",
- "csksc56011987",
- "euc-kr",
- "iso-ir-149",
- "korean",
- "ks_c_5601-1987",
- "ks_c_5601-1989",
- "ksc5601",
- "ksc_5601",
- "windows-949"
- ],
- "name": "EUC-KR"
- }
- ],
- "heading": "Legacy multi-byte Korean encodings"
- },
- {
- "encodings": [
- {
- "labels": [
- "csiso2022kr",
- "hz-gb-2312",
- "iso-2022-cn",
- "iso-2022-cn-ext",
- "iso-2022-kr"
- ],
- "name": "replacement"
- },
- {
- "labels": [
- "utf-16be"
- ],
- "name": "UTF-16BE"
- },
- {
- "labels": [
- "utf-16",
- "utf-16le"
- ],
- "name": "UTF-16LE"
- },
- {
- "labels": [
- "x-user-defined"
- ],
- "name": "x-user-defined"
- }
- ],
- "heading": "Legacy miscellaneous encodings"
- }
- ];
-
- // Label to encoding registry.
- /** @type {Object.<string,{name:string,labels:Array.<string>}>} */
- var label_to_encoding = {};
- encodings.forEach(function(category) {
- category.encodings.forEach(function(encoding) {
- encoding.labels.forEach(function(label) {
- label_to_encoding[label] = encoding;
- });
- });
- });
-
- // Registry of of encoder/decoder factories, by encoding name.
- /** @type {Object.<string, function({fatal:boolean}): Encoder>} */
- var encoders = {};
- /** @type {Object.<string, function({fatal:boolean}): Decoder>} */
- var decoders = {};
-
- //
- // 6. Indexes
- //
-
- /**
- * @param {number} pointer The |pointer| to search for.
- * @param {(!Array.<?number>|undefined)} index The |index| to search within.
- * @return {?number} The code point corresponding to |pointer| in |index|,
- * or null if |code point| is not in |index|.
- */
- function indexCodePointFor(pointer, index) {
- if (!index) return null;
- return index[pointer] || null;
- }
-
- /**
- * @param {number} code_point The |code point| to search for.
- * @param {!Array.<?number>} index The |index| to search within.
- * @return {?number} The first pointer corresponding to |code point| in
- * |index|, or null if |code point| is not in |index|.
- */
- function indexPointerFor(code_point, index) {
- var pointer = index.indexOf(code_point);
- return pointer === -1 ? null : pointer;
- }
-
- /**
- * @param {string} name Name of the index.
- * @return {(!Array.<number>|!Array.<Array.<number>>)}
- * */
- function index(name) {
- if (!('encoding-indexes' in global)) {
- throw Error("Indexes missing." +
- " Did you forget to include encoding-indexes.js first?");
- }
- return global['encoding-indexes'][name];
- }
-
- /**
- * @param {number} pointer The |pointer| to search for in the gb18030 index.
- * @return {?number} The code point corresponding to |pointer| in |index|,
- * or null if |code point| is not in the gb18030 index.
- */
- function indexGB18030RangesCodePointFor(pointer) {
- // 1. If pointer is greater than 39419 and less than 189000, or
- // pointer is greater than 1237575, return null.
- if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))
- return null;
-
- // 2. If pointer is 7457, return code point U+E7C7.
- if (pointer === 7457) return 0xE7C7;
-
- // 3. Let offset be the last pointer in index gb18030 ranges that
- // is equal to or less than pointer and let code point offset be
- // its corresponding code point.
- var offset = 0;
- var code_point_offset = 0;
- var idx = index('gb18030-ranges');
- var i;
- for (i = 0; i < idx.length; ++i) {
- /** @type {!Array.<number>} */
- var entry = idx[i];
- if (entry[0] <= pointer) {
- offset = entry[0];
- code_point_offset = entry[1];
- } else {
- break;
- }
- }
-
- // 4. Return a code point whose value is code point offset +
- // pointer − offset.
- return code_point_offset + pointer - offset;
- }
-
- /**
- * @param {number} code_point The |code point| to locate in the gb18030 index.
- * @return {number} The first pointer corresponding to |code point| in the
- * gb18030 index.
- */
- function indexGB18030RangesPointerFor(code_point) {
- // 1. If code point is U+E7C7, return pointer 7457.
- if (code_point === 0xE7C7) return 7457;
-
- // 2. Let offset be the last code point in index gb18030 ranges
- // that is equal to or less than code point and let pointer offset
- // be its corresponding pointer.
- var offset = 0;
- var pointer_offset = 0;
- var idx = index('gb18030-ranges');
- var i;
- for (i = 0; i < idx.length; ++i) {
- /** @type {!Array.<number>} */
- var entry = idx[i];
- if (entry[1] <= code_point) {
- offset = entry[1];
- pointer_offset = entry[0];
- } else {
- break;
- }
- }
-
- // 3. Return a pointer whose value is pointer offset + code point
- // − offset.
- return pointer_offset + code_point - offset;
- }
-
- /**
- * @param {number} code_point The |code_point| to search for in the Shift_JIS
- * index.
- * @return {?number} The code point corresponding to |pointer| in |index|,
- * or null if |code point| is not in the Shift_JIS index.
- */
- function indexShiftJISPointerFor(code_point) {
- // 1. Let index be index jis0208 excluding all entries whose
- // pointer is in the range 8272 to 8835, inclusive.
- shift_jis_index = shift_jis_index ||
- index('jis0208').map(function(code_point, pointer) {
- return inRange(pointer, 8272, 8835) ? null : code_point;
- });
- var index_ = shift_jis_index;
-
- // 2. Return the index pointer for code point in index.
- return index_.indexOf(code_point);
- }
- var shift_jis_index;
-
- /**
- * @param {number} code_point The |code_point| to search for in the big5
- * index.
- * @return {?number} The code point corresponding to |pointer| in |index|,
- * or null if |code point| is not in the big5 index.
- */
- function indexBig5PointerFor(code_point) {
- // 1. Let index be index Big5 excluding all entries whose pointer
- big5_index_no_hkscs = big5_index_no_hkscs ||
- index('big5').map(function(code_point, pointer) {
- return (pointer < (0xA1 - 0x81) * 157) ? null : code_point;
- });
- var index_ = big5_index_no_hkscs;
-
- // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or
- // U+5345, return the last pointer corresponding to code point in
- // index.
- if (code_point === 0x2550 || code_point === 0x255E ||
- code_point === 0x2561 || code_point === 0x256A ||
- code_point === 0x5341 || code_point === 0x5345) {
- return index_.lastIndexOf(code_point);
- }
-
- // 3. Return the index pointer for code point in index.
- return indexPointerFor(code_point, index_);
- }
- var big5_index_no_hkscs;
-
- //
- // 8. API
- //
-
- /** @const */ var DEFAULT_ENCODING = 'utf-8';
-
- // 8.1 Interface TextDecoder
-
- /**
- * @constructor
- * @param {string=} label The label of the encoding;
- * defaults to 'utf-8'.
- * @param {Object=} options
- */
- function TextDecoder(label, options) {
- // Web IDL conventions
- if (!(this instanceof TextDecoder))
- throw TypeError('Called as a function. Did you forget \'new\'?');
- label = label !== undefined ? String(label) : DEFAULT_ENCODING;
- options = ToDictionary(options);
-
- // A TextDecoder object has an associated encoding, decoder,
- // stream, ignore BOM flag (initially unset), BOM seen flag
- // (initially unset), error mode (initially replacement), and do
- // not flush flag (initially unset).
-
- /** @private */
- this._encoding = null;
- /** @private @type {?Decoder} */
- this._decoder = null;
- /** @private @type {boolean} */
- this._ignoreBOM = false;
- /** @private @type {boolean} */
- this._BOMseen = false;
- /** @private @type {string} */
- this._error_mode = 'replacement';
- /** @private @type {boolean} */
- this._do_not_flush = false;
-
-
- // 1. Let encoding be the result of getting an encoding from
- // label.
- var encoding = getEncoding(label);
-
- // 2. If encoding is failure or replacement, throw a RangeError.
- if (encoding === null || encoding.name === 'replacement')
- throw RangeError('Unknown encoding: ' + label);
- if (!decoders[encoding.name]) {
- throw Error('Decoder not present.' +
- ' Did you forget to include encoding-indexes.js first?');
- }
-
- // 3. Let dec be a new TextDecoder object.
- var dec = this;
-
- // 4. Set dec's encoding to encoding.
- dec._encoding = encoding;
-
- // 5. If options's fatal member is true, set dec's error mode to
- // fatal.
- if (Boolean(options['fatal']))
- dec._error_mode = 'fatal';
-
- // 6. If options's ignoreBOM member is true, set dec's ignore BOM
- // flag.
- if (Boolean(options['ignoreBOM']))
- dec._ignoreBOM = true;
-
- // For pre-ES5 runtimes:
- if (!Object.defineProperty) {
- this.encoding = dec._encoding.name.toLowerCase();
- this.fatal = dec._error_mode === 'fatal';
- this.ignoreBOM = dec._ignoreBOM;
- }
-
- // 7. Return dec.
- return dec;
- }
-
- if (Object.defineProperty) {
- // The encoding attribute's getter must return encoding's name.
- Object.defineProperty(TextDecoder.prototype, 'encoding', {
- /** @this {TextDecoder} */
- get: function() { return this._encoding.name.toLowerCase(); }
- });
-
- // The fatal attribute's getter must return true if error mode
- // is fatal, and false otherwise.
- Object.defineProperty(TextDecoder.prototype, 'fatal', {
- /** @this {TextDecoder} */
- get: function() { return this._error_mode === 'fatal'; }
- });
-
- // The ignoreBOM attribute's getter must return true if ignore
- // BOM flag is set, and false otherwise.
- Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', {
- /** @this {TextDecoder} */
- get: function() { return this._ignoreBOM; }
- });
- }
-
- /**
- * @param {BufferSource=} input The buffer of bytes to decode.
- * @param {Object=} options
- * @return {string} The decoded string.
- */
- TextDecoder.prototype.decode = function decode(input, options) {
- var bytes;
- if (typeof input === 'object' && input instanceof ArrayBuffer) {
- bytes = new Uint8Array(input);
- } else if (typeof input === 'object' && 'buffer' in input &&
- input.buffer instanceof ArrayBuffer) {
- bytes = new Uint8Array(input.buffer,
- input.byteOffset,
- input.byteLength);
- } else {
- bytes = new Uint8Array(0);
- }
-
- options = ToDictionary(options);
-
- // 1. If the do not flush flag is unset, set decoder to a new
- // encoding's decoder, set stream to a new stream, and unset the
- // BOM seen flag.
- if (!this._do_not_flush) {
- this._decoder = decoders[this._encoding.name]({
- fatal: this._error_mode === 'fatal'});
- this._BOMseen = false;
- }
-
- // 2. If options's stream is true, set the do not flush flag, and
- // unset the do not flush flag otherwise.
- this._do_not_flush = Boolean(options['stream']);
-
- // 3. If input is given, push a copy of input to stream.
- // TODO: Align with spec algorithm - maintain stream on instance.
- var input_stream = new Stream(bytes);
-
- // 4. Let output be a new stream.
- var output = [];
-
- /** @type {?(number|!Array.<number>)} */
- var result;
-
- // 5. While true:
- while (true) {
- // 1. Let token be the result of reading from stream.
- var token = input_stream.read();
-
- // 2. If token is end-of-stream and the do not flush flag is
- // set, return output, serialized.
- // TODO: Align with spec algorithm.
- if (token === end_of_stream)
- break;
-
- // 3. Otherwise, run these subsubsteps:
-
- // 1. Let result be the result of processing token for decoder,
- // stream, output, and error mode.
- result = this._decoder.handler(input_stream, token);
-
- // 2. If result is finished, return output, serialized.
- if (result === finished)
- break;
-
- if (result !== null) {
- if (Array.isArray(result))
- output.push.apply(output, /**@type {!Array.<number>}*/(result));
- else
- output.push(result);
- }
-
- // 3. Otherwise, if result is error, throw a TypeError.
- // (Thrown in handler)
-
- // 4. Otherwise, do nothing.
- }
- // TODO: Align with spec algorithm.
- if (!this._do_not_flush) {
- do {
- result = this._decoder.handler(input_stream, input_stream.read());
- if (result === finished)
- break;
- if (result === null)
- continue;
- if (Array.isArray(result))
- output.push.apply(output, /**@type {!Array.<number>}*/(result));
- else
- output.push(result);
- } while (!input_stream.endOfStream());
- this._decoder = null;
- }
-
- // A TextDecoder object also has an associated serialize stream
- // algorithm...
- /**
- * @param {!Array.<number>} stream
- * @return {string}
- * @this {TextDecoder}
- */
- function serializeStream(stream) {
- // 1. Let token be the result of reading from stream.
- // (Done in-place on array, rather than as a stream)
-
- // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore
- // BOM flag and BOM seen flag are unset, run these subsubsteps:
- if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) &&
- !this._ignoreBOM && !this._BOMseen) {
- if (stream.length > 0 && stream[0] === 0xFEFF) {
- // 1. If token is U+FEFF, set BOM seen flag.
- this._BOMseen = true;
- stream.shift();
- } else if (stream.length > 0) {
- // 2. Otherwise, if token is not end-of-stream, set BOM seen
- // flag and append token to stream.
- this._BOMseen = true;
- } else {
- // 3. Otherwise, if token is not end-of-stream, append token
- // to output.
- // (no-op)
- }
- }
- // 4. Otherwise, return output.
- return codePointsToString(stream);
- }
-
- return serializeStream.call(this, output);
- };
-
- // 8.2 Interface TextEncoder
-
- /**
- * @constructor
- * @param {string=} label The label of the encoding. NONSTANDARD.
- * @param {Object=} options NONSTANDARD.
- */
- function TextEncoder(label, options) {
- // Web IDL conventions
- if (!(this instanceof TextEncoder))
- throw TypeError('Called as a function. Did you forget \'new\'?');
- options = ToDictionary(options);
-
- // A TextEncoder object has an associated encoding and encoder.
-
- /** @private */
- this._encoding = null;
- /** @private @type {?Encoder} */
- this._encoder = null;
-
- // Non-standard
- /** @private @type {boolean} */
- this._do_not_flush = false;
- /** @private @type {string} */
- this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement';
-
- // 1. Let enc be a new TextEncoder object.
- var enc = this;
-
- // 2. Set enc's encoding to UTF-8's encoder.
- if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) {
- // NONSTANDARD behavior.
- label = label !== undefined ? String(label) : DEFAULT_ENCODING;
- var encoding = getEncoding(label);
- if (encoding === null || encoding.name === 'replacement')
- throw RangeError('Unknown encoding: ' + label);
- if (!encoders[encoding.name]) {
- throw Error('Encoder not present.' +
- ' Did you forget to include encoding-indexes.js first?');
- }
- enc._encoding = encoding;
- } else {
- // Standard behavior.
- enc._encoding = getEncoding('utf-8');
-
- if (label !== undefined && 'console' in global) {
- console.warn('TextEncoder constructor called with encoding label, '
- + 'which is ignored.');
- }
- }
-
- // For pre-ES5 runtimes:
- if (!Object.defineProperty)
- this.encoding = enc._encoding.name.toLowerCase();
-
- // 3. Return enc.
- return enc;
- }
-
- if (Object.defineProperty) {
- // The encoding attribute's getter must return encoding's name.
- Object.defineProperty(TextEncoder.prototype, 'encoding', {
- /** @this {TextEncoder} */
- get: function() { return this._encoding.name.toLowerCase(); }
- });
- }
-
- /**
- * @param {string=} opt_string The string to encode.
- * @param {Object=} options
- * @return {!Uint8Array} Encoded bytes, as a Uint8Array.
- */
- TextEncoder.prototype.encode = function encode(opt_string, options) {
- opt_string = opt_string === undefined ? '' : String(opt_string);
- options = ToDictionary(options);
-
- // NOTE: This option is nonstandard. None of the encodings
- // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when
- // the input is a USVString so streaming is not necessary.
- if (!this._do_not_flush)
- this._encoder = encoders[this._encoding.name]({
- fatal: this._fatal === 'fatal'});
- this._do_not_flush = Boolean(options['stream']);
-
- // 1. Convert input to a stream.
- var input = new Stream(stringToCodePoints(opt_string));
-
- // 2. Let output be a new stream
- var output = [];
-
- /** @type {?(number|!Array.<number>)} */
- var result;
- // 3. While true, run these substeps:
- while (true) {
- // 1. Let token be the result of reading from input.
- var token = input.read();
- if (token === end_of_stream)
- break;
- // 2. Let result be the result of processing token for encoder,
- // input, output.
- result = this._encoder.handler(input, token);
- if (result === finished)
- break;
- if (Array.isArray(result))
- output.push.apply(output, /**@type {!Array.<number>}*/(result));
- else
- output.push(result);
- }
- // TODO: Align with spec algorithm.
- if (!this._do_not_flush) {
- while (true) {
- result = this._encoder.handler(input, input.read());
- if (result === finished)
- break;
- if (Array.isArray(result))
- output.push.apply(output, /**@type {!Array.<number>}*/(result));
- else
- output.push(result);
- }
- this._encoder = null;
- }
- // 3. If result is finished, convert output into a byte sequence,
- // and then return a Uint8Array object wrapping an ArrayBuffer
- // containing output.
- return new Uint8Array(output);
- };
-
-
- //
- // 9. The encoding
- //
-
- // 9.1 utf-8
-
- // 9.1.1 utf-8 decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {{fatal: boolean}} options
- */
- function UTF8Decoder(options) {
- var fatal = options.fatal;
-
- // utf-8's decoder's has an associated utf-8 code point, utf-8
- // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8
- // lower boundary (initially 0x80), and a utf-8 upper boundary
- // (initially 0xBF).
- var /** @type {number} */ utf8_code_point = 0,
- /** @type {number} */ utf8_bytes_seen = 0,
- /** @type {number} */ utf8_bytes_needed = 0,
- /** @type {number} */ utf8_lower_boundary = 0x80,
- /** @type {number} */ utf8_upper_boundary = 0xBF;
-
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream and utf-8 bytes needed is not 0,
- // set utf-8 bytes needed to 0 and return error.
- if (bite === end_of_stream && utf8_bytes_needed !== 0) {
- utf8_bytes_needed = 0;
- return decoderError(fatal);
- }
-
- // 2. If byte is end-of-stream, return finished.
- if (bite === end_of_stream)
- return finished;
-
- // 3. If utf-8 bytes needed is 0, based on byte:
- if (utf8_bytes_needed === 0) {
-
- // 0x00 to 0x7F
- if (inRange(bite, 0x00, 0x7F)) {
- // Return a code point whose value is byte.
- return bite;
- }
-
- // 0xC2 to 0xDF
- else if (inRange(bite, 0xC2, 0xDF)) {
- // 1. Set utf-8 bytes needed to 1.
- utf8_bytes_needed = 1;
-
- // 2. Set UTF-8 code point to byte & 0x1F.
- utf8_code_point = bite & 0x1F;
- }
-
- // 0xE0 to 0xEF
- else if (inRange(bite, 0xE0, 0xEF)) {
- // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0.
- if (bite === 0xE0)
- utf8_lower_boundary = 0xA0;
- // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F.
- if (bite === 0xED)
- utf8_upper_boundary = 0x9F;
- // 3. Set utf-8 bytes needed to 2.
- utf8_bytes_needed = 2;
- // 4. Set UTF-8 code point to byte & 0xF.
- utf8_code_point = bite & 0xF;
- }
-
- // 0xF0 to 0xF4
- else if (inRange(bite, 0xF0, 0xF4)) {
- // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90.
- if (bite === 0xF0)
- utf8_lower_boundary = 0x90;
- // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F.
- if (bite === 0xF4)
- utf8_upper_boundary = 0x8F;
- // 3. Set utf-8 bytes needed to 3.
- utf8_bytes_needed = 3;
- // 4. Set UTF-8 code point to byte & 0x7.
- utf8_code_point = bite & 0x7;
- }
-
- // Otherwise
- else {
- // Return error.
- return decoderError(fatal);
- }
-
- // Return continue.
- return null;
- }
-
- // 4. If byte is not in the range utf-8 lower boundary to utf-8
- // upper boundary, inclusive, run these substeps:
- if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) {
-
- // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8
- // bytes seen to 0, set utf-8 lower boundary to 0x80, and set
- // utf-8 upper boundary to 0xBF.
- utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;
- utf8_lower_boundary = 0x80;
- utf8_upper_boundary = 0xBF;
-
- // 2. Prepend byte to stream.
- stream.prepend(bite);
-
- // 3. Return error.
- return decoderError(fatal);
- }
-
- // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary
- // to 0xBF.
- utf8_lower_boundary = 0x80;
- utf8_upper_boundary = 0xBF;
-
- // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte &
- // 0x3F)
- utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F);
-
- // 7. Increase utf-8 bytes seen by one.
- utf8_bytes_seen += 1;
-
- // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed,
- // continue.
- if (utf8_bytes_seen !== utf8_bytes_needed)
- return null;
-
- // 9. Let code point be utf-8 code point.
- var code_point = utf8_code_point;
-
- // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes
- // seen to 0.
- utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;
-
- // 11. Return a code point whose value is code point.
- return code_point;
- };
- }
-
- // 9.1.2 utf-8 encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {{fatal: boolean}} options
- */
- function UTF8Encoder(options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is an ASCII code point, return a byte whose
- // value is code point.
- if (isASCIICodePoint(code_point))
- return code_point;
-
- // 3. Set count and offset based on the range code point is in:
- var count, offset;
- // U+0080 to U+07FF, inclusive:
- if (inRange(code_point, 0x0080, 0x07FF)) {
- // 1 and 0xC0
- count = 1;
- offset = 0xC0;
- }
- // U+0800 to U+FFFF, inclusive:
- else if (inRange(code_point, 0x0800, 0xFFFF)) {
- // 2 and 0xE0
- count = 2;
- offset = 0xE0;
- }
- // U+10000 to U+10FFFF, inclusive:
- else if (inRange(code_point, 0x10000, 0x10FFFF)) {
- // 3 and 0xF0
- count = 3;
- offset = 0xF0;
- }
-
- // 4. Let bytes be a byte sequence whose first byte is (code
- // point >> (6 × count)) + offset.
- var bytes = [(code_point >> (6 * count)) + offset];
-
- // 5. Run these substeps while count is greater than 0:
- while (count > 0) {
-
- // 1. Set temp to code point >> (6 × (count − 1)).
- var temp = code_point >> (6 * (count - 1));
-
- // 2. Append to bytes 0x80 | (temp & 0x3F).
- bytes.push(0x80 | (temp & 0x3F));
-
- // 3. Decrease count by one.
- count -= 1;
- }
-
- // 6. Return bytes bytes, in order.
- return bytes;
- };
- }
-
- /** @param {{fatal: boolean}} options */
- encoders['UTF-8'] = function(options) {
- return new UTF8Encoder(options);
- };
- /** @param {{fatal: boolean}} options */
- decoders['UTF-8'] = function(options) {
- return new UTF8Decoder(options);
- };
-
- //
- // 10. Legacy single-byte encodings
- //
-
- // 10.1 single-byte decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {!Array.<number>} index The encoding index.
- * @param {{fatal: boolean}} options
- */
- function SingleByteDecoder(index, options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream, return finished.
- if (bite === end_of_stream)
- return finished;
-
- // 2. If byte is an ASCII byte, return a code point whose value
- // is byte.
- if (isASCIIByte(bite))
- return bite;
-
- // 3. Let code point be the index code point for byte − 0x80 in
- // index single-byte.
- var code_point = index[bite - 0x80];
-
- // 4. If code point is null, return error.
- if (code_point === null)
- return decoderError(fatal);
-
- // 5. Return a code point whose value is code point.
- return code_point;
- };
- }
-
- // 10.2 single-byte encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {!Array.<?number>} index The encoding index.
- * @param {{fatal: boolean}} options
- */
- function SingleByteEncoder(index, options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is an ASCII code point, return a byte whose
- // value is code point.
- if (isASCIICodePoint(code_point))
- return code_point;
-
- // 3. Let pointer be the index pointer for code point in index
- // single-byte.
- var pointer = indexPointerFor(code_point, index);
-
- // 4. If pointer is null, return error with code point.
- if (pointer === null)
- encoderError(code_point);
-
- // 5. Return a byte whose value is pointer + 0x80.
- return pointer + 0x80;
- };
- }
-
- (function() {
- if (!('encoding-indexes' in global))
- return;
- encodings.forEach(function(category) {
- if (category.heading !== 'Legacy single-byte encodings')
- return;
- category.encodings.forEach(function(encoding) {
- var name = encoding.name;
- var idx = index(name.toLowerCase());
- /** @param {{fatal: boolean}} options */
- decoders[name] = function(options) {
- return new SingleByteDecoder(idx, options);
- };
- /** @param {{fatal: boolean}} options */
- encoders[name] = function(options) {
- return new SingleByteEncoder(idx, options);
- };
- });
- });
- }());
-
- //
- // 11. Legacy multi-byte Chinese (simplified) encodings
- //
-
- // 11.1 gbk
-
- // 11.1.1 gbk decoder
- // gbk's decoder is gb18030's decoder.
- /** @param {{fatal: boolean}} options */
- decoders['GBK'] = function(options) {
- return new GB18030Decoder(options);
- };
-
- // 11.1.2 gbk encoder
- // gbk's encoder is gb18030's encoder with its gbk flag set.
- /** @param {{fatal: boolean}} options */
- encoders['GBK'] = function(options) {
- return new GB18030Encoder(options, true);
- };
-
- // 11.2 gb18030
-
- // 11.2.1 gb18030 decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {{fatal: boolean}} options
- */
- function GB18030Decoder(options) {
- var fatal = options.fatal;
- // gb18030's decoder has an associated gb18030 first, gb18030
- // second, and gb18030 third (all initially 0x00).
- var /** @type {number} */ gb18030_first = 0x00,
- /** @type {number} */ gb18030_second = 0x00,
- /** @type {number} */ gb18030_third = 0x00;
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream and gb18030 first, gb18030
- // second, and gb18030 third are 0x00, return finished.
- if (bite === end_of_stream && gb18030_first === 0x00 &&
- gb18030_second === 0x00 && gb18030_third === 0x00) {
- return finished;
- }
- // 2. If byte is end-of-stream, and gb18030 first, gb18030
- // second, or gb18030 third is not 0x00, set gb18030 first,
- // gb18030 second, and gb18030 third to 0x00, and return error.
- if (bite === end_of_stream &&
- (gb18030_first !== 0x00 || gb18030_second !== 0x00 ||
- gb18030_third !== 0x00)) {
- gb18030_first = 0x00;
- gb18030_second = 0x00;
- gb18030_third = 0x00;
- decoderError(fatal);
- }
- var code_point;
- // 3. If gb18030 third is not 0x00, run these substeps:
- if (gb18030_third !== 0x00) {
- // 1. Let code point be null.
- code_point = null;
- // 2. If byte is in the range 0x30 to 0x39, inclusive, set
- // code point to the index gb18030 ranges code point for
- // (((gb18030 first − 0x81) × 10 + gb18030 second − 0x30) ×
- // 126 + gb18030 third − 0x81) × 10 + byte − 0x30.
- if (inRange(bite, 0x30, 0x39)) {
- code_point = indexGB18030RangesCodePointFor(
- (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 +
- gb18030_third - 0x81) * 10 + bite - 0x30);
- }
-
- // 3. Let buffer be a byte sequence consisting of gb18030
- // second, gb18030 third, and byte, in order.
- var buffer = [gb18030_second, gb18030_third, bite];
-
- // 4. Set gb18030 first, gb18030 second, and gb18030 third to
- // 0x00.
- gb18030_first = 0x00;
- gb18030_second = 0x00;
- gb18030_third = 0x00;
-
- // 5. If code point is null, prepend buffer to stream and
- // return error.
- if (code_point === null) {
- stream.prepend(buffer);
- return decoderError(fatal);
- }
-
- // 6. Return a code point whose value is code point.
- return code_point;
- }
-
- // 4. If gb18030 second is not 0x00, run these substeps:
- if (gb18030_second !== 0x00) {
-
- // 1. If byte is in the range 0x81 to 0xFE, inclusive, set
- // gb18030 third to byte and return continue.
- if (inRange(bite, 0x81, 0xFE)) {
- gb18030_third = bite;
- return null;
- }
-
- // 2. Prepend gb18030 second followed by byte to stream, set
- // gb18030 first and gb18030 second to 0x00, and return error.
- stream.prepend([gb18030_second, bite]);
- gb18030_first = 0x00;
- gb18030_second = 0x00;
- return decoderError(fatal);
- }
-
- // 5. If gb18030 first is not 0x00, run these substeps:
- if (gb18030_first !== 0x00) {
-
- // 1. If byte is in the range 0x30 to 0x39, inclusive, set
- // gb18030 second to byte and return continue.
- if (inRange(bite, 0x30, 0x39)) {
- gb18030_second = bite;
- return null;
- }
-
- // 2. Let lead be gb18030 first, let pointer be null, and set
- // gb18030 first to 0x00.
- var lead = gb18030_first;
- var pointer = null;
- gb18030_first = 0x00;
-
- // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41
- // otherwise.
- var offset = bite < 0x7F ? 0x40 : 0x41;
-
- // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80
- // to 0xFE, inclusive, set pointer to (lead − 0x81) × 190 +
- // (byte − offset).
- if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE))
- pointer = (lead - 0x81) * 190 + (bite - offset);
-
- // 5. Let code point be null if pointer is null and the index
- // code point for pointer in index gb18030 otherwise.
- code_point = pointer === null ? null :
- indexCodePointFor(pointer, index('gb18030'));
-
- // 6. If code point is null and byte is an ASCII byte, prepend
- // byte to stream.
- if (code_point === null && isASCIIByte(bite))
- stream.prepend(bite);
-
- // 7. If code point is null, return error.
- if (code_point === null)
- return decoderError(fatal);
-
- // 8. Return a code point whose value is code point.
- return code_point;
- }
-
- // 6. If byte is an ASCII byte, return a code point whose value
- // is byte.
- if (isASCIIByte(bite))
- return bite;
-
- // 7. If byte is 0x80, return code point U+20AC.
- if (bite === 0x80)
- return 0x20AC;
-
- // 8. If byte is in the range 0x81 to 0xFE, inclusive, set
- // gb18030 first to byte and return continue.
- if (inRange(bite, 0x81, 0xFE)) {
- gb18030_first = bite;
- return null;
- }
-
- // 9. Return error.
- return decoderError(fatal);
- };
- }
-
- // 11.2.2 gb18030 encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {{fatal: boolean}} options
- * @param {boolean=} gbk_flag
- */
- function GB18030Encoder(options, gbk_flag) {
- var fatal = options.fatal;
- // gb18030's decoder has an associated gbk flag (initially unset).
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is an ASCII code point, return a byte whose
- // value is code point.
- if (isASCIICodePoint(code_point))
- return code_point;
-
- // 3. If code point is U+E5E5, return error with code point.
- if (code_point === 0xE5E5)
- return encoderError(code_point);
-
- // 4. If the gbk flag is set and code point is U+20AC, return
- // byte 0x80.
- if (gbk_flag && code_point === 0x20AC)
- return 0x80;
-
- // 5. Let pointer be the index pointer for code point in index
- // gb18030.
- var pointer = indexPointerFor(code_point, index('gb18030'));
-
- // 6. If pointer is not null, run these substeps:
- if (pointer !== null) {
-
- // 1. Let lead be floor(pointer / 190) + 0x81.
- var lead = floor(pointer / 190) + 0x81;
-
- // 2. Let trail be pointer % 190.
- var trail = pointer % 190;
-
- // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise.
- var offset = trail < 0x3F ? 0x40 : 0x41;
-
- // 4. Return two bytes whose values are lead and trail + offset.
- return [lead, trail + offset];
- }
-
- // 7. If gbk flag is set, return error with code point.
- if (gbk_flag)
- return encoderError(code_point);
-
- // 8. Set pointer to the index gb18030 ranges pointer for code
- // point.
- pointer = indexGB18030RangesPointerFor(code_point);
-
- // 9. Let byte1 be floor(pointer / 10 / 126 / 10).
- var byte1 = floor(pointer / 10 / 126 / 10);
-
- // 10. Set pointer to pointer − byte1 × 10 × 126 × 10.
- pointer = pointer - byte1 * 10 * 126 * 10;
-
- // 11. Let byte2 be floor(pointer / 10 / 126).
- var byte2 = floor(pointer / 10 / 126);
-
- // 12. Set pointer to pointer − byte2 × 10 × 126.
- pointer = pointer - byte2 * 10 * 126;
-
- // 13. Let byte3 be floor(pointer / 10).
- var byte3 = floor(pointer / 10);
-
- // 14. Let byte4 be pointer − byte3 × 10.
- var byte4 = pointer - byte3 * 10;
-
- // 15. Return four bytes whose values are byte1 + 0x81, byte2 +
- // 0x30, byte3 + 0x81, byte4 + 0x30.
- return [byte1 + 0x81,
- byte2 + 0x30,
- byte3 + 0x81,
- byte4 + 0x30];
- };
- }
-
- /** @param {{fatal: boolean}} options */
- encoders['gb18030'] = function(options) {
- return new GB18030Encoder(options);
- };
- /** @param {{fatal: boolean}} options */
- decoders['gb18030'] = function(options) {
- return new GB18030Decoder(options);
- };
-
-
- //
- // 12. Legacy multi-byte Chinese (traditional) encodings
- //
-
- // 12.1 Big5
-
- // 12.1.1 Big5 decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {{fatal: boolean}} options
- */
- function Big5Decoder(options) {
- var fatal = options.fatal;
- // Big5's decoder has an associated Big5 lead (initially 0x00).
- var /** @type {number} */ Big5_lead = 0x00;
-
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream and Big5 lead is not 0x00, set
- // Big5 lead to 0x00 and return error.
- if (bite === end_of_stream && Big5_lead !== 0x00) {
- Big5_lead = 0x00;
- return decoderError(fatal);
- }
-
- // 2. If byte is end-of-stream and Big5 lead is 0x00, return
- // finished.
- if (bite === end_of_stream && Big5_lead === 0x00)
- return finished;
-
- // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let
- // pointer be null, set Big5 lead to 0x00, and then run these
- // substeps:
- if (Big5_lead !== 0x00) {
- var lead = Big5_lead;
- var pointer = null;
- Big5_lead = 0x00;
-
- // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62
- // otherwise.
- var offset = bite < 0x7F ? 0x40 : 0x62;
-
- // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1
- // to 0xFE, inclusive, set pointer to (lead − 0x81) × 157 +
- // (byte − offset).
- if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE))
- pointer = (lead - 0x81) * 157 + (bite - offset);
-
- // 3. If there is a row in the table below whose first column
- // is pointer, return the two code points listed in its second
- // column
- // Pointer | Code points
- // --------+--------------
- // 1133 | U+00CA U+0304
- // 1135 | U+00CA U+030C
- // 1164 | U+00EA U+0304
- // 1166 | U+00EA U+030C
- switch (pointer) {
- case 1133: return [0x00CA, 0x0304];
- case 1135: return [0x00CA, 0x030C];
- case 1164: return [0x00EA, 0x0304];
- case 1166: return [0x00EA, 0x030C];
- }
-
- // 4. Let code point be null if pointer is null and the index
- // code point for pointer in index Big5 otherwise.
- var code_point = (pointer === null) ? null :
- indexCodePointFor(pointer, index('big5'));
-
- // 5. If code point is null and byte is an ASCII byte, prepend
- // byte to stream.
- if (code_point === null && isASCIIByte(bite))
- stream.prepend(bite);
-
- // 6. If code point is null, return error.
- if (code_point === null)
- return decoderError(fatal);
-
- // 7. Return a code point whose value is code point.
- return code_point;
- }
-
- // 4. If byte is an ASCII byte, return a code point whose value
- // is byte.
- if (isASCIIByte(bite))
- return bite;
-
- // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5
- // lead to byte and return continue.
- if (inRange(bite, 0x81, 0xFE)) {
- Big5_lead = bite;
- return null;
- }
-
- // 6. Return error.
- return decoderError(fatal);
- };
- }
-
- // 12.1.2 Big5 encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {{fatal: boolean}} options
- */
- function Big5Encoder(options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is an ASCII code point, return a byte whose
- // value is code point.
- if (isASCIICodePoint(code_point))
- return code_point;
-
- // 3. Let pointer be the index Big5 pointer for code point.
- var pointer = indexBig5PointerFor(code_point);
-
- // 4. If pointer is null, return error with code point.
- if (pointer === null)
- return encoderError(code_point);
-
- // 5. Let lead be floor(pointer / 157) + 0x81.
- var lead = floor(pointer / 157) + 0x81;
-
- // 6. If lead is less than 0xA1, return error with code point.
- if (lead < 0xA1)
- return encoderError(code_point);
-
- // 7. Let trail be pointer % 157.
- var trail = pointer % 157;
-
- // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62
- // otherwise.
- var offset = trail < 0x3F ? 0x40 : 0x62;
-
- // Return two bytes whose values are lead and trail + offset.
- return [lead, trail + offset];
- };
- }
-
- /** @param {{fatal: boolean}} options */
- encoders['Big5'] = function(options) {
- return new Big5Encoder(options);
- };
- /** @param {{fatal: boolean}} options */
- decoders['Big5'] = function(options) {
- return new Big5Decoder(options);
- };
-
-
- //
- // 13. Legacy multi-byte Japanese encodings
- //
-
- // 13.1 euc-jp
-
- // 13.1.1 euc-jp decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {{fatal: boolean}} options
- */
- function EUCJPDecoder(options) {
- var fatal = options.fatal;
-
- // euc-jp's decoder has an associated euc-jp jis0212 flag
- // (initially unset) and euc-jp lead (initially 0x00).
- var /** @type {boolean} */ eucjp_jis0212_flag = false,
- /** @type {number} */ eucjp_lead = 0x00;
-
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set
- // euc-jp lead to 0x00, and return error.
- if (bite === end_of_stream && eucjp_lead !== 0x00) {
- eucjp_lead = 0x00;
- return decoderError(fatal);
- }
-
- // 2. If byte is end-of-stream and euc-jp lead is 0x00, return
- // finished.
- if (bite === end_of_stream && eucjp_lead === 0x00)
- return finished;
-
- // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to
- // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code
- // point whose value is 0xFF61 − 0xA1 + byte.
- if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) {
- eucjp_lead = 0x00;
- return 0xFF61 - 0xA1 + bite;
- }
-
- // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to
- // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead
- // to byte, and return continue.
- if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) {
- eucjp_jis0212_flag = true;
- eucjp_lead = bite;
- return null;
- }
-
- // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set
- // euc-jp lead to 0x00, and run these substeps:
- if (eucjp_lead !== 0x00) {
- var lead = eucjp_lead;
- eucjp_lead = 0x00;
-
- // 1. Let code point be null.
- var code_point = null;
-
- // 2. If lead and byte are both in the range 0xA1 to 0xFE,
- // inclusive, set code point to the index code point for (lead
- // − 0xA1) × 94 + byte − 0xA1 in index jis0208 if the euc-jp
- // jis0212 flag is unset and in index jis0212 otherwise.
- if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {
- code_point = indexCodePointFor(
- (lead - 0xA1) * 94 + (bite - 0xA1),
- index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212'));
- }
-
- // 3. Unset the euc-jp jis0212 flag.
- eucjp_jis0212_flag = false;
-
- // 4. If byte is not in the range 0xA1 to 0xFE, inclusive,
- // prepend byte to stream.
- if (!inRange(bite, 0xA1, 0xFE))
- stream.prepend(bite);
-
- // 5. If code point is null, return error.
- if (code_point === null)
- return decoderError(fatal);
-
- // 6. Return a code point whose value is code point.
- return code_point;
- }
-
- // 6. If byte is an ASCII byte, return a code point whose value
- // is byte.
- if (isASCIIByte(bite))
- return bite;
-
- // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE,
- // inclusive, set euc-jp lead to byte and return continue.
- if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) {
- eucjp_lead = bite;
- return null;
- }
-
- // 8. Return error.
- return decoderError(fatal);
- };
- }
-
- // 13.1.2 euc-jp encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {{fatal: boolean}} options
- */
- function EUCJPEncoder(options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is an ASCII code point, return a byte whose
- // value is code point.
- if (isASCIICodePoint(code_point))
- return code_point;
-
- // 3. If code point is U+00A5, return byte 0x5C.
- if (code_point === 0x00A5)
- return 0x5C;
-
- // 4. If code point is U+203E, return byte 0x7E.
- if (code_point === 0x203E)
- return 0x7E;
-
- // 5. If code point is in the range U+FF61 to U+FF9F, inclusive,
- // return two bytes whose values are 0x8E and code point −
- // 0xFF61 + 0xA1.
- if (inRange(code_point, 0xFF61, 0xFF9F))
- return [0x8E, code_point - 0xFF61 + 0xA1];
-
- // 6. If code point is U+2212, set it to U+FF0D.
- if (code_point === 0x2212)
- code_point = 0xFF0D;
-
- // 7. Let pointer be the index pointer for code point in index
- // jis0208.
- var pointer = indexPointerFor(code_point, index('jis0208'));
-
- // 8. If pointer is null, return error with code point.
- if (pointer === null)
- return encoderError(code_point);
-
- // 9. Let lead be floor(pointer / 94) + 0xA1.
- var lead = floor(pointer / 94) + 0xA1;
-
- // 10. Let trail be pointer % 94 + 0xA1.
- var trail = pointer % 94 + 0xA1;
-
- // 11. Return two bytes whose values are lead and trail.
- return [lead, trail];
- };
- }
-
- /** @param {{fatal: boolean}} options */
- encoders['EUC-JP'] = function(options) {
- return new EUCJPEncoder(options);
- };
- /** @param {{fatal: boolean}} options */
- decoders['EUC-JP'] = function(options) {
- return new EUCJPDecoder(options);
- };
-
- // 13.2 iso-2022-jp
-
- // 13.2.1 iso-2022-jp decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {{fatal: boolean}} options
- */
- function ISO2022JPDecoder(options) {
- var fatal = options.fatal;
- /** @enum */
- var states = {
- ASCII: 0,
- Roman: 1,
- Katakana: 2,
- LeadByte: 3,
- TrailByte: 4,
- EscapeStart: 5,
- Escape: 6
- };
- // iso-2022-jp's decoder has an associated iso-2022-jp decoder
- // state (initially ASCII), iso-2022-jp decoder output state
- // (initially ASCII), iso-2022-jp lead (initially 0x00), and
- // iso-2022-jp output flag (initially unset).
- var /** @type {number} */ iso2022jp_decoder_state = states.ASCII,
- /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII,
- /** @type {number} */ iso2022jp_lead = 0x00,
- /** @type {boolean} */ iso2022jp_output_flag = false;
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // switching on iso-2022-jp decoder state:
- switch (iso2022jp_decoder_state) {
- default:
- case states.ASCII:
- // ASCII
- // Based on byte:
-
- // 0x1B
- if (bite === 0x1B) {
- // Set iso-2022-jp decoder state to escape start and return
- // continue.
- iso2022jp_decoder_state = states.EscapeStart;
- return null;
- }
-
- // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B
- if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E
- && bite !== 0x0F && bite !== 0x1B) {
- // Unset the iso-2022-jp output flag and return a code point
- // whose value is byte.
- iso2022jp_output_flag = false;
- return bite;
- }
-
- // end-of-stream
- if (bite === end_of_stream) {
- // Return finished.
- return finished;
- }
-
- // Otherwise
- // Unset the iso-2022-jp output flag and return error.
- iso2022jp_output_flag = false;
- return decoderError(fatal);
-
- case states.Roman:
- // Roman
- // Based on byte:
-
- // 0x1B
- if (bite === 0x1B) {
- // Set iso-2022-jp decoder state to escape start and return
- // continue.
- iso2022jp_decoder_state = states.EscapeStart;
- return null;
- }
-
- // 0x5C
- if (bite === 0x5C) {
- // Unset the iso-2022-jp output flag and return code point
- // U+00A5.
- iso2022jp_output_flag = false;
- return 0x00A5;
- }
-
- // 0x7E
- if (bite === 0x7E) {
- // Unset the iso-2022-jp output flag and return code point
- // U+203E.
- iso2022jp_output_flag = false;
- return 0x203E;
- }
-
- // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E
- if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F
- && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) {
- // Unset the iso-2022-jp output flag and return a code point
- // whose value is byte.
- iso2022jp_output_flag = false;
- return bite;
- }
-
- // end-of-stream
- if (bite === end_of_stream) {
- // Return finished.
- return finished;
- }
-
- // Otherwise
- // Unset the iso-2022-jp output flag and return error.
- iso2022jp_output_flag = false;
- return decoderError(fatal);
-
- case states.Katakana:
- // Katakana
- // Based on byte:
-
- // 0x1B
- if (bite === 0x1B) {
- // Set iso-2022-jp decoder state to escape start and return
- // continue.
- iso2022jp_decoder_state = states.EscapeStart;
- return null;
- }
-
- // 0x21 to 0x5F
- if (inRange(bite, 0x21, 0x5F)) {
- // Unset the iso-2022-jp output flag and return a code point
- // whose value is 0xFF61 − 0x21 + byte.
- iso2022jp_output_flag = false;
- return 0xFF61 - 0x21 + bite;
- }
-
- // end-of-stream
- if (bite === end_of_stream) {
- // Return finished.
- return finished;
- }
-
- // Otherwise
- // Unset the iso-2022-jp output flag and return error.
- iso2022jp_output_flag = false;
- return decoderError(fatal);
-
- case states.LeadByte:
- // Lead byte
- // Based on byte:
-
- // 0x1B
- if (bite === 0x1B) {
- // Set iso-2022-jp decoder state to escape start and return
- // continue.
- iso2022jp_decoder_state = states.EscapeStart;
- return null;
- }
-
- // 0x21 to 0x7E
- if (inRange(bite, 0x21, 0x7E)) {
- // Unset the iso-2022-jp output flag, set iso-2022-jp lead
- // to byte, iso-2022-jp decoder state to trail byte, and
- // return continue.
- iso2022jp_output_flag = false;
- iso2022jp_lead = bite;
- iso2022jp_decoder_state = states.TrailByte;
- return null;
- }
-
- // end-of-stream
- if (bite === end_of_stream) {
- // Return finished.
- return finished;
- }
-
- // Otherwise
- // Unset the iso-2022-jp output flag and return error.
- iso2022jp_output_flag = false;
- return decoderError(fatal);
-
- case states.TrailByte:
- // Trail byte
- // Based on byte:
-
- // 0x1B
- if (bite === 0x1B) {
- // Set iso-2022-jp decoder state to escape start and return
- // continue.
- iso2022jp_decoder_state = states.EscapeStart;
- return decoderError(fatal);
- }
-
- // 0x21 to 0x7E
- if (inRange(bite, 0x21, 0x7E)) {
- // 1. Set the iso-2022-jp decoder state to lead byte.
- iso2022jp_decoder_state = states.LeadByte;
-
- // 2. Let pointer be (iso-2022-jp lead − 0x21) × 94 + byte − 0x21.
- var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21;
-
- // 3. Let code point be the index code point for pointer in
- // index jis0208.
- var code_point = indexCodePointFor(pointer, index('jis0208'));
-
- // 4. If code point is null, return error.
- if (code_point === null)
- return decoderError(fatal);
-
- // 5. Return a code point whose value is code point.
- return code_point;
- }
-
- // end-of-stream
- if (bite === end_of_stream) {
- // Set the iso-2022-jp decoder state to lead byte, prepend
- // byte to stream, and return error.
- iso2022jp_decoder_state = states.LeadByte;
- stream.prepend(bite);
- return decoderError(fatal);
- }
-
- // Otherwise
- // Set iso-2022-jp decoder state to lead byte and return
- // error.
- iso2022jp_decoder_state = states.LeadByte;
- return decoderError(fatal);
-
- case states.EscapeStart:
- // Escape start
-
- // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to
- // byte, iso-2022-jp decoder state to escape, and return
- // continue.
- if (bite === 0x24 || bite === 0x28) {
- iso2022jp_lead = bite;
- iso2022jp_decoder_state = states.Escape;
- return null;
- }
-
- // 2. Prepend byte to stream.
- stream.prepend(bite);
-
- // 3. Unset the iso-2022-jp output flag, set iso-2022-jp
- // decoder state to iso-2022-jp decoder output state, and
- // return error.
- iso2022jp_output_flag = false;
- iso2022jp_decoder_state = iso2022jp_decoder_output_state;
- return decoderError(fatal);
-
- case states.Escape:
- // Escape
-
- // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to
- // 0x00.
- var lead = iso2022jp_lead;
- iso2022jp_lead = 0x00;
-
- // 2. Let state be null.
- var state = null;
-
- // 3. If lead is 0x28 and byte is 0x42, set state to ASCII.
- if (lead === 0x28 && bite === 0x42)
- state = states.ASCII;
-
- // 4. If lead is 0x28 and byte is 0x4A, set state to Roman.
- if (lead === 0x28 && bite === 0x4A)
- state = states.Roman;
-
- // 5. If lead is 0x28 and byte is 0x49, set state to Katakana.
- if (lead === 0x28 && bite === 0x49)
- state = states.Katakana;
-
- // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set
- // state to lead byte.
- if (lead === 0x24 && (bite === 0x40 || bite === 0x42))
- state = states.LeadByte;
-
- // 7. If state is non-null, run these substeps:
- if (state !== null) {
- // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder
- // output state to states.
- iso2022jp_decoder_state = iso2022jp_decoder_state = state;
-
- // 2. Let output flag be the iso-2022-jp output flag.
- var output_flag = iso2022jp_output_flag;
-
- // 3. Set the iso-2022-jp output flag.
- iso2022jp_output_flag = true;
-
- // 4. Return continue, if output flag is unset, and error
- // otherwise.
- return !output_flag ? null : decoderError(fatal);
- }
-
- // 8. Prepend lead and byte to stream.
- stream.prepend([lead, bite]);
-
- // 9. Unset the iso-2022-jp output flag, set iso-2022-jp
- // decoder state to iso-2022-jp decoder output state and
- // return error.
- iso2022jp_output_flag = false;
- iso2022jp_decoder_state = iso2022jp_decoder_output_state;
- return decoderError(fatal);
- }
- };
- }
-
- // 13.2.2 iso-2022-jp encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {{fatal: boolean}} options
- */
- function ISO2022JPEncoder(options) {
- var fatal = options.fatal;
- // iso-2022-jp's encoder has an associated iso-2022-jp encoder
- // state which is one of ASCII, Roman, and jis0208 (initially
- // ASCII).
- /** @enum */
- var states = {
- ASCII: 0,
- Roman: 1,
- jis0208: 2
- };
- var /** @type {number} */ iso2022jp_state = states.ASCII;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream and iso-2022-jp encoder
- // state is not ASCII, prepend code point to stream, set
- // iso-2022-jp encoder state to ASCII, and return three bytes
- // 0x1B 0x28 0x42.
- if (code_point === end_of_stream &&
- iso2022jp_state !== states.ASCII) {
- stream.prepend(code_point);
- iso2022jp_state = states.ASCII;
- return [0x1B, 0x28, 0x42];
- }
-
- // 2. If code point is end-of-stream and iso-2022-jp encoder
- // state is ASCII, return finished.
- if (code_point === end_of_stream && iso2022jp_state === states.ASCII)
- return finished;
-
- // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code
- // point is U+000E, U+000F, or U+001B, return error with U+FFFD.
- if ((iso2022jp_state === states.ASCII ||
- iso2022jp_state === states.Roman) &&
- (code_point === 0x000E || code_point === 0x000F ||
- code_point === 0x001B)) {
- return encoderError(0xFFFD);
- }
-
- // 4. If iso-2022-jp encoder state is ASCII and code point is an
- // ASCII code point, return a byte whose value is code point.
- if (iso2022jp_state === states.ASCII &&
- isASCIICodePoint(code_point))
- return code_point;
-
- // 5. If iso-2022-jp encoder state is Roman and code point is an
- // ASCII code point, excluding U+005C and U+007E, or is U+00A5
- // or U+203E, run these substeps:
- if (iso2022jp_state === states.Roman &&
- ((isASCIICodePoint(code_point) &&
- code_point !== 0x005C && code_point !== 0x007E) ||
- (code_point == 0x00A5 || code_point == 0x203E))) {
-
- // 1. If code point is an ASCII code point, return a byte
- // whose value is code point.
- if (isASCIICodePoint(code_point))
- return code_point;
-
- // 2. If code point is U+00A5, return byte 0x5C.
- if (code_point === 0x00A5)
- return 0x5C;
-
- // 3. If code point is U+203E, return byte 0x7E.
- if (code_point === 0x203E)
- return 0x7E;
- }
-
- // 6. If code point is an ASCII code point, and iso-2022-jp
- // encoder state is not ASCII, prepend code point to stream, set
- // iso-2022-jp encoder state to ASCII, and return three bytes
- // 0x1B 0x28 0x42.
- if (isASCIICodePoint(code_point) &&
- iso2022jp_state !== states.ASCII) {
- stream.prepend(code_point);
- iso2022jp_state = states.ASCII;
- return [0x1B, 0x28, 0x42];
- }
-
- // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp
- // encoder state is not Roman, prepend code point to stream, set
- // iso-2022-jp encoder state to Roman, and return three bytes
- // 0x1B 0x28 0x4A.
- if ((code_point === 0x00A5 || code_point === 0x203E) &&
- iso2022jp_state !== states.Roman) {
- stream.prepend(code_point);
- iso2022jp_state = states.Roman;
- return [0x1B, 0x28, 0x4A];
- }
-
- // 8. If code point is U+2212, set it to U+FF0D.
- if (code_point === 0x2212)
- code_point = 0xFF0D;
-
- // 9. Let pointer be the index pointer for code point in index
- // jis0208.
- var pointer = indexPointerFor(code_point, index('jis0208'));
-
- // 10. If pointer is null, return error with code point.
- if (pointer === null)
- return encoderError(code_point);
-
- // 11. If iso-2022-jp encoder state is not jis0208, prepend code
- // point to stream, set iso-2022-jp encoder state to jis0208,
- // and return three bytes 0x1B 0x24 0x42.
- if (iso2022jp_state !== states.jis0208) {
- stream.prepend(code_point);
- iso2022jp_state = states.jis0208;
- return [0x1B, 0x24, 0x42];
- }
-
- // 12. Let lead be floor(pointer / 94) + 0x21.
- var lead = floor(pointer / 94) + 0x21;
-
- // 13. Let trail be pointer % 94 + 0x21.
- var trail = pointer % 94 + 0x21;
-
- // 14. Return two bytes whose values are lead and trail.
- return [lead, trail];
- };
- }
-
- /** @param {{fatal: boolean}} options */
- encoders['ISO-2022-JP'] = function(options) {
- return new ISO2022JPEncoder(options);
- };
- /** @param {{fatal: boolean}} options */
- decoders['ISO-2022-JP'] = function(options) {
- return new ISO2022JPDecoder(options);
- };
-
- // 13.3 Shift_JIS
-
- // 13.3.1 Shift_JIS decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {{fatal: boolean}} options
- */
- function ShiftJISDecoder(options) {
- var fatal = options.fatal;
- // Shift_JIS's decoder has an associated Shift_JIS lead (initially
- // 0x00).
- var /** @type {number} */ Shift_JIS_lead = 0x00;
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00,
- // set Shift_JIS lead to 0x00 and return error.
- if (bite === end_of_stream && Shift_JIS_lead !== 0x00) {
- Shift_JIS_lead = 0x00;
- return decoderError(fatal);
- }
-
- // 2. If byte is end-of-stream and Shift_JIS lead is 0x00,
- // return finished.
- if (bite === end_of_stream && Shift_JIS_lead === 0x00)
- return finished;
-
- // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead,
- // let pointer be null, set Shift_JIS lead to 0x00, and then run
- // these substeps:
- if (Shift_JIS_lead !== 0x00) {
- var lead = Shift_JIS_lead;
- var pointer = null;
- Shift_JIS_lead = 0x00;
-
- // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41
- // otherwise.
- var offset = (bite < 0x7F) ? 0x40 : 0x41;
-
- // 2. Let lead offset be 0x81, if lead is less than 0xA0, and
- // 0xC1 otherwise.
- var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1;
-
- // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80
- // to 0xFC, inclusive, set pointer to (lead − lead offset) ×
- // 188 + byte − offset.
- if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC))
- pointer = (lead - lead_offset) * 188 + bite - offset;
-
- // 4. If pointer is in the range 8836 to 10715, inclusive,
- // return a code point whose value is 0xE000 − 8836 + pointer.
- if (inRange(pointer, 8836, 10715))
- return 0xE000 - 8836 + pointer;
-
- // 5. Let code point be null, if pointer is null, and the
- // index code point for pointer in index jis0208 otherwise.
- var code_point = (pointer === null) ? null :
- indexCodePointFor(pointer, index('jis0208'));
-
- // 6. If code point is null and byte is an ASCII byte, prepend
- // byte to stream.
- if (code_point === null && isASCIIByte(bite))
- stream.prepend(bite);
-
- // 7. If code point is null, return error.
- if (code_point === null)
- return decoderError(fatal);
-
- // 8. Return a code point whose value is code point.
- return code_point;
- }
-
- // 4. If byte is an ASCII byte or 0x80, return a code point
- // whose value is byte.
- if (isASCIIByte(bite) || bite === 0x80)
- return bite;
-
- // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a
- // code point whose value is 0xFF61 − 0xA1 + byte.
- if (inRange(bite, 0xA1, 0xDF))
- return 0xFF61 - 0xA1 + bite;
-
- // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0
- // to 0xFC, inclusive, set Shift_JIS lead to byte and return
- // continue.
- if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) {
- Shift_JIS_lead = bite;
- return null;
- }
-
- // 7. Return error.
- return decoderError(fatal);
- };
- }
-
- // 13.3.2 Shift_JIS encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {{fatal: boolean}} options
- */
- function ShiftJISEncoder(options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is an ASCII code point or U+0080, return a
- // byte whose value is code point.
- if (isASCIICodePoint(code_point) || code_point === 0x0080)
- return code_point;
-
- // 3. If code point is U+00A5, return byte 0x5C.
- if (code_point === 0x00A5)
- return 0x5C;
-
- // 4. If code point is U+203E, return byte 0x7E.
- if (code_point === 0x203E)
- return 0x7E;
-
- // 5. If code point is in the range U+FF61 to U+FF9F, inclusive,
- // return a byte whose value is code point − 0xFF61 + 0xA1.
- if (inRange(code_point, 0xFF61, 0xFF9F))
- return code_point - 0xFF61 + 0xA1;
-
- // 6. If code point is U+2212, set it to U+FF0D.
- if (code_point === 0x2212)
- code_point = 0xFF0D;
-
- // 7. Let pointer be the index Shift_JIS pointer for code point.
- var pointer = indexShiftJISPointerFor(code_point);
-
- // 8. If pointer is null, return error with code point.
- if (pointer === null)
- return encoderError(code_point);
-
- // 9. Let lead be floor(pointer / 188).
- var lead = floor(pointer / 188);
-
- // 10. Let lead offset be 0x81, if lead is less than 0x1F, and
- // 0xC1 otherwise.
- var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1;
-
- // 11. Let trail be pointer % 188.
- var trail = pointer % 188;
-
- // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41
- // otherwise.
- var offset = (trail < 0x3F) ? 0x40 : 0x41;
-
- // 13. Return two bytes whose values are lead + lead offset and
- // trail + offset.
- return [lead + lead_offset, trail + offset];
- };
- }
-
- /** @param {{fatal: boolean}} options */
- encoders['Shift_JIS'] = function(options) {
- return new ShiftJISEncoder(options);
- };
- /** @param {{fatal: boolean}} options */
- decoders['Shift_JIS'] = function(options) {
- return new ShiftJISDecoder(options);
- };
-
- //
- // 14. Legacy multi-byte Korean encodings
- //
-
- // 14.1 euc-kr
-
- // 14.1.1 euc-kr decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {{fatal: boolean}} options
- */
- function EUCKRDecoder(options) {
- var fatal = options.fatal;
-
- // euc-kr's decoder has an associated euc-kr lead (initially 0x00).
- var /** @type {number} */ euckr_lead = 0x00;
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set
- // euc-kr lead to 0x00 and return error.
- if (bite === end_of_stream && euckr_lead !== 0) {
- euckr_lead = 0x00;
- return decoderError(fatal);
- }
-
- // 2. If byte is end-of-stream and euc-kr lead is 0x00, return
- // finished.
- if (bite === end_of_stream && euckr_lead === 0)
- return finished;
-
- // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let
- // pointer be null, set euc-kr lead to 0x00, and then run these
- // substeps:
- if (euckr_lead !== 0x00) {
- var lead = euckr_lead;
- var pointer = null;
- euckr_lead = 0x00;
-
- // 1. If byte is in the range 0x41 to 0xFE, inclusive, set
- // pointer to (lead − 0x81) × 190 + (byte − 0x41).
- if (inRange(bite, 0x41, 0xFE))
- pointer = (lead - 0x81) * 190 + (bite - 0x41);
-
- // 2. Let code point be null, if pointer is null, and the
- // index code point for pointer in index euc-kr otherwise.
- var code_point = (pointer === null)
- ? null : indexCodePointFor(pointer, index('euc-kr'));
-
- // 3. If code point is null and byte is an ASCII byte, prepend
- // byte to stream.
- if (pointer === null && isASCIIByte(bite))
- stream.prepend(bite);
-
- // 4. If code point is null, return error.
- if (code_point === null)
- return decoderError(fatal);
-
- // 5. Return a code point whose value is code point.
- return code_point;
- }
-
- // 4. If byte is an ASCII byte, return a code point whose value
- // is byte.
- if (isASCIIByte(bite))
- return bite;
-
- // 5. If byte is in the range 0x81 to 0xFE, inclusive, set
- // euc-kr lead to byte and return continue.
- if (inRange(bite, 0x81, 0xFE)) {
- euckr_lead = bite;
- return null;
- }
-
- // 6. Return error.
- return decoderError(fatal);
- };
- }
-
- // 14.1.2 euc-kr encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {{fatal: boolean}} options
- */
- function EUCKREncoder(options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is an ASCII code point, return a byte whose
- // value is code point.
- if (isASCIICodePoint(code_point))
- return code_point;
-
- // 3. Let pointer be the index pointer for code point in index
- // euc-kr.
- var pointer = indexPointerFor(code_point, index('euc-kr'));
-
- // 4. If pointer is null, return error with code point.
- if (pointer === null)
- return encoderError(code_point);
-
- // 5. Let lead be floor(pointer / 190) + 0x81.
- var lead = floor(pointer / 190) + 0x81;
-
- // 6. Let trail be pointer % 190 + 0x41.
- var trail = (pointer % 190) + 0x41;
-
- // 7. Return two bytes whose values are lead and trail.
- return [lead, trail];
- };
- }
-
- /** @param {{fatal: boolean}} options */
- encoders['EUC-KR'] = function(options) {
- return new EUCKREncoder(options);
- };
- /** @param {{fatal: boolean}} options */
- decoders['EUC-KR'] = function(options) {
- return new EUCKRDecoder(options);
- };
-
-
- //
- // 15. Legacy miscellaneous encodings
- //
-
- // 15.1 replacement
-
- // Not needed - API throws RangeError
-
- // 15.2 Common infrastructure for utf-16be and utf-16le
-
- /**
- * @param {number} code_unit
- * @param {boolean} utf16be
- * @return {!Array.<number>} bytes
- */
- function convertCodeUnitToBytes(code_unit, utf16be) {
- // 1. Let byte1 be code unit >> 8.
- var byte1 = code_unit >> 8;
-
- // 2. Let byte2 be code unit & 0x00FF.
- var byte2 = code_unit & 0x00FF;
-
- // 3. Then return the bytes in order:
- // utf-16be flag is set: byte1, then byte2.
- if (utf16be)
- return [byte1, byte2];
- // utf-16be flag is unset: byte2, then byte1.
- return [byte2, byte1];
- }
-
- // 15.2.1 shared utf-16 decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {boolean} utf16_be True if big-endian, false if little-endian.
- * @param {{fatal: boolean}} options
- */
- function UTF16Decoder(utf16_be, options) {
- var fatal = options.fatal;
- var /** @type {?number} */ utf16_lead_byte = null,
- /** @type {?number} */ utf16_lead_surrogate = null;
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream and either utf-16 lead byte or
- // utf-16 lead surrogate is not null, set utf-16 lead byte and
- // utf-16 lead surrogate to null, and return error.
- if (bite === end_of_stream && (utf16_lead_byte !== null ||
- utf16_lead_surrogate !== null)) {
- return decoderError(fatal);
- }
-
- // 2. If byte is end-of-stream and utf-16 lead byte and utf-16
- // lead surrogate are null, return finished.
- if (bite === end_of_stream && utf16_lead_byte === null &&
- utf16_lead_surrogate === null) {
- return finished;
- }
-
- // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte
- // and return continue.
- if (utf16_lead_byte === null) {
- utf16_lead_byte = bite;
- return null;
- }
-
- // 4. Let code unit be the result of:
- var code_unit;
- if (utf16_be) {
- // utf-16be decoder flag is set
- // (utf-16 lead byte << 8) + byte.
- code_unit = (utf16_lead_byte << 8) + bite;
- } else {
- // utf-16be decoder flag is unset
- // (byte << 8) + utf-16 lead byte.
- code_unit = (bite << 8) + utf16_lead_byte;
- }
- // Then set utf-16 lead byte to null.
- utf16_lead_byte = null;
-
- // 5. If utf-16 lead surrogate is not null, let lead surrogate
- // be utf-16 lead surrogate, set utf-16 lead surrogate to null,
- // and then run these substeps:
- if (utf16_lead_surrogate !== null) {
- var lead_surrogate = utf16_lead_surrogate;
- utf16_lead_surrogate = null;
-
- // 1. If code unit is in the range U+DC00 to U+DFFF,
- // inclusive, return a code point whose value is 0x10000 +
- // ((lead surrogate − 0xD800) << 10) + (code unit − 0xDC00).
- if (inRange(code_unit, 0xDC00, 0xDFFF)) {
- return 0x10000 + (lead_surrogate - 0xD800) * 0x400 +
- (code_unit - 0xDC00);
- }
-
- // 2. Prepend the sequence resulting of converting code unit
- // to bytes using utf-16be decoder flag to stream and return
- // error.
- stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be));
- return decoderError(fatal);
- }
-
- // 6. If code unit is in the range U+D800 to U+DBFF, inclusive,
- // set utf-16 lead surrogate to code unit and return continue.
- if (inRange(code_unit, 0xD800, 0xDBFF)) {
- utf16_lead_surrogate = code_unit;
- return null;
- }
-
- // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive,
- // return error.
- if (inRange(code_unit, 0xDC00, 0xDFFF))
- return decoderError(fatal);
-
- // 8. Return code point code unit.
- return code_unit;
- };
- }
-
- // 15.2.2 shared utf-16 encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {boolean} utf16_be True if big-endian, false if little-endian.
- * @param {{fatal: boolean}} options
- */
- function UTF16Encoder(utf16_be, options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1. If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is in the range U+0000 to U+FFFF, inclusive,
- // return the sequence resulting of converting code point to
- // bytes using utf-16be encoder flag.
- if (inRange(code_point, 0x0000, 0xFFFF))
- return convertCodeUnitToBytes(code_point, utf16_be);
-
- // 3. Let lead be ((code point − 0x10000) >> 10) + 0xD800,
- // converted to bytes using utf-16be encoder flag.
- var lead = convertCodeUnitToBytes(
- ((code_point - 0x10000) >> 10) + 0xD800, utf16_be);
-
- // 4. Let trail be ((code point − 0x10000) & 0x3FF) + 0xDC00,
- // converted to bytes using utf-16be encoder flag.
- var trail = convertCodeUnitToBytes(
- ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be);
-
- // 5. Return a byte sequence of lead followed by trail.
- return lead.concat(trail);
- };
- }
-
- // 15.3 utf-16be
- // 15.3.1 utf-16be decoder
- /** @param {{fatal: boolean}} options */
- encoders['UTF-16BE'] = function(options) {
- return new UTF16Encoder(true, options);
- };
- // 15.3.2 utf-16be encoder
- /** @param {{fatal: boolean}} options */
- decoders['UTF-16BE'] = function(options) {
- return new UTF16Decoder(true, options);
- };
-
- // 15.4 utf-16le
- // 15.4.1 utf-16le decoder
- /** @param {{fatal: boolean}} options */
- encoders['UTF-16LE'] = function(options) {
- return new UTF16Encoder(false, options);
- };
- // 15.4.2 utf-16le encoder
- /** @param {{fatal: boolean}} options */
- decoders['UTF-16LE'] = function(options) {
- return new UTF16Decoder(false, options);
- };
-
- // 15.5 x-user-defined
-
- // 15.5.1 x-user-defined decoder
- /**
- * @constructor
- * @implements {Decoder}
- * @param {{fatal: boolean}} options
- */
- function XUserDefinedDecoder(options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream The stream of bytes being decoded.
- * @param {number} bite The next byte read from the stream.
- * @return {?(number|!Array.<number>)} The next code point(s)
- * decoded, or null if not enough data exists in the input
- * stream to decode a complete code point.
- */
- this.handler = function(stream, bite) {
- // 1. If byte is end-of-stream, return finished.
- if (bite === end_of_stream)
- return finished;
-
- // 2. If byte is an ASCII byte, return a code point whose value
- // is byte.
- if (isASCIIByte(bite))
- return bite;
-
- // 3. Return a code point whose value is 0xF780 + byte − 0x80.
- return 0xF780 + bite - 0x80;
- };
- }
-
- // 15.5.2 x-user-defined encoder
- /**
- * @constructor
- * @implements {Encoder}
- * @param {{fatal: boolean}} options
- */
- function XUserDefinedEncoder(options) {
- var fatal = options.fatal;
- /**
- * @param {Stream} stream Input stream.
- * @param {number} code_point Next code point read from the stream.
- * @return {(number|!Array.<number>)} Byte(s) to emit.
- */
- this.handler = function(stream, code_point) {
- // 1.If code point is end-of-stream, return finished.
- if (code_point === end_of_stream)
- return finished;
-
- // 2. If code point is an ASCII code point, return a byte whose
- // value is code point.
- if (isASCIICodePoint(code_point))
- return code_point;
-
- // 3. If code point is in the range U+F780 to U+F7FF, inclusive,
- // return a byte whose value is code point − 0xF780 + 0x80.
- if (inRange(code_point, 0xF780, 0xF7FF))
- return code_point - 0xF780 + 0x80;
-
- // 4. Return error with code point.
- return encoderError(code_point);
- };
- }
-
- /** @param {{fatal: boolean}} options */
- encoders['x-user-defined'] = function(options) {
- return new XUserDefinedEncoder(options);
- };
- /** @param {{fatal: boolean}} options */
- decoders['x-user-defined'] = function(options) {
- return new XUserDefinedDecoder(options);
- };
-
- if (!global['TextEncoder'])
- global['TextEncoder'] = TextEncoder;
- if (!global['TextDecoder'])
- global['TextDecoder'] = TextDecoder;
-
- if (typeof module !== "undefined" && module.exports) {
- module.exports = {
- TextEncoder: global['TextEncoder'],
- TextDecoder: global['TextDecoder'],
- EncodingIndexes: global["encoding-indexes"]
- };
- }
-}(this));
diff --git a/vendor/assets/javascripts/xterm/fit.js b/vendor/assets/javascripts/xterm/fit.js
deleted file mode 100644
index 55438452cad..00000000000
--- a/vendor/assets/javascripts/xterm/fit.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Fit terminal columns and rows to the dimensions of its
- * DOM element.
- *
- * Approach:
- * - Rows: Truncate the division of the terminal parent element height
- * by the terminal row height
- *
- * - Columns: Truncate the division of the terminal parent element width by
- * the terminal character width (apply display: inline at the
- * terminal row and truncate its width with the current number
- * of columns)
- */
-(function (fit) {
- if (typeof exports === 'object' && typeof module === 'object') {
- /*
- * CommonJS environment
- */
- module.exports = fit(require('./xterm'));
- } else if (typeof define == 'function') {
- /*
- * Require.js is available
- */
- define(['./xterm'], fit);
- } else {
- /*
- * Plain browser environment
- */
- fit(window.Terminal);
- }
-})(function (Xterm) {
- /**
- * This module provides methods for fitting a terminal's size to a parent container.
- *
- * @module xterm/addons/fit/fit
- */
- var exports = {};
-
- exports.proposeGeometry = function (term) {
- var parentElementStyle = window.getComputedStyle(term.element.parentElement),
- parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')),
- parentElementWidth = parseInt(parentElementStyle.getPropertyValue('width')),
- elementStyle = window.getComputedStyle(term.element),
- elementPaddingVer = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')),
- elementPaddingHor = parseInt(elementStyle.getPropertyValue('padding-right')) + parseInt(elementStyle.getPropertyValue('padding-left')),
- availableHeight = parentElementHeight - elementPaddingVer,
- availableWidth = parentElementWidth - elementPaddingHor,
- container = term.rowContainer,
- subjectRow = term.rowContainer.firstElementChild,
- contentBuffer = subjectRow.innerHTML,
- characterHeight,
- rows,
- characterWidth,
- cols,
- geometry;
-
- subjectRow.style.display = 'inline';
- subjectRow.innerHTML = 'W'; // Common character for measuring width, although on monospace
- characterWidth = subjectRow.getBoundingClientRect().width;
- subjectRow.style.display = ''; // Revert style before calculating height, since they differ.
- characterHeight = parseInt(subjectRow.offsetHeight);
- subjectRow.innerHTML = contentBuffer;
-
- rows = parseInt(availableHeight / characterHeight);
- cols = parseInt(availableWidth / characterWidth) - 1;
-
- geometry = {cols: cols, rows: rows};
- return geometry;
- };
-
- exports.fit = function (term) {
- var geometry = exports.proposeGeometry(term);
-
- term.resize(geometry.cols, geometry.rows);
- };
-
- Xterm.prototype.proposeGeometry = function () {
- return exports.proposeGeometry(this);
- };
-
- Xterm.prototype.fit = function () {
- return exports.fit(this);
- };
-
- return exports;
-});
diff --git a/vendor/assets/javascripts/xterm/xterm.js b/vendor/assets/javascripts/xterm/xterm.js
deleted file mode 100644
index 11ce3c73db9..00000000000
--- a/vendor/assets/javascripts/xterm/xterm.js
+++ /dev/null
@@ -1,2235 +0,0 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Terminal = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-/**
- * xterm.js: xterm, in the browser
- * Copyright (c) 2014-2016, SourceLair Private Company (www.sourcelair.com (MIT License)
- */
-
-/**
- * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend
- * events, displaying the in-progress composition to the UI and forwarding the final composition
- * to the handler.
- * @param {HTMLTextAreaElement} textarea The textarea that xterm uses for input.
- * @param {HTMLElement} compositionView The element to display the in-progress composition in.
- * @param {Terminal} terminal The Terminal to forward the finished composition to.
- */
-function CompositionHelper(textarea, compositionView, terminal) {
- this.textarea = textarea;
- this.compositionView = compositionView;
- this.terminal = terminal;
-
- // Whether input composition is currently happening, eg. via a mobile keyboard, speech input
- // or IME. This variable determines whether the compositionText should be displayed on the UI.
- this.isComposing = false;
-
- // The input currently being composed, eg. via a mobile keyboard, speech input or IME.
- this.compositionText = null;
-
- // The position within the input textarea's value of the current composition.
- this.compositionPosition = { start: null, end: null };
-
- // Whether a composition is in the process of being sent, setting this to false will cancel
- // any in-progress composition.
- this.isSendingComposition = false;
-}
-
-/**
- * Handles the compositionstart event, activating the composition view.
- */
-CompositionHelper.prototype.compositionstart = function () {
- this.isComposing = true;
- this.compositionPosition.start = this.textarea.value.length;
- this.compositionView.textContent = '';
- this.compositionView.classList.add('active');
-};
-
-/**
- * Handles the compositionupdate event, updating the composition view.
- * @param {CompositionEvent} ev The event.
- */
-CompositionHelper.prototype.compositionupdate = function (ev) {
- this.compositionView.textContent = ev.data;
- this.updateCompositionElements();
- var self = this;
- setTimeout(function () {
- self.compositionPosition.end = self.textarea.value.length;
- }, 0);
-};
-
-/**
- * Handles the compositionend event, hiding the composition view and sending the composition to
- * the handler.
- */
-CompositionHelper.prototype.compositionend = function () {
- this.finalizeComposition(true);
-};
-
-/**
- * Handles the keydown event, routing any necessary events to the CompositionHelper functions.
- * @return Whether the Terminal should continue processing the keydown event.
- */
-CompositionHelper.prototype.keydown = function (ev) {
- if (this.isComposing || this.isSendingComposition) {
- if (ev.keyCode === 229) {
- // Continue composing if the keyCode is the "composition character"
- return false;
- } else if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) {
- // Continue composing if the keyCode is a modifier key
- return false;
- } else {
- // Finish composition immediately. This is mainly here for the case where enter is
- // pressed and the handler needs to be triggered before the command is executed.
- this.finalizeComposition(false);
- }
- }
-
- if (ev.keyCode === 229) {
- // If the "composition character" is used but gets to this point it means a non-composition
- // character (eg. numbers and punctuation) was pressed when the IME was active.
- this.handleAnyTextareaChanges();
- return false;
- }
-
- return true;
-};
-
-/**
- * Finalizes the composition, resuming regular input actions. This is called when a composition
- * is ending.
- * @param {boolean} waitForPropogation Whether to wait for events to propogate before sending
- * the input. This should be false if a non-composition keystroke is entered before the
- * compositionend event is triggered, such as enter, so that the composition is send before
- * the command is executed.
- */
-CompositionHelper.prototype.finalizeComposition = function (waitForPropogation) {
- this.compositionView.classList.remove('active');
- this.isComposing = false;
- this.clearTextareaPosition();
-
- if (!waitForPropogation) {
- // Cancel any delayed composition send requests and send the input immediately.
- this.isSendingComposition = false;
- var input = this.textarea.value.substring(this.compositionPosition.start, this.compositionPosition.end);
- this.terminal.handler(input);
- } else {
- // Make a deep copy of the composition position here as a new compositionstart event may
- // fire before the setTimeout executes.
- var currentCompositionPosition = {
- start: this.compositionPosition.start,
- end: this.compositionPosition.end
- };
-
- // Since composition* events happen before the changes take place in the textarea on most
- // browsers, use a setTimeout with 0ms time to allow the native compositionend event to
- // complete. This ensures the correct character is retrieved, this solution was used
- // because:
- // - The compositionend event's data property is unreliable, at least on Chromium
- // - The last compositionupdate event's data property does not always accurately describe
- // the character, a counter example being Korean where an ending consonsant can move to
- // the following character if the following input is a vowel.
- var self = this;
- this.isSendingComposition = true;
- setTimeout(function () {
- // Ensure that the input has not already been sent
- if (self.isSendingComposition) {
- self.isSendingComposition = false;
- var input;
- if (self.isComposing) {
- // Use the end position to get the string if a new composition has started.
- input = self.textarea.value.substring(currentCompositionPosition.start, currentCompositionPosition.end);
- } else {
- // Don't use the end position here in order to pick up any characters after the
- // composition has finished, for example when typing a non-composition character
- // (eg. 2) after a composition character.
- input = self.textarea.value.substring(currentCompositionPosition.start);
- }
- self.terminal.handler(input);
- }
- }, 0);
- }
-};
-
-/**
- * Apply any changes made to the textarea after the current event chain is allowed to complete.
- * This should be called when not currently composing but a keydown event with the "composition
- * character" (229) is triggered, in order to allow non-composition text to be entered when an
- * IME is active.
- */
-CompositionHelper.prototype.handleAnyTextareaChanges = function () {
- var oldValue = this.textarea.value;
- var self = this;
- setTimeout(function () {
- // Ignore if a composition has started since the timeout
- if (!self.isComposing) {
- var newValue = self.textarea.value;
- var diff = newValue.replace(oldValue, '');
- if (diff.length > 0) {
- self.terminal.handler(diff);
- }
- }
- }, 0);
-};
-
-/**
- * Positions the composition view on top of the cursor and the textarea just below it (so the
- * IME helper dialog is positioned correctly).
- */
-CompositionHelper.prototype.updateCompositionElements = function (dontRecurse) {
- if (!this.isComposing) {
- return;
- }
- var cursor = this.terminal.element.querySelector('.terminal-cursor');
- if (cursor) {
- // Take .xterm-rows offsetTop into account as well in case it's positioned absolutely within
- // the .xterm element.
- var xtermRows = this.terminal.element.querySelector('.xterm-rows');
- var cursorTop = xtermRows.offsetTop + cursor.offsetTop;
-
- this.compositionView.style.left = cursor.offsetLeft + 'px';
- this.compositionView.style.top = cursorTop + 'px';
- this.compositionView.style.height = cursor.offsetHeight + 'px';
- this.compositionView.style.lineHeight = cursor.offsetHeight + 'px';
- // Sync the textarea to the exact position of the composition view so the IME knows where the
- // text is.
- var compositionViewBounds = this.compositionView.getBoundingClientRect();
- this.textarea.style.left = cursor.offsetLeft + 'px';
- this.textarea.style.top = cursorTop + 'px';
- this.textarea.style.width = compositionViewBounds.width + 'px';
- this.textarea.style.height = compositionViewBounds.height + 'px';
- this.textarea.style.lineHeight = compositionViewBounds.height + 'px';
- }
- if (!dontRecurse) {
- setTimeout(this.updateCompositionElements.bind(this, true), 0);
- }
-};
-
-/**
- * Clears the textarea's position so that the cursor does not blink on IE.
- * @private
- */
-CompositionHelper.prototype.clearTextareaPosition = function () {
- this.textarea.style.left = '';
- this.textarea.style.top = '';
-};
-
-exports.CompositionHelper = CompositionHelper;
-
-},{}],2:[function(_dereq_,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-/**
- * xterm.js: xterm, in the browser
- * Copyright (c) 2014-2016, SourceLair Private Company (www.sourcelair.com (MIT License)
- */
-
-function EventEmitter() {
- this._events = this._events || {};
-}
-
-EventEmitter.prototype.addListener = function (type, listener) {
- this._events[type] = this._events[type] || [];
- this._events[type].push(listener);
-};
-
-EventEmitter.prototype.on = EventEmitter.prototype.addListener;
-
-EventEmitter.prototype.removeListener = function (type, listener) {
- if (!this._events[type]) return;
-
- var obj = this._events[type],
- i = obj.length;
-
- while (i--) {
- if (obj[i] === listener || obj[i].listener === listener) {
- obj.splice(i, 1);
- return;
- }
- }
-};
-
-EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
-
-EventEmitter.prototype.removeAllListeners = function (type) {
- if (this._events[type]) delete this._events[type];
-};
-
-EventEmitter.prototype.once = function (type, listener) {
- var self = this;
- function on() {
- var args = Array.prototype.slice.call(arguments);
- this.removeListener(type, on);
- return listener.apply(this, args);
- }
- on.listener = listener;
- return this.on(type, on);
-};
-
-EventEmitter.prototype.emit = function (type) {
- if (!this._events[type]) return;
-
- var args = Array.prototype.slice.call(arguments, 1),
- obj = this._events[type],
- l = obj.length,
- i = 0;
-
- for (; i < l; i++) {
- obj[i].apply(this, args);
- }
-};
-
-EventEmitter.prototype.listeners = function (type) {
- return this._events[type] = this._events[type] || [];
-};
-
-exports.EventEmitter = EventEmitter;
-
-},{}],3:[function(_dereq_,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-/**
- * xterm.js: xterm, in the browser
- * Copyright (c) 2014-2016, SourceLair Private Company (www.sourcelair.com (MIT License)
- */
-
-/**
- * Represents the viewport of a terminal, the visible area within the larger buffer of output.
- * Logic for the virtual scroll bar is included in this object.
- * @param {Terminal} terminal The Terminal object.
- * @param {HTMLElement} viewportElement The DOM element acting as the viewport
- * @param {HTMLElement} charMeasureElement A DOM element used to measure the character size of
- * the terminal.
- */
-function Viewport(terminal, viewportElement, scrollArea, charMeasureElement) {
- this.terminal = terminal;
- this.viewportElement = viewportElement;
- this.scrollArea = scrollArea;
- this.charMeasureElement = charMeasureElement;
- this.currentRowHeight = 0;
- this.lastRecordedBufferLength = 0;
- this.lastRecordedViewportHeight = 0;
-
- this.terminal.on('scroll', this.syncScrollArea.bind(this));
- this.terminal.on('resize', this.syncScrollArea.bind(this));
- this.viewportElement.addEventListener('scroll', this.onScroll.bind(this));
-
- this.syncScrollArea();
-}
-
-/**
- * Refreshes row height, setting line-height, viewport height and scroll area height if
- * necessary.
- * @param {number|undefined} charSize A character size measurement bounding rect object, if it
- * doesn't exist it will be created.
- */
-Viewport.prototype.refresh = function (charSize) {
- var size = charSize || this.charMeasureElement.getBoundingClientRect();
- if (size.height > 0) {
- var rowHeightChanged = size.height !== this.currentRowHeight;
- if (rowHeightChanged) {
- this.currentRowHeight = size.height;
- this.viewportElement.style.lineHeight = size.height + 'px';
- this.terminal.rowContainer.style.lineHeight = size.height + 'px';
- }
- var viewportHeightChanged = this.lastRecordedViewportHeight !== this.terminal.rows;
- if (rowHeightChanged || viewportHeightChanged) {
- this.lastRecordedViewportHeight = this.terminal.rows;
- this.viewportElement.style.height = size.height * this.terminal.rows + 'px';
- }
- this.scrollArea.style.height = size.height * this.lastRecordedBufferLength + 'px';
- }
-};
-
-/**
- * Updates dimensions and synchronizes the scroll area if necessary.
- */
-Viewport.prototype.syncScrollArea = function () {
- if (this.lastRecordedBufferLength !== this.terminal.lines.length) {
- // If buffer height changed
- this.lastRecordedBufferLength = this.terminal.lines.length;
- this.refresh();
- } else if (this.lastRecordedViewportHeight !== this.terminal.rows) {
- // If viewport height changed
- this.refresh();
- } else {
- // If size has changed, refresh viewport
- var size = this.charMeasureElement.getBoundingClientRect();
- if (size.height !== this.currentRowHeight) {
- this.refresh(size);
- }
- }
-
- // Sync scrollTop
- var scrollTop = this.terminal.ydisp * this.currentRowHeight;
- if (this.viewportElement.scrollTop !== scrollTop) {
- this.viewportElement.scrollTop = scrollTop;
- }
-};
-
-/**
- * Handles scroll events on the viewport, calculating the new viewport and requesting the
- * terminal to scroll to it.
- * @param {Event} ev The scroll event.
- */
-Viewport.prototype.onScroll = function (ev) {
- var newRow = Math.round(this.viewportElement.scrollTop / this.currentRowHeight);
- var diff = newRow - this.terminal.ydisp;
- this.terminal.scrollDisp(diff, true);
-};
-
-/**
- * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual
- * scrolling to `onScroll`, this event needs to be attached manually by the consumer of
- * `Viewport`.
- * @param {WheelEvent} ev The mouse wheel event.
- */
-Viewport.prototype.onWheel = function (ev) {
- if (ev.deltaY === 0) {
- // Do nothing if it's not a vertical scroll event
- return;
- }
- // Fallback to WheelEvent.DOM_DELTA_PIXEL
- var multiplier = 1;
- if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) {
- multiplier = this.currentRowHeight;
- } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) {
- multiplier = this.currentRowHeight * this.terminal.rows;
- }
- this.viewportElement.scrollTop += ev.deltaY * multiplier;
- // Prevent the page from scrolling when the terminal scrolls
- ev.preventDefault();
-};
-
-exports.Viewport = Viewport;
-
-},{}],4:[function(_dereq_,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-/**
- * xterm.js: xterm, in the browser
- * Copyright (c) 2016, SourceLair Private Company <www.sourcelair.com> (MIT License)
- */
-
-/**
- * Clipboard handler module. This module contains methods for handling all
- * clipboard-related events appropriately in the terminal.
- * @module xterm/handlers/Clipboard
- */
-
-/**
- * Prepares text copied from terminal selection, to be saved in the clipboard by:
- * 1. stripping all trailing white spaces
- * 2. converting all non-breaking spaces to regular spaces
- * @param {string} text The copied text that needs processing for storing in clipboard
- * @returns {string}
- */
-function prepareTextForClipboard(text) {
- var space = String.fromCharCode(32),
- nonBreakingSpace = String.fromCharCode(160),
- allNonBreakingSpaces = new RegExp(nonBreakingSpace, 'g'),
- processedText = text.split('\n').map(function (line) {
- // Strip all trailing white spaces and convert all non-breaking spaces
- // to regular spaces.
- var processedLine = line.replace(/\s+$/g, '').replace(allNonBreakingSpaces, space);
-
- return processedLine;
- }).join('\n');
-
- return processedText;
-}
-
-/**
- * Binds copy functionality to the given terminal.
- * @param {ClipboardEvent} ev The original copy event to be handled
- */
-function copyHandler(ev, term) {
- var copiedText = window.getSelection().toString(),
- text = prepareTextForClipboard(copiedText);
-
- if (term.browser.isMSIE) {
- window.clipboardData.setData('Text', text);
- } else {
- ev.clipboardData.setData('text/plain', text);
- }
-
- ev.preventDefault(); // Prevent or the original text will be copied.
-}
-
-/**
- * Redirect the clipboard's data to the terminal's input handler.
- * @param {ClipboardEvent} ev The original paste event to be handled
- * @param {Terminal} term The terminal on which to apply the handled paste event
- */
-function pasteHandler(ev, term) {
- ev.stopPropagation();
-
- var dispatchPaste = function dispatchPaste(text) {
- term.handler(text);
- term.textarea.value = '';
- return term.cancel(ev);
- };
-
- if (term.browser.isMSIE) {
- if (window.clipboardData) {
- var text = window.clipboardData.getData('Text');
- dispatchPaste(text);
- }
- } else {
- if (ev.clipboardData) {
- var text = ev.clipboardData.getData('text/plain');
- dispatchPaste(text);
- }
- }
-}
-
-/**
- * Bind to right-click event and allow right-click copy and paste.
- *
- * **Logic**
- * If text is selected and right-click happens on selected text, then
- * do nothing to allow seamless copying.
- * If no text is selected or right-click is outside of the selection
- * area, then bring the terminal's input below the cursor, in order to
- * trigger the event on the textarea and allow-right click paste, without
- * caring about disappearing selection.
- * @param {ClipboardEvent} ev The original paste event to be handled
- * @param {Terminal} term The terminal on which to apply the handled paste event
- */
-function rightClickHandler(ev, term) {
- var s = document.getSelection(),
- selectedText = prepareTextForClipboard(s.toString()),
- clickIsOnSelection = false;
-
- if (s.rangeCount) {
- var r = s.getRangeAt(0),
- cr = r.getClientRects(),
- x = ev.clientX,
- y = ev.clientY,
- i,
- rect;
-
- for (i = 0; i < cr.length; i++) {
- rect = cr[i];
- clickIsOnSelection = x > rect.left && x < rect.right && y > rect.top && y < rect.bottom;
-
- if (clickIsOnSelection) {
- break;
- }
- }
- // If we clicked on selection and selection is not a single space,
- // then mark the right click as copy-only. We check for the single
- // space selection, as this can happen when clicking on an &nbsp;
- // and there is not much pointing in copying a single space.
- if (selectedText.match(/^\s$/) || !selectedText.length) {
- clickIsOnSelection = false;
- }
- }
-
- // Bring textarea at the cursor position
- if (!clickIsOnSelection) {
- term.textarea.style.position = 'fixed';
- term.textarea.style.width = '20px';
- term.textarea.style.height = '20px';
- term.textarea.style.left = x - 10 + 'px';
- term.textarea.style.top = y - 10 + 'px';
- term.textarea.style.zIndex = 1000;
- term.textarea.focus();
-
- // Reset the terminal textarea's styling
- setTimeout(function () {
- term.textarea.style.position = null;
- term.textarea.style.width = null;
- term.textarea.style.height = null;
- term.textarea.style.left = null;
- term.textarea.style.top = null;
- term.textarea.style.zIndex = null;
- }, 4);
- }
-}
-
-exports.prepareTextForClipboard = prepareTextForClipboard;
-exports.copyHandler = copyHandler;
-exports.pasteHandler = pasteHandler;
-exports.rightClickHandler = rightClickHandler;
-
-},{}],5:[function(_dereq_,module,exports){
-'use strict';
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.isMSWindows = exports.isIphone = exports.isIpad = exports.isMac = exports.isMSIE = exports.isFirefox = undefined;
-
-var _Generic = _dereq_('./Generic.js');
-
-var isNode = typeof navigator == 'undefined' ? true : false; /**
- * xterm.js: xterm, in the browser
- * Copyright (c) 2016, SourceLair Private Company <www.sourcelair.com> (MIT License)
- */
-
-/**
- * Browser utilities module. This module contains attributes and methods to help with
- * identifying the current browser and platform.
- * @module xterm/utils/Browser
- */
-
-var userAgent = isNode ? 'node' : navigator.userAgent;
-var platform = isNode ? 'node' : navigator.platform;
-
-var isFirefox = exports.isFirefox = !!~userAgent.indexOf('Firefox');
-var isMSIE = exports.isMSIE = !!~userAgent.indexOf('MSIE') || !!~userAgent.indexOf('Trident');
-
-// Find the users platform. We use this to interpret the meta key
-// and ISO third level shifts.
-// http://stackoverflow.com/q/19877924/577598
-var isMac = exports.isMac = (0, _Generic.contains)(['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'], platform);
-var isIpad = exports.isIpad = platform === 'iPad';
-var isIphone = exports.isIphone = platform === 'iPhone';
-var isMSWindows = exports.isMSWindows = (0, _Generic.contains)(['Windows', 'Win16', 'Win32', 'WinCE'], platform);
-
-},{"./Generic.js":6}],6:[function(_dereq_,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-/**
- * xterm.js: xterm, in the browser
- * Copyright (c) 2016, SourceLair Private Company <www.sourcelair.com> (MIT License)
- */
-
-/**
- * Generic utilities module. This module contains generic methods that can be helpful at
- * different parts of the code base.
- * @module xterm/utils/Generic
- */
-
-/**
- * Return if the given array contains the given element
- * @param {Array} array The array to search for the given element.
- * @param {Object} el The element to look for into the array
- */
-var contains = exports.contains = function contains(arr, el) {
- return arr.indexOf(el) >= 0;
-};
-
-},{}],7:[function(_dereq_,module,exports){
-'use strict';var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};/**
- * xterm.js: xterm, in the browser
- * Copyright (c) 2014-2014, SourceLair Private Company <www.sourcelair.com> (MIT License)
- * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
- * https://github.com/chjj/term.js
- *
- * 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.
- *
- * Originally forked from (with the author's permission):
- * Fabrice Bellard's javascript vt100 for jslinux:
- * http://bellard.org/jslinux/
- * Copyright (c) 2011 Fabrice Bellard
- * The original design remains. The terminal itself
- * has been extended to include xterm CSI codes, among
- * other features.
- */var _CompositionHelper=_dereq_('./CompositionHelper.js');var _EventEmitter=_dereq_('./EventEmitter.js');var _Viewport=_dereq_('./Viewport.js');var _Clipboard=_dereq_('./handlers/Clipboard.js');var _Browser=_dereq_('./utils/Browser');var Browser=_interopRequireWildcard(_Browser);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}/**
- * Terminal Emulation References:
- * http://vt100.net/
- * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt
- * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
- * http://invisible-island.net/vttest/
- * http://www.inwap.com/pdp10/ansicode.txt
- * http://linux.die.net/man/4/console_codes
- * http://linux.die.net/man/7/urxvt
- */// Let it work inside Node.js for automated testing purposes.
-var document=typeof window!='undefined'?window.document:null;/**
- * States
- */var normal=0,escaped=1,csi=2,osc=3,charset=4,dcs=5,ignore=6;/**
- * Terminal
- *//**
- * Creates a new `Terminal` object.
- *
- * @param {object} options An object containing a set of options, the available options are:
- * - `cursorBlink` (boolean): Whether the terminal cursor blinks
- * - `cols` (number): The number of columns of the terminal (horizontal size)
- * - `rows` (number): The number of rows of the terminal (vertical size)
- *
- * @public
- * @class Xterm Xterm
- * @alias module:xterm/src/xterm
- */function Terminal(options){var self=this;if(!(this instanceof Terminal)){return new Terminal(arguments[0],arguments[1],arguments[2]);}self.browser=Browser;self.cancel=Terminal.cancel;_EventEmitter.EventEmitter.call(this);if(typeof options==='number'){options={cols:arguments[0],rows:arguments[1],handler:arguments[2]};}options=options||{};Object.keys(Terminal.defaults).forEach(function(key){if(options[key]==null){options[key]=Terminal.options[key];if(Terminal[key]!==Terminal.defaults[key]){options[key]=Terminal[key];}}self[key]=options[key];});if(options.colors.length===8){options.colors=options.colors.concat(Terminal._colors.slice(8));}else if(options.colors.length===16){options.colors=options.colors.concat(Terminal._colors.slice(16));}else if(options.colors.length===10){options.colors=options.colors.slice(0,-2).concat(Terminal._colors.slice(8,-2),options.colors.slice(-2));}else if(options.colors.length===18){options.colors=options.colors.concat(Terminal._colors.slice(16,-2),options.colors.slice(-2));}this.colors=options.colors;this.options=options;// this.context = options.context || window;
-// this.document = options.document || document;
-this.parent=options.body||options.parent||(document?document.getElementsByTagName('body')[0]:null);this.cols=options.cols||options.geometry[0];this.rows=options.rows||options.geometry[1];this.geometry=[this.cols,this.rows];if(options.handler){this.on('data',options.handler);}/**
- * The scroll position of the y cursor, ie. ybase + y = the y position within the entire
- * buffer
- */this.ybase=0;/**
- * The scroll position of the viewport
- */this.ydisp=0;/**
- * The cursor's x position after ybase
- */this.x=0;/**
- * The cursor's y position after ybase
- */this.y=0;/**
- * Used to debounce the refresh function
- */this.isRefreshing=false;/**
- * Whether there is a full terminal refresh queued
- */this.cursorState=0;this.cursorHidden=false;this.convertEol;this.state=0;this.queue='';this.scrollTop=0;this.scrollBottom=this.rows-1;this.customKeydownHandler=null;// modes
-this.applicationKeypad=false;this.applicationCursor=false;this.originMode=false;this.insertMode=false;this.wraparoundMode=true;// defaults: xterm - true, vt100 - false
-this.normal=null;// charset
-this.charset=null;this.gcharset=null;this.glevel=0;this.charsets=[null];// mouse properties
-this.decLocator;this.x10Mouse;this.vt200Mouse;this.vt300Mouse;this.normalMouse;this.mouseEvents;this.sendFocus;this.utfMouse;this.sgrMouse;this.urxvtMouse;// misc
-this.element;this.children;this.refreshStart;this.refreshEnd;this.savedX;this.savedY;this.savedCols;// stream
-this.readable=true;this.writable=true;this.defAttr=0<<18|257<<9|256<<0;this.curAttr=this.defAttr;this.params=[];this.currentParam=0;this.prefix='';this.postfix='';// leftover surrogate high from previous write invocation
-this.surrogate_high='';/**
- * An array of all lines in the entire buffer, including the prompt. The lines are array of
- * characters which are 2-length arrays where [0] is an attribute and [1] is the character.
- */this.lines=[];var i=this.rows;while(i--){this.lines.push(this.blankLine());}this.tabs;this.setupStops();// Store if user went browsing history in scrollback
-this.userScrolling=false;}inherits(Terminal,_EventEmitter.EventEmitter);/**
- * back_color_erase feature for xterm.
- */Terminal.prototype.eraseAttr=function(){// if (this.is('screen')) return this.defAttr;
-return this.defAttr&~0x1ff|this.curAttr&0x1ff;};/**
- * Colors
- */// Colors 0-15
-Terminal.tangoColors=[// dark:
-'#2e3436','#cc0000','#4e9a06','#c4a000','#3465a4','#75507b','#06989a','#d3d7cf',// bright:
-'#555753','#ef2929','#8ae234','#fce94f','#729fcf','#ad7fa8','#34e2e2','#eeeeec'];// Colors 0-15 + 16-255
-// Much thanks to TooTallNate for writing this.
-Terminal.colors=function(){var colors=Terminal.tangoColors.slice(),r=[0x00,0x5f,0x87,0xaf,0xd7,0xff],i;// 16-231
-i=0;for(;i<216;i++){out(r[i/36%6|0],r[i/6%6|0],r[i%6]);}// 232-255 (grey)
-i=0;for(;i<24;i++){r=8+i*10;out(r,r,r);}function out(r,g,b){colors.push('#'+hex(r)+hex(g)+hex(b));}function hex(c){c=c.toString(16);return c.length<2?'0'+c:c;}return colors;}();Terminal._colors=Terminal.colors.slice();Terminal.vcolors=function(){var out=[],colors=Terminal.colors,i=0,color;for(;i<256;i++){color=parseInt(colors[i].substring(1),16);out.push([color>>16&0xff,color>>8&0xff,color&0xff]);}return out;}();/**
- * Options
- */Terminal.defaults={colors:Terminal.colors,theme:'default',convertEol:false,termName:'xterm',geometry:[80,24],cursorBlink:false,visualBell:false,popOnBell:false,scrollback:1000,screenKeys:false,debug:false,cancelEvents:false// programFeatures: false,
-// focusKeys: false,
-};Terminal.options={};Terminal.focus=null;each(keys(Terminal.defaults),function(key){Terminal[key]=Terminal.defaults[key];Terminal.options[key]=Terminal.defaults[key];});/**
- * Focus the terminal. Delegates focus handling to the terminal's DOM element.
- */Terminal.prototype.focus=function(){return this.textarea.focus();};/**
- * Retrieves an option's value from the terminal.
- * @param {string} key The option key.
- */Terminal.prototype.getOption=function(key,value){if(!(key in Terminal.defaults)){throw new Error('No option with key "'+key+'"');}if(typeof this.options[key]!=='undefined'){return this.options[key];}return this[key];};/**
- * Sets an option on the terminal.
- * @param {string} key The option key.
- * @param {string} value The option value.
- */Terminal.prototype.setOption=function(key,value){if(!(key in Terminal.defaults)){throw new Error('No option with key "'+key+'"');}this[key]=value;this.options[key]=value;};/**
- * Binds the desired focus behavior on a given terminal object.
- *
- * @static
- */Terminal.bindFocus=function(term){on(term.textarea,'focus',function(ev){if(term.sendFocus){term.send('\x1b[I');}term.element.classList.add('focus');term.showCursor();Terminal.focus=term;term.emit('focus',{terminal:term});});};/**
- * Blur the terminal. Delegates blur handling to the terminal's DOM element.
- */Terminal.prototype.blur=function(){return this.textarea.blur();};/**
- * Binds the desired blur behavior on a given terminal object.
- *
- * @static
- */Terminal.bindBlur=function(term){on(term.textarea,'blur',function(ev){term.refresh(term.y,term.y);if(term.sendFocus){term.send('\x1b[O');}term.element.classList.remove('focus');Terminal.focus=null;term.emit('blur',{terminal:term});});};/**
- * Initialize default behavior
- */Terminal.prototype.initGlobal=function(){var term=this;Terminal.bindKeys(this);Terminal.bindFocus(this);Terminal.bindBlur(this);// Bind clipboard functionality
-on(this.element,'copy',function(ev){_Clipboard.copyHandler.call(this,ev,term);});on(this.textarea,'paste',function(ev){_Clipboard.pasteHandler.call(this,ev,term);});function rightClickHandlerWrapper(ev){_Clipboard.rightClickHandler.call(this,ev,term);}if(term.browser.isFirefox){on(this.element,'mousedown',function(ev){if(ev.button==2){rightClickHandlerWrapper(ev);}});}else{on(this.element,'contextmenu',rightClickHandlerWrapper);}};/**
- * Apply key handling to the terminal
- */Terminal.bindKeys=function(term){on(term.element,'keydown',function(ev){if(document.activeElement!=this){return;}term.keyDown(ev);},true);on(term.element,'keypress',function(ev){if(document.activeElement!=this){return;}term.keyPress(ev);},true);on(term.element,'keyup',term.focus.bind(term));on(term.textarea,'keydown',function(ev){term.keyDown(ev);},true);on(term.textarea,'keypress',function(ev){term.keyPress(ev);// Truncate the textarea's value, since it is not needed
-this.value='';},true);on(term.textarea,'compositionstart',term.compositionHelper.compositionstart.bind(term.compositionHelper));on(term.textarea,'compositionupdate',term.compositionHelper.compositionupdate.bind(term.compositionHelper));on(term.textarea,'compositionend',term.compositionHelper.compositionend.bind(term.compositionHelper));term.on('refresh',term.compositionHelper.updateCompositionElements.bind(term.compositionHelper));};/**
- * Insert the given row to the terminal or produce a new one
- * if no row argument is passed. Return the inserted row.
- * @param {HTMLElement} row (optional) The row to append to the terminal.
- */Terminal.prototype.insertRow=function(row){if((typeof row==='undefined'?'undefined':_typeof(row))!='object'){row=document.createElement('div');}this.rowContainer.appendChild(row);this.children.push(row);return row;};/**
- * Opens the terminal within an element.
- *
- * @param {HTMLElement} parent The element to create the terminal within.
- */Terminal.prototype.open=function(parent){var self=this,i=0,div;this.parent=parent||this.parent;if(!this.parent){throw new Error('Terminal requires a parent element.');}// Grab global elements
-this.context=this.parent.ownerDocument.defaultView;this.document=this.parent.ownerDocument;this.body=this.document.getElementsByTagName('body')[0];//Create main element container
-this.element=this.document.createElement('div');this.element.classList.add('terminal');this.element.classList.add('xterm');this.element.classList.add('xterm-theme-'+this.theme);this.element.style.height;this.element.setAttribute('tabindex',0);this.viewportElement=document.createElement('div');this.viewportElement.classList.add('xterm-viewport');this.element.appendChild(this.viewportElement);this.viewportScrollArea=document.createElement('div');this.viewportScrollArea.classList.add('xterm-scroll-area');this.viewportElement.appendChild(this.viewportScrollArea);// Create the container that will hold the lines of the terminal and then
-// produce the lines the lines.
-this.rowContainer=document.createElement('div');this.rowContainer.classList.add('xterm-rows');this.element.appendChild(this.rowContainer);this.children=[];// Create the container that will hold helpers like the textarea for
-// capturing DOM Events. Then produce the helpers.
-this.helperContainer=document.createElement('div');this.helperContainer.classList.add('xterm-helpers');// TODO: This should probably be inserted once it's filled to prevent an additional layout
-this.element.appendChild(this.helperContainer);this.textarea=document.createElement('textarea');this.textarea.classList.add('xterm-helper-textarea');this.textarea.setAttribute('autocorrect','off');this.textarea.setAttribute('autocapitalize','off');this.textarea.setAttribute('spellcheck','false');this.textarea.tabIndex=0;this.textarea.addEventListener('focus',function(){self.emit('focus',{terminal:self});});this.textarea.addEventListener('blur',function(){self.emit('blur',{terminal:self});});this.helperContainer.appendChild(this.textarea);this.compositionView=document.createElement('div');this.compositionView.classList.add('composition-view');this.compositionHelper=new _CompositionHelper.CompositionHelper(this.textarea,this.compositionView,this);this.helperContainer.appendChild(this.compositionView);this.charMeasureElement=document.createElement('div');this.charMeasureElement.classList.add('xterm-char-measure-element');this.charMeasureElement.innerHTML='W';this.helperContainer.appendChild(this.charMeasureElement);for(;i<this.rows;i++){this.insertRow();}this.parent.appendChild(this.element);this.viewport=new _Viewport.Viewport(this,this.viewportElement,this.viewportScrollArea,this.charMeasureElement);// Draw the screen.
-this.refresh(0,this.rows-1);// Initialize global actions that
-// need to be taken on the document.
-this.initGlobal();// Ensure there is a Terminal.focus.
-this.focus();on(this.element,'click',function(){var selection=document.getSelection(),collapsed=selection.isCollapsed,isRange=typeof collapsed=='boolean'?!collapsed:selection.type=='Range';if(!isRange){self.focus();}});// Listen for mouse events and translate
-// them into terminal mouse protocols.
-this.bindMouse();// Figure out whether boldness affects
-// the character width of monospace fonts.
-if(Terminal.brokenBold==null){Terminal.brokenBold=isBoldBroken(this.document);}this.emit('open');};/**
- * Attempts to load an add-on using CommonJS or RequireJS (whichever is available).
- * @param {string} addon The name of the addon to load
- * @static
- */Terminal.loadAddon=function(addon,callback){if((typeof exports==='undefined'?'undefined':_typeof(exports))==='object'&&(typeof module==='undefined'?'undefined':_typeof(module))==='object'){// CommonJS
-return _dereq_('../addons/'+addon);}else if(typeof define=='function'){// RequireJS
-return _dereq_(['../addons/'+addon+'/'+addon],callback);}else{console.error('Cannot load a module without a CommonJS or RequireJS environment.');return false;}};/**
- * XTerm mouse events
- * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#Mouse%20Tracking
- * To better understand these
- * the xterm code is very helpful:
- * Relevant files:
- * button.c, charproc.c, misc.c
- * Relevant functions in xterm/button.c:
- * BtnCode, EmitButtonCode, EditorButton, SendMousePosition
- */Terminal.prototype.bindMouse=function(){var el=this.element,self=this,pressed=32;// mouseup, mousedown, wheel
-// left click: ^[[M 3<^[[M#3<
-// wheel up: ^[[M`3>
-function sendButton(ev){var button,pos;// get the xterm-style button
-button=getButton(ev);// get mouse coordinates
-pos=getCoords(ev);if(!pos)return;sendEvent(button,pos);switch(ev.overrideType||ev.type){case'mousedown':pressed=button;break;case'mouseup':// keep it at the left
-// button, just in case.
-pressed=32;break;case'wheel':// nothing. don't
-// interfere with
-// `pressed`.
-break;}}// motion example of a left click:
-// ^[[M 3<^[[M@4<^[[M@5<^[[M@6<^[[M@7<^[[M#7<
-function sendMove(ev){var button=pressed,pos;pos=getCoords(ev);if(!pos)return;// buttons marked as motions
-// are incremented by 32
-button+=32;sendEvent(button,pos);}// encode button and
-// position to characters
-function encode(data,ch){if(!self.utfMouse){if(ch===255)return data.push(0);if(ch>127)ch=127;data.push(ch);}else{if(ch===2047)return data.push(0);if(ch<127){data.push(ch);}else{if(ch>2047)ch=2047;data.push(0xC0|ch>>6);data.push(0x80|ch&0x3F);}}}// send a mouse event:
-// regular/utf8: ^[[M Cb Cx Cy
-// urxvt: ^[[ Cb ; Cx ; Cy M
-// sgr: ^[[ Cb ; Cx ; Cy M/m
-// vt300: ^[[ 24(1/3/5)~ [ Cx , Cy ] \r
-// locator: CSI P e ; P b ; P r ; P c ; P p & w
-function sendEvent(button,pos){// self.emit('mouse', {
-// x: pos.x - 32,
-// y: pos.x - 32,
-// button: button
-// });
-if(self.vt300Mouse){// NOTE: Unstable.
-// http://www.vt100.net/docs/vt3xx-gp/chapter15.html
-button&=3;pos.x-=32;pos.y-=32;var data='\x1b[24';if(button===0)data+='1';else if(button===1)data+='3';else if(button===2)data+='5';else if(button===3)return;else data+='0';data+='~['+pos.x+','+pos.y+']\r';self.send(data);return;}if(self.decLocator){// NOTE: Unstable.
-button&=3;pos.x-=32;pos.y-=32;if(button===0)button=2;else if(button===1)button=4;else if(button===2)button=6;else if(button===3)button=3;self.send('\x1b['+button+';'+(button===3?4:0)+';'+pos.y+';'+pos.x+';'+(pos.page||0)+'&w');return;}if(self.urxvtMouse){pos.x-=32;pos.y-=32;pos.x++;pos.y++;self.send('\x1b['+button+';'+pos.x+';'+pos.y+'M');return;}if(self.sgrMouse){pos.x-=32;pos.y-=32;self.send('\x1b[<'+((button&3)===3?button&~3:button)+';'+pos.x+';'+pos.y+((button&3)===3?'m':'M'));return;}var data=[];encode(data,button);encode(data,pos.x);encode(data,pos.y);self.send('\x1b[M'+String.fromCharCode.apply(String,data));}function getButton(ev){var button,shift,meta,ctrl,mod;// two low bits:
-// 0 = left
-// 1 = middle
-// 2 = right
-// 3 = release
-// wheel up/down:
-// 1, and 2 - with 64 added
-switch(ev.overrideType||ev.type){case'mousedown':button=ev.button!=null?+ev.button:ev.which!=null?ev.which-1:null;if(self.browser.isMSIE){button=button===1?0:button===4?1:button;}break;case'mouseup':button=3;break;case'DOMMouseScroll':button=ev.detail<0?64:65;break;case'wheel':button=ev.wheelDeltaY>0?64:65;break;}// next three bits are the modifiers:
-// 4 = shift, 8 = meta, 16 = control
-shift=ev.shiftKey?4:0;meta=ev.metaKey?8:0;ctrl=ev.ctrlKey?16:0;mod=shift|meta|ctrl;// no mods
-if(self.vt200Mouse){// ctrl only
-mod&=ctrl;}else if(!self.normalMouse){mod=0;}// increment to SP
-button=32+(mod<<2)+button;return button;}// mouse coordinates measured in cols/rows
-function getCoords(ev){var x,y,w,h,el;// ignore browsers without pageX for now
-if(ev.pageX==null)return;x=ev.pageX;y=ev.pageY;el=self.element;// should probably check offsetParent
-// but this is more portable
-while(el&&el!==self.document.documentElement){x-=el.offsetLeft;y-=el.offsetTop;el='offsetParent'in el?el.offsetParent:el.parentNode;}// convert to cols/rows
-w=self.element.clientWidth;h=self.element.clientHeight;x=Math.ceil(x/w*self.cols);y=Math.ceil(y/h*self.rows);// be sure to avoid sending
-// bad positions to the program
-if(x<0)x=0;if(x>self.cols)x=self.cols;if(y<0)y=0;if(y>self.rows)y=self.rows;// xterm sends raw bytes and
-// starts at 32 (SP) for each.
-x+=32;y+=32;return{x:x,y:y,type:'wheel'};}on(el,'mousedown',function(ev){if(!self.mouseEvents)return;// send the button
-sendButton(ev);// ensure focus
-self.focus();// fix for odd bug
-//if (self.vt200Mouse && !self.normalMouse) {
-if(self.vt200Mouse){ev.overrideType='mouseup';sendButton(ev);return self.cancel(ev);}// bind events
-if(self.normalMouse)on(self.document,'mousemove',sendMove);// x10 compatibility mode can't send button releases
-if(!self.x10Mouse){on(self.document,'mouseup',function up(ev){sendButton(ev);if(self.normalMouse)off(self.document,'mousemove',sendMove);off(self.document,'mouseup',up);return self.cancel(ev);});}return self.cancel(ev);});//if (self.normalMouse) {
-// on(self.document, 'mousemove', sendMove);
-//}
-on(el,'wheel',function(ev){if(!self.mouseEvents)return;if(self.x10Mouse||self.vt300Mouse||self.decLocator)return;sendButton(ev);return self.cancel(ev);});// allow wheel scrolling in
-// the shell for example
-on(el,'wheel',function(ev){if(self.mouseEvents)return;self.viewport.onWheel(ev);return self.cancel(ev);});};/**
- * Destroys the terminal.
- */Terminal.prototype.destroy=function(){this.readable=false;this.writable=false;this._events={};this.handler=function(){};this.write=function(){};if(this.element.parentNode){this.element.parentNode.removeChild(this.element);}//this.emit('close');
-};/**
- * Flags used to render terminal text properly
- */Terminal.flags={BOLD:1,UNDERLINE:2,BLINK:4,INVERSE:8,INVISIBLE:16};/**
- * Refreshes (re-renders) terminal content within two rows (inclusive)
- *
- * Rendering Engine:
- *
- * In the screen buffer, each character is stored as a an array with a character
- * and a 32-bit integer:
- * - First value: a utf-16 character.
- * - Second value:
- * - Next 9 bits: background color (0-511).
- * - Next 9 bits: foreground color (0-511).
- * - Next 14 bits: a mask for misc. flags:
- * - 1=bold
- * - 2=underline
- * - 4=blink
- * - 8=inverse
- * - 16=invisible
- *
- * @param {number} start The row to start from (between 0 and terminal's height terminal - 1)
- * @param {number} end The row to end at (between fromRow and terminal's height terminal - 1)
- * @param {boolean} queue Whether the refresh should ran right now or be queued
- */Terminal.prototype.refresh=function(start,end,queue){var self=this;// queue defaults to true
-queue=typeof queue=='undefined'?true:queue;/**
- * The refresh queue allows refresh to execute only approximately 30 times a second. For
- * commands that pass a significant amount of output to the write function, this prevents the
- * terminal from maxing out the CPU and making the UI unresponsive. While commands can still
- * run beyond what they do on the terminal, it is far better with a debounce in place as
- * every single terminal manipulation does not need to be constructed in the DOM.
- *
- * A side-effect of this is that it makes ^C to interrupt a process seem more responsive.
- */if(queue){// If refresh should be queued, order the refresh and return.
-if(this._refreshIsQueued){// If a refresh has already been queued, just order a full refresh next
-this._fullRefreshNext=true;}else{setTimeout(function(){self.refresh(start,end,false);},34);this._refreshIsQueued=true;}return;}// If refresh should be run right now (not be queued), release the lock
-this._refreshIsQueued=false;// If multiple refreshes were requested, make a full refresh.
-if(this._fullRefreshNext){start=0;end=this.rows-1;this._fullRefreshNext=false;// reset lock
-}var x,y,i,line,out,ch,ch_width,width,data,attr,bg,fg,flags,row,parent,focused=document.activeElement;// If this is a big refresh, remove the terminal rows from the DOM for faster calculations
-if(end-start>=this.rows/2){parent=this.element.parentNode;if(parent){this.element.removeChild(this.rowContainer);}}width=this.cols;y=start;if(end>=this.rows.length){this.log('`end` is too large. Most likely a bad CSR.');end=this.rows.length-1;}for(;y<=end;y++){row=y+this.ydisp;line=this.lines[row];out='';if(this.y===y-(this.ybase-this.ydisp)&&this.cursorState&&!this.cursorHidden){x=this.x;}else{x=-1;}attr=this.defAttr;i=0;for(;i<width;i++){data=line[i][0];ch=line[i][1];ch_width=line[i][2];if(!ch_width)continue;if(i===x)data=-1;if(data!==attr){if(attr!==this.defAttr){out+='</span>';}if(data!==this.defAttr){if(data===-1){out+='<span class="reverse-video terminal-cursor';if(this.cursorBlink){out+=' blinking';}out+='">';}else{var classNames=[];bg=data&0x1ff;fg=data>>9&0x1ff;flags=data>>18;if(flags&Terminal.flags.BOLD){if(!Terminal.brokenBold){classNames.push('xterm-bold');}// See: XTerm*boldColors
-if(fg<8)fg+=8;}if(flags&Terminal.flags.UNDERLINE){classNames.push('xterm-underline');}if(flags&Terminal.flags.BLINK){classNames.push('xterm-blink');}// If inverse flag is on, then swap the foreground and background variables.
-if(flags&Terminal.flags.INVERSE){/* One-line variable swap in JavaScript: http://stackoverflow.com/a/16201730 */bg=[fg,fg=bg][0];// Should inverse just be before the
-// above boldColors effect instead?
-if(flags&1&&fg<8)fg+=8;}if(flags&Terminal.flags.INVISIBLE){classNames.push('xterm-hidden');}/**
- * Weird situation: Invert flag used black foreground and white background results
- * in invalid background color, positioned at the 256 index of the 256 terminal
- * color map. Pin the colors manually in such a case.
- *
- * Source: https://github.com/sourcelair/xterm.js/issues/57
- */if(flags&Terminal.flags.INVERSE){if(bg==257){bg=15;}if(fg==256){fg=0;}}if(bg<256){classNames.push('xterm-bg-color-'+bg);}if(fg<256){classNames.push('xterm-color-'+fg);}out+='<span';if(classNames.length){out+=' class="'+classNames.join(' ')+'"';}out+='>';}}}switch(ch){case'&':out+='&amp;';break;case'<':out+='&lt;';break;case'>':out+='&gt;';break;default:if(ch<=' '){out+='&nbsp;';}else{out+=ch;}break;}attr=data;}if(attr!==this.defAttr){out+='</span>';}this.children[y].innerHTML=out;}if(parent){this.element.appendChild(this.rowContainer);}this.emit('refresh',{element:this.element,start:start,end:end});};/**
- * Display the cursor element
- */Terminal.prototype.showCursor=function(){if(!this.cursorState){this.cursorState=1;this.refresh(this.y,this.y);}};/**
- * Scroll the terminal
- */Terminal.prototype.scroll=function(){var row;if(++this.ybase===this.scrollback){this.ybase=this.ybase/2|0;this.lines=this.lines.slice(-(this.ybase+this.rows)+1);}if(!this.userScrolling){this.ydisp=this.ybase;}// last line
-row=this.ybase+this.rows-1;// subtract the bottom scroll region
-row-=this.rows-1-this.scrollBottom;if(row===this.lines.length){// potential optimization:
-// pushing is faster than splicing
-// when they amount to the same
-// behavior.
-this.lines.push(this.blankLine());}else{// add our new line
-this.lines.splice(row,0,this.blankLine());}if(this.scrollTop!==0){if(this.ybase!==0){this.ybase--;if(!this.userScrolling){this.ydisp=this.ybase;}}this.lines.splice(this.ybase+this.scrollTop,1);}// this.maxRange();
-this.updateRange(this.scrollTop);this.updateRange(this.scrollBottom);this.emit('scroll',this.ydisp);};/**
- * Scroll the display of the terminal
- * @param {number} disp The number of lines to scroll down (negatives scroll up).
- * @param {boolean} suppressScrollEvent Don't emit the scroll event as scrollDisp. This is used
- * to avoid unwanted events being handled by the veiwport when the event was triggered from the
- * viewport originally.
- */Terminal.prototype.scrollDisp=function(disp,suppressScrollEvent){if(disp<0){this.userScrolling=true;}else if(disp+this.ydisp>=this.ybase){this.userScrolling=false;}this.ydisp+=disp;if(this.ydisp>this.ybase){this.ydisp=this.ybase;}else if(this.ydisp<0){this.ydisp=0;}if(!suppressScrollEvent){this.emit('scroll',this.ydisp);}this.refresh(0,this.rows-1);};/**
- * Scroll the display of the terminal by a number of pages.
- * @param {number} pageCount The number of pages to scroll (negative scrolls up).
- */Terminal.prototype.scrollPages=function(pageCount){this.scrollDisp(pageCount*(this.rows-1));};/**
- * Scrolls the display of the terminal to the top.
- */Terminal.prototype.scrollToTop=function(){this.scrollDisp(-this.ydisp);};/**
- * Scrolls the display of the terminal to the bottom.
- */Terminal.prototype.scrollToBottom=function(){this.scrollDisp(this.ybase-this.ydisp);};/**
- * Writes text to the terminal.
- * @param {string} text The text to write to the terminal.
- */Terminal.prototype.write=function(data){var l=data.length,i=0,j,cs,ch,code,low,ch_width,row;this.refreshStart=this.y;this.refreshEnd=this.y;// apply leftover surrogate high from last write
-if(this.surrogate_high){data=this.surrogate_high+data;this.surrogate_high='';}for(;i<l;i++){ch=data[i];// FIXME: higher chars than 0xa0 are not allowed in escape sequences
-// --> maybe move to default
-code=data.charCodeAt(i);if(0xD800<=code&&code<=0xDBFF){// we got a surrogate high
-// get surrogate low (next 2 bytes)
-low=data.charCodeAt(i+1);if(isNaN(low)){// end of data stream, save surrogate high
-this.surrogate_high=ch;continue;}code=(code-0xD800)*0x400+(low-0xDC00)+0x10000;ch+=data.charAt(i+1);}// surrogate low - already handled above
-if(0xDC00<=code&&code<=0xDFFF)continue;switch(this.state){case normal:switch(ch){case'\x07':this.bell();break;// '\n', '\v', '\f'
-case'\n':case'\x0b':case'\x0c':if(this.convertEol){this.x=0;}this.y++;if(this.y>this.scrollBottom){this.y--;this.scroll();}break;// '\r'
-case'\r':this.x=0;break;// '\b'
-case'\x08':if(this.x>0){this.x--;}break;// '\t'
-case'\t':this.x=this.nextStop();break;// shift out
-case'\x0e':this.setgLevel(1);break;// shift in
-case'\x0f':this.setgLevel(0);break;// '\e'
-case'\x1b':this.state=escaped;break;default:// ' '
-// calculate print space
-// expensive call, therefore we save width in line buffer
-ch_width=wcwidth(code);if(ch>=' '){if(this.charset&&this.charset[ch]){ch=this.charset[ch];}row=this.y+this.ybase;// insert combining char in last cell
-// FIXME: needs handling after cursor jumps
-if(!ch_width&&this.x){// dont overflow left
-if(this.lines[row][this.x-1]){if(!this.lines[row][this.x-1][2]){// found empty cell after fullwidth, need to go 2 cells back
-if(this.lines[row][this.x-2])this.lines[row][this.x-2][1]+=ch;}else{this.lines[row][this.x-1][1]+=ch;}this.updateRange(this.y);}break;}// goto next line if ch would overflow
-// TODO: needs a global min terminal width of 2
-if(this.x+ch_width-1>=this.cols){// autowrap - DECAWM
-if(this.wraparoundMode){this.x=0;this.y++;if(this.y>this.scrollBottom){this.y--;this.scroll();}}else{this.x=this.cols-1;if(ch_width===2)// FIXME: check for xterm behavior
-continue;}}row=this.y+this.ybase;// insert mode: move characters to right
-if(this.insertMode){// do this twice for a fullwidth char
-for(var moves=0;moves<ch_width;++moves){// remove last cell, if it's width is 0
-// we have to adjust the second last cell as well
-var removed=this.lines[this.y+this.ybase].pop();if(removed[2]===0&&this.lines[row][this.cols-2]&&this.lines[row][this.cols-2][2]===2)this.lines[row][this.cols-2]=[this.curAttr,' ',1];// insert empty cell at cursor
-this.lines[row].splice(this.x,0,[this.curAttr,' ',1]);}}this.lines[row][this.x]=[this.curAttr,ch,ch_width];this.x++;this.updateRange(this.y);// fullwidth char - set next cell width to zero and advance cursor
-if(ch_width===2){this.lines[row][this.x]=[this.curAttr,'',0];this.x++;}}break;}break;case escaped:switch(ch){// ESC [ Control Sequence Introducer ( CSI is 0x9b).
-case'[':this.params=[];this.currentParam=0;this.state=csi;break;// ESC ] Operating System Command ( OSC is 0x9d).
-case']':this.params=[];this.currentParam=0;this.state=osc;break;// ESC P Device Control String ( DCS is 0x90).
-case'P':this.params=[];this.currentParam=0;this.state=dcs;break;// ESC _ Application Program Command ( APC is 0x9f).
-case'_':this.state=ignore;break;// ESC ^ Privacy Message ( PM is 0x9e).
-case'^':this.state=ignore;break;// ESC c Full Reset (RIS).
-case'c':this.reset();break;// ESC E Next Line ( NEL is 0x85).
-// ESC D Index ( IND is 0x84).
-case'E':this.x=0;;case'D':this.index();break;// ESC M Reverse Index ( RI is 0x8d).
-case'M':this.reverseIndex();break;// ESC % Select default/utf-8 character set.
-// @ = default, G = utf-8
-case'%'://this.charset = null;
-this.setgLevel(0);this.setgCharset(0,Terminal.charsets.US);this.state=normal;i++;break;// ESC (,),*,+,-,. Designate G0-G2 Character Set.
-case'(':// <-- this seems to get all the attention
-case')':case'*':case'+':case'-':case'.':switch(ch){case'(':this.gcharset=0;break;case')':this.gcharset=1;break;case'*':this.gcharset=2;break;case'+':this.gcharset=3;break;case'-':this.gcharset=1;break;case'.':this.gcharset=2;break;}this.state=charset;break;// Designate G3 Character Set (VT300).
-// A = ISO Latin-1 Supplemental.
-// Not implemented.
-case'/':this.gcharset=3;this.state=charset;i--;break;// ESC N
-// Single Shift Select of G2 Character Set
-// ( SS2 is 0x8e). This affects next character only.
-case'N':break;// ESC O
-// Single Shift Select of G3 Character Set
-// ( SS3 is 0x8f). This affects next character only.
-case'O':break;// ESC n
-// Invoke the G2 Character Set as GL (LS2).
-case'n':this.setgLevel(2);break;// ESC o
-// Invoke the G3 Character Set as GL (LS3).
-case'o':this.setgLevel(3);break;// ESC |
-// Invoke the G3 Character Set as GR (LS3R).
-case'|':this.setgLevel(3);break;// ESC }
-// Invoke the G2 Character Set as GR (LS2R).
-case'}':this.setgLevel(2);break;// ESC ~
-// Invoke the G1 Character Set as GR (LS1R).
-case'~':this.setgLevel(1);break;// ESC 7 Save Cursor (DECSC).
-case'7':this.saveCursor();this.state=normal;break;// ESC 8 Restore Cursor (DECRC).
-case'8':this.restoreCursor();this.state=normal;break;// ESC # 3 DEC line height/width
-case'#':this.state=normal;i++;break;// ESC H Tab Set (HTS is 0x88).
-case'H':this.tabSet();break;// ESC = Application Keypad (DECKPAM).
-case'=':this.log('Serial port requested application keypad.');this.applicationKeypad=true;this.viewport.syncScrollArea();this.state=normal;break;// ESC > Normal Keypad (DECKPNM).
-case'>':this.log('Switching back to normal keypad.');this.applicationKeypad=false;this.viewport.syncScrollArea();this.state=normal;break;default:this.state=normal;this.error('Unknown ESC control: %s.',ch);break;}break;case charset:switch(ch){case'0':// DEC Special Character and Line Drawing Set.
-cs=Terminal.charsets.SCLD;break;case'A':// UK
-cs=Terminal.charsets.UK;break;case'B':// United States (USASCII).
-cs=Terminal.charsets.US;break;case'4':// Dutch
-cs=Terminal.charsets.Dutch;break;case'C':// Finnish
-case'5':cs=Terminal.charsets.Finnish;break;case'R':// French
-cs=Terminal.charsets.French;break;case'Q':// FrenchCanadian
-cs=Terminal.charsets.FrenchCanadian;break;case'K':// German
-cs=Terminal.charsets.German;break;case'Y':// Italian
-cs=Terminal.charsets.Italian;break;case'E':// NorwegianDanish
-case'6':cs=Terminal.charsets.NorwegianDanish;break;case'Z':// Spanish
-cs=Terminal.charsets.Spanish;break;case'H':// Swedish
-case'7':cs=Terminal.charsets.Swedish;break;case'=':// Swiss
-cs=Terminal.charsets.Swiss;break;case'/':// ISOLatin (actually /A)
-cs=Terminal.charsets.ISOLatin;i++;break;default:// Default
-cs=Terminal.charsets.US;break;}this.setgCharset(this.gcharset,cs);this.gcharset=null;this.state=normal;break;case osc:// OSC Ps ; Pt ST
-// OSC Ps ; Pt BEL
-// Set Text Parameters.
-if(ch==='\x1b'||ch==='\x07'){if(ch==='\x1b')i++;this.params.push(this.currentParam);switch(this.params[0]){case 0:case 1:case 2:if(this.params[1]){this.title=this.params[1];this.handleTitle(this.title);}break;case 3:// set X property
-break;case 4:case 5:// change dynamic colors
-break;case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:// change dynamic ui colors
-break;case 46:// change log file
-break;case 50:// dynamic font
-break;case 51:// emacs shell
-break;case 52:// manipulate selection data
-break;case 104:case 105:case 110:case 111:case 112:case 113:case 114:case 115:case 116:case 117:case 118:// reset colors
-break;}this.params=[];this.currentParam=0;this.state=normal;}else{if(!this.params.length){if(ch>='0'&&ch<='9'){this.currentParam=this.currentParam*10+ch.charCodeAt(0)-48;}else if(ch===';'){this.params.push(this.currentParam);this.currentParam='';}}else{this.currentParam+=ch;}}break;case csi:// '?', '>', '!'
-if(ch==='?'||ch==='>'||ch==='!'){this.prefix=ch;break;}// 0 - 9
-if(ch>='0'&&ch<='9'){this.currentParam=this.currentParam*10+ch.charCodeAt(0)-48;break;}// '$', '"', ' ', '\''
-if(ch==='$'||ch==='"'||ch===' '||ch==='\''){this.postfix=ch;break;}this.params.push(this.currentParam);this.currentParam=0;// ';'
-if(ch===';')break;this.state=normal;switch(ch){// CSI Ps A
-// Cursor Up Ps Times (default = 1) (CUU).
-case'A':this.cursorUp(this.params);break;// CSI Ps B
-// Cursor Down Ps Times (default = 1) (CUD).
-case'B':this.cursorDown(this.params);break;// CSI Ps C
-// Cursor Forward Ps Times (default = 1) (CUF).
-case'C':this.cursorForward(this.params);break;// CSI Ps D
-// Cursor Backward Ps Times (default = 1) (CUB).
-case'D':this.cursorBackward(this.params);break;// CSI Ps ; Ps H
-// Cursor Position [row;column] (default = [1,1]) (CUP).
-case'H':this.cursorPos(this.params);break;// CSI Ps J Erase in Display (ED).
-case'J':this.eraseInDisplay(this.params);break;// CSI Ps K Erase in Line (EL).
-case'K':this.eraseInLine(this.params);break;// CSI Pm m Character Attributes (SGR).
-case'm':if(!this.prefix){this.charAttributes(this.params);}break;// CSI Ps n Device Status Report (DSR).
-case'n':if(!this.prefix){this.deviceStatus(this.params);}break;/**
- * Additions
- */// CSI Ps @
-// Insert Ps (Blank) Character(s) (default = 1) (ICH).
-case'@':this.insertChars(this.params);break;// CSI Ps E
-// Cursor Next Line Ps Times (default = 1) (CNL).
-case'E':this.cursorNextLine(this.params);break;// CSI Ps F
-// Cursor Preceding Line Ps Times (default = 1) (CNL).
-case'F':this.cursorPrecedingLine(this.params);break;// CSI Ps G
-// Cursor Character Absolute [column] (default = [row,1]) (CHA).
-case'G':this.cursorCharAbsolute(this.params);break;// CSI Ps L
-// Insert Ps Line(s) (default = 1) (IL).
-case'L':this.insertLines(this.params);break;// CSI Ps M
-// Delete Ps Line(s) (default = 1) (DL).
-case'M':this.deleteLines(this.params);break;// CSI Ps P
-// Delete Ps Character(s) (default = 1) (DCH).
-case'P':this.deleteChars(this.params);break;// CSI Ps X
-// Erase Ps Character(s) (default = 1) (ECH).
-case'X':this.eraseChars(this.params);break;// CSI Pm ` Character Position Absolute
-// [column] (default = [row,1]) (HPA).
-case'`':this.charPosAbsolute(this.params);break;// 141 61 a * HPR -
-// Horizontal Position Relative
-case'a':this.HPositionRelative(this.params);break;// CSI P s c
-// Send Device Attributes (Primary DA).
-// CSI > P s c
-// Send Device Attributes (Secondary DA)
-case'c':this.sendDeviceAttributes(this.params);break;// CSI Pm d
-// Line Position Absolute [row] (default = [1,column]) (VPA).
-case'd':this.linePosAbsolute(this.params);break;// 145 65 e * VPR - Vertical Position Relative
-case'e':this.VPositionRelative(this.params);break;// CSI Ps ; Ps f
-// Horizontal and Vertical Position [row;column] (default =
-// [1,1]) (HVP).
-case'f':this.HVPosition(this.params);break;// CSI Pm h Set Mode (SM).
-// CSI ? Pm h - mouse escape codes, cursor escape codes
-case'h':this.setMode(this.params);break;// CSI Pm l Reset Mode (RM).
-// CSI ? Pm l
-case'l':this.resetMode(this.params);break;// CSI Ps ; Ps r
-// Set Scrolling Region [top;bottom] (default = full size of win-
-// dow) (DECSTBM).
-// CSI ? Pm r
-case'r':this.setScrollRegion(this.params);break;// CSI s
-// Save cursor (ANSI.SYS).
-case's':this.saveCursor(this.params);break;// CSI u
-// Restore cursor (ANSI.SYS).
-case'u':this.restoreCursor(this.params);break;/**
- * Lesser Used
- */// CSI Ps I
-// Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).
-case'I':this.cursorForwardTab(this.params);break;// CSI Ps S Scroll up Ps lines (default = 1) (SU).
-case'S':this.scrollUp(this.params);break;// CSI Ps T Scroll down Ps lines (default = 1) (SD).
-// CSI Ps ; Ps ; Ps ; Ps ; Ps T
-// CSI > Ps; Ps T
-case'T':// if (this.prefix === '>') {
-// this.resetTitleModes(this.params);
-// break;
-// }
-// if (this.params.length > 2) {
-// this.initMouseTracking(this.params);
-// break;
-// }
-if(this.params.length<2&&!this.prefix){this.scrollDown(this.params);}break;// CSI Ps Z
-// Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).
-case'Z':this.cursorBackwardTab(this.params);break;// CSI Ps b Repeat the preceding graphic character Ps times (REP).
-case'b':this.repeatPrecedingCharacter(this.params);break;// CSI Ps g Tab Clear (TBC).
-case'g':this.tabClear(this.params);break;// CSI Pm i Media Copy (MC).
-// CSI ? Pm i
-// case 'i':
-// this.mediaCopy(this.params);
-// break;
-// CSI Pm m Character Attributes (SGR).
-// CSI > Ps; Ps m
-// case 'm': // duplicate
-// if (this.prefix === '>') {
-// this.setResources(this.params);
-// } else {
-// this.charAttributes(this.params);
-// }
-// break;
-// CSI Ps n Device Status Report (DSR).
-// CSI > Ps n
-// case 'n': // duplicate
-// if (this.prefix === '>') {
-// this.disableModifiers(this.params);
-// } else {
-// this.deviceStatus(this.params);
-// }
-// break;
-// CSI > Ps p Set pointer mode.
-// CSI ! p Soft terminal reset (DECSTR).
-// CSI Ps$ p
-// Request ANSI mode (DECRQM).
-// CSI ? Ps$ p
-// Request DEC private mode (DECRQM).
-// CSI Ps ; Ps " p
-case'p':switch(this.prefix){// case '>':
-// this.setPointerMode(this.params);
-// break;
-case'!':this.softReset(this.params);break;// case '?':
-// if (this.postfix === '$') {
-// this.requestPrivateMode(this.params);
-// }
-// break;
-// default:
-// if (this.postfix === '"') {
-// this.setConformanceLevel(this.params);
-// } else if (this.postfix === '$') {
-// this.requestAnsiMode(this.params);
-// }
-// break;
-}break;// CSI Ps q Load LEDs (DECLL).
-// CSI Ps SP q
-// CSI Ps " q
-// case 'q':
-// if (this.postfix === ' ') {
-// this.setCursorStyle(this.params);
-// break;
-// }
-// if (this.postfix === '"') {
-// this.setCharProtectionAttr(this.params);
-// break;
-// }
-// this.loadLEDs(this.params);
-// break;
-// CSI Ps ; Ps r
-// Set Scrolling Region [top;bottom] (default = full size of win-
-// dow) (DECSTBM).
-// CSI ? Pm r
-// CSI Pt; Pl; Pb; Pr; Ps$ r
-// case 'r': // duplicate
-// if (this.prefix === '?') {
-// this.restorePrivateValues(this.params);
-// } else if (this.postfix === '$') {
-// this.setAttrInRectangle(this.params);
-// } else {
-// this.setScrollRegion(this.params);
-// }
-// break;
-// CSI s Save cursor (ANSI.SYS).
-// CSI ? Pm s
-// case 's': // duplicate
-// if (this.prefix === '?') {
-// this.savePrivateValues(this.params);
-// } else {
-// this.saveCursor(this.params);
-// }
-// break;
-// CSI Ps ; Ps ; Ps t
-// CSI Pt; Pl; Pb; Pr; Ps$ t
-// CSI > Ps; Ps t
-// CSI Ps SP t
-// case 't':
-// if (this.postfix === '$') {
-// this.reverseAttrInRectangle(this.params);
-// } else if (this.postfix === ' ') {
-// this.setWarningBellVolume(this.params);
-// } else {
-// if (this.prefix === '>') {
-// this.setTitleModeFeature(this.params);
-// } else {
-// this.manipulateWindow(this.params);
-// }
-// }
-// break;
-// CSI u Restore cursor (ANSI.SYS).
-// CSI Ps SP u
-// case 'u': // duplicate
-// if (this.postfix === ' ') {
-// this.setMarginBellVolume(this.params);
-// } else {
-// this.restoreCursor(this.params);
-// }
-// break;
-// CSI Pt; Pl; Pb; Pr; Pp; Pt; Pl; Pp$ v
-// case 'v':
-// if (this.postfix === '$') {
-// this.copyRectagle(this.params);
-// }
-// break;
-// CSI Pt ; Pl ; Pb ; Pr ' w
-// case 'w':
-// if (this.postfix === '\'') {
-// this.enableFilterRectangle(this.params);
-// }
-// break;
-// CSI Ps x Request Terminal Parameters (DECREQTPARM).
-// CSI Ps x Select Attribute Change Extent (DECSACE).
-// CSI Pc; Pt; Pl; Pb; Pr$ x
-// case 'x':
-// if (this.postfix === '$') {
-// this.fillRectangle(this.params);
-// } else {
-// this.requestParameters(this.params);
-// //this.__(this.params);
-// }
-// break;
-// CSI Ps ; Pu ' z
-// CSI Pt; Pl; Pb; Pr$ z
-// case 'z':
-// if (this.postfix === '\'') {
-// this.enableLocatorReporting(this.params);
-// } else if (this.postfix === '$') {
-// this.eraseRectangle(this.params);
-// }
-// break;
-// CSI Pm ' {
-// CSI Pt; Pl; Pb; Pr$ {
-// case '{':
-// if (this.postfix === '\'') {
-// this.setLocatorEvents(this.params);
-// } else if (this.postfix === '$') {
-// this.selectiveEraseRectangle(this.params);
-// }
-// break;
-// CSI Ps ' |
-// case '|':
-// if (this.postfix === '\'') {
-// this.requestLocatorPosition(this.params);
-// }
-// break;
-// CSI P m SP }
-// Insert P s Column(s) (default = 1) (DECIC), VT420 and up.
-// case '}':
-// if (this.postfix === ' ') {
-// this.insertColumns(this.params);
-// }
-// break;
-// CSI P m SP ~
-// Delete P s Column(s) (default = 1) (DECDC), VT420 and up
-// case '~':
-// if (this.postfix === ' ') {
-// this.deleteColumns(this.params);
-// }
-// break;
-default:this.error('Unknown CSI code: %s.',ch);break;}this.prefix='';this.postfix='';break;case dcs:if(ch==='\x1b'||ch==='\x07'){if(ch==='\x1b')i++;switch(this.prefix){// User-Defined Keys (DECUDK).
-case'':break;// Request Status String (DECRQSS).
-// test: echo -e '\eP$q"p\e\\'
-case'$q':var pt=this.currentParam,valid=false;switch(pt){// DECSCA
-case'"q':pt='0"q';break;// DECSCL
-case'"p':pt='61"p';break;// DECSTBM
-case'r':pt=''+(this.scrollTop+1)+';'+(this.scrollBottom+1)+'r';break;// SGR
-case'm':pt='0m';break;default:this.error('Unknown DCS Pt: %s.',pt);pt='';break;}this.send('\x1bP'+ +valid+'$r'+pt+'\x1b\\');break;// Set Termcap/Terminfo Data (xterm, experimental).
-case'+p':break;// Request Termcap/Terminfo String (xterm, experimental)
-// Regular xterm does not even respond to this sequence.
-// This can cause a small glitch in vim.
-// test: echo -ne '\eP+q6b64\e\\'
-case'+q':var pt=this.currentParam,valid=false;this.send('\x1bP'+ +valid+'+r'+pt+'\x1b\\');break;default:this.error('Unknown DCS prefix: %s.',this.prefix);break;}this.currentParam=0;this.prefix='';this.state=normal;}else if(!this.currentParam){if(!this.prefix&&ch!=='$'&&ch!=='+'){this.currentParam=ch;}else if(this.prefix.length===2){this.currentParam=ch;}else{this.prefix+=ch;}}else{this.currentParam+=ch;}break;case ignore:// For PM and APC.
-if(ch==='\x1b'||ch==='\x07'){if(ch==='\x1b')i++;this.state=normal;}break;}}this.updateRange(this.y);this.refresh(this.refreshStart,this.refreshEnd);};/**
- * Writes text to the terminal, followed by a break line character (\n).
- * @param {string} text The text to write to the terminal.
- */Terminal.prototype.writeln=function(data){this.write(data+'\r\n');};/**
- * Attaches a custom keydown handler which is run before keys are processed, giving consumers of
- * xterm.js ultimate control as to what keys should be processed by the terminal and what keys
- * should not.
- * @param {function} customKeydownHandler The custom KeyboardEvent handler to attach. This is a
- * function that takes a KeyboardEvent, allowing consumers to stop propogation and/or prevent
- * the default action. The function returns whether the event should be processed by xterm.js.
- */Terminal.prototype.attachCustomKeydownHandler=function(customKeydownHandler){this.customKeydownHandler=customKeydownHandler;};/**
- * Handle a keydown event
- * Key Resources:
- * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent
- * @param {KeyboardEvent} ev The keydown event to be handled.
- */Terminal.prototype.keyDown=function(ev){// Scroll down to prompt, whenever the user presses a key.
-if(this.ybase!==this.ydisp){this.scrollToBottom();}if(this.customKeydownHandler&&this.customKeydownHandler(ev)===false){return false;}if(!this.compositionHelper.keydown.bind(this.compositionHelper)(ev)){return false;}var self=this;var result=this.evaluateKeyEscapeSequence(ev);if(result.scrollDisp){this.scrollDisp(result.scrollDisp);return this.cancel(ev,true);}if(isThirdLevelShift(this,ev)){return true;}if(result.cancel){// The event is canceled at the end already, is this necessary?
-this.cancel(ev,true);}if(!result.key){return true;}this.emit('keydown',ev);this.emit('key',result.key,ev);this.showCursor();this.handler(result.key);return this.cancel(ev,true);};/**
- * Returns an object that determines how a KeyboardEvent should be handled. The key of the
- * returned value is the new key code to pass to the PTY.
- *
- * Reference: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
- * @param {KeyboardEvent} ev The keyboard event to be translated to key escape sequence.
- */Terminal.prototype.evaluateKeyEscapeSequence=function(ev){var result={// Whether to cancel event propogation (NOTE: this may not be needed since the event is
-// canceled at the end of keyDown
-cancel:false,// The new key even to emit
-key:undefined,// The number of characters to scroll, if this is defined it will cancel the event
-scrollDisp:undefined};var modifiers=ev.shiftKey<<0|ev.altKey<<1|ev.ctrlKey<<2|ev.metaKey<<3;switch(ev.keyCode){case 8:// backspace
-if(ev.shiftKey){result.key='\x08';// ^H
-break;}result.key='\x7f';// ^?
-break;case 9:// tab
-if(ev.shiftKey){result.key='\x1b[Z';break;}result.key='\t';result.cancel=true;break;case 13:// return/enter
-result.key='\r';result.cancel=true;break;case 27:// escape
-result.key='\x1b';result.cancel=true;break;case 37:// left-arrow
-if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'D';// HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards
-// http://unix.stackexchange.com/a/108106
-if(result.key=='\x1b[1;3D'){result.key='\x1b[1;5D';}}else if(this.applicationCursor){result.key='\x1bOD';}else{result.key='\x1b[D';}break;case 39:// right-arrow
-if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'C';// HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward
-// http://unix.stackexchange.com/a/108106
-if(result.key=='\x1b[1;3C'){result.key='\x1b[1;5C';}}else if(this.applicationCursor){result.key='\x1bOC';}else{result.key='\x1b[C';}break;case 38:// up-arrow
-if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'A';// HACK: Make Alt + up-arrow behave like Ctrl + up-arrow
-// http://unix.stackexchange.com/a/108106
-if(result.key=='\x1b[1;3A'){result.key='\x1b[1;5A';}}else if(this.applicationCursor){result.key='\x1bOA';}else{result.key='\x1b[A';}break;case 40:// down-arrow
-if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'B';// HACK: Make Alt + down-arrow behave like Ctrl + down-arrow
-// http://unix.stackexchange.com/a/108106
-if(result.key=='\x1b[1;3B'){result.key='\x1b[1;5B';}}else if(this.applicationCursor){result.key='\x1bOB';}else{result.key='\x1b[B';}break;case 45:// insert
-if(!ev.shiftKey&&!ev.ctrlKey){// <Ctrl> or <Shift> + <Insert> are used to
-// copy-paste on some systems.
-result.key='\x1b[2~';}break;case 46:// delete
-if(modifiers){result.key='\x1b[3;'+(modifiers+1)+'~';}else{result.key='\x1b[3~';}break;case 36:// home
-if(modifiers)result.key='\x1b[1;'+(modifiers+1)+'H';else if(this.applicationCursor)result.key='\x1bOH';else result.key='\x1b[H';break;case 35:// end
-if(modifiers)result.key='\x1b[1;'+(modifiers+1)+'F';else if(this.applicationCursor)result.key='\x1bOF';else result.key='\x1b[F';break;case 33:// page up
-if(ev.shiftKey){result.scrollDisp=-(this.rows-1);}else{result.key='\x1b[5~';}break;case 34:// page down
-if(ev.shiftKey){result.scrollDisp=this.rows-1;}else{result.key='\x1b[6~';}break;case 112:// F1-F12
-if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'P';}else{result.key='\x1bOP';}break;case 113:if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'Q';}else{result.key='\x1bOQ';}break;case 114:if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'R';}else{result.key='\x1bOR';}break;case 115:if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'S';}else{result.key='\x1bOS';}break;case 116:if(modifiers){result.key='\x1b[15;'+(modifiers+1)+'~';}else{result.key='\x1b[15~';}break;case 117:if(modifiers){result.key='\x1b[17;'+(modifiers+1)+'~';}else{result.key='\x1b[17~';}break;case 118:if(modifiers){result.key='\x1b[18;'+(modifiers+1)+'~';}else{result.key='\x1b[18~';}break;case 119:if(modifiers){result.key='\x1b[19;'+(modifiers+1)+'~';}else{result.key='\x1b[19~';}break;case 120:if(modifiers){result.key='\x1b[20;'+(modifiers+1)+'~';}else{result.key='\x1b[20~';}break;case 121:if(modifiers){result.key='\x1b[21;'+(modifiers+1)+'~';}else{result.key='\x1b[21~';}break;case 122:if(modifiers){result.key='\x1b[23;'+(modifiers+1)+'~';}else{result.key='\x1b[23~';}break;case 123:if(modifiers){result.key='\x1b[24;'+(modifiers+1)+'~';}else{result.key='\x1b[24~';}break;default:// a-z and space
-if(ev.ctrlKey&&!ev.shiftKey&&!ev.altKey&&!ev.metaKey){if(ev.keyCode>=65&&ev.keyCode<=90){result.key=String.fromCharCode(ev.keyCode-64);}else if(ev.keyCode===32){// NUL
-result.key=String.fromCharCode(0);}else if(ev.keyCode>=51&&ev.keyCode<=55){// escape, file sep, group sep, record sep, unit sep
-result.key=String.fromCharCode(ev.keyCode-51+27);}else if(ev.keyCode===56){// delete
-result.key=String.fromCharCode(127);}else if(ev.keyCode===219){// ^[ - escape
-result.key=String.fromCharCode(27);}else if(ev.keyCode===221){// ^] - group sep
-result.key=String.fromCharCode(29);}}else if(!this.browser.isMac&&ev.altKey&&!ev.ctrlKey&&!ev.metaKey){// On Mac this is a third level shift. Use <Esc> instead.
-if(ev.keyCode>=65&&ev.keyCode<=90){result.key='\x1b'+String.fromCharCode(ev.keyCode+32);}else if(ev.keyCode===192){result.key='\x1b`';}else if(ev.keyCode>=48&&ev.keyCode<=57){result.key='\x1b'+(ev.keyCode-48);}}break;}return result;};/**
- * Set the G level of the terminal
- * @param g
- */Terminal.prototype.setgLevel=function(g){this.glevel=g;this.charset=this.charsets[g];};/**
- * Set the charset for the given G level of the terminal
- * @param g
- * @param charset
- */Terminal.prototype.setgCharset=function(g,charset){this.charsets[g]=charset;if(this.glevel===g){this.charset=charset;}};/**
- * Handle a keypress event.
- * Key Resources:
- * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent
- * @param {KeyboardEvent} ev The keypress event to be handled.
- */Terminal.prototype.keyPress=function(ev){var key;this.cancel(ev);if(ev.charCode){key=ev.charCode;}else if(ev.which==null){key=ev.keyCode;}else if(ev.which!==0&&ev.charCode!==0){key=ev.which;}else{return false;}if(!key||(ev.altKey||ev.ctrlKey||ev.metaKey)&&!isThirdLevelShift(this,ev)){return false;}key=String.fromCharCode(key);this.emit('keypress',key,ev);this.emit('key',key,ev);this.showCursor();this.handler(key);return false;};/**
- * Send data for handling to the terminal
- * @param {string} data
- */Terminal.prototype.send=function(data){var self=this;if(!this.queue){setTimeout(function(){self.handler(self.queue);self.queue='';},1);}this.queue+=data;};/**
- * Ring the bell.
- * Note: We could do sweet things with webaudio here
- */Terminal.prototype.bell=function(){if(!this.visualBell)return;var self=this;this.element.style.borderColor='white';setTimeout(function(){self.element.style.borderColor='';},10);if(this.popOnBell)this.focus();};/**
- * Log the current state to the console.
- */Terminal.prototype.log=function(){if(!this.debug)return;if(!this.context.console||!this.context.console.log)return;var args=Array.prototype.slice.call(arguments);this.context.console.log.apply(this.context.console,args);};/**
- * Log the current state as error to the console.
- */Terminal.prototype.error=function(){if(!this.debug)return;if(!this.context.console||!this.context.console.error)return;var args=Array.prototype.slice.call(arguments);this.context.console.error.apply(this.context.console,args);};/**
- * Resizes the terminal.
- *
- * @param {number} x The number of columns to resize to.
- * @param {number} y The number of rows to resize to.
- */Terminal.prototype.resize=function(x,y){var line,el,i,j,ch,addToY;if(x===this.cols&&y===this.rows){return;}if(x<1)x=1;if(y<1)y=1;// resize cols
-j=this.cols;if(j<x){ch=[this.defAttr,' ',1];// does xterm use the default attr?
-i=this.lines.length;while(i--){while(this.lines[i].length<x){this.lines[i].push(ch);}}}else{// (j > x)
-i=this.lines.length;while(i--){while(this.lines[i].length>x){this.lines[i].pop();}}}this.setupStops(j);this.cols=x;// resize rows
-j=this.rows;addToY=0;if(j<y){el=this.element;while(j++<y){// y is rows, not this.y
-if(this.lines.length<y+this.ybase){if(this.ybase>0&&this.lines.length<=this.ybase+this.y+addToY+1){// There is room above the buffer and there are no empty elements below the line,
-// scroll up
-this.ybase--;addToY++;if(this.ydisp>0){// Viewport is at the top of the buffer, must increase downwards
-this.ydisp--;}}else{// Add a blank line if there is no buffer left at the top to scroll to, or if there
-// are blank lines after the cursor
-this.lines.push(this.blankLine());}}if(this.children.length<y){this.insertRow();}}}else{// (j > y)
-while(j-->y){if(this.lines.length>y+this.ybase){if(this.lines.length>this.ybase+this.y+1){// The line is a blank line below the cursor, remove it
-this.lines.pop();}else{// The line is the cursor, scroll down
-this.ybase++;this.ydisp++;}}if(this.children.length>y){el=this.children.shift();if(!el)continue;el.parentNode.removeChild(el);}}}this.rows=y;// Make sure that the cursor stays on screen
-if(this.y>=y){this.y=y-1;}if(addToY){this.y+=addToY;}if(this.x>=x){this.x=x-1;}this.scrollTop=0;this.scrollBottom=y-1;this.refresh(0,this.rows-1);this.normal=null;this.geometry=[this.cols,this.rows];this.emit('resize',{terminal:this,cols:x,rows:y});};/**
- * Updates the range of rows to refresh
- * @param {number} y The number of rows to refresh next.
- */Terminal.prototype.updateRange=function(y){if(y<this.refreshStart)this.refreshStart=y;if(y>this.refreshEnd)this.refreshEnd=y;// if (y > this.refreshEnd) {
-// this.refreshEnd = y;
-// if (y > this.rows - 1) {
-// this.refreshEnd = this.rows - 1;
-// }
-// }
-};/**
- * Set the range of refreshing to the maximum value
- */Terminal.prototype.maxRange=function(){this.refreshStart=0;this.refreshEnd=this.rows-1;};/**
- * Setup the tab stops.
- * @param {number} i
- */Terminal.prototype.setupStops=function(i){if(i!=null){if(!this.tabs[i]){i=this.prevStop(i);}}else{this.tabs={};i=0;}for(;i<this.cols;i+=8){this.tabs[i]=true;}};/**
- * Move the cursor to the previous tab stop from the given position (default is current).
- * @param {number} x The position to move the cursor to the previous tab stop.
- */Terminal.prototype.prevStop=function(x){if(x==null)x=this.x;while(!this.tabs[--x]&&x>0){}return x>=this.cols?this.cols-1:x<0?0:x;};/**
- * Move the cursor one tab stop forward from the given position (default is current).
- * @param {number} x The position to move the cursor one tab stop forward.
- */Terminal.prototype.nextStop=function(x){if(x==null)x=this.x;while(!this.tabs[++x]&&x<this.cols){}return x>=this.cols?this.cols-1:x<0?0:x;};/**
- * Erase in the identified line everything from "x" to the end of the line (right).
- * @param {number} x The column from which to start erasing to the end of the line.
- * @param {number} y The line in which to operate.
- */Terminal.prototype.eraseRight=function(x,y){var line=this.lines[this.ybase+y],ch=[this.eraseAttr(),' ',1];// xterm
-for(;x<this.cols;x++){line[x]=ch;}this.updateRange(y);};/**
- * Erase in the identified line everything from "x" to the start of the line (left).
- * @param {number} x The column from which to start erasing to the start of the line.
- * @param {number} y The line in which to operate.
- */Terminal.prototype.eraseLeft=function(x,y){var line=this.lines[this.ybase+y],ch=[this.eraseAttr(),' ',1];// xterm
-x++;while(x--){line[x]=ch;}this.updateRange(y);};/**
- * Clears the entire buffer, making the prompt line the new first line.
- */Terminal.prototype.clear=function(){if(this.ybase===0&&this.y===0){// Don't clear if it's already clear
-return;}this.lines=[this.lines[this.ybase+this.y]];this.ydisp=0;this.ybase=0;this.y=0;for(var i=1;i<this.rows;i++){this.lines.push(this.blankLine());}this.refresh(0,this.rows-1);this.emit('scroll',this.ydisp);};/**
- * Erase all content in the given line
- * @param {number} y The line to erase all of its contents.
- */Terminal.prototype.eraseLine=function(y){this.eraseRight(0,y);};/**
- * Return the data array of a blank line/
- * @param {number} cur First bunch of data for each "blank" character.
- */Terminal.prototype.blankLine=function(cur){var attr=cur?this.eraseAttr():this.defAttr;var ch=[attr,' ',1]// width defaults to 1 halfwidth character
-,line=[],i=0;for(;i<this.cols;i++){line[i]=ch;}return line;};/**
- * If cur return the back color xterm feature attribute. Else return defAttr.
- * @param {object} cur
- */Terminal.prototype.ch=function(cur){return cur?[this.eraseAttr(),' ',1]:[this.defAttr,' ',1];};/**
- * Evaluate if the current erminal is the given argument.
- * @param {object} term The terminal to evaluate
- */Terminal.prototype.is=function(term){var name=this.termName;return(name+'').indexOf(term)===0;};/**
- * Emit the 'data' event and populate the given data.
- * @param {string} data The data to populate in the event.
- */Terminal.prototype.handler=function(data){this.emit('data',data);};/**
- * Emit the 'title' event and populate the given title.
- * @param {string} title The title to populate in the event.
- */Terminal.prototype.handleTitle=function(title){this.emit('title',title);};/**
- * ESC
- *//**
- * ESC D Index (IND is 0x84).
- */Terminal.prototype.index=function(){this.y++;if(this.y>this.scrollBottom){this.y--;this.scroll();}this.state=normal;};/**
- * ESC M Reverse Index (RI is 0x8d).
- */Terminal.prototype.reverseIndex=function(){var j;this.y--;if(this.y<this.scrollTop){this.y++;// possibly move the code below to term.reverseScroll();
-// test: echo -ne '\e[1;1H\e[44m\eM\e[0m'
-// blankLine(true) is xterm/linux behavior
-this.lines.splice(this.y+this.ybase,0,this.blankLine(true));j=this.rows-1-this.scrollBottom;this.lines.splice(this.rows-1+this.ybase-j+1,1);// this.maxRange();
-this.updateRange(this.scrollTop);this.updateRange(this.scrollBottom);}this.state=normal;};/**
- * ESC c Full Reset (RIS).
- */Terminal.prototype.reset=function(){this.options.rows=this.rows;this.options.cols=this.cols;var customKeydownHandler=this.customKeydownHandler;Terminal.call(this,this.options);this.customKeydownHandler=customKeydownHandler;this.refresh(0,this.rows-1);this.viewport.syncScrollArea();};/**
- * ESC H Tab Set (HTS is 0x88).
- */Terminal.prototype.tabSet=function(){this.tabs[this.x]=true;this.state=normal;};/**
- * CSI
- *//**
- * CSI Ps A
- * Cursor Up Ps Times (default = 1) (CUU).
- */Terminal.prototype.cursorUp=function(params){var param=params[0];if(param<1)param=1;this.y-=param;if(this.y<0)this.y=0;};/**
- * CSI Ps B
- * Cursor Down Ps Times (default = 1) (CUD).
- */Terminal.prototype.cursorDown=function(params){var param=params[0];if(param<1)param=1;this.y+=param;if(this.y>=this.rows){this.y=this.rows-1;}};/**
- * CSI Ps C
- * Cursor Forward Ps Times (default = 1) (CUF).
- */Terminal.prototype.cursorForward=function(params){var param=params[0];if(param<1)param=1;this.x+=param;if(this.x>=this.cols){this.x=this.cols-1;}};/**
- * CSI Ps D
- * Cursor Backward Ps Times (default = 1) (CUB).
- */Terminal.prototype.cursorBackward=function(params){var param=params[0];if(param<1)param=1;this.x-=param;if(this.x<0)this.x=0;};/**
- * CSI Ps ; Ps H
- * Cursor Position [row;column] (default = [1,1]) (CUP).
- */Terminal.prototype.cursorPos=function(params){var row,col;row=params[0]-1;if(params.length>=2){col=params[1]-1;}else{col=0;}if(row<0){row=0;}else if(row>=this.rows){row=this.rows-1;}if(col<0){col=0;}else if(col>=this.cols){col=this.cols-1;}this.x=col;this.y=row;};/**
- * CSI Ps J Erase in Display (ED).
- * Ps = 0 -> Erase Below (default).
- * Ps = 1 -> Erase Above.
- * Ps = 2 -> Erase All.
- * Ps = 3 -> Erase Saved Lines (xterm).
- * CSI ? Ps J
- * Erase in Display (DECSED).
- * Ps = 0 -> Selective Erase Below (default).
- * Ps = 1 -> Selective Erase Above.
- * Ps = 2 -> Selective Erase All.
- */Terminal.prototype.eraseInDisplay=function(params){var j;switch(params[0]){case 0:this.eraseRight(this.x,this.y);j=this.y+1;for(;j<this.rows;j++){this.eraseLine(j);}break;case 1:this.eraseLeft(this.x,this.y);j=this.y;while(j--){this.eraseLine(j);}break;case 2:j=this.rows;while(j--){this.eraseLine(j);}break;case 3:;// no saved lines
-break;}};/**
- * CSI Ps K Erase in Line (EL).
- * Ps = 0 -> Erase to Right (default).
- * Ps = 1 -> Erase to Left.
- * Ps = 2 -> Erase All.
- * CSI ? Ps K
- * Erase in Line (DECSEL).
- * Ps = 0 -> Selective Erase to Right (default).
- * Ps = 1 -> Selective Erase to Left.
- * Ps = 2 -> Selective Erase All.
- */Terminal.prototype.eraseInLine=function(params){switch(params[0]){case 0:this.eraseRight(this.x,this.y);break;case 1:this.eraseLeft(this.x,this.y);break;case 2:this.eraseLine(this.y);break;}};/**
- * CSI Pm m Character Attributes (SGR).
- * Ps = 0 -> Normal (default).
- * Ps = 1 -> Bold.
- * Ps = 4 -> Underlined.
- * Ps = 5 -> Blink (appears as Bold).
- * Ps = 7 -> Inverse.
- * Ps = 8 -> Invisible, i.e., hidden (VT300).
- * Ps = 2 2 -> Normal (neither bold nor faint).
- * Ps = 2 4 -> Not underlined.
- * Ps = 2 5 -> Steady (not blinking).
- * Ps = 2 7 -> Positive (not inverse).
- * Ps = 2 8 -> Visible, i.e., not hidden (VT300).
- * Ps = 3 0 -> Set foreground color to Black.
- * Ps = 3 1 -> Set foreground color to Red.
- * Ps = 3 2 -> Set foreground color to Green.
- * Ps = 3 3 -> Set foreground color to Yellow.
- * Ps = 3 4 -> Set foreground color to Blue.
- * Ps = 3 5 -> Set foreground color to Magenta.
- * Ps = 3 6 -> Set foreground color to Cyan.
- * Ps = 3 7 -> Set foreground color to White.
- * Ps = 3 9 -> Set foreground color to default (original).
- * Ps = 4 0 -> Set background color to Black.
- * Ps = 4 1 -> Set background color to Red.
- * Ps = 4 2 -> Set background color to Green.
- * Ps = 4 3 -> Set background color to Yellow.
- * Ps = 4 4 -> Set background color to Blue.
- * Ps = 4 5 -> Set background color to Magenta.
- * Ps = 4 6 -> Set background color to Cyan.
- * Ps = 4 7 -> Set background color to White.
- * Ps = 4 9 -> Set background color to default (original).
- *
- * If 16-color support is compiled, the following apply. Assume
- * that xterm's resources are set so that the ISO color codes are
- * the first 8 of a set of 16. Then the aixterm colors are the
- * bright versions of the ISO colors:
- * Ps = 9 0 -> Set foreground color to Black.
- * Ps = 9 1 -> Set foreground color to Red.
- * Ps = 9 2 -> Set foreground color to Green.
- * Ps = 9 3 -> Set foreground color to Yellow.
- * Ps = 9 4 -> Set foreground color to Blue.
- * Ps = 9 5 -> Set foreground color to Magenta.
- * Ps = 9 6 -> Set foreground color to Cyan.
- * Ps = 9 7 -> Set foreground color to White.
- * Ps = 1 0 0 -> Set background color to Black.
- * Ps = 1 0 1 -> Set background color to Red.
- * Ps = 1 0 2 -> Set background color to Green.
- * Ps = 1 0 3 -> Set background color to Yellow.
- * Ps = 1 0 4 -> Set background color to Blue.
- * Ps = 1 0 5 -> Set background color to Magenta.
- * Ps = 1 0 6 -> Set background color to Cyan.
- * Ps = 1 0 7 -> Set background color to White.
- *
- * If xterm is compiled with the 16-color support disabled, it
- * supports the following, from rxvt:
- * Ps = 1 0 0 -> Set foreground and background color to
- * default.
- *
- * If 88- or 256-color support is compiled, the following apply.
- * Ps = 3 8 ; 5 ; Ps -> Set foreground color to the second
- * Ps.
- * Ps = 4 8 ; 5 ; Ps -> Set background color to the second
- * Ps.
- */Terminal.prototype.charAttributes=function(params){// Optimize a single SGR0.
-if(params.length===1&&params[0]===0){this.curAttr=this.defAttr;return;}var l=params.length,i=0,flags=this.curAttr>>18,fg=this.curAttr>>9&0x1ff,bg=this.curAttr&0x1ff,p;for(;i<l;i++){p=params[i];if(p>=30&&p<=37){// fg color 8
-fg=p-30;}else if(p>=40&&p<=47){// bg color 8
-bg=p-40;}else if(p>=90&&p<=97){// fg color 16
-p+=8;fg=p-90;}else if(p>=100&&p<=107){// bg color 16
-p+=8;bg=p-100;}else if(p===0){// default
-flags=this.defAttr>>18;fg=this.defAttr>>9&0x1ff;bg=this.defAttr&0x1ff;// flags = 0;
-// fg = 0x1ff;
-// bg = 0x1ff;
-}else if(p===1){// bold text
-flags|=1;}else if(p===4){// underlined text
-flags|=2;}else if(p===5){// blink
-flags|=4;}else if(p===7){// inverse and positive
-// test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m'
-flags|=8;}else if(p===8){// invisible
-flags|=16;}else if(p===22){// not bold
-flags&=~1;}else if(p===24){// not underlined
-flags&=~2;}else if(p===25){// not blink
-flags&=~4;}else if(p===27){// not inverse
-flags&=~8;}else if(p===28){// not invisible
-flags&=~16;}else if(p===39){// reset fg
-fg=this.defAttr>>9&0x1ff;}else if(p===49){// reset bg
-bg=this.defAttr&0x1ff;}else if(p===38){// fg color 256
-if(params[i+1]===2){i+=2;fg=matchColor(params[i]&0xff,params[i+1]&0xff,params[i+2]&0xff);if(fg===-1)fg=0x1ff;i+=2;}else if(params[i+1]===5){i+=2;p=params[i]&0xff;fg=p;}}else if(p===48){// bg color 256
-if(params[i+1]===2){i+=2;bg=matchColor(params[i]&0xff,params[i+1]&0xff,params[i+2]&0xff);if(bg===-1)bg=0x1ff;i+=2;}else if(params[i+1]===5){i+=2;p=params[i]&0xff;bg=p;}}else if(p===100){// reset fg/bg
-fg=this.defAttr>>9&0x1ff;bg=this.defAttr&0x1ff;}else{this.error('Unknown SGR attribute: %d.',p);}}this.curAttr=flags<<18|fg<<9|bg;};/**
- * CSI Ps n Device Status Report (DSR).
- * Ps = 5 -> Status Report. Result (``OK'') is
- * CSI 0 n
- * Ps = 6 -> Report Cursor Position (CPR) [row;column].
- * Result is
- * CSI r ; c R
- * CSI ? Ps n
- * Device Status Report (DSR, DEC-specific).
- * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI
- * ? r ; c R (assumes page is zero).
- * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).
- * or CSI ? 1 1 n (not ready).
- * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)
- * or CSI ? 2 1 n (locked).
- * Ps = 2 6 -> Report Keyboard status as
- * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).
- * The last two parameters apply to VT400 & up, and denote key-
- * board ready and LK01 respectively.
- * Ps = 5 3 -> Report Locator status as
- * CSI ? 5 3 n Locator available, if compiled-in, or
- * CSI ? 5 0 n No Locator, if not.
- */Terminal.prototype.deviceStatus=function(params){if(!this.prefix){switch(params[0]){case 5:// status report
-this.send('\x1b[0n');break;case 6:// cursor position
-this.send('\x1b['+(this.y+1)+';'+(this.x+1)+'R');break;}}else if(this.prefix==='?'){// modern xterm doesnt seem to
-// respond to any of these except ?6, 6, and 5
-switch(params[0]){case 6:// cursor position
-this.send('\x1b[?'+(this.y+1)+';'+(this.x+1)+'R');break;case 15:// no printer
-// this.send('\x1b[?11n');
-break;case 25:// dont support user defined keys
-// this.send('\x1b[?21n');
-break;case 26:// north american keyboard
-// this.send('\x1b[?27;1;0;0n');
-break;case 53:// no dec locator/mouse
-// this.send('\x1b[?50n');
-break;}}};/**
- * Additions
- *//**
- * CSI Ps @
- * Insert Ps (Blank) Character(s) (default = 1) (ICH).
- */Terminal.prototype.insertChars=function(params){var param,row,j,ch;param=params[0];if(param<1)param=1;row=this.y+this.ybase;j=this.x;ch=[this.eraseAttr(),' ',1];// xterm
-while(param--&&j<this.cols){this.lines[row].splice(j++,0,ch);this.lines[row].pop();}};/**
- * CSI Ps E
- * Cursor Next Line Ps Times (default = 1) (CNL).
- * same as CSI Ps B ?
- */Terminal.prototype.cursorNextLine=function(params){var param=params[0];if(param<1)param=1;this.y+=param;if(this.y>=this.rows){this.y=this.rows-1;}this.x=0;};/**
- * CSI Ps F
- * Cursor Preceding Line Ps Times (default = 1) (CNL).
- * reuse CSI Ps A ?
- */Terminal.prototype.cursorPrecedingLine=function(params){var param=params[0];if(param<1)param=1;this.y-=param;if(this.y<0)this.y=0;this.x=0;};/**
- * CSI Ps G
- * Cursor Character Absolute [column] (default = [row,1]) (CHA).
- */Terminal.prototype.cursorCharAbsolute=function(params){var param=params[0];if(param<1)param=1;this.x=param-1;};/**
- * CSI Ps L
- * Insert Ps Line(s) (default = 1) (IL).
- */Terminal.prototype.insertLines=function(params){var param,row,j;param=params[0];if(param<1)param=1;row=this.y+this.ybase;j=this.rows-1-this.scrollBottom;j=this.rows-1+this.ybase-j+1;while(param--){// test: echo -e '\e[44m\e[1L\e[0m'
-// blankLine(true) - xterm/linux behavior
-this.lines.splice(row,0,this.blankLine(true));this.lines.splice(j,1);}// this.maxRange();
-this.updateRange(this.y);this.updateRange(this.scrollBottom);};/**
- * CSI Ps M
- * Delete Ps Line(s) (default = 1) (DL).
- */Terminal.prototype.deleteLines=function(params){var param,row,j;param=params[0];if(param<1)param=1;row=this.y+this.ybase;j=this.rows-1-this.scrollBottom;j=this.rows-1+this.ybase-j;while(param--){// test: echo -e '\e[44m\e[1M\e[0m'
-// blankLine(true) - xterm/linux behavior
-this.lines.splice(j+1,0,this.blankLine(true));this.lines.splice(row,1);}// this.maxRange();
-this.updateRange(this.y);this.updateRange(this.scrollBottom);};/**
- * CSI Ps P
- * Delete Ps Character(s) (default = 1) (DCH).
- */Terminal.prototype.deleteChars=function(params){var param,row,ch;param=params[0];if(param<1)param=1;row=this.y+this.ybase;ch=[this.eraseAttr(),' ',1];// xterm
-while(param--){this.lines[row].splice(this.x,1);this.lines[row].push(ch);}};/**
- * CSI Ps X
- * Erase Ps Character(s) (default = 1) (ECH).
- */Terminal.prototype.eraseChars=function(params){var param,row,j,ch;param=params[0];if(param<1)param=1;row=this.y+this.ybase;j=this.x;ch=[this.eraseAttr(),' ',1];// xterm
-while(param--&&j<this.cols){this.lines[row][j++]=ch;}};/**
- * CSI Pm ` Character Position Absolute
- * [column] (default = [row,1]) (HPA).
- */Terminal.prototype.charPosAbsolute=function(params){var param=params[0];if(param<1)param=1;this.x=param-1;if(this.x>=this.cols){this.x=this.cols-1;}};/**
- * 141 61 a * HPR -
- * Horizontal Position Relative
- * reuse CSI Ps C ?
- */Terminal.prototype.HPositionRelative=function(params){var param=params[0];if(param<1)param=1;this.x+=param;if(this.x>=this.cols){this.x=this.cols-1;}};/**
- * CSI Ps c Send Device Attributes (Primary DA).
- * Ps = 0 or omitted -> request attributes from terminal. The
- * response depends on the decTerminalID resource setting.
- * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')
- * -> CSI ? 1 ; 0 c (``VT101 with No Options'')
- * -> CSI ? 6 c (``VT102'')
- * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')
- * The VT100-style response parameters do not mean anything by
- * themselves. VT220 parameters do, telling the host what fea-
- * tures the terminal supports:
- * Ps = 1 -> 132-columns.
- * Ps = 2 -> Printer.
- * Ps = 6 -> Selective erase.
- * Ps = 8 -> User-defined keys.
- * Ps = 9 -> National replacement character sets.
- * Ps = 1 5 -> Technical characters.
- * Ps = 2 2 -> ANSI color, e.g., VT525.
- * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).
- * CSI > Ps c
- * Send Device Attributes (Secondary DA).
- * Ps = 0 or omitted -> request the terminal's identification
- * code. The response depends on the decTerminalID resource set-
- * ting. It should apply only to VT220 and up, but xterm extends
- * this to VT100.
- * -> CSI > Pp ; Pv ; Pc c
- * where Pp denotes the terminal type
- * Pp = 0 -> ``VT100''.
- * Pp = 1 -> ``VT220''.
- * and Pv is the firmware version (for xterm, this was originally
- * the XFree86 patch number, starting with 95). In a DEC termi-
- * nal, Pc indicates the ROM cartridge registration number and is
- * always zero.
- * More information:
- * xterm/charproc.c - line 2012, for more information.
- * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)
- */Terminal.prototype.sendDeviceAttributes=function(params){if(params[0]>0)return;if(!this.prefix){if(this.is('xterm')||this.is('rxvt-unicode')||this.is('screen')){this.send('\x1b[?1;2c');}else if(this.is('linux')){this.send('\x1b[?6c');}}else if(this.prefix==='>'){// xterm and urxvt
-// seem to spit this
-// out around ~370 times (?).
-if(this.is('xterm')){this.send('\x1b[>0;276;0c');}else if(this.is('rxvt-unicode')){this.send('\x1b[>85;95;0c');}else if(this.is('linux')){// not supported by linux console.
-// linux console echoes parameters.
-this.send(params[0]+'c');}else if(this.is('screen')){this.send('\x1b[>83;40003;0c');}}};/**
- * CSI Pm d
- * Line Position Absolute [row] (default = [1,column]) (VPA).
- */Terminal.prototype.linePosAbsolute=function(params){var param=params[0];if(param<1)param=1;this.y=param-1;if(this.y>=this.rows){this.y=this.rows-1;}};/**
- * 145 65 e * VPR - Vertical Position Relative
- * reuse CSI Ps B ?
- */Terminal.prototype.VPositionRelative=function(params){var param=params[0];if(param<1)param=1;this.y+=param;if(this.y>=this.rows){this.y=this.rows-1;}};/**
- * CSI Ps ; Ps f
- * Horizontal and Vertical Position [row;column] (default =
- * [1,1]) (HVP).
- */Terminal.prototype.HVPosition=function(params){if(params[0]<1)params[0]=1;if(params[1]<1)params[1]=1;this.y=params[0]-1;if(this.y>=this.rows){this.y=this.rows-1;}this.x=params[1]-1;if(this.x>=this.cols){this.x=this.cols-1;}};/**
- * CSI Pm h Set Mode (SM).
- * Ps = 2 -> Keyboard Action Mode (AM).
- * Ps = 4 -> Insert Mode (IRM).
- * Ps = 1 2 -> Send/receive (SRM).
- * Ps = 2 0 -> Automatic Newline (LNM).
- * CSI ? Pm h
- * DEC Private Mode Set (DECSET).
- * Ps = 1 -> Application Cursor Keys (DECCKM).
- * Ps = 2 -> Designate USASCII for character sets G0-G3
- * (DECANM), and set VT100 mode.
- * Ps = 3 -> 132 Column Mode (DECCOLM).
- * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).
- * Ps = 5 -> Reverse Video (DECSCNM).
- * Ps = 6 -> Origin Mode (DECOM).
- * Ps = 7 -> Wraparound Mode (DECAWM).
- * Ps = 8 -> Auto-repeat Keys (DECARM).
- * Ps = 9 -> Send Mouse X & Y on button press. See the sec-
- * tion Mouse Tracking.
- * Ps = 1 0 -> Show toolbar (rxvt).
- * Ps = 1 2 -> Start Blinking Cursor (att610).
- * Ps = 1 8 -> Print form feed (DECPFF).
- * Ps = 1 9 -> Set print extent to full screen (DECPEX).
- * Ps = 2 5 -> Show Cursor (DECTCEM).
- * Ps = 3 0 -> Show scrollbar (rxvt).
- * Ps = 3 5 -> Enable font-shifting functions (rxvt).
- * Ps = 3 8 -> Enter Tektronix Mode (DECTEK).
- * Ps = 4 0 -> Allow 80 -> 132 Mode.
- * Ps = 4 1 -> more(1) fix (see curses resource).
- * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-
- * RCM).
- * Ps = 4 4 -> Turn On Margin Bell.
- * Ps = 4 5 -> Reverse-wraparound Mode.
- * Ps = 4 6 -> Start Logging. This is normally disabled by a
- * compile-time option.
- * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-
- * abled by the titeInhibit resource).
- * Ps = 6 6 -> Application keypad (DECNKM).
- * Ps = 6 7 -> Backarrow key sends backspace (DECBKM).
- * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and
- * release. See the section Mouse Tracking.
- * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.
- * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.
- * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.
- * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.
- * Ps = 1 0 0 5 -> Enable Extended Mouse Mode.
- * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).
- * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).
- * Ps = 1 0 3 4 -> Interpret "meta" key, sets eighth bit.
- * (enables the eightBitInput resource).
- * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-
- * Lock keys. (This enables the numLock resource).
- * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This
- * enables the metaSendsEscape resource).
- * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete
- * key.
- * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This
- * enables the altSendsEscape resource).
- * Ps = 1 0 4 0 -> Keep selection even if not highlighted.
- * (This enables the keepSelection resource).
- * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables
- * the selectToClipboard resource).
- * Ps = 1 0 4 2 -> Enable Urgency window manager hint when
- * Control-G is received. (This enables the bellIsUrgent
- * resource).
- * Ps = 1 0 4 3 -> Enable raising of the window when Control-G
- * is received. (enables the popOnBell resource).
- * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be
- * disabled by the titeInhibit resource).
- * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-
- * abled by the titeInhibit resource).
- * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate
- * Screen Buffer, clearing it first. (This may be disabled by
- * the titeInhibit resource). This combines the effects of the 1
- * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based
- * applications rather than the 4 7 mode.
- * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.
- * Ps = 1 0 5 1 -> Set Sun function-key mode.
- * Ps = 1 0 5 2 -> Set HP function-key mode.
- * Ps = 1 0 5 3 -> Set SCO function-key mode.
- * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).
- * Ps = 1 0 6 1 -> Set VT220 keyboard emulation.
- * Ps = 2 0 0 4 -> Set bracketed paste mode.
- * Modes:
- * http: *vt100.net/docs/vt220-rm/chapter4.html
- */Terminal.prototype.setMode=function(params){if((typeof params==='undefined'?'undefined':_typeof(params))==='object'){var l=params.length,i=0;for(;i<l;i++){this.setMode(params[i]);}return;}if(!this.prefix){switch(params){case 4:this.insertMode=true;break;case 20://this.convertEol = true;
-break;}}else if(this.prefix==='?'){switch(params){case 1:this.applicationCursor=true;break;case 2:this.setgCharset(0,Terminal.charsets.US);this.setgCharset(1,Terminal.charsets.US);this.setgCharset(2,Terminal.charsets.US);this.setgCharset(3,Terminal.charsets.US);// set VT100 mode here
-break;case 3:// 132 col mode
-this.savedCols=this.cols;this.resize(132,this.rows);break;case 6:this.originMode=true;break;case 7:this.wraparoundMode=true;break;case 12:// this.cursorBlink = true;
-break;case 66:this.log('Serial port requested application keypad.');this.applicationKeypad=true;this.viewport.syncScrollArea();break;case 9:// X10 Mouse
-// no release, no motion, no wheel, no modifiers.
-case 1000:// vt200 mouse
-// no motion.
-// no modifiers, except control on the wheel.
-case 1002:// button event mouse
-case 1003:// any event mouse
-// any event - sends motion events,
-// even if there is no button held down.
-this.x10Mouse=params===9;this.vt200Mouse=params===1000;this.normalMouse=params>1000;this.mouseEvents=true;this.element.style.cursor='default';this.log('Binding to mouse events.');break;case 1004:// send focusin/focusout events
-// focusin: ^[[I
-// focusout: ^[[O
-this.sendFocus=true;break;case 1005:// utf8 ext mode mouse
-this.utfMouse=true;// for wide terminals
-// simply encodes large values as utf8 characters
-break;case 1006:// sgr ext mode mouse
-this.sgrMouse=true;// for wide terminals
-// does not add 32 to fields
-// press: ^[[<b;x;yM
-// release: ^[[<b;x;ym
-break;case 1015:// urxvt ext mode mouse
-this.urxvtMouse=true;// for wide terminals
-// numbers for fields
-// press: ^[[b;x;yM
-// motion: ^[[b;x;yT
-break;case 25:// show cursor
-this.cursorHidden=false;break;case 1049:// alt screen buffer cursor
-//this.saveCursor();
-;// FALL-THROUGH
-case 47:// alt screen buffer
-case 1047:// alt screen buffer
-if(!this.normal){var normal={lines:this.lines,ybase:this.ybase,ydisp:this.ydisp,x:this.x,y:this.y,scrollTop:this.scrollTop,scrollBottom:this.scrollBottom,tabs:this.tabs// XXX save charset(s) here?
-// charset: this.charset,
-// glevel: this.glevel,
-// charsets: this.charsets
-};this.reset();this.normal=normal;this.showCursor();}break;}}};/**
- * CSI Pm l Reset Mode (RM).
- * Ps = 2 -> Keyboard Action Mode (AM).
- * Ps = 4 -> Replace Mode (IRM).
- * Ps = 1 2 -> Send/receive (SRM).
- * Ps = 2 0 -> Normal Linefeed (LNM).
- * CSI ? Pm l
- * DEC Private Mode Reset (DECRST).
- * Ps = 1 -> Normal Cursor Keys (DECCKM).
- * Ps = 2 -> Designate VT52 mode (DECANM).
- * Ps = 3 -> 80 Column Mode (DECCOLM).
- * Ps = 4 -> Jump (Fast) Scroll (DECSCLM).
- * Ps = 5 -> Normal Video (DECSCNM).
- * Ps = 6 -> Normal Cursor Mode (DECOM).
- * Ps = 7 -> No Wraparound Mode (DECAWM).
- * Ps = 8 -> No Auto-repeat Keys (DECARM).
- * Ps = 9 -> Don't send Mouse X & Y on button press.
- * Ps = 1 0 -> Hide toolbar (rxvt).
- * Ps = 1 2 -> Stop Blinking Cursor (att610).
- * Ps = 1 8 -> Don't print form feed (DECPFF).
- * Ps = 1 9 -> Limit print to scrolling region (DECPEX).
- * Ps = 2 5 -> Hide Cursor (DECTCEM).
- * Ps = 3 0 -> Don't show scrollbar (rxvt).
- * Ps = 3 5 -> Disable font-shifting functions (rxvt).
- * Ps = 4 0 -> Disallow 80 -> 132 Mode.
- * Ps = 4 1 -> No more(1) fix (see curses resource).
- * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-
- * NRCM).
- * Ps = 4 4 -> Turn Off Margin Bell.
- * Ps = 4 5 -> No Reverse-wraparound Mode.
- * Ps = 4 6 -> Stop Logging. (This is normally disabled by a
- * compile-time option).
- * Ps = 4 7 -> Use Normal Screen Buffer.
- * Ps = 6 6 -> Numeric keypad (DECNKM).
- * Ps = 6 7 -> Backarrow key sends delete (DECBKM).
- * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and
- * release. See the section Mouse Tracking.
- * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.
- * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.
- * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.
- * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.
- * Ps = 1 0 0 5 -> Disable Extended Mouse Mode.
- * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output
- * (rxvt).
- * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).
- * Ps = 1 0 3 4 -> Don't interpret "meta" key. (This disables
- * the eightBitInput resource).
- * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-
- * Lock keys. (This disables the numLock resource).
- * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.
- * (This disables the metaSendsEscape resource).
- * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad
- * Delete key.
- * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.
- * (This disables the altSendsEscape resource).
- * Ps = 1 0 4 0 -> Do not keep selection when not highlighted.
- * (This disables the keepSelection resource).
- * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables
- * the selectToClipboard resource).
- * Ps = 1 0 4 2 -> Disable Urgency window manager hint when
- * Control-G is received. (This disables the bellIsUrgent
- * resource).
- * Ps = 1 0 4 3 -> Disable raising of the window when Control-
- * G is received. (This disables the popOnBell resource).
- * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen
- * first if in the Alternate Screen. (This may be disabled by
- * the titeInhibit resource).
- * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be
- * disabled by the titeInhibit resource).
- * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor
- * as in DECRC. (This may be disabled by the titeInhibit
- * resource). This combines the effects of the 1 0 4 7 and 1 0
- * 4 8 modes. Use this with terminfo-based applications rather
- * than the 4 7 mode.
- * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.
- * Ps = 1 0 5 1 -> Reset Sun function-key mode.
- * Ps = 1 0 5 2 -> Reset HP function-key mode.
- * Ps = 1 0 5 3 -> Reset SCO function-key mode.
- * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).
- * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.
- * Ps = 2 0 0 4 -> Reset bracketed paste mode.
- */Terminal.prototype.resetMode=function(params){if((typeof params==='undefined'?'undefined':_typeof(params))==='object'){var l=params.length,i=0;for(;i<l;i++){this.resetMode(params[i]);}return;}if(!this.prefix){switch(params){case 4:this.insertMode=false;break;case 20://this.convertEol = false;
-break;}}else if(this.prefix==='?'){switch(params){case 1:this.applicationCursor=false;break;case 3:if(this.cols===132&&this.savedCols){this.resize(this.savedCols,this.rows);}delete this.savedCols;break;case 6:this.originMode=false;break;case 7:this.wraparoundMode=false;break;case 12:// this.cursorBlink = false;
-break;case 66:this.log('Switching back to normal keypad.');this.applicationKeypad=false;this.viewport.syncScrollArea();break;case 9:// X10 Mouse
-case 1000:// vt200 mouse
-case 1002:// button event mouse
-case 1003:// any event mouse
-this.x10Mouse=false;this.vt200Mouse=false;this.normalMouse=false;this.mouseEvents=false;this.element.style.cursor='';break;case 1004:// send focusin/focusout events
-this.sendFocus=false;break;case 1005:// utf8 ext mode mouse
-this.utfMouse=false;break;case 1006:// sgr ext mode mouse
-this.sgrMouse=false;break;case 1015:// urxvt ext mode mouse
-this.urxvtMouse=false;break;case 25:// hide cursor
-this.cursorHidden=true;break;case 1049:// alt screen buffer cursor
-;// FALL-THROUGH
-case 47:// normal screen buffer
-case 1047:// normal screen buffer - clearing it first
-if(this.normal){this.lines=this.normal.lines;this.ybase=this.normal.ybase;this.ydisp=this.normal.ydisp;this.x=this.normal.x;this.y=this.normal.y;this.scrollTop=this.normal.scrollTop;this.scrollBottom=this.normal.scrollBottom;this.tabs=this.normal.tabs;this.normal=null;// if (params === 1049) {
-// this.x = this.savedX;
-// this.y = this.savedY;
-// }
-this.refresh(0,this.rows-1);this.showCursor();}break;}}};/**
- * CSI Ps ; Ps r
- * Set Scrolling Region [top;bottom] (default = full size of win-
- * dow) (DECSTBM).
- * CSI ? Pm r
- */Terminal.prototype.setScrollRegion=function(params){if(this.prefix)return;this.scrollTop=(params[0]||1)-1;this.scrollBottom=(params[1]||this.rows)-1;this.x=0;this.y=0;};/**
- * CSI s
- * Save cursor (ANSI.SYS).
- */Terminal.prototype.saveCursor=function(params){this.savedX=this.x;this.savedY=this.y;};/**
- * CSI u
- * Restore cursor (ANSI.SYS).
- */Terminal.prototype.restoreCursor=function(params){this.x=this.savedX||0;this.y=this.savedY||0;};/**
- * Lesser Used
- *//**
- * CSI Ps I
- * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).
- */Terminal.prototype.cursorForwardTab=function(params){var param=params[0]||1;while(param--){this.x=this.nextStop();}};/**
- * CSI Ps S Scroll up Ps lines (default = 1) (SU).
- */Terminal.prototype.scrollUp=function(params){var param=params[0]||1;while(param--){this.lines.splice(this.ybase+this.scrollTop,1);this.lines.splice(this.ybase+this.scrollBottom,0,this.blankLine());}// this.maxRange();
-this.updateRange(this.scrollTop);this.updateRange(this.scrollBottom);};/**
- * CSI Ps T Scroll down Ps lines (default = 1) (SD).
- */Terminal.prototype.scrollDown=function(params){var param=params[0]||1;while(param--){this.lines.splice(this.ybase+this.scrollBottom,1);this.lines.splice(this.ybase+this.scrollTop,0,this.blankLine());}// this.maxRange();
-this.updateRange(this.scrollTop);this.updateRange(this.scrollBottom);};/**
- * CSI Ps ; Ps ; Ps ; Ps ; Ps T
- * Initiate highlight mouse tracking. Parameters are
- * [func;startx;starty;firstrow;lastrow]. See the section Mouse
- * Tracking.
- */Terminal.prototype.initMouseTracking=function(params){// Relevant: DECSET 1001
-};/**
- * CSI > Ps; Ps T
- * Reset one or more features of the title modes to the default
- * value. Normally, "reset" disables the feature. It is possi-
- * ble to disable the ability to reset features by compiling a
- * different default for the title modes into xterm.
- * Ps = 0 -> Do not set window/icon labels using hexadecimal.
- * Ps = 1 -> Do not query window/icon labels using hexadeci-
- * mal.
- * Ps = 2 -> Do not set window/icon labels using UTF-8.
- * Ps = 3 -> Do not query window/icon labels using UTF-8.
- * (See discussion of "Title Modes").
- */Terminal.prototype.resetTitleModes=function(params){;};/**
- * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).
- */Terminal.prototype.cursorBackwardTab=function(params){var param=params[0]||1;while(param--){this.x=this.prevStop();}};/**
- * CSI Ps b Repeat the preceding graphic character Ps times (REP).
- */Terminal.prototype.repeatPrecedingCharacter=function(params){var param=params[0]||1,line=this.lines[this.ybase+this.y],ch=line[this.x-1]||[this.defAttr,' ',1];while(param--){line[this.x++]=ch;}};/**
- * CSI Ps g Tab Clear (TBC).
- * Ps = 0 -> Clear Current Column (default).
- * Ps = 3 -> Clear All.
- * Potentially:
- * Ps = 2 -> Clear Stops on Line.
- * http://vt100.net/annarbor/aaa-ug/section6.html
- */Terminal.prototype.tabClear=function(params){var param=params[0];if(param<=0){delete this.tabs[this.x];}else if(param===3){this.tabs={};}};/**
- * CSI Pm i Media Copy (MC).
- * Ps = 0 -> Print screen (default).
- * Ps = 4 -> Turn off printer controller mode.
- * Ps = 5 -> Turn on printer controller mode.
- * CSI ? Pm i
- * Media Copy (MC, DEC-specific).
- * Ps = 1 -> Print line containing cursor.
- * Ps = 4 -> Turn off autoprint mode.
- * Ps = 5 -> Turn on autoprint mode.
- * Ps = 1 0 -> Print composed display, ignores DECPEX.
- * Ps = 1 1 -> Print all pages.
- */Terminal.prototype.mediaCopy=function(params){;};/**
- * CSI > Ps; Ps m
- * Set or reset resource-values used by xterm to decide whether
- * to construct escape sequences holding information about the
- * modifiers pressed with a given key. The first parameter iden-
- * tifies the resource to set/reset. The second parameter is the
- * value to assign to the resource. If the second parameter is
- * omitted, the resource is reset to its initial value.
- * Ps = 1 -> modifyCursorKeys.
- * Ps = 2 -> modifyFunctionKeys.
- * Ps = 4 -> modifyOtherKeys.
- * If no parameters are given, all resources are reset to their
- * initial values.
- */Terminal.prototype.setResources=function(params){;};/**
- * CSI > Ps n
- * Disable modifiers which may be enabled via the CSI > Ps; Ps m
- * sequence. This corresponds to a resource value of "-1", which
- * cannot be set with the other sequence. The parameter identi-
- * fies the resource to be disabled:
- * Ps = 1 -> modifyCursorKeys.
- * Ps = 2 -> modifyFunctionKeys.
- * Ps = 4 -> modifyOtherKeys.
- * If the parameter is omitted, modifyFunctionKeys is disabled.
- * When modifyFunctionKeys is disabled, xterm uses the modifier
- * keys to make an extended sequence of functions rather than
- * adding a parameter to each function key to denote the modi-
- * fiers.
- */Terminal.prototype.disableModifiers=function(params){;};/**
- * CSI > Ps p
- * Set resource value pointerMode. This is used by xterm to
- * decide whether to hide the pointer cursor as the user types.
- * Valid values for the parameter:
- * Ps = 0 -> never hide the pointer.
- * Ps = 1 -> hide if the mouse tracking mode is not enabled.
- * Ps = 2 -> always hide the pointer. If no parameter is
- * given, xterm uses the default, which is 1 .
- */Terminal.prototype.setPointerMode=function(params){;};/**
- * CSI ! p Soft terminal reset (DECSTR).
- * http://vt100.net/docs/vt220-rm/table4-10.html
- */Terminal.prototype.softReset=function(params){this.cursorHidden=false;this.insertMode=false;this.originMode=false;this.wraparoundMode=false;// autowrap
-this.applicationKeypad=false;// ?
-this.viewport.syncScrollArea();this.applicationCursor=false;this.scrollTop=0;this.scrollBottom=this.rows-1;this.curAttr=this.defAttr;this.x=this.y=0;// ?
-this.charset=null;this.glevel=0;// ??
-this.charsets=[null];// ??
-};/**
- * CSI Ps$ p
- * Request ANSI mode (DECRQM). For VT300 and up, reply is
- * CSI Ps; Pm$ y
- * where Ps is the mode number as in RM, and Pm is the mode
- * value:
- * 0 - not recognized
- * 1 - set
- * 2 - reset
- * 3 - permanently set
- * 4 - permanently reset
- */Terminal.prototype.requestAnsiMode=function(params){;};/**
- * CSI ? Ps$ p
- * Request DEC private mode (DECRQM). For VT300 and up, reply is
- * CSI ? Ps; Pm$ p
- * where Ps is the mode number as in DECSET, Pm is the mode value
- * as in the ANSI DECRQM.
- */Terminal.prototype.requestPrivateMode=function(params){;};/**
- * CSI Ps ; Ps " p
- * Set conformance level (DECSCL). Valid values for the first
- * parameter:
- * Ps = 6 1 -> VT100.
- * Ps = 6 2 -> VT200.
- * Ps = 6 3 -> VT300.
- * Valid values for the second parameter:
- * Ps = 0 -> 8-bit controls.
- * Ps = 1 -> 7-bit controls (always set for VT100).
- * Ps = 2 -> 8-bit controls.
- */Terminal.prototype.setConformanceLevel=function(params){;};/**
- * CSI Ps q Load LEDs (DECLL).
- * Ps = 0 -> Clear all LEDS (default).
- * Ps = 1 -> Light Num Lock.
- * Ps = 2 -> Light Caps Lock.
- * Ps = 3 -> Light Scroll Lock.
- * Ps = 2 1 -> Extinguish Num Lock.
- * Ps = 2 2 -> Extinguish Caps Lock.
- * Ps = 2 3 -> Extinguish Scroll Lock.
- */Terminal.prototype.loadLEDs=function(params){;};/**
- * CSI Ps SP q
- * Set cursor style (DECSCUSR, VT520).
- * Ps = 0 -> blinking block.
- * Ps = 1 -> blinking block (default).
- * Ps = 2 -> steady block.
- * Ps = 3 -> blinking underline.
- * Ps = 4 -> steady underline.
- */Terminal.prototype.setCursorStyle=function(params){;};/**
- * CSI Ps " q
- * Select character protection attribute (DECSCA). Valid values
- * for the parameter:
- * Ps = 0 -> DECSED and DECSEL can erase (default).
- * Ps = 1 -> DECSED and DECSEL cannot erase.
- * Ps = 2 -> DECSED and DECSEL can erase.
- */Terminal.prototype.setCharProtectionAttr=function(params){;};/**
- * CSI ? Pm r
- * Restore DEC Private Mode Values. The value of Ps previously
- * saved is restored. Ps values are the same as for DECSET.
- */Terminal.prototype.restorePrivateValues=function(params){;};/**
- * CSI Pt; Pl; Pb; Pr; Ps$ r
- * Change Attributes in Rectangular Area (DECCARA), VT400 and up.
- * Pt; Pl; Pb; Pr denotes the rectangle.
- * Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7.
- * NOTE: xterm doesn't enable this code by default.
- */Terminal.prototype.setAttrInRectangle=function(params){var t=params[0],l=params[1],b=params[2],r=params[3],attr=params[4];var line,i;for(;t<b+1;t++){line=this.lines[this.ybase+t];for(i=l;i<r;i++){line[i]=[attr,line[i][1]];}}// this.maxRange();
-this.updateRange(params[0]);this.updateRange(params[2]);};/**
- * CSI Pc; Pt; Pl; Pb; Pr$ x
- * Fill Rectangular Area (DECFRA), VT420 and up.
- * Pc is the character to use.
- * Pt; Pl; Pb; Pr denotes the rectangle.
- * NOTE: xterm doesn't enable this code by default.
- */Terminal.prototype.fillRectangle=function(params){var ch=params[0],t=params[1],l=params[2],b=params[3],r=params[4];var line,i;for(;t<b+1;t++){line=this.lines[this.ybase+t];for(i=l;i<r;i++){line[i]=[line[i][0],String.fromCharCode(ch)];}}// this.maxRange();
-this.updateRange(params[1]);this.updateRange(params[3]);};/**
- * CSI Ps ; Pu ' z
- * Enable Locator Reporting (DECELR).
- * Valid values for the first parameter:
- * Ps = 0 -> Locator disabled (default).
- * Ps = 1 -> Locator enabled.
- * Ps = 2 -> Locator enabled for one report, then disabled.
- * The second parameter specifies the coordinate unit for locator
- * reports.
- * Valid values for the second parameter:
- * Pu = 0 <- or omitted -> default to character cells.
- * Pu = 1 <- device physical pixels.
- * Pu = 2 <- character cells.
- */Terminal.prototype.enableLocatorReporting=function(params){var val=params[0]>0;//this.mouseEvents = val;
-//this.decLocator = val;
-};/**
- * CSI Pt; Pl; Pb; Pr$ z
- * Erase Rectangular Area (DECERA), VT400 and up.
- * Pt; Pl; Pb; Pr denotes the rectangle.
- * NOTE: xterm doesn't enable this code by default.
- */Terminal.prototype.eraseRectangle=function(params){var t=params[0],l=params[1],b=params[2],r=params[3];var line,i,ch;ch=[this.eraseAttr(),' ',1];// xterm?
-for(;t<b+1;t++){line=this.lines[this.ybase+t];for(i=l;i<r;i++){line[i]=ch;}}// this.maxRange();
-this.updateRange(params[0]);this.updateRange(params[2]);};/**
- * CSI P m SP }
- * Insert P s Column(s) (default = 1) (DECIC), VT420 and up.
- * NOTE: xterm doesn't enable this code by default.
- */Terminal.prototype.insertColumns=function(){var param=params[0],l=this.ybase+this.rows,ch=[this.eraseAttr(),' ',1]// xterm?
-,i;while(param--){for(i=this.ybase;i<l;i++){this.lines[i].splice(this.x+1,0,ch);this.lines[i].pop();}}this.maxRange();};/**
- * CSI P m SP ~
- * Delete P s Column(s) (default = 1) (DECDC), VT420 and up
- * NOTE: xterm doesn't enable this code by default.
- */Terminal.prototype.deleteColumns=function(){var param=params[0],l=this.ybase+this.rows,ch=[this.eraseAttr(),' ',1]// xterm?
-,i;while(param--){for(i=this.ybase;i<l;i++){this.lines[i].splice(this.x,1);this.lines[i].push(ch);}}this.maxRange();};/**
- * Character Sets
- */Terminal.charsets={};// DEC Special Character and Line Drawing Set.
-// http://vt100.net/docs/vt102-ug/table5-13.html
-// A lot of curses apps use this if they see TERM=xterm.
-// testing: echo -e '\e(0a\e(B'
-// The xterm output sometimes seems to conflict with the
-// reference above. xterm seems in line with the reference
-// when running vttest however.
-// The table below now uses xterm's output from vttest.
-Terminal.charsets.SCLD={// (0
-'`':'\u25C6',// 'â—†'
-'a':'\u2592',// 'â–’'
-'b':'\t',// '\t'
-'c':'\f',// '\f'
-'d':'\r',// '\r'
-'e':'\n',// '\n'
-'f':'\xB0',// '°'
-'g':'\xB1',// '±'
-'h':'\u2424',// '\u2424' (NL)
-'i':'\x0B',// '\v'
-'j':'\u2518',// '┘'
-'k':'\u2510',// 'â”'
-'l':'\u250C',// '┌'
-'m':'\u2514',// 'â””'
-'n':'\u253C',// '┼'
-'o':'\u23BA',// '⎺'
-'p':'\u23BB',// '⎻'
-'q':'\u2500',// '─'
-'r':'\u23BC',// '⎼'
-'s':'\u23BD',// '⎽'
-'t':'\u251C',// '├'
-'u':'\u2524',// '┤'
-'v':'\u2534',// 'â”´'
-'w':'\u252C',// '┬'
-'x':'\u2502',// '│'
-'y':'\u2264',// '≤'
-'z':'\u2265',// '≥'
-'{':'\u03C0',// 'Ï€'
-'|':'\u2260',// '≠'
-'}':'\xA3',// '£'
-'~':'\xB7'// '·'
-};Terminal.charsets.UK=null;// (A
-Terminal.charsets.US=null;// (B (USASCII)
-Terminal.charsets.Dutch=null;// (4
-Terminal.charsets.Finnish=null;// (C or (5
-Terminal.charsets.French=null;// (R
-Terminal.charsets.FrenchCanadian=null;// (Q
-Terminal.charsets.German=null;// (K
-Terminal.charsets.Italian=null;// (Y
-Terminal.charsets.NorwegianDanish=null;// (E or (6
-Terminal.charsets.Spanish=null;// (Z
-Terminal.charsets.Swedish=null;// (H or (7
-Terminal.charsets.Swiss=null;// (=
-Terminal.charsets.ISOLatin=null;// /A
-/**
- * Helpers
- */function on(el,type,handler,capture){if(!Array.isArray(el)){el=[el];}el.forEach(function(element){element.addEventListener(type,handler,capture||false);});}function off(el,type,handler,capture){el.removeEventListener(type,handler,capture||false);}function cancel(ev,force){if(!this.cancelEvents&&!force){return;}ev.preventDefault();ev.stopPropagation();return false;}function inherits(child,parent){function f(){this.constructor=child;}f.prototype=parent.prototype;child.prototype=new f();}// if bold is broken, we can't
-// use it in the terminal.
-function isBoldBroken(document){var body=document.getElementsByTagName('body')[0];var el=document.createElement('span');el.innerHTML='hello world';body.appendChild(el);var w1=el.scrollWidth;el.style.fontWeight='bold';var w2=el.scrollWidth;body.removeChild(el);return w1!==w2;}function indexOf(obj,el){var i=obj.length;while(i--){if(obj[i]===el)return i;}return-1;}function isThirdLevelShift(term,ev){var thirdLevelKey=term.browser.isMac&&ev.altKey&&!ev.ctrlKey&&!ev.metaKey||term.browser.isMSWindows&&ev.altKey&&ev.ctrlKey&&!ev.metaKey;if(ev.type=='keypress'){return thirdLevelKey;}// Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events)
-return thirdLevelKey&&(!ev.keyCode||ev.keyCode>47);}function matchColor(r1,g1,b1){var hash=r1<<16|g1<<8|b1;if(matchColor._cache[hash]!=null){return matchColor._cache[hash];}var ldiff=Infinity,li=-1,i=0,c,r2,g2,b2,diff;for(;i<Terminal.vcolors.length;i++){c=Terminal.vcolors[i];r2=c[0];g2=c[1];b2=c[2];diff=matchColor.distance(r1,g1,b1,r2,g2,b2);if(diff===0){li=i;break;}if(diff<ldiff){ldiff=diff;li=i;}}return matchColor._cache[hash]=li;}matchColor._cache={};// http://stackoverflow.com/questions/1633828
-matchColor.distance=function(r1,g1,b1,r2,g2,b2){return Math.pow(30*(r1-r2),2)+Math.pow(59*(g1-g2),2)+Math.pow(11*(b1-b2),2);};function each(obj,iter,con){if(obj.forEach)return obj.forEach(iter,con);for(var i=0;i<obj.length;i++){iter.call(con,obj[i],i,obj);}}function keys(obj){if(Object.keys)return Object.keys(obj);var key,keys=[];for(key in obj){if(Object.prototype.hasOwnProperty.call(obj,key)){keys.push(key);}}return keys;}var wcwidth=function(opts){// extracted from https://www.cl.cam.ac.uk/%7Emgk25/ucs/wcwidth.c
-// combining characters
-var COMBINING=[[0x0300,0x036F],[0x0483,0x0486],[0x0488,0x0489],[0x0591,0x05BD],[0x05BF,0x05BF],[0x05C1,0x05C2],[0x05C4,0x05C5],[0x05C7,0x05C7],[0x0600,0x0603],[0x0610,0x0615],[0x064B,0x065E],[0x0670,0x0670],[0x06D6,0x06E4],[0x06E7,0x06E8],[0x06EA,0x06ED],[0x070F,0x070F],[0x0711,0x0711],[0x0730,0x074A],[0x07A6,0x07B0],[0x07EB,0x07F3],[0x0901,0x0902],[0x093C,0x093C],[0x0941,0x0948],[0x094D,0x094D],[0x0951,0x0954],[0x0962,0x0963],[0x0981,0x0981],[0x09BC,0x09BC],[0x09C1,0x09C4],[0x09CD,0x09CD],[0x09E2,0x09E3],[0x0A01,0x0A02],[0x0A3C,0x0A3C],[0x0A41,0x0A42],[0x0A47,0x0A48],[0x0A4B,0x0A4D],[0x0A70,0x0A71],[0x0A81,0x0A82],[0x0ABC,0x0ABC],[0x0AC1,0x0AC5],[0x0AC7,0x0AC8],[0x0ACD,0x0ACD],[0x0AE2,0x0AE3],[0x0B01,0x0B01],[0x0B3C,0x0B3C],[0x0B3F,0x0B3F],[0x0B41,0x0B43],[0x0B4D,0x0B4D],[0x0B56,0x0B56],[0x0B82,0x0B82],[0x0BC0,0x0BC0],[0x0BCD,0x0BCD],[0x0C3E,0x0C40],[0x0C46,0x0C48],[0x0C4A,0x0C4D],[0x0C55,0x0C56],[0x0CBC,0x0CBC],[0x0CBF,0x0CBF],[0x0CC6,0x0CC6],[0x0CCC,0x0CCD],[0x0CE2,0x0CE3],[0x0D41,0x0D43],[0x0D4D,0x0D4D],[0x0DCA,0x0DCA],[0x0DD2,0x0DD4],[0x0DD6,0x0DD6],[0x0E31,0x0E31],[0x0E34,0x0E3A],[0x0E47,0x0E4E],[0x0EB1,0x0EB1],[0x0EB4,0x0EB9],[0x0EBB,0x0EBC],[0x0EC8,0x0ECD],[0x0F18,0x0F19],[0x0F35,0x0F35],[0x0F37,0x0F37],[0x0F39,0x0F39],[0x0F71,0x0F7E],[0x0F80,0x0F84],[0x0F86,0x0F87],[0x0F90,0x0F97],[0x0F99,0x0FBC],[0x0FC6,0x0FC6],[0x102D,0x1030],[0x1032,0x1032],[0x1036,0x1037],[0x1039,0x1039],[0x1058,0x1059],[0x1160,0x11FF],[0x135F,0x135F],[0x1712,0x1714],[0x1732,0x1734],[0x1752,0x1753],[0x1772,0x1773],[0x17B4,0x17B5],[0x17B7,0x17BD],[0x17C6,0x17C6],[0x17C9,0x17D3],[0x17DD,0x17DD],[0x180B,0x180D],[0x18A9,0x18A9],[0x1920,0x1922],[0x1927,0x1928],[0x1932,0x1932],[0x1939,0x193B],[0x1A17,0x1A18],[0x1B00,0x1B03],[0x1B34,0x1B34],[0x1B36,0x1B3A],[0x1B3C,0x1B3C],[0x1B42,0x1B42],[0x1B6B,0x1B73],[0x1DC0,0x1DCA],[0x1DFE,0x1DFF],[0x200B,0x200F],[0x202A,0x202E],[0x2060,0x2063],[0x206A,0x206F],[0x20D0,0x20EF],[0x302A,0x302F],[0x3099,0x309A],[0xA806,0xA806],[0xA80B,0xA80B],[0xA825,0xA826],[0xFB1E,0xFB1E],[0xFE00,0xFE0F],[0xFE20,0xFE23],[0xFEFF,0xFEFF],[0xFFF9,0xFFFB],[0x10A01,0x10A03],[0x10A05,0x10A06],[0x10A0C,0x10A0F],[0x10A38,0x10A3A],[0x10A3F,0x10A3F],[0x1D167,0x1D169],[0x1D173,0x1D182],[0x1D185,0x1D18B],[0x1D1AA,0x1D1AD],[0x1D242,0x1D244],[0xE0001,0xE0001],[0xE0020,0xE007F],[0xE0100,0xE01EF]];// binary search
-function bisearch(ucs){var min=0;var max=COMBINING.length-1;var mid;if(ucs<COMBINING[0][0]||ucs>COMBINING[max][1])return false;while(max>=min){mid=Math.floor((min+max)/2);if(ucs>COMBINING[mid][1])min=mid+1;else if(ucs<COMBINING[mid][0])max=mid-1;else return true;}return false;}function wcwidth(ucs){// test for 8-bit control characters
-if(ucs===0)return opts.nul;if(ucs<32||ucs>=0x7f&&ucs<0xa0)return opts.control;// binary search in table of non-spacing characters
-if(bisearch(ucs))return 0;// if we arrive here, ucs is not a combining or C0/C1 control character
-return 1+(ucs>=0x1100&&(ucs<=0x115f||// Hangul Jamo init. consonants
-ucs==0x2329||ucs==0x232a||ucs>=0x2e80&&ucs<=0xa4cf&&ucs!=0x303f||// CJK..Yi
-ucs>=0xac00&&ucs<=0xd7a3||// Hangul Syllables
-ucs>=0xf900&&ucs<=0xfaff||// CJK Compat Ideographs
-ucs>=0xfe10&&ucs<=0xfe19||// Vertical forms
-ucs>=0xfe30&&ucs<=0xfe6f||// CJK Compat Forms
-ucs>=0xff00&&ucs<=0xff60||// Fullwidth Forms
-ucs>=0xffe0&&ucs<=0xffe6||ucs>=0x20000&&ucs<=0x2fffd||ucs>=0x30000&&ucs<=0x3fffd));}return wcwidth;}({nul:0,control:0});// configurable options
-/**
- * Expose
- */Terminal.EventEmitter=_EventEmitter.EventEmitter;Terminal.CompositionHelper=_CompositionHelper.CompositionHelper;Terminal.Viewport=_Viewport.Viewport;Terminal.inherits=inherits;/**
- * Adds an event listener to the terminal.
- *
- * @param {string} event The name of the event. TODO: Document all event types
- * @param {function} callback The function to call when the event is triggered.
- */Terminal.on=on;Terminal.off=off;Terminal.cancel=cancel;module.exports=Terminal;
-
-},{"./CompositionHelper.js":1,"./EventEmitter.js":2,"./Viewport.js":3,"./handlers/Clipboard.js":4,"./utils/Browser":5}]},{},[7])(7)
-});
-//# sourceMappingURL=xterm.js.map
diff --git a/vendor/assets/stylesheets/xterm/xterm.css b/vendor/assets/stylesheets/xterm/xterm.css
deleted file mode 100644
index fabc51b0e3d..00000000000
--- a/vendor/assets/stylesheets/xterm/xterm.css
+++ /dev/null
@@ -1,2206 +0,0 @@
-/**
- * xterm.js: xterm, in the browser
- * Copyright (c) 2014-2016, SourceLair Private Company (www.sourcelair.com (MIT License)
- * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
- * https://github.com/chjj/term.js
- *
- * 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.
- *
- * Originally forked from (with the author's permission):
- * Fabrice Bellard's javascript vt100 for jslinux:
- * http://bellard.org/jslinux/
- * Copyright (c) 2011 Fabrice Bellard
- * The original design remains. The terminal itself
- * has been extended to include xterm CSI codes, among
- * other features.
- */
-
-/*
- * Default style for xterm.js
- */
-
-.terminal {
- background-color: #000;
- color: #fff;
- font-family: courier-new, courier, monospace;
- font-feature-settings: "liga" 0;
- position: relative;
-}
-
-.terminal.focus,
-.terminal:focus {
- outline: none;
-}
-
-.terminal .xterm-helpers {
- position: absolute;
- top: 0;
-}
-
-.terminal .xterm-helper-textarea {
- /*
- * HACK: to fix IE's blinking cursor
- * Move textarea out of the screen to the far left, so that the cursor is not visible.
- */
- position: absolute;
- opacity: 0;
- left: -9999em;
- top: -9999em;
- width: 0;
- height: 0;
- z-index: -10;
- /** Prevent wrapping so the IME appears against the textarea at the correct position */
- white-space: nowrap;
- overflow: hidden;
- resize: none;
-}
-
-.terminal .terminal-cursor {
- background-color: #fff;
- color: #000;
-}
-
-.terminal:not(.focus) .terminal-cursor {
- outline: 1px solid #fff;
- outline-offset: -1px;
- background-color: transparent;
-}
-
-.terminal.focus .terminal-cursor.blinking {
- animation: blink-cursor 1.2s infinite step-end;
-}
-
-@keyframes blink-cursor {
- 0% {
- background-color: #fff;
- color: #000;
- }
- 50% {
- background-color: transparent;
- color: #FFF;
- }
-}
-
-.terminal .composition-view {
- background: #000;
- color: #FFF;
- display: none;
- position: absolute;
- white-space: nowrap;
- z-index: 1;
-}
-
-.terminal .composition-view.active {
- display: block;
-}
-
-.terminal .xterm-viewport {
- /* On OS X this is required in order for the scroll bar to appear fully opaque */
- background-color: #000;
- overflow-y: scroll;
-}
-
-.terminal .xterm-rows {
- position: absolute;
- left: 0;
- top: 0;
-}
-
-.terminal .xterm-rows > div {
- /* Lines containing spans and text nodes ocassionally wrap despite being the same width (#327) */
- white-space: nowrap;
-}
-
-.terminal .xterm-scroll-area {
- visibility: hidden;
-}
-
-.terminal .xterm-char-measure-element {
- display: inline-block;
- visibility: hidden;
- position: absolute;
- left: -9999em;
-}
-
-/*
- * Determine default colors for xterm.js
- */
-.terminal .xterm-bold {
- font-weight: 600;
-}
-
-.terminal .xterm-underline {
- text-decoration: underline;
-}
-
-.terminal .xterm-blink {
- text-decoration: blink;
-}
-
-.terminal .xterm-hidden {
- visibility: hidden;
-}
-
-.terminal .xterm-color-0 {
- color: #2e3436;
-}
-
-.terminal .xterm-bg-color-0 {
- background-color: #2e3436;
-}
-
-.terminal .xterm-color-1 {
- color: #cc0000;
-}
-
-.terminal .xterm-bg-color-1 {
- background-color: #cc0000;
-}
-
-.terminal .xterm-color-2 {
- color: #4e9a06;
-}
-
-.terminal .xterm-bg-color-2 {
- background-color: #4e9a06;
-}
-
-.terminal .xterm-color-3 {
- color: #c4a000;
-}
-
-.terminal .xterm-bg-color-3 {
- background-color: #c4a000;
-}
-
-.terminal .xterm-color-4 {
- color: #3465a4;
-}
-
-.terminal .xterm-bg-color-4 {
- background-color: #3465a4;
-}
-
-.terminal .xterm-color-5 {
- color: #75507b;
-}
-
-.terminal .xterm-bg-color-5 {
- background-color: #75507b;
-}
-
-.terminal .xterm-color-6 {
- color: #06989a;
-}
-
-.terminal .xterm-bg-color-6 {
- background-color: #06989a;
-}
-
-.terminal .xterm-color-7 {
- color: #d3d7cf;
-}
-
-.terminal .xterm-bg-color-7 {
- background-color: #d3d7cf;
-}
-
-.terminal .xterm-color-8 {
- color: #555753;
-}
-
-.terminal .xterm-bg-color-8 {
- background-color: #555753;
-}
-
-.terminal .xterm-color-9 {
- color: #ef2929;
-}
-
-.terminal .xterm-bg-color-9 {
- background-color: #ef2929;
-}
-
-.terminal .xterm-color-10 {
- color: #8ae234;
-}
-
-.terminal .xterm-bg-color-10 {
- background-color: #8ae234;
-}
-
-.terminal .xterm-color-11 {
- color: #fce94f;
-}
-
-.terminal .xterm-bg-color-11 {
- background-color: #fce94f;
-}
-
-.terminal .xterm-color-12 {
- color: #729fcf;
-}
-
-.terminal .xterm-bg-color-12 {
- background-color: #729fcf;
-}
-
-.terminal .xterm-color-13 {
- color: #ad7fa8;
-}
-
-.terminal .xterm-bg-color-13 {
- background-color: #ad7fa8;
-}
-
-.terminal .xterm-color-14 {
- color: #34e2e2;
-}
-
-.terminal .xterm-bg-color-14 {
- background-color: #34e2e2;
-}
-
-.terminal .xterm-color-15 {
- color: #eeeeec;
-}
-
-.terminal .xterm-bg-color-15 {
- background-color: #eeeeec;
-}
-
-.terminal .xterm-color-16 {
- color: #000000;
-}
-
-.terminal .xterm-bg-color-16 {
- background-color: #000000;
-}
-
-.terminal .xterm-color-17 {
- color: #00005f;
-}
-
-.terminal .xterm-bg-color-17 {
- background-color: #00005f;
-}
-
-.terminal .xterm-color-18 {
- color: #000087;
-}
-
-.terminal .xterm-bg-color-18 {
- background-color: #000087;
-}
-
-.terminal .xterm-color-19 {
- color: #0000af;
-}
-
-.terminal .xterm-bg-color-19 {
- background-color: #0000af;
-}
-
-.terminal .xterm-color-20 {
- color: #0000d7;
-}
-
-.terminal .xterm-bg-color-20 {
- background-color: #0000d7;
-}
-
-.terminal .xterm-color-21 {
- color: #0000ff;
-}
-
-.terminal .xterm-bg-color-21 {
- background-color: #0000ff;
-}
-
-.terminal .xterm-color-22 {
- color: #005f00;
-}
-
-.terminal .xterm-bg-color-22 {
- background-color: #005f00;
-}
-
-.terminal .xterm-color-23 {
- color: #005f5f;
-}
-
-.terminal .xterm-bg-color-23 {
- background-color: #005f5f;
-}
-
-.terminal .xterm-color-24 {
- color: #005f87;
-}
-
-.terminal .xterm-bg-color-24 {
- background-color: #005f87;
-}
-
-.terminal .xterm-color-25 {
- color: #005faf;
-}
-
-.terminal .xterm-bg-color-25 {
- background-color: #005faf;
-}
-
-.terminal .xterm-color-26 {
- color: #005fd7;
-}
-
-.terminal .xterm-bg-color-26 {
- background-color: #005fd7;
-}
-
-.terminal .xterm-color-27 {
- color: #005fff;
-}
-
-.terminal .xterm-bg-color-27 {
- background-color: #005fff;
-}
-
-.terminal .xterm-color-28 {
- color: #008700;
-}
-
-.terminal .xterm-bg-color-28 {
- background-color: #008700;
-}
-
-.terminal .xterm-color-29 {
- color: #00875f;
-}
-
-.terminal .xterm-bg-color-29 {
- background-color: #00875f;
-}
-
-.terminal .xterm-color-30 {
- color: #008787;
-}
-
-.terminal .xterm-bg-color-30 {
- background-color: #008787;
-}
-
-.terminal .xterm-color-31 {
- color: #0087af;
-}
-
-.terminal .xterm-bg-color-31 {
- background-color: #0087af;
-}
-
-.terminal .xterm-color-32 {
- color: #0087d7;
-}
-
-.terminal .xterm-bg-color-32 {
- background-color: #0087d7;
-}
-
-.terminal .xterm-color-33 {
- color: #0087ff;
-}
-
-.terminal .xterm-bg-color-33 {
- background-color: #0087ff;
-}
-
-.terminal .xterm-color-34 {
- color: #00af00;
-}
-
-.terminal .xterm-bg-color-34 {
- background-color: #00af00;
-}
-
-.terminal .xterm-color-35 {
- color: #00af5f;
-}
-
-.terminal .xterm-bg-color-35 {
- background-color: #00af5f;
-}
-
-.terminal .xterm-color-36 {
- color: #00af87;
-}
-
-.terminal .xterm-bg-color-36 {
- background-color: #00af87;
-}
-
-.terminal .xterm-color-37 {
- color: #00afaf;
-}
-
-.terminal .xterm-bg-color-37 {
- background-color: #00afaf;
-}
-
-.terminal .xterm-color-38 {
- color: #00afd7;
-}
-
-.terminal .xterm-bg-color-38 {
- background-color: #00afd7;
-}
-
-.terminal .xterm-color-39 {
- color: #00afff;
-}
-
-.terminal .xterm-bg-color-39 {
- background-color: #00afff;
-}
-
-.terminal .xterm-color-40 {
- color: #00d700;
-}
-
-.terminal .xterm-bg-color-40 {
- background-color: #00d700;
-}
-
-.terminal .xterm-color-41 {
- color: #00d75f;
-}
-
-.terminal .xterm-bg-color-41 {
- background-color: #00d75f;
-}
-
-.terminal .xterm-color-42 {
- color: #00d787;
-}
-
-.terminal .xterm-bg-color-42 {
- background-color: #00d787;
-}
-
-.terminal .xterm-color-43 {
- color: #00d7af;
-}
-
-.terminal .xterm-bg-color-43 {
- background-color: #00d7af;
-}
-
-.terminal .xterm-color-44 {
- color: #00d7d7;
-}
-
-.terminal .xterm-bg-color-44 {
- background-color: #00d7d7;
-}
-
-.terminal .xterm-color-45 {
- color: #00d7ff;
-}
-
-.terminal .xterm-bg-color-45 {
- background-color: #00d7ff;
-}
-
-.terminal .xterm-color-46 {
- color: #00ff00;
-}
-
-.terminal .xterm-bg-color-46 {
- background-color: #00ff00;
-}
-
-.terminal .xterm-color-47 {
- color: #00ff5f;
-}
-
-.terminal .xterm-bg-color-47 {
- background-color: #00ff5f;
-}
-
-.terminal .xterm-color-48 {
- color: #00ff87;
-}
-
-.terminal .xterm-bg-color-48 {
- background-color: #00ff87;
-}
-
-.terminal .xterm-color-49 {
- color: #00ffaf;
-}
-
-.terminal .xterm-bg-color-49 {
- background-color: #00ffaf;
-}
-
-.terminal .xterm-color-50 {
- color: #00ffd7;
-}
-
-.terminal .xterm-bg-color-50 {
- background-color: #00ffd7;
-}
-
-.terminal .xterm-color-51 {
- color: #00ffff;
-}
-
-.terminal .xterm-bg-color-51 {
- background-color: #00ffff;
-}
-
-.terminal .xterm-color-52 {
- color: #5f0000;
-}
-
-.terminal .xterm-bg-color-52 {
- background-color: #5f0000;
-}
-
-.terminal .xterm-color-53 {
- color: #5f005f;
-}
-
-.terminal .xterm-bg-color-53 {
- background-color: #5f005f;
-}
-
-.terminal .xterm-color-54 {
- color: #5f0087;
-}
-
-.terminal .xterm-bg-color-54 {
- background-color: #5f0087;
-}
-
-.terminal .xterm-color-55 {
- color: #5f00af;
-}
-
-.terminal .xterm-bg-color-55 {
- background-color: #5f00af;
-}
-
-.terminal .xterm-color-56 {
- color: #5f00d7;
-}
-
-.terminal .xterm-bg-color-56 {
- background-color: #5f00d7;
-}
-
-.terminal .xterm-color-57 {
- color: #5f00ff;
-}
-
-.terminal .xterm-bg-color-57 {
- background-color: #5f00ff;
-}
-
-.terminal .xterm-color-58 {
- color: #5f5f00;
-}
-
-.terminal .xterm-bg-color-58 {
- background-color: #5f5f00;
-}
-
-.terminal .xterm-color-59 {
- color: #5f5f5f;
-}
-
-.terminal .xterm-bg-color-59 {
- background-color: #5f5f5f;
-}
-
-.terminal .xterm-color-60 {
- color: #5f5f87;
-}
-
-.terminal .xterm-bg-color-60 {
- background-color: #5f5f87;
-}
-
-.terminal .xterm-color-61 {
- color: #5f5faf;
-}
-
-.terminal .xterm-bg-color-61 {
- background-color: #5f5faf;
-}
-
-.terminal .xterm-color-62 {
- color: #5f5fd7;
-}
-
-.terminal .xterm-bg-color-62 {
- background-color: #5f5fd7;
-}
-
-.terminal .xterm-color-63 {
- color: #5f5fff;
-}
-
-.terminal .xterm-bg-color-63 {
- background-color: #5f5fff;
-}
-
-.terminal .xterm-color-64 {
- color: #5f8700;
-}
-
-.terminal .xterm-bg-color-64 {
- background-color: #5f8700;
-}
-
-.terminal .xterm-color-65 {
- color: #5f875f;
-}
-
-.terminal .xterm-bg-color-65 {
- background-color: #5f875f;
-}
-
-.terminal .xterm-color-66 {
- color: #5f8787;
-}
-
-.terminal .xterm-bg-color-66 {
- background-color: #5f8787;
-}
-
-.terminal .xterm-color-67 {
- color: #5f87af;
-}
-
-.terminal .xterm-bg-color-67 {
- background-color: #5f87af;
-}
-
-.terminal .xterm-color-68 {
- color: #5f87d7;
-}
-
-.terminal .xterm-bg-color-68 {
- background-color: #5f87d7;
-}
-
-.terminal .xterm-color-69 {
- color: #5f87ff;
-}
-
-.terminal .xterm-bg-color-69 {
- background-color: #5f87ff;
-}
-
-.terminal .xterm-color-70 {
- color: #5faf00;
-}
-
-.terminal .xterm-bg-color-70 {
- background-color: #5faf00;
-}
-
-.terminal .xterm-color-71 {
- color: #5faf5f;
-}
-
-.terminal .xterm-bg-color-71 {
- background-color: #5faf5f;
-}
-
-.terminal .xterm-color-72 {
- color: #5faf87;
-}
-
-.terminal .xterm-bg-color-72 {
- background-color: #5faf87;
-}
-
-.terminal .xterm-color-73 {
- color: #5fafaf;
-}
-
-.terminal .xterm-bg-color-73 {
- background-color: #5fafaf;
-}
-
-.terminal .xterm-color-74 {
- color: #5fafd7;
-}
-
-.terminal .xterm-bg-color-74 {
- background-color: #5fafd7;
-}
-
-.terminal .xterm-color-75 {
- color: #5fafff;
-}
-
-.terminal .xterm-bg-color-75 {
- background-color: #5fafff;
-}
-
-.terminal .xterm-color-76 {
- color: #5fd700;
-}
-
-.terminal .xterm-bg-color-76 {
- background-color: #5fd700;
-}
-
-.terminal .xterm-color-77 {
- color: #5fd75f;
-}
-
-.terminal .xterm-bg-color-77 {
- background-color: #5fd75f;
-}
-
-.terminal .xterm-color-78 {
- color: #5fd787;
-}
-
-.terminal .xterm-bg-color-78 {
- background-color: #5fd787;
-}
-
-.terminal .xterm-color-79 {
- color: #5fd7af;
-}
-
-.terminal .xterm-bg-color-79 {
- background-color: #5fd7af;
-}
-
-.terminal .xterm-color-80 {
- color: #5fd7d7;
-}
-
-.terminal .xterm-bg-color-80 {
- background-color: #5fd7d7;
-}
-
-.terminal .xterm-color-81 {
- color: #5fd7ff;
-}
-
-.terminal .xterm-bg-color-81 {
- background-color: #5fd7ff;
-}
-
-.terminal .xterm-color-82 {
- color: #5fff00;
-}
-
-.terminal .xterm-bg-color-82 {
- background-color: #5fff00;
-}
-
-.terminal .xterm-color-83 {
- color: #5fff5f;
-}
-
-.terminal .xterm-bg-color-83 {
- background-color: #5fff5f;
-}
-
-.terminal .xterm-color-84 {
- color: #5fff87;
-}
-
-.terminal .xterm-bg-color-84 {
- background-color: #5fff87;
-}
-
-.terminal .xterm-color-85 {
- color: #5fffaf;
-}
-
-.terminal .xterm-bg-color-85 {
- background-color: #5fffaf;
-}
-
-.terminal .xterm-color-86 {
- color: #5fffd7;
-}
-
-.terminal .xterm-bg-color-86 {
- background-color: #5fffd7;
-}
-
-.terminal .xterm-color-87 {
- color: #5fffff;
-}
-
-.terminal .xterm-bg-color-87 {
- background-color: #5fffff;
-}
-
-.terminal .xterm-color-88 {
- color: #870000;
-}
-
-.terminal .xterm-bg-color-88 {
- background-color: #870000;
-}
-
-.terminal .xterm-color-89 {
- color: #87005f;
-}
-
-.terminal .xterm-bg-color-89 {
- background-color: #87005f;
-}
-
-.terminal .xterm-color-90 {
- color: #870087;
-}
-
-.terminal .xterm-bg-color-90 {
- background-color: #870087;
-}
-
-.terminal .xterm-color-91 {
- color: #8700af;
-}
-
-.terminal .xterm-bg-color-91 {
- background-color: #8700af;
-}
-
-.terminal .xterm-color-92 {
- color: #8700d7;
-}
-
-.terminal .xterm-bg-color-92 {
- background-color: #8700d7;
-}
-
-.terminal .xterm-color-93 {
- color: #8700ff;
-}
-
-.terminal .xterm-bg-color-93 {
- background-color: #8700ff;
-}
-
-.terminal .xterm-color-94 {
- color: #875f00;
-}
-
-.terminal .xterm-bg-color-94 {
- background-color: #875f00;
-}
-
-.terminal .xterm-color-95 {
- color: #875f5f;
-}
-
-.terminal .xterm-bg-color-95 {
- background-color: #875f5f;
-}
-
-.terminal .xterm-color-96 {
- color: #875f87;
-}
-
-.terminal .xterm-bg-color-96 {
- background-color: #875f87;
-}
-
-.terminal .xterm-color-97 {
- color: #875faf;
-}
-
-.terminal .xterm-bg-color-97 {
- background-color: #875faf;
-}
-
-.terminal .xterm-color-98 {
- color: #875fd7;
-}
-
-.terminal .xterm-bg-color-98 {
- background-color: #875fd7;
-}
-
-.terminal .xterm-color-99 {
- color: #875fff;
-}
-
-.terminal .xterm-bg-color-99 {
- background-color: #875fff;
-}
-
-.terminal .xterm-color-100 {
- color: #878700;
-}
-
-.terminal .xterm-bg-color-100 {
- background-color: #878700;
-}
-
-.terminal .xterm-color-101 {
- color: #87875f;
-}
-
-.terminal .xterm-bg-color-101 {
- background-color: #87875f;
-}
-
-.terminal .xterm-color-102 {
- color: #878787;
-}
-
-.terminal .xterm-bg-color-102 {
- background-color: #878787;
-}
-
-.terminal .xterm-color-103 {
- color: #8787af;
-}
-
-.terminal .xterm-bg-color-103 {
- background-color: #8787af;
-}
-
-.terminal .xterm-color-104 {
- color: #8787d7;
-}
-
-.terminal .xterm-bg-color-104 {
- background-color: #8787d7;
-}
-
-.terminal .xterm-color-105 {
- color: #8787ff;
-}
-
-.terminal .xterm-bg-color-105 {
- background-color: #8787ff;
-}
-
-.terminal .xterm-color-106 {
- color: #87af00;
-}
-
-.terminal .xterm-bg-color-106 {
- background-color: #87af00;
-}
-
-.terminal .xterm-color-107 {
- color: #87af5f;
-}
-
-.terminal .xterm-bg-color-107 {
- background-color: #87af5f;
-}
-
-.terminal .xterm-color-108 {
- color: #87af87;
-}
-
-.terminal .xterm-bg-color-108 {
- background-color: #87af87;
-}
-
-.terminal .xterm-color-109 {
- color: #87afaf;
-}
-
-.terminal .xterm-bg-color-109 {
- background-color: #87afaf;
-}
-
-.terminal .xterm-color-110 {
- color: #87afd7;
-}
-
-.terminal .xterm-bg-color-110 {
- background-color: #87afd7;
-}
-
-.terminal .xterm-color-111 {
- color: #87afff;
-}
-
-.terminal .xterm-bg-color-111 {
- background-color: #87afff;
-}
-
-.terminal .xterm-color-112 {
- color: #87d700;
-}
-
-.terminal .xterm-bg-color-112 {
- background-color: #87d700;
-}
-
-.terminal .xterm-color-113 {
- color: #87d75f;
-}
-
-.terminal .xterm-bg-color-113 {
- background-color: #87d75f;
-}
-
-.terminal .xterm-color-114 {
- color: #87d787;
-}
-
-.terminal .xterm-bg-color-114 {
- background-color: #87d787;
-}
-
-.terminal .xterm-color-115 {
- color: #87d7af;
-}
-
-.terminal .xterm-bg-color-115 {
- background-color: #87d7af;
-}
-
-.terminal .xterm-color-116 {
- color: #87d7d7;
-}
-
-.terminal .xterm-bg-color-116 {
- background-color: #87d7d7;
-}
-
-.terminal .xterm-color-117 {
- color: #87d7ff;
-}
-
-.terminal .xterm-bg-color-117 {
- background-color: #87d7ff;
-}
-
-.terminal .xterm-color-118 {
- color: #87ff00;
-}
-
-.terminal .xterm-bg-color-118 {
- background-color: #87ff00;
-}
-
-.terminal .xterm-color-119 {
- color: #87ff5f;
-}
-
-.terminal .xterm-bg-color-119 {
- background-color: #87ff5f;
-}
-
-.terminal .xterm-color-120 {
- color: #87ff87;
-}
-
-.terminal .xterm-bg-color-120 {
- background-color: #87ff87;
-}
-
-.terminal .xterm-color-121 {
- color: #87ffaf;
-}
-
-.terminal .xterm-bg-color-121 {
- background-color: #87ffaf;
-}
-
-.terminal .xterm-color-122 {
- color: #87ffd7;
-}
-
-.terminal .xterm-bg-color-122 {
- background-color: #87ffd7;
-}
-
-.terminal .xterm-color-123 {
- color: #87ffff;
-}
-
-.terminal .xterm-bg-color-123 {
- background-color: #87ffff;
-}
-
-.terminal .xterm-color-124 {
- color: #af0000;
-}
-
-.terminal .xterm-bg-color-124 {
- background-color: #af0000;
-}
-
-.terminal .xterm-color-125 {
- color: #af005f;
-}
-
-.terminal .xterm-bg-color-125 {
- background-color: #af005f;
-}
-
-.terminal .xterm-color-126 {
- color: #af0087;
-}
-
-.terminal .xterm-bg-color-126 {
- background-color: #af0087;
-}
-
-.terminal .xterm-color-127 {
- color: #af00af;
-}
-
-.terminal .xterm-bg-color-127 {
- background-color: #af00af;
-}
-
-.terminal .xterm-color-128 {
- color: #af00d7;
-}
-
-.terminal .xterm-bg-color-128 {
- background-color: #af00d7;
-}
-
-.terminal .xterm-color-129 {
- color: #af00ff;
-}
-
-.terminal .xterm-bg-color-129 {
- background-color: #af00ff;
-}
-
-.terminal .xterm-color-130 {
- color: #af5f00;
-}
-
-.terminal .xterm-bg-color-130 {
- background-color: #af5f00;
-}
-
-.terminal .xterm-color-131 {
- color: #af5f5f;
-}
-
-.terminal .xterm-bg-color-131 {
- background-color: #af5f5f;
-}
-
-.terminal .xterm-color-132 {
- color: #af5f87;
-}
-
-.terminal .xterm-bg-color-132 {
- background-color: #af5f87;
-}
-
-.terminal .xterm-color-133 {
- color: #af5faf;
-}
-
-.terminal .xterm-bg-color-133 {
- background-color: #af5faf;
-}
-
-.terminal .xterm-color-134 {
- color: #af5fd7;
-}
-
-.terminal .xterm-bg-color-134 {
- background-color: #af5fd7;
-}
-
-.terminal .xterm-color-135 {
- color: #af5fff;
-}
-
-.terminal .xterm-bg-color-135 {
- background-color: #af5fff;
-}
-
-.terminal .xterm-color-136 {
- color: #af8700;
-}
-
-.terminal .xterm-bg-color-136 {
- background-color: #af8700;
-}
-
-.terminal .xterm-color-137 {
- color: #af875f;
-}
-
-.terminal .xterm-bg-color-137 {
- background-color: #af875f;
-}
-
-.terminal .xterm-color-138 {
- color: #af8787;
-}
-
-.terminal .xterm-bg-color-138 {
- background-color: #af8787;
-}
-
-.terminal .xterm-color-139 {
- color: #af87af;
-}
-
-.terminal .xterm-bg-color-139 {
- background-color: #af87af;
-}
-
-.terminal .xterm-color-140 {
- color: #af87d7;
-}
-
-.terminal .xterm-bg-color-140 {
- background-color: #af87d7;
-}
-
-.terminal .xterm-color-141 {
- color: #af87ff;
-}
-
-.terminal .xterm-bg-color-141 {
- background-color: #af87ff;
-}
-
-.terminal .xterm-color-142 {
- color: #afaf00;
-}
-
-.terminal .xterm-bg-color-142 {
- background-color: #afaf00;
-}
-
-.terminal .xterm-color-143 {
- color: #afaf5f;
-}
-
-.terminal .xterm-bg-color-143 {
- background-color: #afaf5f;
-}
-
-.terminal .xterm-color-144 {
- color: #afaf87;
-}
-
-.terminal .xterm-bg-color-144 {
- background-color: #afaf87;
-}
-
-.terminal .xterm-color-145 {
- color: #afafaf;
-}
-
-.terminal .xterm-bg-color-145 {
- background-color: #afafaf;
-}
-
-.terminal .xterm-color-146 {
- color: #afafd7;
-}
-
-.terminal .xterm-bg-color-146 {
- background-color: #afafd7;
-}
-
-.terminal .xterm-color-147 {
- color: #afafff;
-}
-
-.terminal .xterm-bg-color-147 {
- background-color: #afafff;
-}
-
-.terminal .xterm-color-148 {
- color: #afd700;
-}
-
-.terminal .xterm-bg-color-148 {
- background-color: #afd700;
-}
-
-.terminal .xterm-color-149 {
- color: #afd75f;
-}
-
-.terminal .xterm-bg-color-149 {
- background-color: #afd75f;
-}
-
-.terminal .xterm-color-150 {
- color: #afd787;
-}
-
-.terminal .xterm-bg-color-150 {
- background-color: #afd787;
-}
-
-.terminal .xterm-color-151 {
- color: #afd7af;
-}
-
-.terminal .xterm-bg-color-151 {
- background-color: #afd7af;
-}
-
-.terminal .xterm-color-152 {
- color: #afd7d7;
-}
-
-.terminal .xterm-bg-color-152 {
- background-color: #afd7d7;
-}
-
-.terminal .xterm-color-153 {
- color: #afd7ff;
-}
-
-.terminal .xterm-bg-color-153 {
- background-color: #afd7ff;
-}
-
-.terminal .xterm-color-154 {
- color: #afff00;
-}
-
-.terminal .xterm-bg-color-154 {
- background-color: #afff00;
-}
-
-.terminal .xterm-color-155 {
- color: #afff5f;
-}
-
-.terminal .xterm-bg-color-155 {
- background-color: #afff5f;
-}
-
-.terminal .xterm-color-156 {
- color: #afff87;
-}
-
-.terminal .xterm-bg-color-156 {
- background-color: #afff87;
-}
-
-.terminal .xterm-color-157 {
- color: #afffaf;
-}
-
-.terminal .xterm-bg-color-157 {
- background-color: #afffaf;
-}
-
-.terminal .xterm-color-158 {
- color: #afffd7;
-}
-
-.terminal .xterm-bg-color-158 {
- background-color: #afffd7;
-}
-
-.terminal .xterm-color-159 {
- color: #afffff;
-}
-
-.terminal .xterm-bg-color-159 {
- background-color: #afffff;
-}
-
-.terminal .xterm-color-160 {
- color: #d70000;
-}
-
-.terminal .xterm-bg-color-160 {
- background-color: #d70000;
-}
-
-.terminal .xterm-color-161 {
- color: #d7005f;
-}
-
-.terminal .xterm-bg-color-161 {
- background-color: #d7005f;
-}
-
-.terminal .xterm-color-162 {
- color: #d70087;
-}
-
-.terminal .xterm-bg-color-162 {
- background-color: #d70087;
-}
-
-.terminal .xterm-color-163 {
- color: #d700af;
-}
-
-.terminal .xterm-bg-color-163 {
- background-color: #d700af;
-}
-
-.terminal .xterm-color-164 {
- color: #d700d7;
-}
-
-.terminal .xterm-bg-color-164 {
- background-color: #d700d7;
-}
-
-.terminal .xterm-color-165 {
- color: #d700ff;
-}
-
-.terminal .xterm-bg-color-165 {
- background-color: #d700ff;
-}
-
-.terminal .xterm-color-166 {
- color: #d75f00;
-}
-
-.terminal .xterm-bg-color-166 {
- background-color: #d75f00;
-}
-
-.terminal .xterm-color-167 {
- color: #d75f5f;
-}
-
-.terminal .xterm-bg-color-167 {
- background-color: #d75f5f;
-}
-
-.terminal .xterm-color-168 {
- color: #d75f87;
-}
-
-.terminal .xterm-bg-color-168 {
- background-color: #d75f87;
-}
-
-.terminal .xterm-color-169 {
- color: #d75faf;
-}
-
-.terminal .xterm-bg-color-169 {
- background-color: #d75faf;
-}
-
-.terminal .xterm-color-170 {
- color: #d75fd7;
-}
-
-.terminal .xterm-bg-color-170 {
- background-color: #d75fd7;
-}
-
-.terminal .xterm-color-171 {
- color: #d75fff;
-}
-
-.terminal .xterm-bg-color-171 {
- background-color: #d75fff;
-}
-
-.terminal .xterm-color-172 {
- color: #d78700;
-}
-
-.terminal .xterm-bg-color-172 {
- background-color: #d78700;
-}
-
-.terminal .xterm-color-173 {
- color: #d7875f;
-}
-
-.terminal .xterm-bg-color-173 {
- background-color: #d7875f;
-}
-
-.terminal .xterm-color-174 {
- color: #d78787;
-}
-
-.terminal .xterm-bg-color-174 {
- background-color: #d78787;
-}
-
-.terminal .xterm-color-175 {
- color: #d787af;
-}
-
-.terminal .xterm-bg-color-175 {
- background-color: #d787af;
-}
-
-.terminal .xterm-color-176 {
- color: #d787d7;
-}
-
-.terminal .xterm-bg-color-176 {
- background-color: #d787d7;
-}
-
-.terminal .xterm-color-177 {
- color: #d787ff;
-}
-
-.terminal .xterm-bg-color-177 {
- background-color: #d787ff;
-}
-
-.terminal .xterm-color-178 {
- color: #d7af00;
-}
-
-.terminal .xterm-bg-color-178 {
- background-color: #d7af00;
-}
-
-.terminal .xterm-color-179 {
- color: #d7af5f;
-}
-
-.terminal .xterm-bg-color-179 {
- background-color: #d7af5f;
-}
-
-.terminal .xterm-color-180 {
- color: #d7af87;
-}
-
-.terminal .xterm-bg-color-180 {
- background-color: #d7af87;
-}
-
-.terminal .xterm-color-181 {
- color: #d7afaf;
-}
-
-.terminal .xterm-bg-color-181 {
- background-color: #d7afaf;
-}
-
-.terminal .xterm-color-182 {
- color: #d7afd7;
-}
-
-.terminal .xterm-bg-color-182 {
- background-color: #d7afd7;
-}
-
-.terminal .xterm-color-183 {
- color: #d7afff;
-}
-
-.terminal .xterm-bg-color-183 {
- background-color: #d7afff;
-}
-
-.terminal .xterm-color-184 {
- color: #d7d700;
-}
-
-.terminal .xterm-bg-color-184 {
- background-color: #d7d700;
-}
-
-.terminal .xterm-color-185 {
- color: #d7d75f;
-}
-
-.terminal .xterm-bg-color-185 {
- background-color: #d7d75f;
-}
-
-.terminal .xterm-color-186 {
- color: #d7d787;
-}
-
-.terminal .xterm-bg-color-186 {
- background-color: #d7d787;
-}
-
-.terminal .xterm-color-187 {
- color: #d7d7af;
-}
-
-.terminal .xterm-bg-color-187 {
- background-color: #d7d7af;
-}
-
-.terminal .xterm-color-188 {
- color: #d7d7d7;
-}
-
-.terminal .xterm-bg-color-188 {
- background-color: #d7d7d7;
-}
-
-.terminal .xterm-color-189 {
- color: #d7d7ff;
-}
-
-.terminal .xterm-bg-color-189 {
- background-color: #d7d7ff;
-}
-
-.terminal .xterm-color-190 {
- color: #d7ff00;
-}
-
-.terminal .xterm-bg-color-190 {
- background-color: #d7ff00;
-}
-
-.terminal .xterm-color-191 {
- color: #d7ff5f;
-}
-
-.terminal .xterm-bg-color-191 {
- background-color: #d7ff5f;
-}
-
-.terminal .xterm-color-192 {
- color: #d7ff87;
-}
-
-.terminal .xterm-bg-color-192 {
- background-color: #d7ff87;
-}
-
-.terminal .xterm-color-193 {
- color: #d7ffaf;
-}
-
-.terminal .xterm-bg-color-193 {
- background-color: #d7ffaf;
-}
-
-.terminal .xterm-color-194 {
- color: #d7ffd7;
-}
-
-.terminal .xterm-bg-color-194 {
- background-color: #d7ffd7;
-}
-
-.terminal .xterm-color-195 {
- color: #d7ffff;
-}
-
-.terminal .xterm-bg-color-195 {
- background-color: #d7ffff;
-}
-
-.terminal .xterm-color-196 {
- color: #ff0000;
-}
-
-.terminal .xterm-bg-color-196 {
- background-color: #ff0000;
-}
-
-.terminal .xterm-color-197 {
- color: #ff005f;
-}
-
-.terminal .xterm-bg-color-197 {
- background-color: #ff005f;
-}
-
-.terminal .xterm-color-198 {
- color: #ff0087;
-}
-
-.terminal .xterm-bg-color-198 {
- background-color: #ff0087;
-}
-
-.terminal .xterm-color-199 {
- color: #ff00af;
-}
-
-.terminal .xterm-bg-color-199 {
- background-color: #ff00af;
-}
-
-.terminal .xterm-color-200 {
- color: #ff00d7;
-}
-
-.terminal .xterm-bg-color-200 {
- background-color: #ff00d7;
-}
-
-.terminal .xterm-color-201 {
- color: #ff00ff;
-}
-
-.terminal .xterm-bg-color-201 {
- background-color: #ff00ff;
-}
-
-.terminal .xterm-color-202 {
- color: #ff5f00;
-}
-
-.terminal .xterm-bg-color-202 {
- background-color: #ff5f00;
-}
-
-.terminal .xterm-color-203 {
- color: #ff5f5f;
-}
-
-.terminal .xterm-bg-color-203 {
- background-color: #ff5f5f;
-}
-
-.terminal .xterm-color-204 {
- color: #ff5f87;
-}
-
-.terminal .xterm-bg-color-204 {
- background-color: #ff5f87;
-}
-
-.terminal .xterm-color-205 {
- color: #ff5faf;
-}
-
-.terminal .xterm-bg-color-205 {
- background-color: #ff5faf;
-}
-
-.terminal .xterm-color-206 {
- color: #ff5fd7;
-}
-
-.terminal .xterm-bg-color-206 {
- background-color: #ff5fd7;
-}
-
-.terminal .xterm-color-207 {
- color: #ff5fff;
-}
-
-.terminal .xterm-bg-color-207 {
- background-color: #ff5fff;
-}
-
-.terminal .xterm-color-208 {
- color: #ff8700;
-}
-
-.terminal .xterm-bg-color-208 {
- background-color: #ff8700;
-}
-
-.terminal .xterm-color-209 {
- color: #ff875f;
-}
-
-.terminal .xterm-bg-color-209 {
- background-color: #ff875f;
-}
-
-.terminal .xterm-color-210 {
- color: #ff8787;
-}
-
-.terminal .xterm-bg-color-210 {
- background-color: #ff8787;
-}
-
-.terminal .xterm-color-211 {
- color: #ff87af;
-}
-
-.terminal .xterm-bg-color-211 {
- background-color: #ff87af;
-}
-
-.terminal .xterm-color-212 {
- color: #ff87d7;
-}
-
-.terminal .xterm-bg-color-212 {
- background-color: #ff87d7;
-}
-
-.terminal .xterm-color-213 {
- color: #ff87ff;
-}
-
-.terminal .xterm-bg-color-213 {
- background-color: #ff87ff;
-}
-
-.terminal .xterm-color-214 {
- color: #ffaf00;
-}
-
-.terminal .xterm-bg-color-214 {
- background-color: #ffaf00;
-}
-
-.terminal .xterm-color-215 {
- color: #ffaf5f;
-}
-
-.terminal .xterm-bg-color-215 {
- background-color: #ffaf5f;
-}
-
-.terminal .xterm-color-216 {
- color: #ffaf87;
-}
-
-.terminal .xterm-bg-color-216 {
- background-color: #ffaf87;
-}
-
-.terminal .xterm-color-217 {
- color: #ffafaf;
-}
-
-.terminal .xterm-bg-color-217 {
- background-color: #ffafaf;
-}
-
-.terminal .xterm-color-218 {
- color: #ffafd7;
-}
-
-.terminal .xterm-bg-color-218 {
- background-color: #ffafd7;
-}
-
-.terminal .xterm-color-219 {
- color: #ffafff;
-}
-
-.terminal .xterm-bg-color-219 {
- background-color: #ffafff;
-}
-
-.terminal .xterm-color-220 {
- color: #ffd700;
-}
-
-.terminal .xterm-bg-color-220 {
- background-color: #ffd700;
-}
-
-.terminal .xterm-color-221 {
- color: #ffd75f;
-}
-
-.terminal .xterm-bg-color-221 {
- background-color: #ffd75f;
-}
-
-.terminal .xterm-color-222 {
- color: #ffd787;
-}
-
-.terminal .xterm-bg-color-222 {
- background-color: #ffd787;
-}
-
-.terminal .xterm-color-223 {
- color: #ffd7af;
-}
-
-.terminal .xterm-bg-color-223 {
- background-color: #ffd7af;
-}
-
-.terminal .xterm-color-224 {
- color: #ffd7d7;
-}
-
-.terminal .xterm-bg-color-224 {
- background-color: #ffd7d7;
-}
-
-.terminal .xterm-color-225 {
- color: #ffd7ff;
-}
-
-.terminal .xterm-bg-color-225 {
- background-color: #ffd7ff;
-}
-
-.terminal .xterm-color-226 {
- color: #ffff00;
-}
-
-.terminal .xterm-bg-color-226 {
- background-color: #ffff00;
-}
-
-.terminal .xterm-color-227 {
- color: #ffff5f;
-}
-
-.terminal .xterm-bg-color-227 {
- background-color: #ffff5f;
-}
-
-.terminal .xterm-color-228 {
- color: #ffff87;
-}
-
-.terminal .xterm-bg-color-228 {
- background-color: #ffff87;
-}
-
-.terminal .xterm-color-229 {
- color: #ffffaf;
-}
-
-.terminal .xterm-bg-color-229 {
- background-color: #ffffaf;
-}
-
-.terminal .xterm-color-230 {
- color: #ffffd7;
-}
-
-.terminal .xterm-bg-color-230 {
- background-color: #ffffd7;
-}
-
-.terminal .xterm-color-231 {
- color: #ffffff;
-}
-
-.terminal .xterm-bg-color-231 {
- background-color: #ffffff;
-}
-
-.terminal .xterm-color-232 {
- color: #080808;
-}
-
-.terminal .xterm-bg-color-232 {
- background-color: #080808;
-}
-
-.terminal .xterm-color-233 {
- color: #121212;
-}
-
-.terminal .xterm-bg-color-233 {
- background-color: #121212;
-}
-
-.terminal .xterm-color-234 {
- color: #1c1c1c;
-}
-
-.terminal .xterm-bg-color-234 {
- background-color: #1c1c1c;
-}
-
-.terminal .xterm-color-235 {
- color: #262626;
-}
-
-.terminal .xterm-bg-color-235 {
- background-color: #262626;
-}
-
-.terminal .xterm-color-236 {
- color: #303030;
-}
-
-.terminal .xterm-bg-color-236 {
- background-color: #303030;
-}
-
-.terminal .xterm-color-237 {
- color: #3a3a3a;
-}
-
-.terminal .xterm-bg-color-237 {
- background-color: #3a3a3a;
-}
-
-.terminal .xterm-color-238 {
- color: #444444;
-}
-
-.terminal .xterm-bg-color-238 {
- background-color: #444444;
-}
-
-.terminal .xterm-color-239 {
- color: #4e4e4e;
-}
-
-.terminal .xterm-bg-color-239 {
- background-color: #4e4e4e;
-}
-
-.terminal .xterm-color-240 {
- color: #585858;
-}
-
-.terminal .xterm-bg-color-240 {
- background-color: #585858;
-}
-
-.terminal .xterm-color-241 {
- color: #626262;
-}
-
-.terminal .xterm-bg-color-241 {
- background-color: #626262;
-}
-
-.terminal .xterm-color-242 {
- color: #6c6c6c;
-}
-
-.terminal .xterm-bg-color-242 {
- background-color: #6c6c6c;
-}
-
-.terminal .xterm-color-243 {
- color: #767676;
-}
-
-.terminal .xterm-bg-color-243 {
- background-color: #767676;
-}
-
-.terminal .xterm-color-244 {
- color: #808080;
-}
-
-.terminal .xterm-bg-color-244 {
- background-color: #808080;
-}
-
-.terminal .xterm-color-245 {
- color: #8a8a8a;
-}
-
-.terminal .xterm-bg-color-245 {
- background-color: #8a8a8a;
-}
-
-.terminal .xterm-color-246 {
- color: #949494;
-}
-
-.terminal .xterm-bg-color-246 {
- background-color: #949494;
-}
-
-.terminal .xterm-color-247 {
- color: #9e9e9e;
-}
-
-.terminal .xterm-bg-color-247 {
- background-color: #9e9e9e;
-}
-
-.terminal .xterm-color-248 {
- color: #a8a8a8;
-}
-
-.terminal .xterm-bg-color-248 {
- background-color: #a8a8a8;
-}
-
-.terminal .xterm-color-249 {
- color: #b2b2b2;
-}
-
-.terminal .xterm-bg-color-249 {
- background-color: #b2b2b2;
-}
-
-.terminal .xterm-color-250 {
- color: #bcbcbc;
-}
-
-.terminal .xterm-bg-color-250 {
- background-color: #bcbcbc;
-}
-
-.terminal .xterm-color-251 {
- color: #c6c6c6;
-}
-
-.terminal .xterm-bg-color-251 {
- background-color: #c6c6c6;
-}
-
-.terminal .xterm-color-252 {
- color: #d0d0d0;
-}
-
-.terminal .xterm-bg-color-252 {
- background-color: #d0d0d0;
-}
-
-.terminal .xterm-color-253 {
- color: #dadada;
-}
-
-.terminal .xterm-bg-color-253 {
- background-color: #dadada;
-}
-
-.terminal .xterm-color-254 {
- color: #e4e4e4;
-}
-
-.terminal .xterm-bg-color-254 {
- background-color: #e4e4e4;
-}
-
-.terminal .xterm-color-255 {
- color: #eeeeee;
-}
-
-.terminal .xterm-bg-color-255 {
- background-color: #eeeeee;
-}
diff --git a/yarn.lock b/yarn.lock
index 85fdb150d34..f6e3b84c84b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -78,9 +78,17 @@
lodash "^4.2.0"
to-fast-properties "^2.0.0"
-"@gitlab-org/gitlab-svgs@^1.26.0":
- version "1.26.0"
- resolved "https://registry.yarnpkg.com/@gitlab-org/gitlab-svgs/-/gitlab-svgs-1.26.0.tgz#d89c633e866d031a9e4787b05eacc7144c3a7791"
+"@gitlab-org/gitlab-svgs@^1.23.0", "@gitlab-org/gitlab-svgs@^1.27.0":
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/@gitlab-org/gitlab-svgs/-/gitlab-svgs-1.27.0.tgz#638e70399ebd59e503732177316bb9a18bf7a13f"
+
+"@gitlab-org/gitlab-ui@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@gitlab-org/gitlab-ui/-/gitlab-ui-1.0.5.tgz#a64b402650494115c8b494a44b72c2d6fbf33fff"
+ dependencies:
+ "@gitlab-org/gitlab-svgs" "^1.23.0"
+ bootstrap-vue "^2.0.0-rc.11"
+ vue "^2.5.16"
"@sindresorhus/is@^0.7.0":
version "0.7.0"
@@ -346,6 +354,10 @@ ansi-align@^2.0.0:
dependencies:
string-width "^2.0.0"
+ansi-escapes@^1.1.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
ansi-escapes@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
@@ -1045,6 +1057,14 @@ babel-plugin-transform-strict-mode@^6.24.1:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
+babel-polyfill@6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
babel-preset-es2015@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
@@ -1317,6 +1337,21 @@ boom@5.x.x:
dependencies:
hoek "4.x.x"
+bootstrap-vue@^2.0.0-rc.11:
+ version "2.0.0-rc.11"
+ resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.11.tgz#47aaa6d2a8d390477de75e636d8ea652b1d03f59"
+ dependencies:
+ bootstrap "^4.1.1"
+ lodash.get "^4.4.2"
+ lodash.startcase "^4.4.0"
+ opencollective "^1.0.3"
+ popper.js "^1.12.9"
+ vue-functional-data-merge "^2.0.5"
+
+bootstrap@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.2.tgz#aee2a93472e61c471fc79fb475531dcbc87de326"
+
bootstrap@~4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.1.1.tgz#3aec85000fa619085da8d2e4983dfd67cf2114cb"
@@ -1576,7 +1611,7 @@ center-align@^0.1.1:
align-text "^0.1.3"
lazy-cache "^1.0.3"
-chalk@^1.1.1, chalk@^1.1.3:
+chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
dependencies:
@@ -1774,7 +1809,7 @@ combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
-commander@^2.13.0, commander@^2.15.1, commander@^2.9.0:
+commander@2, commander@^2.13.0, commander@^2.15.1, commander@^2.9.0:
version "2.15.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
@@ -2070,15 +2105,15 @@ cyclist@~0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
-d3-array@^1.2.0, d3-array@^1.2.1:
+d3-array@1, d3-array@1.2.1, d3-array@^1.2.0, d3-array@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.1.tgz#d1ca33de2f6ac31efadb8e050a021d7e2396d5dc"
-d3-axis@^1.0.8:
+d3-axis@1.0.8, d3-axis@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.8.tgz#31a705a0b535e65759de14173a31933137f18efa"
-d3-brush@^1.0.4:
+d3-brush@1.0.4, d3-brush@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.0.4.tgz#00c2f238019f24f6c0a194a26d41a1530ffe7bc4"
dependencies:
@@ -2088,44 +2123,103 @@ d3-brush@^1.0.4:
d3-selection "1"
d3-transition "1"
-d3-collection@1:
+d3-chord@1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.4.tgz#7dec4f0ba886f713fe111c45f763414f6f74ca2c"
+ dependencies:
+ d3-array "1"
+ d3-path "1"
+
+d3-collection@1, d3-collection@1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2"
-d3-color@1:
+d3-color@1, d3-color@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b"
-d3-dispatch@1:
+d3-dispatch@1, d3-dispatch@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz#46e1491eaa9b58c358fce5be4e8bed626e7871f8"
-d3-drag@1:
+d3-drag@1, d3-drag@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.1.tgz#df8dd4c502fb490fc7462046a8ad98a5c479282d"
dependencies:
d3-dispatch "1"
d3-selection "1"
-d3-ease@1:
+d3-dsv@1, d3-dsv@1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.0.8.tgz#907e240d57b386618dc56468bacfe76bf19764ae"
+ dependencies:
+ commander "2"
+ iconv-lite "0.4"
+ rw "1"
+
+d3-ease@1, d3-ease@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.3.tgz#68bfbc349338a380c44d8acc4fbc3304aa2d8c0e"
-d3-format@1:
+d3-force@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.1.0.tgz#cebf3c694f1078fcc3d4daf8e567b2fbd70d4ea3"
+ dependencies:
+ d3-collection "1"
+ d3-dispatch "1"
+ d3-quadtree "1"
+ d3-timer "1"
+
+d3-format@1, d3-format@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.2.1.tgz#4e19ecdb081a341dafaf5f555ee956bcfdbf167f"
-d3-interpolate@1:
+d3-geo@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.9.1.tgz#157e3b0f917379d0f73bebfff3be537f49fa7356"
+ dependencies:
+ d3-array "1"
+
+d3-hierarchy@1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz#a1c845c42f84a206bcf1c01c01098ea4ddaa7a26"
+
+d3-interpolate@1, d3-interpolate@1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6"
dependencies:
d3-color "1"
-d3-path@1:
+d3-path@1, d3-path@1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764"
-d3-scale@^1.0.7:
+d3-polygon@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.3.tgz#16888e9026460933f2b179652ad378224d382c62"
+
+d3-quadtree@1, d3-quadtree@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.3.tgz#ac7987e3e23fe805a990f28e1b50d38fcb822438"
+
+d3-queue@3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/d3-queue/-/d3-queue-3.0.7.tgz#c93a2e54b417c0959129d7d73f6cf7d4292e7618"
+
+d3-random@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.0.tgz#6642e506c6fa3a648595d2b2469788a8d12529d3"
+
+d3-request@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/d3-request/-/d3-request-1.0.6.tgz#a1044a9ef4ec28c824171c9379fae6d79474b19f"
+ dependencies:
+ d3-collection "1"
+ d3-dispatch "1"
+ d3-dsv "1"
+ xmlhttprequest "1"
+
+d3-scale@1.0.7, d3-scale@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.7.tgz#fa90324b3ea8a776422bd0472afab0b252a0945d"
dependencies:
@@ -2137,31 +2231,31 @@ d3-scale@^1.0.7:
d3-time "1"
d3-time-format "2"
-d3-selection@1, d3-selection@^1.1.0, d3-selection@^1.2.0:
+d3-selection@1, d3-selection@1.2.0, d3-selection@^1.1.0, d3-selection@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.2.0.tgz#1b8ec1c7cedadfb691f2ba20a4a3cfbeb71bbc88"
-d3-shape@^1.2.0:
+d3-shape@1.2.0, d3-shape@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777"
dependencies:
d3-path "1"
-d3-time-format@2, d3-time-format@^2.1.1:
+d3-time-format@2, d3-time-format@2.1.1, d3-time-format@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.1.tgz#85b7cdfbc9ffca187f14d3c456ffda268081bb31"
dependencies:
d3-time "1"
-d3-time@1, d3-time@^1.0.8:
+d3-time@1, d3-time@1.0.8, d3-time@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.8.tgz#dbd2d6007bf416fe67a76d17947b784bffea1e84"
-d3-timer@1:
+d3-timer@1, d3-timer@1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.7.tgz#df9650ca587f6c96607ff4e60cc38229e8dd8531"
-d3-transition@1:
+d3-transition@1, d3-transition@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.1.1.tgz#d8ef89c3b848735b060e54a39b32aaebaa421039"
dependencies:
@@ -2172,10 +2266,59 @@ d3-transition@1:
d3-selection "^1.1.0"
d3-timer "1"
+d3-voronoi@1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz#1687667e8f13a2d158c80c1480c5a29cb0d8973c"
+
+d3-zoom@1.7.1:
+ version "1.7.1"
+ resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.7.1.tgz#02f43b3c3e2db54f364582d7e4a236ccc5506b63"
+ dependencies:
+ d3-dispatch "1"
+ d3-drag "1"
+ d3-interpolate "1"
+ d3-selection "1"
+ d3-transition "1"
+
d3@3.5.17:
version "3.5.17"
resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8"
+d3@4.12.2:
+ version "4.12.2"
+ resolved "https://registry.yarnpkg.com/d3/-/d3-4.12.2.tgz#12f775564c6a9de229f63db03446e2cb7bb56c8f"
+ dependencies:
+ d3-array "1.2.1"
+ d3-axis "1.0.8"
+ d3-brush "1.0.4"
+ d3-chord "1.0.4"
+ d3-collection "1.0.4"
+ d3-color "1.0.3"
+ d3-dispatch "1.0.3"
+ d3-drag "1.2.1"
+ d3-dsv "1.0.8"
+ d3-ease "1.0.3"
+ d3-force "1.1.0"
+ d3-format "1.2.1"
+ d3-geo "1.9.1"
+ d3-hierarchy "1.1.5"
+ d3-interpolate "1.1.6"
+ d3-path "1.0.5"
+ d3-polygon "1.0.3"
+ d3-quadtree "1.0.3"
+ d3-queue "3.0.7"
+ d3-random "1.1.0"
+ d3-request "1.0.6"
+ d3-scale "1.0.7"
+ d3-selection "1.2.0"
+ d3-shape "1.2.0"
+ d3-time "1.0.8"
+ d3-time-format "2.1.1"
+ d3-timer "1.0.7"
+ d3-transition "1.1.1"
+ d3-voronoi "1.1.2"
+ d3-zoom "1.7.1"
+
dagre-d3-renderer@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/dagre-d3-renderer/-/dagre-d3-renderer-0.4.24.tgz#b36ce2fe4ea20de43e7698627c6ede2a9f15ec45"
@@ -2534,6 +2677,12 @@ encodeurl@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+encoding@^0.1.11:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+ dependencies:
+ iconv-lite "~0.4.13"
+
end-of-stream@^1.0.0, end-of-stream@^1.1.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
@@ -3009,7 +3158,7 @@ extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
-external-editor@^2.0.4:
+external-editor@^2.0.1, external-editor@^2.0.4:
version "2.2.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
dependencies:
@@ -3771,6 +3920,12 @@ https-proxy-agent@^2.2.1:
agent-base "^4.1.0"
debug "^3.1.0"
+iconv-lite@0.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
iconv-lite@0.4.15:
version "0.4.15"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
@@ -3779,7 +3934,7 @@ iconv-lite@0.4.19, iconv-lite@^0.4.17:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
-iconv-lite@0.4.23, iconv-lite@^0.4.22, iconv-lite@^0.4.4:
+iconv-lite@0.4.23, iconv-lite@^0.4.22, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
version "0.4.23"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
dependencies:
@@ -3884,6 +4039,24 @@ ini@^1.3.4, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+inquirer@3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347"
+ dependencies:
+ ansi-escapes "^1.1.0"
+ chalk "^1.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.1"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx "^4.1.0"
+ string-width "^2.0.0"
+ strip-ansi "^3.0.0"
+ through "^2.3.6"
+
inquirer@^3.0.6:
version "3.3.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
@@ -4173,7 +4346,7 @@ is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
-is-stream@^1.0.0, is-stream@^1.1.0:
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -4662,6 +4835,10 @@ lodash.escaperegexp@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
+lodash.get@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+
lodash.kebabcase@4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
@@ -4674,6 +4851,10 @@ lodash.snakecase@4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d"
+lodash.startcase@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8"
+
lodash.upperfirst@4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce"
@@ -4954,7 +5135,7 @@ minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
-minimist@^1.1.3, minimist@^1.2.0:
+minimist@1.2.0, minimist@^1.1.3, minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
@@ -5098,6 +5279,13 @@ nice-try@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
+node-fetch@1.6.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04"
+ dependencies:
+ encoding "^0.1.11"
+ is-stream "^1.0.1"
+
node-forge@0.6.33:
version "0.6.33"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc"
@@ -5351,10 +5539,28 @@ onetime@^2.0.0:
dependencies:
mimic-fn "^1.0.0"
+opencollective@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1"
+ dependencies:
+ babel-polyfill "6.23.0"
+ chalk "1.1.3"
+ inquirer "3.0.6"
+ minimist "1.2.0"
+ node-fetch "1.6.3"
+ opn "4.0.2"
+
opener@^1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8"
+opn@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95"
+ dependencies:
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.0"
+
opn@^5.1.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225"
@@ -5648,7 +5854,7 @@ pluralize@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
-popper.js@^1.14.3:
+popper.js@^1.12.9, popper.js@^1.14.3:
version "1.14.3"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.3.tgz#1438f98d046acf7b4d78cd502bf418ac64d4f095"
@@ -6056,6 +6262,10 @@ regenerate@^1.2.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
+regenerator-runtime@^0.10.0:
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
regenerator-runtime@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1"
@@ -6293,6 +6503,10 @@ run-queue@^1.0.0, run-queue@^1.0.3:
dependencies:
aproba "^1.1.1"
+rw@1:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
+
rx-lite-aggregates@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
@@ -6303,6 +6517,10 @@ rx-lite@*, rx-lite@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+rx@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
+
rxjs@^6.1.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.1.tgz#246cebec189a6cbc143a3ef9f62d6f4c91813ca1"
@@ -7457,6 +7675,10 @@ vue-eslint-parser@^2.0.3:
esquery "^1.0.0"
lodash "^4.17.4"
+vue-functional-data-merge@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-2.0.6.tgz#f08055adfb92458debcf2ad10c3aa712277f7fc2"
+
vue-hot-reload-api@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
@@ -7772,6 +7994,10 @@ xmlhttprequest-ssl@~1.5.4:
version "1.5.5"
resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
+xmlhttprequest@1:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc"
+
xregexp@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
@@ -7780,6 +8006,10 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+xterm@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/xterm/-/xterm-3.5.0.tgz#ba3f464bc5730c9d259ebe62131862224db9ddcc"
+
y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"