From eaaf823f2ce72d2af72708711a91d37e95a8fb24 Mon Sep 17 00:00:00 2001 From: Wang Date: Tue, 9 Nov 2021 18:42:02 +0900 Subject: [PATCH 01/68] Update custom-resources.md --- .../extend-kubernetes/api-extension/custom-resources.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md index 85c1c4a77f..9fea0905c6 100644 --- a/content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md +++ b/content/ja/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -118,7 +118,7 @@ CRDオブジェクトの名前は[DNSサブドメイン名](/ja/docs/concepts/ov 通常、Kubernetes APIの各リソースは、RESTリクエストとオブジェクトの永続的なストレージを管理するためのコードが必要です。メインのKubernetes APIサーバーは *Pod* や *Service* のようなビルトインのリソースを処理し、またカスタムリソースも[CRD](#customresourcedefinition)を通じて同じように管理することができます。 -[アグリゲーションレイヤー](/ja/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)は、独自のスタンドアローンAPIサーバーを書き、デプロイすることで、カスタムリソースに特化した実装の提供を可能にします。メインのAPIサーバーが、処理したいカスタムリソースへのリクエストを委譲することで、他のクライアントからも利用できるようにします。 +[アグリゲーションレイヤー](/ja/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)は、独自のAPIサーバーを書き、デプロイすることで、カスタムリソースに特化した実装の提供を可能にします。メインのAPIサーバーが、処理したいカスタムリソースへのリクエストを独自のAPIサーバーに委譲することで、他のクライアントからも利用できるようにします。 ## カスタムリソースの追加方法を選択する From 61b6871ed4af7cf62ba5471f48f043f949818ecc Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Fri, 12 Nov 2021 11:09:20 +0900 Subject: [PATCH 02/68] [ja] Translate setup/best-practices/cluster-large/ into Japanese --- .../setup/best-practices/cluster-large.md | 137 +++++++----------- 1 file changed, 56 insertions(+), 81 deletions(-) diff --git a/content/ja/docs/setup/best-practices/cluster-large.md b/content/ja/docs/setup/best-practices/cluster-large.md index 5a1f45b662..a6905e6886 100644 --- a/content/ja/docs/setup/best-practices/cluster-large.md +++ b/content/ja/docs/setup/best-practices/cluster-large.md @@ -1,123 +1,98 @@ --- -title: 大規模クラスタの構築 +title: 大規模クラスターの構築 weight: 20 --- -## サポート -At {{< param "version" >}}, Kubernetes supports clusters with up to 5000 nodes. More specifically, we support configurations that meet *all* of the following criteria: +クラスターはKubernetesのエージェントが動作する(物理もしくは仮想の) {{< glossary_tooltip text="nodes" term_id="node" >}} の集合で、{{< glossary_tooltip text="control plane" term_id="control-plane" >}} によって管理されます。 +Kubernetes {{< param "version" >}} では、最大5000ノードから構成されるクラスターをサポートします。 +具体的には、Kubernetesは次の基準を *全て* 満たす構成に対して適用できるように設計されています。 -* No more than 110 pods per node -* No more than 5000 nodes -* No more than 150000 total pods -* No more than 300000 total containers +* 1ノードにつきPodが110個以上存在しない +* 5000ノード以上存在しない +* Podの総数が150000個以上存在しない +* コンテナの総数が300000個以上存在しない + +ノードを追加したり削除したりすることによって、クラスターをスケールできます。 +これを行う方法は、クラスターがどのようにデプロイされたかに依存します。 -## 構築 +## クラウドプロバイダのリソースクォータ {#クォータの問題} -A cluster is a set of nodes (physical or virtual machines) running Kubernetes agents, managed by a "master" (the cluster-level control plane). +クラウドプロバイダのクォータの問題に遭遇することを避けるため、多数のノードを使ったクラスターを作成するときには次のようなことを考慮してください。 -Normally the number of nodes in a cluster is controlled by the value `NUM_NODES` in the platform-specific `config-default.sh` file (for example, see [GCE's `config-default.sh`](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/gce/config-default.sh)). +* 次のようなクラウドリソースの増加をリクエストする + * コンピュータインスタンス + * CPU + * ストレージボリューム + * 使用中のIPアドレス + * パケットフィルタリングのルールセット + * ロードバランサの数 + * ネットワークサブネット + * ログストリーム +* クラウドプロバイダによる新しいインスタンスの作成に対するレート制限のため、バッチで新しいノードを立ち上げるようなクラスターのスケーリング操作を通すためには、バッチ間ですこし休止を入れます。 -Simply changing that value to something very large, however, may cause the setup script to fail for many cloud providers. A GCE deployment, for example, will run in to quota issues and fail to bring the cluster up. -When setting up a large Kubernetes cluster, the following issues must be considered. +## コントロールプレーンのコンポーネント -### クォータの問題 +大きなクラスターでは、十分な計算とその他のリソースを持ったコントロールプレーンが必要になります。 -To avoid running into cloud provider quota issues, when creating a cluster with many nodes, consider: +特に故障ゾーンあたり1つまたは2つのコントロールプレーンインスタンスを動かす場合、最初に垂直方向にインスタンスをスケーリングさせ、垂直方向のスケーリングの効果が低下するポイントに達したら水平方向にスケーリングさせます。 -* Increase the quota for things like CPU, IPs, etc. - * In [GCE, for example,](https://cloud.google.com/compute/docs/resource-quotas) you'll want to increase the quota for: - * CPUs - * VM instances - * Total persistent disk reserved - * In-use IP addresses - * Firewall Rules - * Forwarding rules - * Routes - * Target pools -* Gating the setup script so that it brings up new node VMs in smaller batches with waits in between, because some cloud providers rate limit the creation of VMs. +フォールトトレランスを備えるために、1つの故障ゾーンに対して最低1インスタンスを動かすべきです。 +Kubernetesノードは、同一故障ゾーン内のコントロールプレーンエンドポイントに対して自動的にトラフィックが向かないようにします。 +しかし、クラウドプロバイダはこれを実現するための独自の機構を持っているかもしれません。 -### Etcdのストレージ +例えばマネージドなロードバランサを使うと、故障ゾーン _A_ にあるkubeletやPodから発生したトラフィックを、同じく故障ゾーン _A_ にあるコントロールプレーンホストに対してのみ送るように設定します。もし1つのコントロールプレーンホストまたは故障ゾーン _A_ のエンドポイントがオフラインになった場合、ゾーン _A_ にあるノードについてすべてのコントロールプレーンのトラフィックはゾーンを跨いで送信されます。それぞれのゾーンで複数のコントロールプレーンホストを動作させることは、結果としてほとんどありません。 -To improve performance of large clusters, we store events in a separate dedicated etcd instance. -When creating a cluster, existing salt scripts: +## etcdストレージ -* start and configure additional etcd instance -* configure api-server to use it for storing events +大きなクラスターの性能を向上させるために、他の専用のetcdインスタンスにイベントオブジェクトを保存できます。 -### マスターのサイズと構成要素 +クラスターを作るときに、(カスタムツールを使って)以下のようなことができます。 -On GCE/Google Kubernetes Engine, and AWS, `kube-up` automatically configures the proper VM size for your master depending on the number of nodes -in your cluster. On other providers, you will need to configure it manually. For reference, the sizes we use on GCE are +* 追加のetcdインスタンスを起動または設定する +* イベントを保存するために {{< glossary_tooltip term_id="kube-apiserver" text="API server" >}} を設定する -* 1-5 nodes: n1-standard-1 -* 6-10 nodes: n1-standard-2 -* 11-100 nodes: n1-standard-4 -* 101-250 nodes: n1-standard-8 -* 251-500 nodes: n1-standard-16 -* more than 500 nodes: n1-standard-32 +大きなクラスターのためにetcdを設定・管理する詳細については、[Operating etcd clusters for Kubernetes](/docs/tasks/administer-cluster/configure-upgrade-etcd/) または [kubeadmを使用した高可用性etcdクラスターの作成](/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/) を見てください。 -And the sizes we use on AWS are -* 1-5 nodes: m3.medium -* 6-10 nodes: m3.large -* 11-100 nodes: m3.xlarge -* 101-250 nodes: m3.2xlarge -* 251-500 nodes: c4.4xlarge -* more than 500 nodes: c4.8xlarge +## アドオンのリソース -{{< note >}} -On Google Kubernetes Engine, the size of the master node adjusts automatically based on the size of your cluster. For more information, see [this blog post](https://cloudplatform.googleblog.com/2017/11/Cutting-Cluster-Management-Fees-on-Google-Kubernetes-Engine.html). +Kubernetesの [リソース制限](/docs/concepts/configuration/manage-resources-containers/) は、メモリリークの影響やPodやコンテナが他のコンポーネントに与える他の影響を最小化することに役立ちます。 +これらのリソース制限は、アプリケーションのワークロードに適用するのと同様に、{{< glossary_tooltip text="addon" term_id="addons" >}} のリソースにも適用されます。 -On AWS, master node sizes are currently set at cluster startup time and do not change, even if you later scale your cluster up or down by manually removing or adding nodes or using a cluster autoscaler. -{{< /note >}} - -### アドオンのリソース - -To prevent memory leaks or other resource issues in [cluster addons](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons) from consuming all the resources available on a node, Kubernetes sets resource limits on addon containers to limit the CPU and Memory resources they can consume (See PR [#10653](https://pr.k8s.io/10653/files) and [#10778](https://pr.k8s.io/10778/files)). - -For example: +例えば、ロギングコンポーネントに対してCPUやメモリ制限を設定できます。 ```yaml + ... containers: - name: fluentd-cloud-logging - image: k8s.gcr.io/fluentd-gcp:1.16 + image: fluent/fluentd-kubernetes-daemonset:v1 resources: limits: cpu: 100m memory: 200Mi ``` -Except for Heapster, these limits are static and are based on data we collected from addons running on 4-node clusters (see [#10335](https://issue.k8s.io/10335#issuecomment-117861225)). The addons consume a lot more resources when running on large deployment clusters (see [#5880](http://issue.k8s.io/5880#issuecomment-113984085)). So, if a large cluster is deployed without adjusting these values, the addons may continuously get killed because they keep hitting the limits. +アドオンのデフォルト制限は、アドオンを小~中規模のKubernetesクラスターで動作させたときの経験から得られたデータに基づきます。 +大規模のクラスターで動作させる場合は、アドオンはデフォルト制限よりも多くのリソースを消費することが多いです。 +これらの値を調整せずに大規模のクラスターをデプロイした場合、メモリ制限に達し続けるため、アドオンが継続的に停止されるかもしれません。 +あるいは、CPUのタイムスライス制限により性能がでない状態で動作するかもしれません。 -To avoid running into cluster addon resource issues, when creating a cluster with many nodes, consider the following: +クラスターのアドオンのリソース制限に遭遇しないために、多くのノードで構成されるクラスターを構築する場合は次のことを考慮します。 -* Scale memory and CPU limits for each of the following addons, if used, as you scale up the size of cluster (there is one replica of each handling the entire cluster so memory and CPU usage tends to grow proportionally with size/load on cluster): - * [InfluxDB and Grafana](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/cluster-monitoring/influxdb/influxdb-grafana-controller.yaml) - * [kubedns, dnsmasq, and sidecar](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/dns/kube-dns/kube-dns.yaml.in) - * [Kibana](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/fluentd-elasticsearch/kibana-deployment.yaml) -* Scale number of replicas for the following addons, if used, along with the size of cluster (there are multiple replicas of each so increasing replicas should help handle increased load, but, since load per replica also increases slightly, also consider increasing CPU/memory limits): - * [elasticsearch](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/fluentd-elasticsearch/es-statefulset.yaml) -* Increase memory and CPU limits slightly for each of the following addons, if used, along with the size of cluster (there is one replica per node but CPU/memory usage increases slightly along with cluster load/size as well): - * [FluentD with ElasticSearch Plugin](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/fluentd-elasticsearch/fluentd-es-ds.yaml) - * [FluentD with GCP Plugin](https://releases.k8s.io/{{< param "githubbranch" >}}/cluster/addons/fluentd-gcp/fluentd-gcp-ds.yaml) +* いくつかのアドオンは垂直方向にスケールします - クラスターに1つのレプリカ、もしくは故障ゾーン全体にサービングされるものがあります。このようなアドオンでは、クラスターをスケールアウトしたときにリクエストと制限を増やす必要があります。 +* 数多くのアドオンは、水平方向にスケールします - より多くのPod数を動作させることで性能を向上できます - ただし、とても大きなクラスターではCPUやメモリの制限も少し引き上げる必要があるかもしれません。VerticalPodAutoscalerは、提案されたリクエストや制限の数値を提供する `_recommender_` モードで動作可能です。 +* いくつかのアドオンは {< glossary_tooltip text="DaemonSet" term_id="daemonset" >}} によって制御され、1ノードに1つ複製される形で動作します: 例えばノードレベルのログアグリゲーターです。水平方向にスケールするアドオンの場合と同様に、CPUやメモリ制限を少し引き上げる必要があるかもしれません。 -Heapster's resource limits are set dynamically based on the initial size of your cluster (see [#16185](http://issue.k8s.io/16185) -and [#22940](http://issue.k8s.io/22940)). If you find that Heapster is running -out of resources, you should adjust the formulas that compute heapster memory request (see those PRs for details). -For directions on how to detect if addon containers are hitting resource limits, see the -[Troubleshooting section of Compute Resources](/docs/concepts/configuration/manage-resources-containers/#troubleshooting). +## {{% heading "whatsnext" %}} -### 少数のノードの起動の失敗を許容する +`VerticalPodAutoscaler` は、リソースのリクエストやポッドの制限についての管理を手助けするためにクラスターへデプロイ可能なカスタムリソースです。 +`VerticalPodAutoscaler` やクラスターで致命的なアドオンを含むクラスターコンポーネントをスケールする方法についてさらに知りたい場合は [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#readme) をご覧ください。 -For various reasons (see [#18969](https://github.com/kubernetes/kubernetes/issues/18969) for more details) running -`kube-up.sh` with a very large `NUM_NODES` may fail due to a very small number of nodes not coming up properly. -Currently you have two choices: restart the cluster (`kube-down.sh` and then `kube-up.sh` again), or before -running `kube-up.sh` set the environment variable `ALLOWED_NOTREADY_NODES` to whatever value you feel comfortable -with. This will allow `kube-up.sh` to succeed with fewer than `NUM_NODES` coming up. Depending on the -reason for the failure, those additional nodes may join later or the cluster may remain at a size of -`NUM_NODES - ALLOWED_NOTREADY_NODES`. +[cluster autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#readme) は、クラスターで要求されるリソース水準を満たす正確なノード数で動作できるよう、いくつかのクラウドプロバイダと統合されています。 + +[addon resizer](https://github.com/kubernetes/autoscaler/tree/master/addon-resizer#readme) は、クラスターのスケールが変化したときにアドオンの自動的なリサイズをお手伝いします。 From cbfb0501de9ab7b784bf029e65b0956a2549048f Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Fri, 12 Nov 2021 12:34:54 +0900 Subject: [PATCH 03/68] Fix: link to ja/docs/concepts/extend-kubernetes/operator/ --- content/ja/docs/concepts/extend-kubernetes/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/_index.md b/content/ja/docs/concepts/extend-kubernetes/_index.md index 07cf8b2af2..fb3b249cfc 100644 --- a/content/ja/docs/concepts/extend-kubernetes/_index.md +++ b/content/ja/docs/concepts/extend-kubernetes/_index.md @@ -161,4 +161,4 @@ Kubernetesはいくつかのビルトイン認証方式と、それらが要件 * [ネットワークプラグイン](/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) * [デバイスプラグイン](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/) * [kubectlプラグイン](/docs/tasks/extend-kubectl/kubectl-plugins/)について学ぶ -* [オペレーターパターン](/docs/concepts/extend-kubernetes/operator/)について学ぶ +* [オペレーターパターン](/ja/docs/concepts/extend-kubernetes/operator/)について学ぶ From a6e7c0215d50f3f00f9c9601cad7f7ae05d3edaa Mon Sep 17 00:00:00 2001 From: Wang Date: Sat, 13 Nov 2021 23:30:25 +0900 Subject: [PATCH 04/68] Update operator.md --- content/ja/docs/concepts/extend-kubernetes/operator.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/operator.md b/content/ja/docs/concepts/extend-kubernetes/operator.md index 62e38d6ddb..48ab01436d 100644 --- a/content/ja/docs/concepts/extend-kubernetes/operator.md +++ b/content/ja/docs/concepts/extend-kubernetes/operator.md @@ -26,7 +26,8 @@ Kubernetes上でワークロードを稼働させている人は、しばしば Kubernetesは自動化のために設計されています。追加の作業、設定無しに、Kubernetesのコア機能によって多数のビルトインされた自動化機能が提供されます。 ワークロードのデプロイおよび稼働を自動化するためにKubernetesを使うことができます。 *さらに* Kubernetesがそれをどのように行うかの自動化も可能です。 -Kubernetesの{{< glossary_tooltip text="コントローラー" term_id="controller" >}}コンセプトは、Kubernetesのソースコードを修正すること無く、クラスターの振る舞いを拡張することを可能にします。 +Kubernetesの {{< glossary_tooltip text="オペレーターパターン" term_id="operator-pattern" >}} コンセプトは、Kubernetesのソースコードを修正すること無く、 +一つ以上のカスタムリソースに {{< glossary_tooltip text="カスタムコントローラー" term_id="controller" >}} をリンクすることで、クラスターの振る舞いを拡張することを可能にします。 オペレーターはKubernetes APIのクライアントで、[Custom Resource](/docs/concepts/extend-kubernetes/api-extension/custom-resources/)にとっての、コントローラーのように振る舞います。 ## オペレーターの例 {#example} From eaf9b9713fb27df015fc97a2b7dd87d020df16e8 Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Tue, 30 Nov 2021 08:05:45 +0900 Subject: [PATCH 05/68] Fix: missing links --- content/ja/docs/concepts/extend-kubernetes/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/_index.md b/content/ja/docs/concepts/extend-kubernetes/_index.md index fb3b249cfc..ea427bd555 100644 --- a/content/ja/docs/concepts/extend-kubernetes/_index.md +++ b/content/ja/docs/concepts/extend-kubernetes/_index.md @@ -30,7 +30,7 @@ Kubernetesは柔軟な設定が可能で、高い拡張性を持っています ホスティングされたKubernetesサービスやマネージドなKubernetesでは、フラグと設定ファイルが常に変更できるとは限りません。変更可能な場合でも、通常はクラスターの管理者のみが変更できます。また、それらは将来のKubernetesバージョンで変更される可能性があり、設定変更にはプロセスの再起動が必要になるかもしれません。これらの理由により、この方法は他の選択肢が無いときにのみ利用するべきです。 -[ResourceQuota](/docs/concepts/policy/resource-quotas/)、[PodSecurityPolicy](/docs/concepts/policy/pod-security-policy/)、[NetworkPolicy](/docs/concepts/services-networking/network-policies/)、そしてロールベースアクセス制御([RBAC](/docs/reference/access-authn-authz/rbac/))といった *ビルトインポリシーAPI* は、ビルトインのKubernetes APIです。APIは通常、ホスティングされたKubernetesサービスやマネージドなKubernetesで利用されます。これらは宣言的で、Podのような他のKubernetesリソースと同じ慣例に従っています。そのため、新しいクラスターの設定は繰り返し再利用することができ、アプリケーションと同じように管理することが可能です。さらに、安定版(stable)を利用している場合、他のKubernetes APIのような[定義済みのサポートポリシー](/docs/reference/deprecation-policy/)を利用することができます。これらの理由により、この方法は、適切な用途の場合、 *設定ファイル* や *フラグ* よりも好まれます。 +[ResourceQuota](/ja/docs/concepts/policy/resource-quotas/)、[PodSecurityPolicy](/docs/concepts/policy/pod-security-policy/)、[NetworkPolicy](/ja/docs/concepts/services-networking/network-policies/)、そしてロールベースアクセス制御([RBAC](/ja/docs/reference/access-authn-authz/rbac/))といった *ビルトインポリシーAPI* は、ビルトインのKubernetes APIです。APIは通常、ホスティングされたKubernetesサービスやマネージドなKubernetesで利用されます。これらは宣言的で、Podのような他のKubernetesリソースと同じ慣例に従っています。そのため、新しいクラスターの設定は繰り返し再利用することができ、アプリケーションと同じように管理することが可能です。さらに、安定版(stable)を利用している場合、他のKubernetes APIのような[定義済みのサポートポリシー](/docs/reference/deprecation-policy/)を利用することができます。これらの理由により、この方法は、適切な用途の場合、 *設定ファイル* や *フラグ* よりも好まれます。 ## 拡張 @@ -115,7 +115,7 @@ Kubdernetesはいくつかのビルトイン認証方式をサポートしてい [認証](/ja/docs/reference/access-authn-authz/authentication/)は、全てのリクエストのヘッダーまたは証明書情報を、リクエストを投げたクライアントのユーザー名にマッピングします。 -Kubernetesはいくつかのビルトイン認証方式と、それらが要件に合わない場合、[認証Webhook](/docs/reference/access-authn-authz/authentication/#webhook-token-authentication)を提供します。 +Kubernetesはいくつかのビルトイン認証方式と、それらが要件に合わない場合、[認証Webhook](ja/docs/reference/access-authn-authz/authentication/#webhook-token-authentication)を提供します。 ### 認可 From a64b2c1b3f4d5d80d6ae1026a983e620d1439ecf Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Tue, 30 Nov 2021 08:12:46 +0900 Subject: [PATCH 06/68] Address review's comment --- content/ja/docs/setup/best-practices/cluster-large.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/ja/docs/setup/best-practices/cluster-large.md b/content/ja/docs/setup/best-practices/cluster-large.md index a6905e6886..045fdd018d 100644 --- a/content/ja/docs/setup/best-practices/cluster-large.md +++ b/content/ja/docs/setup/best-practices/cluster-large.md @@ -4,7 +4,7 @@ weight: 20 --- -クラスターはKubernetesのエージェントが動作する(物理もしくは仮想の) {{< glossary_tooltip text="nodes" term_id="node" >}} の集合で、{{< glossary_tooltip text="control plane" term_id="control-plane" >}} によって管理されます。 +クラスターはKubernetesのエージェントが動作する(物理もしくは仮想の) {{< glossary_tooltip text="ノード" term_id="node" >}} の集合で、{{< glossary_tooltip text="コントロールプレーン" term_id="control-plane" >}} によって管理されます。 Kubernetes {{< param "version" >}} では、最大5000ノードから構成されるクラスターをサポートします。 具体的には、Kubernetesは次の基準を *全て* 満たす構成に対して適用できるように設計されています。 @@ -53,15 +53,15 @@ Kubernetesノードは、同一故障ゾーン内のコントロールプレー クラスターを作るときに、(カスタムツールを使って)以下のようなことができます。 * 追加のetcdインスタンスを起動または設定する -* イベントを保存するために {{< glossary_tooltip term_id="kube-apiserver" text="API server" >}} を設定する +* イベントを保存するために {{< glossary_tooltip term_id="kube-apiserver" text="APIサーバ" >}} を設定する 大きなクラスターのためにetcdを設定・管理する詳細については、[Operating etcd clusters for Kubernetes](/docs/tasks/administer-cluster/configure-upgrade-etcd/) または [kubeadmを使用した高可用性etcdクラスターの作成](/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/) を見てください。 ## アドオンのリソース -Kubernetesの [リソース制限](/docs/concepts/configuration/manage-resources-containers/) は、メモリリークの影響やPodやコンテナが他のコンポーネントに与える他の影響を最小化することに役立ちます。 -これらのリソース制限は、アプリケーションのワークロードに適用するのと同様に、{{< glossary_tooltip text="addon" term_id="addons" >}} のリソースにも適用されます。 +Kubernetesの [リソース制限](/ja/docs/concepts/configuration/manage-resources-containers/) は、メモリリークの影響やPodやコンテナが他のコンポーネントに与える他の影響を最小化することに役立ちます。 +これらのリソース制限は、アプリケーションのワークロードに適用するのと同様に、{{< glossary_tooltip text="アドオン" term_id="addons" >}} のリソースにも適用されます。 例えば、ロギングコンポーネントに対してCPUやメモリ制限を設定できます。 @@ -90,7 +90,7 @@ Kubernetesの [リソース制限](/docs/concepts/configuration/manage-resources ## {{% heading "whatsnext" %}} -`VerticalPodAutoscaler` は、リソースのリクエストやポッドの制限についての管理を手助けするためにクラスターへデプロイ可能なカスタムリソースです。 +`VerticalPodAutoscaler` は、リソースのリクエストやPodの制限についての管理を手助けするためにクラスターへデプロイ可能なカスタムリソースです。 `VerticalPodAutoscaler` やクラスターで致命的なアドオンを含むクラスターコンポーネントをスケールする方法についてさらに知りたい場合は [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#readme) をご覧ください。 [cluster autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#readme) は、クラスターで要求されるリソース水準を満たす正確なノード数で動作できるよう、いくつかのクラウドプロバイダと統合されています。 From f4bf6a2206987752777884ce2c595d1a24167607 Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Wed, 1 Dec 2021 07:18:20 +0900 Subject: [PATCH 07/68] Address review comment --- content/ja/docs/concepts/extend-kubernetes/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/_index.md b/content/ja/docs/concepts/extend-kubernetes/_index.md index ea427bd555..b1aaaadf3f 100644 --- a/content/ja/docs/concepts/extend-kubernetes/_index.md +++ b/content/ja/docs/concepts/extend-kubernetes/_index.md @@ -115,7 +115,7 @@ Kubdernetesはいくつかのビルトイン認証方式をサポートしてい [認証](/ja/docs/reference/access-authn-authz/authentication/)は、全てのリクエストのヘッダーまたは証明書情報を、リクエストを投げたクライアントのユーザー名にマッピングします。 -Kubernetesはいくつかのビルトイン認証方式と、それらが要件に合わない場合、[認証Webhook](ja/docs/reference/access-authn-authz/authentication/#webhook-token-authentication)を提供します。 +Kubernetesはいくつかのビルトイン認証方式と、それらが要件に合わない場合、[認証Webhook](/ja/docs/reference/access-authn-authz/authentication/#webhook-token-authentication)を提供します。 ### 認可 From d2c1939fce431121663153722c5389937f96708b Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Sat, 4 Dec 2021 10:09:16 +0900 Subject: [PATCH 08/68] Apply suggestions from code review Co-authored-by: nasa9084 --- .../setup/best-practices/cluster-large.md | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/content/ja/docs/setup/best-practices/cluster-large.md b/content/ja/docs/setup/best-practices/cluster-large.md index 045fdd018d..68713bf27c 100644 --- a/content/ja/docs/setup/best-practices/cluster-large.md +++ b/content/ja/docs/setup/best-practices/cluster-large.md @@ -4,7 +4,7 @@ weight: 20 --- -クラスターはKubernetesのエージェントが動作する(物理もしくは仮想の) {{< glossary_tooltip text="ノード" term_id="node" >}} の集合で、{{< glossary_tooltip text="コントロールプレーン" term_id="control-plane" >}} によって管理されます。 +クラスターはKubernetesのエージェントが動作する(物理もしくは仮想の){{< glossary_tooltip text="ノード" term_id="node" >}}の集合で、{{< glossary_tooltip text="コントロールプレーン" term_id="control-plane" >}}によって管理されます。 Kubernetes {{< param "version" >}} では、最大5000ノードから構成されるクラスターをサポートします。 具体的には、Kubernetesは次の基準を *全て* 満たす構成に対して適用できるように設計されています。 @@ -17,9 +17,9 @@ Kubernetes {{< param "version" >}} では、最大5000ノードから構成さ これを行う方法は、クラスターがどのようにデプロイされたかに依存します。 -## クラウドプロバイダのリソースクォータ {#クォータの問題} +## クラウドプロバイダーのリソースクォータ {#クォータの問題} -クラウドプロバイダのクォータの問題に遭遇することを避けるため、多数のノードを使ったクラスターを作成するときには次のようなことを考慮してください。 +クラウドプロバイダのクォーターの問題に遭遇することを避けるため、多数のノードを使ったクラスターを作成するときには次のようなことを考慮してください。 * 次のようなクラウドリソースの増加をリクエストする * コンピュータインスタンス @@ -27,10 +27,10 @@ Kubernetes {{< param "version" >}} では、最大5000ノードから構成さ * ストレージボリューム * 使用中のIPアドレス * パケットフィルタリングのルールセット - * ロードバランサの数 + * ロードバランサーの数 * ネットワークサブネット * ログストリーム -* クラウドプロバイダによる新しいインスタンスの作成に対するレート制限のため、バッチで新しいノードを立ち上げるようなクラスターのスケーリング操作を通すためには、バッチ間ですこし休止を入れます。 +* クラウドプロバイダーによる新しいインスタンスの作成に対するレート制限のため、バッチで新しいノードを立ち上げるようなクラスターのスケーリング操作を通すためには、バッチ間ですこし休止を入れます。 ## コントロールプレーンのコンポーネント @@ -41,27 +41,27 @@ Kubernetes {{< param "version" >}} では、最大5000ノードから構成さ フォールトトレランスを備えるために、1つの故障ゾーンに対して最低1インスタンスを動かすべきです。 Kubernetesノードは、同一故障ゾーン内のコントロールプレーンエンドポイントに対して自動的にトラフィックが向かないようにします。 -しかし、クラウドプロバイダはこれを実現するための独自の機構を持っているかもしれません。 +しかし、クラウドプロバイダーはこれを実現するための独自の機構を持っているかもしれません。 -例えばマネージドなロードバランサを使うと、故障ゾーン _A_ にあるkubeletやPodから発生したトラフィックを、同じく故障ゾーン _A_ にあるコントロールプレーンホストに対してのみ送るように設定します。もし1つのコントロールプレーンホストまたは故障ゾーン _A_ のエンドポイントがオフラインになった場合、ゾーン _A_ にあるノードについてすべてのコントロールプレーンのトラフィックはゾーンを跨いで送信されます。それぞれのゾーンで複数のコントロールプレーンホストを動作させることは、結果としてほとんどありません。 +例えばマネージドなロードバランサーを使うと、故障ゾーン _A_ にあるkubeletやPodから発生したトラフィックを、同じく故障ゾーン _A_ にあるコントロールプレーンホストに対してのみ送るように設定します。もし1つのコントロールプレーンホストまたは故障ゾーン _A_ のエンドポイントがオフラインになった場合、ゾーン _A_ にあるノードについてすべてのコントロールプレーンのトラフィックはゾーンを跨いで送信されます。それぞれのゾーンで複数のコントロールプレーンホストを動作させることは、結果としてほとんどありません。 ## etcdストレージ 大きなクラスターの性能を向上させるために、他の専用のetcdインスタンスにイベントオブジェクトを保存できます。 -クラスターを作るときに、(カスタムツールを使って)以下のようなことができます。 +クラスターを作るときに、(カスタムツールを使って)以下のようなことができます。 * 追加のetcdインスタンスを起動または設定する -* イベントを保存するために {{< glossary_tooltip term_id="kube-apiserver" text="APIサーバ" >}} を設定する +* イベントを保存するために{{< glossary_tooltip term_id="kube-apiserver" text="APIサーバ" >}}を設定する -大きなクラスターのためにetcdを設定・管理する詳細については、[Operating etcd clusters for Kubernetes](/docs/tasks/administer-cluster/configure-upgrade-etcd/) または [kubeadmを使用した高可用性etcdクラスターの作成](/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/) を見てください。 +大きなクラスターのためにetcdを設定・管理する詳細については、[Operating etcd clusters for Kubernetes](/docs/tasks/administer-cluster/configure-upgrade-etcd/)または[kubeadmを使用した高可用性etcdクラスターの作成](/ja/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/)を見てください。 ## アドオンのリソース -Kubernetesの [リソース制限](/ja/docs/concepts/configuration/manage-resources-containers/) は、メモリリークの影響やPodやコンテナが他のコンポーネントに与える他の影響を最小化することに役立ちます。 -これらのリソース制限は、アプリケーションのワークロードに適用するのと同様に、{{< glossary_tooltip text="アドオン" term_id="addons" >}} のリソースにも適用されます。 +Kubernetesの[リソース制限](/ja/docs/concepts/configuration/manage-resources-containers/)は、メモリリークの影響やPodやコンテナが他のコンポーネントに与える他の影響を最小化することに役立ちます。 +これらのリソース制限は、アプリケーションのワークロードに適用するのと同様に、{{< glossary_tooltip text="アドオン" term_id="addons" >}}のリソースにも適用されます。 例えば、ロギングコンポーネントに対してCPUやメモリ制限を設定できます。 @@ -78,7 +78,7 @@ Kubernetesの [リソース制限](/ja/docs/concepts/configuration/manage-resour アドオンのデフォルト制限は、アドオンを小~中規模のKubernetesクラスターで動作させたときの経験から得られたデータに基づきます。 大規模のクラスターで動作させる場合は、アドオンはデフォルト制限よりも多くのリソースを消費することが多いです。 -これらの値を調整せずに大規模のクラスターをデプロイした場合、メモリ制限に達し続けるため、アドオンが継続的に停止されるかもしれません。 +これらの値を調整せずに大規模のクラスターをデプロイした場合、メモリー制限に達し続けるため、アドオンが継続的に停止されるかもしれません。 あるいは、CPUのタイムスライス制限により性能がでない状態で動作するかもしれません。 クラスターのアドオンのリソース制限に遭遇しないために、多くのノードで構成されるクラスターを構築する場合は次のことを考慮します。 @@ -91,8 +91,8 @@ Kubernetesの [リソース制限](/ja/docs/concepts/configuration/manage-resour ## {{% heading "whatsnext" %}} `VerticalPodAutoscaler` は、リソースのリクエストやPodの制限についての管理を手助けするためにクラスターへデプロイ可能なカスタムリソースです。 -`VerticalPodAutoscaler` やクラスターで致命的なアドオンを含むクラスターコンポーネントをスケールする方法についてさらに知りたい場合は [Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#readme) をご覧ください。 +`VerticalPodAutoscaler` やクラスターで致命的なアドオンを含むクラスターコンポーネントをスケールする方法についてさらに知りたい場合は[Vertical Pod Autoscaler](https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler#readme)をご覧ください。 -[cluster autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#readme) は、クラスターで要求されるリソース水準を満たす正確なノード数で動作できるよう、いくつかのクラウドプロバイダと統合されています。 +[cluster autoscaler](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler#readme)は、クラスターで要求されるリソース水準を満たす正確なノード数で動作できるよう、いくつかのクラウドプロバイダーと統合されています。 -[addon resizer](https://github.com/kubernetes/autoscaler/tree/master/addon-resizer#readme) は、クラスターのスケールが変化したときにアドオンの自動的なリサイズをお手伝いします。 +[addon resizer](https://github.com/kubernetes/autoscaler/tree/master/addon-resizer#readme)は、クラスターのスケールが変化したときにアドオンの自動的なリサイズをお手伝いします。 From c7e7de3f5c88e50da67aa0f745b5198a11303928 Mon Sep 17 00:00:00 2001 From: Wang Date: Sun, 5 Dec 2021 17:11:57 +0900 Subject: [PATCH 09/68] Update content/ja/docs/concepts/extend-kubernetes/operator.md Co-authored-by: nasa9084 --- content/ja/docs/concepts/extend-kubernetes/operator.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/operator.md b/content/ja/docs/concepts/extend-kubernetes/operator.md index 48ab01436d..5ead647d68 100644 --- a/content/ja/docs/concepts/extend-kubernetes/operator.md +++ b/content/ja/docs/concepts/extend-kubernetes/operator.md @@ -26,7 +26,7 @@ Kubernetes上でワークロードを稼働させている人は、しばしば Kubernetesは自動化のために設計されています。追加の作業、設定無しに、Kubernetesのコア機能によって多数のビルトインされた自動化機能が提供されます。 ワークロードのデプロイおよび稼働を自動化するためにKubernetesを使うことができます。 *さらに* Kubernetesがそれをどのように行うかの自動化も可能です。 -Kubernetesの {{< glossary_tooltip text="オペレーターパターン" term_id="operator-pattern" >}} コンセプトは、Kubernetesのソースコードを修正すること無く、 +Kubernetesの{{< glossary_tooltip text="オペレーターパターン" term_id="operator-pattern" >}}コンセプトは、Kubernetesのソースコードを修正すること無く、 一つ以上のカスタムリソースに {{< glossary_tooltip text="カスタムコントローラー" term_id="controller" >}} をリンクすることで、クラスターの振る舞いを拡張することを可能にします。 オペレーターはKubernetes APIのクライアントで、[Custom Resource](/docs/concepts/extend-kubernetes/api-extension/custom-resources/)にとっての、コントローラーのように振る舞います。 From 80750395ddfb8f2025f11be9c8835b17f2d0eb5c Mon Sep 17 00:00:00 2001 From: Wang Date: Sun, 5 Dec 2021 17:12:47 +0900 Subject: [PATCH 10/68] Update operator.md --- content/ja/docs/concepts/extend-kubernetes/operator.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/operator.md b/content/ja/docs/concepts/extend-kubernetes/operator.md index 5ead647d68..5f214e763f 100644 --- a/content/ja/docs/concepts/extend-kubernetes/operator.md +++ b/content/ja/docs/concepts/extend-kubernetes/operator.md @@ -26,8 +26,7 @@ Kubernetes上でワークロードを稼働させている人は、しばしば Kubernetesは自動化のために設計されています。追加の作業、設定無しに、Kubernetesのコア機能によって多数のビルトインされた自動化機能が提供されます。 ワークロードのデプロイおよび稼働を自動化するためにKubernetesを使うことができます。 *さらに* Kubernetesがそれをどのように行うかの自動化も可能です。 -Kubernetesの{{< glossary_tooltip text="オペレーターパターン" term_id="operator-pattern" >}}コンセプトは、Kubernetesのソースコードを修正すること無く、 -一つ以上のカスタムリソースに {{< glossary_tooltip text="カスタムコントローラー" term_id="controller" >}} をリンクすることで、クラスターの振る舞いを拡張することを可能にします。 +Kubernetesの{{< glossary_tooltip text="オペレーターパターン" term_id="operator-pattern" >}}コンセプトは、Kubernetesのソースコードを修正すること無く、一つ以上のカスタムリソースに {{< glossary_tooltip text="カスタムコントローラー" term_id="controller" >}} をリンクすることで、クラスターの振る舞いを拡張することを可能にします。 オペレーターはKubernetes APIのクライアントで、[Custom Resource](/docs/concepts/extend-kubernetes/api-extension/custom-resources/)にとっての、コントローラーのように振る舞います。 ## オペレーターの例 {#example} From 68d60b76e452c03f7f50ed9f03f415ab94d225f0 Mon Sep 17 00:00:00 2001 From: Wang Date: Mon, 6 Dec 2021 01:45:34 +0900 Subject: [PATCH 11/68] Update content/ja/docs/concepts/extend-kubernetes/operator.md Co-authored-by: nasa9084 --- content/ja/docs/concepts/extend-kubernetes/operator.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/concepts/extend-kubernetes/operator.md b/content/ja/docs/concepts/extend-kubernetes/operator.md index 5f214e763f..34e5aa9095 100644 --- a/content/ja/docs/concepts/extend-kubernetes/operator.md +++ b/content/ja/docs/concepts/extend-kubernetes/operator.md @@ -26,7 +26,7 @@ Kubernetes上でワークロードを稼働させている人は、しばしば Kubernetesは自動化のために設計されています。追加の作業、設定無しに、Kubernetesのコア機能によって多数のビルトインされた自動化機能が提供されます。 ワークロードのデプロイおよび稼働を自動化するためにKubernetesを使うことができます。 *さらに* Kubernetesがそれをどのように行うかの自動化も可能です。 -Kubernetesの{{< glossary_tooltip text="オペレーターパターン" term_id="operator-pattern" >}}コンセプトは、Kubernetesのソースコードを修正すること無く、一つ以上のカスタムリソースに {{< glossary_tooltip text="カスタムコントローラー" term_id="controller" >}} をリンクすることで、クラスターの振る舞いを拡張することを可能にします。 +Kubernetesの{{< glossary_tooltip text="オペレーターパターン" term_id="operator-pattern" >}}コンセプトは、Kubernetesのソースコードを修正すること無く、一つ以上のカスタムリソースに{{< glossary_tooltip text="カスタムコントローラー" term_id="controller" >}}をリンクすることで、クラスターの振る舞いを拡張することを可能にします。 オペレーターはKubernetes APIのクライアントで、[Custom Resource](/docs/concepts/extend-kubernetes/api-extension/custom-resources/)にとっての、コントローラーのように振る舞います。 ## オペレーターの例 {#example} From b1c4618fbd24291cda0622ea9fd0d6e502208862 Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Mon, 6 Dec 2021 07:03:41 +0900 Subject: [PATCH 12/68] Address review's comment --- content/ja/docs/setup/best-practices/cluster-large.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/setup/best-practices/cluster-large.md b/content/ja/docs/setup/best-practices/cluster-large.md index 68713bf27c..4ba9739e50 100644 --- a/content/ja/docs/setup/best-practices/cluster-large.md +++ b/content/ja/docs/setup/best-practices/cluster-large.md @@ -37,7 +37,7 @@ Kubernetes {{< param "version" >}} では、最大5000ノードから構成さ 大きなクラスターでは、十分な計算とその他のリソースを持ったコントロールプレーンが必要になります。 -特に故障ゾーンあたり1つまたは2つのコントロールプレーンインスタンスを動かす場合、最初に垂直方向にインスタンスをスケーリングさせ、垂直方向のスケーリングの効果が低下するポイントに達したら水平方向にスケーリングさせます。 +特に故障ゾーンあたり1つまたは2つのコントロールプレーンインスタンスを動かす場合、最初に垂直方向にインスタンスをスケールし、垂直方向のスケーリングの効果が低下するポイントに達したら水平方向にスケールします。 フォールトトレランスを備えるために、1つの故障ゾーンに対して最低1インスタンスを動かすべきです。 Kubernetesノードは、同一故障ゾーン内のコントロールプレーンエンドポイントに対して自動的にトラフィックが向かないようにします。 From 74cf4ccb139a5c5d68ea3040119ef2520c74de39 Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Mon, 6 Dec 2021 07:05:33 +0900 Subject: [PATCH 13/68] Apply suggestions from code review Co-authored-by: nasa9084 --- content/ja/docs/setup/best-practices/cluster-large.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/docs/setup/best-practices/cluster-large.md b/content/ja/docs/setup/best-practices/cluster-large.md index 4ba9739e50..8c2626ba3b 100644 --- a/content/ja/docs/setup/best-practices/cluster-large.md +++ b/content/ja/docs/setup/best-practices/cluster-large.md @@ -19,10 +19,10 @@ Kubernetes {{< param "version" >}} では、最大5000ノードから構成さ ## クラウドプロバイダーのリソースクォータ {#クォータの問題} -クラウドプロバイダのクォーターの問題に遭遇することを避けるため、多数のノードを使ったクラスターを作成するときには次のようなことを考慮してください。 +クラウドプロバイダーのクォーターの問題に遭遇することを避けるため、多数のノードを使ったクラスターを作成するときには次のようなことを考慮してください。 * 次のようなクラウドリソースの増加をリクエストする - * コンピュータインスタンス + * コンピューターインスタンス * CPU * ストレージボリューム * 使用中のIPアドレス From 1eabc66c8fb1933f41e64d430314f3edc61c925a Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Mon, 6 Dec 2021 17:03:26 +0900 Subject: [PATCH 14/68] Update content/ja/docs/setup/best-practices/cluster-large.md Co-authored-by: nasa9084 --- content/ja/docs/setup/best-practices/cluster-large.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/setup/best-practices/cluster-large.md b/content/ja/docs/setup/best-practices/cluster-large.md index 8c2626ba3b..e1c545bd22 100644 --- a/content/ja/docs/setup/best-practices/cluster-large.md +++ b/content/ja/docs/setup/best-practices/cluster-large.md @@ -19,7 +19,7 @@ Kubernetes {{< param "version" >}} では、最大5000ノードから構成さ ## クラウドプロバイダーのリソースクォータ {#クォータの問題} -クラウドプロバイダーのクォーターの問題に遭遇することを避けるため、多数のノードを使ったクラスターを作成するときには次のようなことを考慮してください。 +クラウドプロバイダーのクォータの問題に遭遇することを避けるため、多数のノードを使ったクラスターを作成するときには次のようなことを考慮してください。 * 次のようなクラウドリソースの増加をリクエストする * コンピューターインスタンス From 42917dcd5be5dd5bb255846aa65630324b27edec Mon Sep 17 00:00:00 2001 From: Atsushi Nukariya Date: Tue, 7 Dec 2021 06:26:35 +0900 Subject: [PATCH 15/68] Update content/ja/docs/setup/best-practices/cluster-large.md Co-authored-by: nasa9084 --- content/ja/docs/setup/best-practices/cluster-large.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/ja/docs/setup/best-practices/cluster-large.md b/content/ja/docs/setup/best-practices/cluster-large.md index e1c545bd22..4f99e1b551 100644 --- a/content/ja/docs/setup/best-practices/cluster-large.md +++ b/content/ja/docs/setup/best-practices/cluster-large.md @@ -85,7 +85,7 @@ Kubernetesの[リソース制限](/ja/docs/concepts/configuration/manage-resourc * いくつかのアドオンは垂直方向にスケールします - クラスターに1つのレプリカ、もしくは故障ゾーン全体にサービングされるものがあります。このようなアドオンでは、クラスターをスケールアウトしたときにリクエストと制限を増やす必要があります。 * 数多くのアドオンは、水平方向にスケールします - より多くのPod数を動作させることで性能を向上できます - ただし、とても大きなクラスターではCPUやメモリの制限も少し引き上げる必要があるかもしれません。VerticalPodAutoscalerは、提案されたリクエストや制限の数値を提供する `_recommender_` モードで動作可能です。 -* いくつかのアドオンは {< glossary_tooltip text="DaemonSet" term_id="daemonset" >}} によって制御され、1ノードに1つ複製される形で動作します: 例えばノードレベルのログアグリゲーターです。水平方向にスケールするアドオンの場合と同様に、CPUやメモリ制限を少し引き上げる必要があるかもしれません。 +* いくつかのアドオンは{{< glossary_tooltip text="DaemonSet" term_id="daemonset" >}}によって制御され、1ノードに1つ複製される形で動作します: 例えばノードレベルのログアグリゲーターです。水平方向にスケールするアドオンの場合と同様に、CPUやメモリ制限を少し引き上げる必要があるかもしれません。 ## {{% heading "whatsnext" %}} From 1b605ea7334652d3ffa18750325d809b91dd01b6 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Sat, 11 Dec 2021 17:13:37 +0800 Subject: [PATCH 16/68] [zh] Translate client-authentication API reference --- .../config-api/client-authentication.v1.md | 280 ++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 content/zh/docs/reference/config-api/client-authentication.v1.md diff --git a/content/zh/docs/reference/config-api/client-authentication.v1.md b/content/zh/docs/reference/config-api/client-authentication.v1.md new file mode 100644 index 0000000000..e3b919b9c4 --- /dev/null +++ b/content/zh/docs/reference/config-api/client-authentication.v1.md @@ -0,0 +1,280 @@ +--- +title: 客户端身份认证(Client Authentication) (v1) +content_type: tool-reference +package: client.authentication.k8s.io/v1 +auto_generated: true +--- + + + + +## 资源类型 {#resource-types} + +- [ExecCredential](#client-authentication-k8s-io-v1-ExecCredential) + +## `ExecCredential` {#client-authentication-k8s-io-v1-ExecCredential} + + +ExecCredential 由基于 exec 的插件使用,与 HTTP 传输组件沟通凭据信息。 + + + + + + + + + + + + + + + + +
字段描述
apiVersion
string
client.authentication.k8s.io/v1
kind
string
ExecCredential
spec [必需]
+ExecCredentialSpec +
+ + 字段 spec 包含由 HTTP 传输组件传递给插件的信息。 +
status
+ExecCredentialStatus +
+ + 字段 status 由插件填充,包含传输组件与 API 服务器连接时需要提供的凭据。 +
+ +## `Cluster` {#client-authentication-k8s-io-v1-Cluster} + + +**出现在:** + +- [ExecCredentialSpec](#client-authentication-k8s-io-v1-ExecCredentialSpec) + + +Cluster 中包含允许 exec 插件与 Kubernetes 集群进行通信身份认证时所需 +的信息。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
字段描述
server [必需]
+string +
+ + 字段 server 是 Kubernetes 集群的地址(https://hostname:port)。 +
tls-server-name
+string +
+ + tls-server-name 是用来提供给服务器用作 SNI 解析的,客户端以此检查服务器的证书。 + 如此字段为空,则使用链接服务器时使用的主机名。 +
insecure-skip-tls-verify
+bool +
+ + 设置此字段之后,会令客户端跳过对服务器端证书的合法性检查。 + 这会使得你的 HTTPS 链接不再安全。 +
certificate-authority-data
+[]byte +
+ + 此字段包含 PEM 编码的证书机构(CA)证书。 + 如果为空,则使用系统的根证书。 +
proxy-url
+string +
+ + 此字段用来设置向集群发送所有请求时要使用的代理服务器。 +
config
+k8s.io/apimachinery/pkg/runtime.RawExtension +
+ +

此字段包含一些额外的、特定于 exec 插件和所连接的集群的数据,

+

此字段来自于 clientcmd 集群对象的 extensions[client.authentication.k8s.io/exec] + 字段:

+
+clusters:
+- name: my-cluster
+  cluster:
+    ...
+    extensions:
+    - name: client.authentication.k8s.io/exec  # 针对每个集群 exec 配置所预留的扩展名称
+      extension:
+        audience: 06e3fbd18de8  # 任意配置信息
+
+ + +

在某些环境中,用户配置可能对很多集群而言都完全一样(即调用同一个 exec 插件), + 只是针对不同集群会有一些细节上的差异,例如 audience。 + 此字段使得特定于集群的配置可以直接使用集群信息来设置。 + 不建议使用此字段来保存 Secret 数据,因为 exec 插件的主要优势之一是不需要在 + kubeconfig 中保存 Secret 数据。 +

+ +## `ExecCredentialSpec` {#client-authentication-k8s-io-v1-ExecCredentialSpec} + + +**出现在:** + +- [ExecCredential](#client-authentication-k8s-io-v1-ExecCredential) + + +ExecCredentialSpec 保存传输组件所提供的特定于请求和运行时的信息。 + + + + + + + + + + + + + +
字段描述
cluster
+Cluster +
+ + 此字段中包含的信息使得 exec 插件能够与要访问的 Kubernetes 集群通信。 + 注意,cluster 字段只有在 exec 驱动的配置中 provideClusterInfo + (即:ExecConfig.ProvideClusterInfo)被设置为 true 时才不能为空。 +
interactive [必需]
+bool +
+ + 此字段用来标明标准输出信息是否已传递给 exec 插件。 +
+ +## `ExecCredentialStatus` {#client-authentication-k8s-io-v1-ExecCredentialStatus} + + + +- [ExecCredential](#client-authentication-k8s-io-v1-ExecCredential) + + +

ExecCredentialStatus 中包含传输组件要使用的凭据。

+

字段 token 和 clientKeyData 都是敏感字段。此数据只能在 +客户端与 exec 插件进程之间使用内存来传递。exec 插件本身至少 +应通过文件访问许可来实施保护。

》 + + + + + + + + + + + + + + + + + + + + +
字段描述
expirationTimestamp
+meta/v1.Time +
+ + 给出所提供的凭据到期的时间。 +
token [必需]
+string +
+ + 客户端用做请求身份认证的持有者令牌。 +
clientCertificateData [必需]
+string +
+ + PEM 编码的客户端 TLS 证书(如果有临时证书,也会包含)。 +
clientKeyData [必需]
+string +
+ + 与上述证书对应的、PEM 编码的私钥。 +
+ From fe1c3e8c534f1698e2a5e6882e1399cedcd3ee4b Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Sat, 11 Dec 2021 16:38:46 +0800 Subject: [PATCH 17/68] [zh] Translate WebhookAdmission API --- .../apiserver-webhookadmission.v1.md | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/content/zh/docs/reference/config-api/apiserver-webhookadmission.v1.md b/content/zh/docs/reference/config-api/apiserver-webhookadmission.v1.md index fb45ca7b1a..e577e497c6 100644 --- a/content/zh/docs/reference/config-api/apiserver-webhookadmission.v1.md +++ b/content/zh/docs/reference/config-api/apiserver-webhookadmission.v1.md @@ -1,46 +1,52 @@ --- -title: WebhookAdmission Configuration (v1) +title: WebhookAdmission 配置 (v1) content_type: tool-reference package: apiserver.config.k8s.io/v1 auto_generated: true --- + + + + +此 API 的版本是 v1。 +## 资源类型 {#resource-types} - [WebhookAdmission](#apiserver-config-k8s-io-v1-WebhookAdmission) - - - ## `WebhookAdmission` {#apiserver-config-k8s-io-v1-WebhookAdmission} - - - - + +WebhookAdmission 为 Webhook 准入控制器提供配置信息。 - + - - - + + 字段 kubeConfigFile 包含指向 kubeconfig 文件的路径。 + -
FieldDescription
字段描述
apiVersion
string
apiserver.config.k8s.io/v1
kind
string
WebhookAdmission
kubeConfigFile [Required]
+
kubeConfigFile [必需]
string
- KubeConfigFile is the path to the kubeconfig file.
- - + From 26b54b06fb3f03767b283d1a6edddb74c3507307 Mon Sep 17 00:00:00 2001 From: Qiming Teng Date: Sat, 11 Dec 2021 16:33:34 +0800 Subject: [PATCH 18/68] [zh] Translate audit API reference --- .../config-api/apiserver-audit.v1.md | 572 ++++++++++-------- 1 file changed, 315 insertions(+), 257 deletions(-) diff --git a/content/zh/docs/reference/config-api/apiserver-audit.v1.md b/content/zh/docs/reference/config-api/apiserver-audit.v1.md index c2e4a37704..245096e999 100644 --- a/content/zh/docs/reference/config-api/apiserver-audit.v1.md +++ b/content/zh/docs/reference/config-api/apiserver-audit.v1.md @@ -1,145 +1,171 @@ --- -title: kube-apiserver Audit Configuration (v1) +title: kube-apiserver Audit 配置 (v1) content_type: tool-reference package: audit.k8s.io/v1 auto_generated: true --- + + +## 资源类型 {#resource-types} - [Event](#audit-k8s-io-v1-Event) - [EventList](#audit-k8s-io-v1-EventList) - [Policy](#audit-k8s-io-v1-Policy) - [PolicyList](#audit-k8s-io-v1-PolicyList) - - - ## `Event` {#audit-k8s-io-v1-Event} - - - + +**出现在:** - [EventList](#audit-k8s-io-v1-EventList) - + +Event 结构包含可出现在 API 审计日志中的所有信息。 - + - - - - + + 生成事件所对应的审计级别。 + - - + + 为每个请求所生成的唯一审计 ID。 + - - + + 生成此事件时请求的处理阶段。 + - - + + requestURI 是客户端发送到服务器端的请求 URI。 + - + + verb 是与请求对应的 Kubernetes 动词。对于非资源请求,此字段为 HTTP 方法的小写形式。 + - - + + 关于认证用户的信息。 + - - + + + 关于所伪装(impersonated)的用户的信息。 + - - + + + 发起请求和中间代理的源 IP 地址。 + - - + + + + userAgent 中记录客户端所报告的用户代理(User Agent)字符串。 + 注意 userAgent 信息是由客户端提供的,一定不要信任。 + - - + + + 此请求所指向的对象引用。对于 List 类型的请求或者非资源请求,此字段可忽略。 + - - + + + 响应的状态,当 responseObject 不是 Status 类型时被赋值。 + 对于成功的请求,此字段仅包含 code 和 statusSuccess。 + 对于非 Status 类型的错误响应,此字段会被自动赋值为出错信息。 + - - + @@ -147,470 +173,502 @@ Omitted for non-resource requests. Only logged at Request Level and higher.k8s.io/apimachinery/pkg/runtime.Unknown - - + + + 请求到达 API 服务器时的时间。 + - - + + + 请求到达当前审计阶段时的时间。 + - - + + + annotations 是一个无结构的键-值映射,其中保存的是一个审计事件。 + 该事件可以由请求处理链路上的插件来设置,包括身份认证插件、鉴权插件以及 + 准入控制插件等。 + 注意这些注解是针对审计事件本身的,与所提交的对象中的 metadata.annotations + 之间不存在对应关系。 + 映射中的键名应该唯一性地标识生成该事件的组件,从而避免名字上的冲突 + (例如 podsecuritypolicy.admission.k8s.io/policy)。 + 映射中的键值应该比较简洁。 + 当审计级别为 Metadata 时会包含 annotations 字段。 + - -
FieldDescription
字段描述
apiVersion
string
audit.k8s.io/v1
kind
string
Event
level [Required]
+
level [必需]
Level
- AuditLevel at which event was generated
auditID [Required]
+
auditID [必需]
k8s.io/apimachinery/pkg/types.UID
- Unique audit ID, generated for each request.
stage [Required]
+
stage [必需]
Stage
- Stage of the request handling when this event instance was generated.
requestURI [Required]
+
requestURI [必需]
string
- RequestURI is the request URI as sent by the client to a server.
verb [Required]
+
verb [必需]
string
- Verb is the kubernetes verb associated with the request. -For non-resource requests, this is the lower-cased HTTP method.
user [Required]
-authentication/v1.UserInfo +
user [必需]
+authentication/v1.UserInfo
- Authenticated user information.
impersonatedUser
-authentication/v1.UserInfo +authentication/v1.UserInfo
- Impersonated user information.
sourceIPs
[]string
- Source IPs, from where the request originated and intermediate proxies.
userAgent
string
- UserAgent records the user agent string reported by the client. -Note that the UserAgent is provided by the client, and must not be trusted.
objectRef
ObjectReference
- Object reference this request is targeted at. -Does not apply for List-type requests, or non-resource requests.
responseStatus
-meta/v1.Status +meta/v1.Status
- The response status, populated even when the ResponseObject is not a Status type. -For successful responses, this will only include the Code and StatusSuccess. -For non-status type error responses, this will be auto-populated with the error Message.
requestObject
k8s.io/apimachinery/pkg/runtime.Unknown
- API object from the request, in JSON format. The RequestObject is recorded as-is in the request + + 来自请求的 API 对象,以 JSON 格式呈现。requestObject 在请求中按原样记录 + (可能会采用 JSON 重新编码),之后会进入版本转换、默认值填充、准入控制以及 + 配置信息合并等阶段。此对象为外部版本化的对象类型,甚至其自身可能并不是一个 + 合法的对象。对于非资源请求,此字段被忽略。 + 只有当审计级别为 Request 或更高的时候才会记录。 +
- API object returned in the response, in JSON. The ResponseObject is recorded after conversion + + 响应中包含的 API 对象,以 JSON 格式呈现。requestObject 是在被转换为外部类型 + 并序列化为 JSON 格式之后才被记录的。 + 对于非资源请求,此字段会被忽略。 + 只有审计级别为 Response 时才会记录。 +
requestReceivedTimestamp
-meta/v1.MicroTime +meta/v1.MicroTime
- Time the request reached the apiserver.
stageTimestamp
-meta/v1.MicroTime +meta/v1.MicroTime
- Time the request reached current audit stage.
annotations
map[string]string
- Annotations is an unstructured key value map stored with an audit event that may be set by -plugins invoked in the request serving chain, including authentication, authorization and -admission plugins. Note that these annotations are for the audit event, and do not correspond -to the metadata.annotations of the submitted object. Keys should uniquely identify the informing -component to avoid name collisions (e.g. podsecuritypolicy.admission.k8s.io/policy). Values -should be short. Annotations are included in the Metadata level.
- - ## `EventList` {#audit-k8s-io-v1-EventList} - - - - + +EventList 是审计事件(Event)的列表。 - + - + - - - - - - - -
FieldDescription
字段描述
apiVersion
string
audit.k8s.io/v1
kind
string
EventList
metadata
-meta/v1.ListMeta +meta/v1.ListMeta
- No description provided. + 列表结构元数据
items [Required]
+ +
items [必需]
[]Event
- No description provided. + 事件对象列表
- - ## `Policy` {#audit-k8s-io-v1-Policy} - - - + +**出现在:** - [PolicyList](#audit-k8s-io-v1-PolicyList) - + +Policy 定义的是审计日志的配置以及不同类型请求的日志记录规则。 - + - + - - - + + 包含 metadata 字段是为了便于与 API 基础设施之间实现互操作。 + 参考 Kubernetes API 文档了解 metadata 字段的详细信息。 + - - - - - + + + 字段 omitStages 是一个阶段(Stage)列表,其中包含无须生成事件的阶段。 + 注意这一选项也可以通过每条规则来设置。 + 审计组件最终会忽略出现在 omitStages 中阶段,也会忽略规则中的阶段。 + - -
FieldDescription
字段描述
apiVersion
string
audit.k8s.io/v1
kind
string
Policy
metadata
-meta/v1.ObjectMeta +meta/v1.ObjectMeta
- ObjectMeta is included for interoperability with API infrastructure.Refer to the Kubernetes API documentation for the fields of the metadata field.
rules [Required]
+ +
rules [必需]
[]PolicyRule
- Rules specify the audit Level a request should be recorded at. + + 字段 rules 设置请求要被记录的审计级别(level)。 + 每个请求可能会与多条规则相匹配;发生这种状况时遵从第一条匹配规则。 + 默认的审计级别是 None,不过可以在列表的末尾使用一条全抓(catch-all)规则 + 重载其设置。 + 列表中的规则(PolicyRule)是严格有序的。 +
omitStages
[]Stage
- OmitStages is a list of stages for which no events are created. Note that this can also -be specified per rule in which case the union of both are omitted.
- - ## `PolicyList` {#audit-k8s-io-v1-PolicyList} - - - - + +PolicyList 是由审计策略(Policy)组成的列表。 - + - - - - - - - -
FieldDescription
字段描述
apiVersion
string
audit.k8s.io/v1
kind
string
PolicyList
metadata
-meta/v1.ListMeta +meta/v1.ListMeta
- No description provided. + 列表结构元数据。
items [Required]
+ +
items [必需]
[]Policy
- No description provided. + 策略(Policy)对象列表。
- - ## `GroupResources` {#audit-k8s-io-v1-GroupResources} - - - + +**出现在:** - [PolicyRule](#audit-k8s-io-v1-PolicyRule) - + +GroupResources 代表的是某 API 组中的资源类别。 - + - - + + 字段 group 给出包含资源的 API 组的名称。 + 空字符串代表 core API 组。 + - - + - - + + + 字段 resourceNames 是策略将匹配的资源实例名称列表。 + 使用此字段时,resources 必须指定。 + 空的 resourceNames 列表意味着资源的所有实例都会匹配到此策略。 + - -
FieldDescription
字段描述
group
string
- Group is the name of the API group that contains the resources. -The empty string represents the core API group.
resources
[]string
- Resources is a list of resources this rule applies to. + + 字段 resources 是此规则所适用的资源的列表。
+ 例如:
+ 'pods' 匹配 Pods;
+ 'pods/log' 匹配 Pods 的 log 子资源;
+ '∗' 匹配所有资源及其子资源;
+ 'pods/∗' 匹配 Pods 的所有子资源;
+ '∗/scale' 匹配所有的 scale 子资源。

-If wildcard is present, the validation rule will ensure resources do not -overlap with each other. + + 如果存在通配符,则合法性检查逻辑会确保 resources 中的条目不会彼此重叠。
+ 空的列表意味着规则适用于该 API 组中的所有资源及其子资源。 +
resourceNames
[]string
- ResourceNames is a list of resource instance names that the policy matches. -Using this field requires Resources to be specified. -An empty list implies that every instance of the resource is matched.
- - ## `Level` {#audit-k8s-io-v1-Level} - + + +string 数据类型的别名。 - + +**出现在:** - [Event](#audit-k8s-io-v1-Event) - - [PolicyRule](#audit-k8s-io-v1-PolicyRule) - + +Level 定义的是审计过程中在日志内记录的信息量。 ## `ObjectReference` {#audit-k8s-io-v1-ObjectReference} - - - + +**出现在:** - [Event](#audit-k8s-io-v1-Event) - + +ObjectReference 包含的是用来检查或修改所引用对象时将需要的全部信息。 - + - - - - + - - + - - + - - + + + 字段 apiGroup 给出包含所引用对象的 API 组的名称。 + 空字符串代表 core API 组。 + - - + + + 字段 apiVersion 是包含所引用对象的 API 组的版本。 + - - + - - + - -
FieldDescription
字段描述
resource
string
- No description provided. + 资源类别。
namespace
string
- No description provided. + 资源对象所在名字空间。
name
string
- No description provided. + 资源对象名称。
uid
k8s.io/apimachinery/pkg/types.UID
- No description provided. + 资源对象的唯一标识(UID)。
apiGroup
string
- APIGroup is the name of the API group that contains the referred object. -The empty string represents the core API group.
apiVersion
string
- APIVersion is the version of the API group that contains the referred object.
resourceVersion
string
- No description provided. + 资源对象自身的版本值。
subresource
string
- No description provided. + 子资源的类别。
- - ## `PolicyRule` {#audit-k8s-io-v1-PolicyRule} - - - + +**出现在:** - [Policy](#audit-k8s-io-v1-Policy) - + +PolicyRule 包含一个映射,基于元数据将请求映射到某审计级别。 +请求必须与每个字段所定义的规则都匹配(即 rules 的交集)才被视为匹配。 - + - - - + + 与此规则匹配的请求所对应的日志记录级别(Level)。 + - - + + + 根据身份认证所确定的用户名的列表,给出此规则所适用的用户。 + 空列表意味着适用于所有用户。 + - - + + + 此规则所适用的用户组的列表。如果用户是所列用户组中任一用户组的成员,则视为匹配。 + 空列表意味着适用于所有用户组。 + - - + + + 此规则所适用的动词(verb)列表。 + 空列表意味着适用于所有动词。 + - - + + + 此规则所适用的资源类别列表。 + 空列表意味着适用于 API 组中的所有资源类别。 + - - + + + + 此规则所适用的名字空间列表。 + 空字符串("")意味着适用于非名字空间作用域的资源。 + 空列表意味着适用于所有名字空间。 - - + + + 字段 nonResourceURLs 给出一组需要被审计的 URL 路径。 + 允许使用 ∗,但只能作为路径中最后一个完整分段。
+ 例如:
+ "/metrics" - 记录对 API 服务器度量值(metrics)的所有请求;
+ "/healthz∗" - 记录所有健康检查请求。 + - - + + + 字段 omitStages 是一个阶段(Stage)列表,针对所列的阶段服务器不会生成审计事件。 + 注意这一选项也可以在策略(Policy)级别指定。服务器审计组件会忽略 + omitStages 中给出的阶段,也会忽略策略中给出的阶段。 + 空列表意味着不对阶段作任何限制。 + - -
FieldDescription
字段描述
level [Required]
+
level [必需]
Level
- The Level that requests matching this rule are recorded at.
users
[]string
- The users (by authenticated user name) this rule applies to. -An empty list implies every user.
userGroups
[]string
- The user groups this rule applies to. A user is considered matching -if it is a member of any of the UserGroups. -An empty list implies every user group.
verbs
[]string
- The verbs that match this rule. -An empty list implies every verb.
resources
[]GroupResources
- Resources that this rule matches. An empty list implies all kinds in all API groups.
namespaces
[]string
- Namespaces that this rule matches. -The empty string "" matches non-namespaced resources. -An empty list implies every namespace.
nonResourceURLs
[]string
- NonResourceURLs is a set of URL paths that should be audited. -∗s are allowed, but only as the full, final step in the path. -Examples: - "/metrics" - Log requests for apiserver metrics - "/healthz∗" - Log all health checks
omitStages
[]Stage
- OmitStages is a list of stages for which no events are created. Note that this can also -be specified policy wide in which case the union of both are omitted. -An empty list means no restrictions will apply.
- - ## `Stage` {#audit-k8s-io-v1-Stage} - + + +string 数据类型的别名。 - + +**出现在:** - [Event](#audit-k8s-io-v1-Event) - - [Policy](#audit-k8s-io-v1-Policy) - - [PolicyRule](#audit-k8s-io-v1-PolicyRule) - + +Stage 定义在请求处理过程中可以生成审计事件的阶段。 + From 5c18ac1880b3beea1e379c645e8ddac302159da7 Mon Sep 17 00:00:00 2001 From: gamba47 Date: Fri, 17 Dec 2021 23:23:20 -0300 Subject: [PATCH 19/68] commit inicial con archivo base --- .../concepts/security/controlling-access.md | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 content/es/docs/concepts/security/controlling-access.md diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md new file mode 100644 index 0000000000..1a0c93d8cf --- /dev/null +++ b/content/es/docs/concepts/security/controlling-access.md @@ -0,0 +1,184 @@ +--- +reviewers: +- erictune +- lavalamp +title: Controlling Access to the Kubernetes API +content_type: concept +--- + + +This page provides an overview of controlling access to the Kubernetes API. + + + +Users access the [Kubernetes API](/docs/concepts/overview/kubernetes-api/) using `kubectl`, +client libraries, or by making REST requests. Both human users and +[Kubernetes service accounts](/docs/tasks/configure-pod-container/configure-service-account/) can be +authorized for API access. +When a request reaches the API, it goes through several stages, illustrated in the +following diagram: + +![Diagram of request handling steps for Kubernetes API request](/images/docs/admin/access-control-overview.svg) + +## Transport security + +In a typical Kubernetes cluster, the API serves on port 443, protected by TLS. +The API server presents a certificate. This certificate may be signed using +a private certificate authority (CA), or based on a public key infrastructure linked +to a generally recognized CA. + +If your cluster uses a private certificate authority, you need a copy of that CA +certificate configured into your `~/.kube/config` on the client, so that you can +trust the connection and be confident it was not intercepted. + +Your client can present a TLS client certificate at this stage. + +## Authentication + +Once TLS is established, the HTTP request moves to the Authentication step. +This is shown as step **1** in the diagram. +The cluster creation script or cluster admin configures the API server to run +one or more Authenticator modules. +Authenticators are described in more detail in +[Authentication](/docs/reference/access-authn-authz/authentication/). + +The input to the authentication step is the entire HTTP request; however, it typically +examines the headers and/or client certificate. + +Authentication modules include client certificates, password, and plain tokens, +bootstrap tokens, and JSON Web Tokens (used for service accounts). + +Multiple authentication modules can be specified, in which case each one is tried in sequence, +until one of them succeeds. + +If the request cannot be authenticated, it is rejected with HTTP status code 401. +Otherwise, the user is authenticated as a specific `username`, and the user name +is available to subsequent steps to use in their decisions. Some authenticators +also provide the group memberships of the user, while other authenticators +do not. + +While Kubernetes uses usernames for access control decisions and in request logging, +it does not have a `User` object nor does it store usernames or other information about +users in its API. + +## Authorization + +After the request is authenticated as coming from a specific user, the request must be authorized. This is shown as step **2** in the diagram. + +A request must include the username of the requester, the requested action, and the object affected by the action. The request is authorized if an existing policy declares that the user has permissions to complete the requested action. + +For example, if Bob has the policy below, then he can read pods only in the namespace `projectCaribou`: + +```json +{ + "apiVersion": "abac.authorization.kubernetes.io/v1beta1", + "kind": "Policy", + "spec": { + "user": "bob", + "namespace": "projectCaribou", + "resource": "pods", + "readonly": true + } +} +``` +If Bob makes the following request, the request is authorized because he is allowed to read objects in the `projectCaribou` namespace: + +```json +{ + "apiVersion": "authorization.k8s.io/v1beta1", + "kind": "SubjectAccessReview", + "spec": { + "resourceAttributes": { + "namespace": "projectCaribou", + "verb": "get", + "group": "unicorn.example.org", + "resource": "pods" + } + } +} +``` +If Bob makes a request to write (`create` or `update`) to the objects in the `projectCaribou` namespace, his authorization is denied. If Bob makes a request to read (`get`) objects in a different namespace such as `projectFish`, then his authorization is denied. + +Kubernetes authorization requires that you use common REST attributes to interact with existing organization-wide or cloud-provider-wide access control systems. It is important to use REST formatting because these control systems might interact with other APIs besides the Kubernetes API. + +Kubernetes supports multiple authorization modules, such as ABAC mode, RBAC Mode, and Webhook mode. When an administrator creates a cluster, they configure the authorization modules that should be used in the API server. If more than one authorization modules are configured, Kubernetes checks each module, and if any module authorizes the request, then the request can proceed. If all of the modules deny the request, then the request is denied (HTTP status code 403). + +To learn more about Kubernetes authorization, including details about creating policies using the supported authorization modules, see [Authorization](/docs/reference/access-authn-authz/authorization/). + + +## Admission control + +Admission Control modules are software modules that can modify or reject requests. +In addition to the attributes available to Authorization modules, Admission +Control modules can access the contents of the object that is being created or modified. + +Admission controllers act on requests that create, modify, delete, or connect to (proxy) an object. +Admission controllers do not act on requests that merely read objects. +When multiple admission controllers are configured, they are called in order. + +This is shown as step **3** in the diagram. + +Unlike Authentication and Authorization modules, if any admission controller module +rejects, then the request is immediately rejected. + +In addition to rejecting objects, admission controllers can also set complex defaults for +fields. + +The available Admission Control modules are described in [Admission Controllers](/docs/reference/access-authn-authz/admission-controllers/). + +Once a request passes all admission controllers, it is validated using the validation routines +for the corresponding API object, and then written to the object store (shown as step **4**). + + +## API server ports and IPs + +The previous discussion applies to requests sent to the secure port of the API server +(the typical case). The API server can actually serve on 2 ports: + +By default, the Kubernetes API server serves HTTP on 2 ports: + + 1. `localhost` port: + + - is intended for testing and bootstrap, and for other components of the master node + (scheduler, controller-manager) to talk to the API + - no TLS + - default is port 8080 + - default IP is localhost, change with `--insecure-bind-address` flag. + - request **bypasses** authentication and authorization modules. + - request handled by admission control module(s). + - protected by need to have host access + + 2. “Secure port”: + + - use whenever possible + - uses TLS. Set cert with `--tls-cert-file` and key with `--tls-private-key-file` flag. + - default is port 6443, change with `--secure-port` flag. + - default IP is first non-localhost network interface, change with `--bind-address` flag. + - request handled by authentication and authorization modules. + - request handled by admission control module(s). + - authentication and authorization modules run. + +## {{% heading "whatsnext" %}} + +Read more documentation on authentication, authorization and API access control: + +- [Authenticating](/docs/reference/access-authn-authz/authentication/) + - [Authenticating with Bootstrap Tokens](/docs/reference/access-authn-authz/bootstrap-tokens/) +- [Admission Controllers](/docs/reference/access-authn-authz/admission-controllers/) + - [Dynamic Admission Control](/docs/reference/access-authn-authz/extensible-admission-controllers/) +- [Authorization](/docs/reference/access-authn-authz/authorization/) + - [Role Based Access Control](/docs/reference/access-authn-authz/rbac/) + - [Attribute Based Access Control](/docs/reference/access-authn-authz/abac/) + - [Node Authorization](/docs/reference/access-authn-authz/node/) + - [Webhook Authorization](/docs/reference/access-authn-authz/webhook/) +- [Certificate Signing Requests](/docs/reference/access-authn-authz/certificate-signing-requests/) + - including [CSR approval](/docs/reference/access-authn-authz/certificate-signing-requests/#approval-rejection) + and [certificate signing](/docs/reference/access-authn-authz/certificate-signing-requests/#signing) +- Service accounts + - [Developer guide](/docs/tasks/configure-pod-container/configure-service-account/) + - [Administration](/docs/reference/access-authn-authz/service-accounts-admin/) + +You can learn about: +- how Pods can use + [Secrets](/docs/concepts/configuration/secret/#service-accounts-automatically-create-and-attach-secrets-with-api-credentials) + to obtain API credentials. From dcf7fa9bb089d3c089df2e49e0ce67d10bb649e8 Mon Sep 17 00:00:00 2001 From: gamba47 Date: Fri, 17 Dec 2021 23:23:58 -0300 Subject: [PATCH 20/68] terminando primer revision de documento --- .../concepts/security/controlling-access.md | 170 +++++++++--------- 1 file changed, 86 insertions(+), 84 deletions(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 1a0c93d8cf..01f4239eb4 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -1,73 +1,76 @@ --- reviewers: -- erictune -- lavalamp -title: Controlling Access to the Kubernetes API +- electrocucaracha +- raelga +title: Controlando el Acceso a la API de Kubernetes content_type: concept --- -This page provides an overview of controlling access to the Kubernetes API. +Esta pagina proporciona información sobre el como controlar el acceso a la API de Kubernetes. -Users access the [Kubernetes API](/docs/concepts/overview/kubernetes-api/) using `kubectl`, -client libraries, or by making REST requests. Both human users and -[Kubernetes service accounts](/docs/tasks/configure-pod-container/configure-service-account/) can be -authorized for API access. -When a request reaches the API, it goes through several stages, illustrated in the -following diagram: +Los usuarios acceden a la [API de Kubernetes](/docs/concepts/overview/kubernetes-api/) usando `kubectl`, +client libraries, o haciendo peticiones REST. Humanos y los +[Kubernetes service accounts](/docs/tasks/configure-pod-container/configure-service-account/) pueden ser +autorizados para acceder a la API. +Cuando una peticion llega a la API, pasa por varias etapas, estan ilustradas en el +siguiente diagrama: -![Diagram of request handling steps for Kubernetes API request](/images/docs/admin/access-control-overview.svg) +![Diagrama de pasos para una petición a la API de Kubernetes](/images/docs/admin/access-control-overview.svg) ## Transport security -In a typical Kubernetes cluster, the API serves on port 443, protected by TLS. -The API server presents a certificate. This certificate may be signed using -a private certificate authority (CA), or based on a public key infrastructure linked -to a generally recognized CA. +En un cluster típico de Kubernetes, la API sirve peticiones en el puerto 443, protegida por TLS. +El server API presenta un certificado. Este certificado puede ser firmando usando +un certificado de autoridad privada (CA) o basado en una llave publica relacionada +generalmente a un CA reconocido. -If your cluster uses a private certificate authority, you need a copy of that CA -certificate configured into your `~/.kube/config` on the client, so that you can -trust the connection and be confident it was not intercepted. +Si el cluster usa un certificado de autoridad privado, se necesita copiar este certificado +CA configurado dentro de su `~/.kube/config` en el cliente, entonces usted podrá +confiar en la conección y estar seguro que no será hackeada. -Your client can present a TLS client certificate at this stage. +Su cliente puede presentar un certificado TLS de cliente en esta etapa. -## Authentication +## Autenticación -Once TLS is established, the HTTP request moves to the Authentication step. -This is shown as step **1** in the diagram. -The cluster creation script or cluster admin configures the API server to run -one or more Authenticator modules. -Authenticators are described in more detail in +Una vez que se estableció el TLS, las peticiones HTTP avanzan a la etapa de autenticación. +Esto se muestra en el paso 1 del diagrama. +El script de creación del cluster o el administrador del cluster configurada el servidor API para ejecutar +uno o mas módulos de autenticación. +Los Autenticadores estan descriptos con más detalle en [Authentication](/docs/reference/access-authn-authz/authentication/). -The input to the authentication step is the entire HTTP request; however, it typically +```The input to the authentication step is the entire HTTP request; however, it typically examines the headers and/or client certificate. +``` +El ingreso al paso de autenticación es la petición HTTP completa, aun así, esta tipicamente +examina las cabeceras y/o el certificado del cliente. -Authentication modules include client certificates, password, and plain tokens, -bootstrap tokens, and JSON Web Tokens (used for service accounts). +Los modulos de autenticación incluyen certificado de cliente, contraseña, tokens planos, +tokens de inicio y JSON Web Tokens (usados para los service accounts). -Multiple authentication modules can be specified, in which case each one is tried in sequence, -until one of them succeeds. +Multiples modulos de autenticación puede ser especificados, en este caso cada uno es probado secuencialmente, +hasta que uno de ellos tiene éxito. -If the request cannot be authenticated, it is rejected with HTTP status code 401. -Otherwise, the user is authenticated as a specific `username`, and the user name -is available to subsequent steps to use in their decisions. Some authenticators -also provide the group memberships of the user, while other authenticators -do not. +Si la petición no puede ser autenticada, la misma es rechazada con un codigo de estado HTTP 401. +En otro caso, el usuario es validado con el `username` específico, y el nombre de usuario +esta disponible para los pasos siguientes. Algunos autenticadores +tambien proporcionan membresías de grupo al usuario, mientras que otros +no lo hacen. While Kubernetes uses usernames for access control decisions and in request logging, -it does not have a `User` object nor does it store usernames or other information about -users in its API. +este n otiene un objeto `User` ni tampoco guarda nombres de usaurio o otra información acerca +de ellos en su API. -## Authorization +## Autorización -After the request is authenticated as coming from a specific user, the request must be authorized. This is shown as step **2** in the diagram. +Despues de autenticar la petición como proveniente de un usuario específico, la petición debe ser autorizada. Esto se muestra en el paso 2 del diagrama. -A request must include the username of the requester, the requested action, and the object affected by the action. The request is authorized if an existing policy declares that the user has permissions to complete the requested action. +Una petición debe incluir el nombre de usuario solicitante, la acción solicitada y el objeto afectado por la acción. La petición es autorizada si hay una politica existente que declare que el usuario tiene permisos para la realizar la acción. -For example, if Bob has the policy below, then he can read pods only in the namespace `projectCaribou`: +Por ejemplo, si Bob tiene la siguiente politica, entonces el puede leer pods solamente en el namespace `projectCaribou`: ```json { @@ -81,7 +84,7 @@ For example, if Bob has the policy below, then he can read pods only in the name } } ``` -If Bob makes the following request, the request is authorized because he is allowed to read objects in the `projectCaribou` namespace: +Si Bob hace la siguiente petición, será aturizada porque él tiene permitido leer los objetos en el namespace `projectCaribou` : ```json { @@ -97,70 +100,69 @@ If Bob makes the following request, the request is authorized because he is allo } } ``` -If Bob makes a request to write (`create` or `update`) to the objects in the `projectCaribou` namespace, his authorization is denied. If Bob makes a request to read (`get`) objects in a different namespace such as `projectFish`, then his authorization is denied. +Si Bob en su petición intenta escribir (`create` o `update`) en los objetos del namespace `projectCaribou`. Si Bob hace una petición para leer (`get`) objetocs en otro namespace como `projectFish`, entonces la autorización será denegada. -Kubernetes authorization requires that you use common REST attributes to interact with existing organization-wide or cloud-provider-wide access control systems. It is important to use REST formatting because these control systems might interact with other APIs besides the Kubernetes API. +Las autorizaciones en Kubernetes requieren que se usen atributos REST comunes para interactuar con el existente sistema de control de toda la organización o del proveedor cloud. Es importante usar formatos REST porque esos sistemas de control pueden interactuar con otras APIs además de la API de Kubernetes. -Kubernetes supports multiple authorization modules, such as ABAC mode, RBAC Mode, and Webhook mode. When an administrator creates a cluster, they configure the authorization modules that should be used in the API server. If more than one authorization modules are configured, Kubernetes checks each module, and if any module authorizes the request, then the request can proceed. If all of the modules deny the request, then the request is denied (HTTP status code 403). +Kubernetes soporta multiples modulos de autorización, como el modo ABAC, el modo RBAC y el modo Webhook. Cuando un administrador crea un cluster, se realiza la configuración de los modulos de autorización que deben ser usados con la API del server. Si mas de uno modulo de autorización es configurado, Kubernetes verificada cada uon y si alguno de ellos autoriza la petición entonces la misma se ejecuta. Si todos los modules deniegan la petición, entonces la misma es denegada (Con un error HTTP con código 403). -To learn more about Kubernetes authorization, including details about creating policies using the supported authorization modules, see [Authorization](/docs/reference/access-authn-authz/authorization/). +Para leer más acerca de las autorizaciones en Kubernetes, incluyendo detalles acerca de crear politicas usando los modulos de autorización soportados, vea [Authorization](/docs/reference/access-authn-authz/authorization/). -## Admission control +## Control de Admisión -Admission Control modules are software modules that can modify or reject requests. -In addition to the attributes available to Authorization modules, Admission -Control modules can access the contents of the object that is being created or modified. +Los modulos de Control de Admisión son modulos de software que solo pueen modificar o rechazar peticiones. +Adicionalmente a los atributos disponibles en los modulos de Autorización, los modulos de +Control de Admisión pueden acceder al contenido del objeto que esta siendo creado o modificado. -Admission controllers act on requests that create, modify, delete, or connect to (proxy) an object. -Admission controllers do not act on requests that merely read objects. -When multiple admission controllers are configured, they are called in order. +Los Controles de Admisión actúan en las peticiones que crean, modifican, borran ó se conectan (proxy) a un objeto. +cuando multiples modulos de control de admisión son configurados, son llamados en orden. -This is shown as step **3** in the diagram. +Esto se muestra en el paso 3 del diagrama. -Unlike Authentication and Authorization modules, if any admission controller module -rejects, then the request is immediately rejected. +A diferencia de los modulos de Autorización y Autenticación, si uno de los modulos de control de admisión +rechaza la petición, entonces es inmediatamente rechazada. -In addition to rejecting objects, admission controllers can also set complex defaults for -fields. +Adicionalmente a rechazar objetos, los controles de admisión pueden tambien permite establecer +valores predeterminados complejos. -The available Admission Control modules are described in [Admission Controllers](/docs/reference/access-authn-authz/admission-controllers/). +Los modulos de Control de Admisión disponibles están descriptos en [Admission Controllers](/docs/reference/access-authn-authz/admission-controllers/). -Once a request passes all admission controllers, it is validated using the validation routines -for the corresponding API object, and then written to the object store (shown as step **4**). +Cuando una petición pasa todos los controles de admisión, esta es validada usando la rutinas de validación +para el objeto API correspondiente y luego es escrita en el objeto. -## API server ports and IPs +## Puertos e IPs del API server -The previous discussion applies to requests sent to the secure port of the API server -(the typical case). The API server can actually serve on 2 ports: +La discusión previa aplica a peticiones enviadas a un puerto seguro del servidor API +(el caso típico). El servidor API puede en realidad servir en 2 puertos: -By default, the Kubernetes API server serves HTTP on 2 ports: +Por defecto, la API de Kubernetes entrega HTTP en 2 puertos: - 1. `localhost` port: + 1. puerto `localhost`: - - is intended for testing and bootstrap, and for other components of the master node - (scheduler, controller-manager) to talk to the API - - no TLS - - default is port 8080 - - default IP is localhost, change with `--insecure-bind-address` flag. + - debe usarse para testeo e iniciar el sistema y para otros componentes del nodo maestro + (scheduler, controller-manager) para hablar con la API + - no se usa TLS + - el puerto predeterminado es el 8080 + - la IP por defecto es localhost, la puede cambiar con el flag `--insecure-bind-address`. - request **bypasses** authentication and authorization modules. - - request handled by admission control module(s). - - protected by need to have host access + - peticiones controladas por los modulos de control de admisión. + - protejidas por necesidad para tener acceso al host - 2. “Secure port”: + 2. “Puerto seguro”: - - use whenever possible - - uses TLS. Set cert with `--tls-cert-file` and key with `--tls-private-key-file` flag. - - default is port 6443, change with `--secure-port` flag. - - default IP is first non-localhost network interface, change with `--bind-address` flag. - - request handled by authentication and authorization modules. - - request handled by admission control module(s). + - usar siempre que sea posible + - usa TLS. Se configura el certificado con el flag `--tls-cert-file` y la llave con `--tls-private-key-file`. + - el puerto predeterminado es 6443, se cambia con el flag `--secure-port`. + - la IP por defecto es la primer interface que no es la localhost. se cambia con el flag `--bind-address`. + - peticiones controladas por los modulos de autenticación y autorización. + - peticiones controladas por los modulos de control de admisión. - authentication and authorization modules run. ## {{% heading "whatsnext" %}} -Read more documentation on authentication, authorization and API access control: +Lea mas documentación sobre autenticación, autorización y el contro de acceso a la API: - [Authenticating](/docs/reference/access-authn-authz/authentication/) - [Authenticating with Bootstrap Tokens](/docs/reference/access-authn-authz/bootstrap-tokens/) @@ -178,7 +180,7 @@ Read more documentation on authentication, authorization and API access control: - [Developer guide](/docs/tasks/configure-pod-container/configure-service-account/) - [Administration](/docs/reference/access-authn-authz/service-accounts-admin/) -You can learn about: -- how Pods can use +Tambien puede aprender sobre: +- como los pods pueden usar [Secrets](/docs/concepts/configuration/secret/#service-accounts-automatically-create-and-attach-secrets-with-api-credentials) - to obtain API credentials. + para obtener credenciales para la API. From 7f1f16746f0a1139b38d1b18fcb45361e26844ec Mon Sep 17 00:00:00 2001 From: Tim Bannister Date: Tue, 21 Dec 2021 11:39:10 +0000 Subject: [PATCH 21/68] Include screenshot showing Netlify preview --- .../en/docs/contribute/review/reviewing-prs.md | 6 +++++- .../docs/github_netlify_deploy_preview.png | Bin 0 -> 122197 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 static/images/docs/github_netlify_deploy_preview.png diff --git a/content/en/docs/contribute/review/reviewing-prs.md b/content/en/docs/contribute/review/reviewing-prs.md index 9240d98f3b..77bdc85806 100644 --- a/content/en/docs/contribute/review/reviewing-prs.md +++ b/content/en/docs/contribute/review/reviewing-prs.md @@ -85,7 +85,11 @@ class third,fourth white - Reading the PR description to understand the changes made, and read any linked issues - Reading any comments by other reviewers - Clicking the **Files changed** tab to see the files and lines changed - - Previewing the changes in the Netlify preview build by scrolling to the PR's build check section at the bottom of the **Conversation** tab and clicking the **deploy/netlify** line's **Details** link. + - Previewing the changes in the Netlify preview build by scrolling to the PR's build check section at the bottom of the **Conversation** tab. + Here's a screenshot (this shows GitHub's desktop site; if you're reviewing + on a tablet or smartphone device, the GitHub web UI is slightly different): + {{< figure src="/images/docs/github_netlify_deploy_preview.png" alt="GitHub pull request details including link to Netlify preview" >}} + To open the preview, click on the **Details** link of the **deploy/netlify** line in the list of checks. 4. Go to the **Files changed** tab to start your review. 1. Click on the `+` symbol beside the line you want to comment on. diff --git a/static/images/docs/github_netlify_deploy_preview.png b/static/images/docs/github_netlify_deploy_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2313644e32fa0a1bd299f33bb81f8c24603872 GIT binary patch literal 122197 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�& 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%0Aqk`vGpcxnn9G zDdF9;BTK1WQgGw?{yS=6_S>#_C$qy5wYAQl+Z(qy1dyxIRzhcoxyb#TrS4?{kyl&M z{c1(7*P95fc5kZpZ8CzHJGyz;H~!-T_EWh8Dqj|y|f^O?PW{Tj=r9z*UMLX+t|PlHE213PVdD&ci{%WQ)jva&|H zhk(ND*1I@&cO3ZYk-IIyv!7&=I4fJ$8kML8C_KLba07@14!AcMJN0yl{gJyDOtiMo zLWOYA$s+E=^K7z{oNFQ3en(X$;dw8tlvK~mtb2?CyI!LoOfxfiA~oBM3J zaFWNGtT}>!fUZnKxq+I`-#Z$kxhSmLd-1`{E1v(B38Q2(D}E8XW_fh6m|Ti;{-*Fz z*T;CCUxo)|e}_{ zCw@arM6q4n5!wViN(|Z)`l8C4HW&Qm@X~eZR`ttstmB@$JG4a)6*G_ zS~sT3iIc^+-ug1f15e?f0Lv~B5oMFA_-4{l8t+CS*0%bguwXhm zIzn(Q=iNzZaAmxj$`}FUG5+x?^L$vLFvuk4pUo78oPUqX9Usot&XtaSZFp5=Z-pHi zk|a^9v2treszmA0IH<3>7nmrvA?!`%h7WD zmn03Fet^e{1h$Q99{~s05EURBXlKVACsDZvFy_{>)WcvVUmX+1-uH%Gy^S z+oPyT%C7!e#TlPA@KUTUCzht-8db$%pcmmARv*OzO=v*QpdWxdS}$~zsL1XU{^tu~ z+V?=%1%)+R$Fk1Z{-f=;`p&$_#-oxm{$PB351w<)@Nh*SD^OS>W0XsN#_%%8mzJu_ z>OOtnk?S&IhnNhHl=@p-ObncoL*(sF{BOw2+#f=C!vSyU8V90y@kF=yLhjI?Ov3xL zqB>>{Jj;7|_)2cbe8=eMtuH^rj$C)6D$k(%_5kU2hd;`dl9gWT4UvdP%|9=p0eGY2 z%^JHr^2|RtOt({*; zXum}<1UL~XaaV1*&h}EPPHTvQ;;>qoBg4tj&TF`}%ZnU)(M@#okgY_ALd*)%)SLchiHX8BC&mg|8*S~Mhli6gFZRPz0#;>zNMfOaO~ z`AKY2s5IV>JvlgYps7s`s-9Aybl;SH8h&qy!HA^fusugDNwH7e?VX26Q^@On*|RKK zL&+q*;F29z_WL)U8Q&2cB#?ir&we+CNJr zw#;W!JJkwxQ?r>C3>I&A*#D>8On7W8@_2#=8+laFvVh2NE(h96Z_7SCP=<88%RNg9 z^h6n`bu!Udn4y;}pnJrS$SoP}#;#nNkzBt61G4+SFrE4U*0!Nr!8bl_Mb{yPM+f5{SvB>_*y( z3SKHf`@pVq{gGVFge*^-jk$FC3j&%9>m3SW5|V4oe~q32Z%;KoGLP}FwVp|7I5QE_ z)ZE^-?61$FcsG{z$xsCK*4EPFMz2c2OA*MUlh`{26kUKGkO8=%!P^)VKl-+3R5Me3 z`S!Kc`zTZo;GKBri|9iBcKUD7V7P8l27W6lLN7)H49bFt4N_1w4oYob36eV+%@3)!qa3L=C z9nI%|?bVc5m%dHdT1wU); z@xs0bzL^?zdMsK$cq?PgWX<@k}rcU^J-QnZD{hBUdFJq1pDikW6 zgYLOAe>KyoOia|u=uhk{i$k${G*(G|HoSU~(H|QyWNL`{O+VwQ$_QwEqde>fcwzo) zDksNN#){p2|t!C#kWt%Cn7)5>L;E)G6N`2ESJ9{I; zqb8~^GpPLKfL!oX#!Ri_a(w|(i|DdGkmpBcfPQwpM#X@&VB@x@n&pHCB{>pE&qyvAv5wcb^DTw z#fCB;4@l7Zg)jiSLehCfp^Xu|X zhorpcgbE3{&(HpdLy?q#0}SGQYkT`GT^o)Dw4+ko#oSyOVeXja!dEQM$vP`WpNkVF zCm|dhXkLE4o8`m;7q;vDO<&H%O0(^`T9{(ya+YGQAcl! zucDIXK`v+?;5K2tCHz5SuM;3GnnzuTJa^lvpizEse+O-hl`_SQt4f+N-E4A~GYz#86LebTe#bR+gYI z+iZhDhmQ;oK+Bjr$0}o~jU-Cjujoc|4wi;PfRDM(rFvsZzX8~DA1n>3g^qNj6Lo+c zni%i=x+!(VsjvF7E=l!$0sBCi&1`C)ekZ^a={l8v4{Y`K=xg6N-IQtlmcVBw4xrU1 zD8b(NOyim9A)g1|xew7jRV}MWRu5ORV@+--n1LIaa?*&;&W!P`-MVk5TkYyTa9dhS zOZMxLO`|J}IXN9Z3^fj(Kn+LeG@spJsnzOLn1h;|?Z5%_`u6zztT84tNac3n(&M?W z1aEK;o?k7yX~+?}c#*fJ7_;}eazVuShMljxg`Ju!#!E628*5+MtsO21(TmoH<|L1; z{V6tlQlFR)l$ZMOTDtR(%pj9_Yu$n;3`K*VNJZUGaQ^bmH-CAVCAC9;qG?aCN%L1o zQWUb1&q@Yt9*TsWL5yR*?s@C2`vZT&0TSl5W~%n<`1)4Tb@9lhpTNhfLDUthtPl1B zpe#W7L3N8@*SerDvGxHYqonzFmD;?zT_M}pJ;8FnJB1cH-A5}M6GYQ>s72EZc)Sfh zjg$3!{1{t2A!W=*L@}S$>}wq_^rUak`a^LTztoP#XfI&oY?&Ww38R-iu+R+?lao3{ zdL5fb3DRS9($aFU%FwpprCTID(1MjnrDQL+r_(Mw%`Gk8QeJsq=L16*QUcf&J|)*^ z*lUpFg z2u?<}X6>^OQn4%;ds=cwJ7XkSLkvu}={yLG1FqNDcPe>IPhZ;hYeC5QowECRuCI~- zNL8*Nl9C!(xLE@D<}U(4s`kbM3L=kYCuw=O-ig5YPM^==MpacQ!8ERaTRWptR`4aS z(=%FrRQgDdkdpkBWL^F<{XNtiPkZog8`h5M2wx z=s_06LP&mo|E&OiHnqA$)p@kvHvmGeJZ$al>mG|(z@_2ktmBw-mvWw$xxPhKYr90l z#EBOSYHrh}Mt4psTbnz+sZW2n{rFn@xI-IH0-x|;jq&ga%M^44a_t}QZ221&YR*}m zG+#myyIoINFqYLc(#(3xLt63QCt|ASi~oGPN5ViZ${8*BtbOBc4sb+93IwmhQ2YXd z;mP{$gH{g+<#Mk-o`J2V31?p8>-2%{QMt)Dfa^@?KT`r>B5o zkcyz2yhPkErNtg+I~dc+I$RJ5S=H+BKLN}3vN0chyqZzlj z8m?%Qgvv5fnwqBWClr^Kr-NDw=`4I;EE?W<*(K86I&;kqfiA%lK;tS|)$}Gky_q(q znaSTT?Qo@Jk_DGbrf1LG9e3J5lHPSKjbme~T7)c!RlPXA>hvZBDTn#rat9$2HuXX*YnR*ryATjss}y2Z+G`#f`l{=#`9{ZD zl(&NSvP6$iRrZTUo}hwA%3W#I0;7&RT{B`O*!Q-lV|nx6bl>TEaQxu)ZZH8SWzn|F zt|O4jIF5hi=gHMyTIx5!u#~`BA<@*b|AfWWjn^Rs)Tc+4?JFw?g?w`( zd|xV)R>V#qm1r9m?@a&LaN~jJ>d(e$E$#LBT%po6w4D8iyVse0kP~B7ua4H46*91~ zNoI0>g{(bwL%-=gOB8enW}9}=j3zx%XP2u+DqIj3Qwd6z2Kdo8m;ZVjs$kG+HwtKL&I=}2M)t#w) z-{d&47g1U+B|JL$kP(Vq&ceT-XQFqI>YBW}BxPLSpKTH0C)3k8H1JAX0qvwofR0K= zF19BoWgo^-bPsC_clU7bqkoBC3R{s6?Vit0*N!{<_DtdS%y@TTk1RQLn<`#^C5Spn z=kyMA%bSd3r4PY4hV33{x#rd5fU;pK{@xXHe_6CC{GkKr61o(75jq{m;J@M%)mJTcerAM-b8TOUh(2 zfj|(^=86ggLE_VlAFby;nV(&Y?yXln8DLeb3gl=ASoPt17Uc?s9n973^_e=T55xw67DFs$7S4^c zVilh&jCy|jsM&nREoqfJ22swiFU(P~TpI$HSAE#qV7aL>Oo=~>|xNoYb z3m(lwb1Ml{h>&t|UGj~W9ULgq@EDjpxK7;VdTDgG#?0)D>((gg+5Xzu^$zS>TRWPM z|B4*pk!F!#l$1<{niGR#&}=f?n3>Y_zOk?tzS|Ia`A|(+P)*To9-m2eILU#%93^i}sfE-1i?o6!$4Q6 zbOm+k1fIf)va-Z!jmG?@lF@-Q{9vjU7Py(G;-Y1*fmp|0NBGSK>fMV<@8E-z zGJ{^}sJK(8@bX&6qNz!WXNudiMKNEP_whvpx~}4Rav|TdhY=dDlJ4U7QSL}0AEU@h z1>BxRQ+?>H3}gcbPk}35I+u8Qk3B=~p)B*AFrnuFUJ%NQ!h0VkvlI7am>4dstotP; zp~ns|hUbCmfR3SHq#Yy{SAZS@0yr=rhfy8hALh8n?}QMxX*j4G-MS?~9~T!_Ra?Db zyyf}sm+fVnnSz3%nUiwvv5#c%0XlQ|Y%`+LX4;Sy+(3GJ#|fUJm%6}TF_10%6ue9u7$579ScJ`~{vrFk{P5JhgEdg%VUW*OL}+AN-F(d7JgK4GX}xLDs4K0X4#T;h4|eqJeRX1;FvWO5pDEG1SX)e94X8*&lC zLf@-%$oE?I9AMahh5~?`o){EbQdiPkL-4i_mJ46`o#BgLGk4R5-hVKspfQ@Uxeyn- zzG?p&2&OdqR*GL28^}grP9JZ~XXM40WLE`q?QSA+PaaiMgW~$gsw&7(eZZK|Jo-;L z_Uj0uW6Q&@8mGYks#qT{+#{Wk?M(EM&4d>^FiFaRLuL$^A(Url{V^Yo4V0iTH zzsH#g*Jl3a&EtgiKg|%~|J&9l>DMdt-MBb)P_j-~W|YVJSgG>ZO0&GFyB z_Bc$CNFnya6{ZZ&D{S>R_2_YYD!j#zbe1@Nv{{bQu_~Sa{~nlb^9HMnlE<4TNbds% z@K#6U->{fu=&$SFU2VbesJM0u8}IiXZk{?aLnN9RA?S(mO9R?5t$dog*C6z}GJno#n2stnBUieacg-{`LL4IG{KJj;D8)JH+7O>AjAq ze|Jv&kJ3lTa~Gxc?qLXC9r3aD&VdD^ToPJyz-sc~k@&lJi<_G*IjaGab#`nn1nW3W zF}j|p5LTqioR^RGG#|Iw(!KNy{HP8KqJM4rjOBX4nCUn-er~lfKD}aFb3X4=hiLHF z$ekUmVy%x?5Fgn`=K;Aka#OYu>*Sz2Q?a|dyI8|z zHD?qL>UuMO+UbvEp_j*Dw~5Myr$?XS^@?=DWL6uwy;Ctw7pB7v-11`F$yw{Bxt><@ z4H5bTAt|yK1A!E%r-WgjehgUs^?o*7B8xNUhI|XbrxG^Yc;>NrXx1St5Y4+IG+aAB z+m}??WInyJVyJ_L=awNyqI`dbES&Ct?5$XX`)XHGQSw>5vt345PSr)3!Mvqnc2!&E z1|KrIEp3>r4^|5$)f_LJk?KBU-M#^lj>&&qW#($#Q7O+|7SCcEu)B z>eWhcj#hWbp5Jr!?~)|(+skiUpF+y9EiT#C#xh+v;(4saS9_w^3Rl%=ohwNL^GPB|%pg!f0dsYINqe43l~2R}*#x#fsoV4QY^ zE3D@A&rZVV>4dos>_9<2>tl1wVVNV4`T|9NZ5(P?M$l!`FD(sQK%jbis@_+QS_o2P zu*ME?cSJh(FB=*fa;<;$_4BXxOUPx}-Q5M#V!mL@hb;S?%w@d2aOUUd2YUV9p|noZ z$y5Q!5E|?zQyx%8sypp8IvxPNi>0@={MBt}wXentdHr-1V% zzc;IvVR<1ac6gnlDV;56yF!~!u!}HFuR-Sm*6CrX88I;#xX*{vm6m$_J?TnW3!150 zJA)0>lw$=eA-5dtoSd)g67|lw>x;!tWItjr_BNQN z)sV~XaD89;sL;tDISwZ2xUDSedvNY3g5Jh~Us1VO>oeK(xvH#2TNzG{TT{1y9-Y^6 zB9HIJKR%18xGT$4^m1KsmzFDXaPZ-{_VxbI(|CUa#{M1r?NOpu#EnDNIu>&I`l6D@W7$V9-7yeHxvV z)H*)z1t;M4ZW$eY^hLYY8GEp_Q@be&V!M|9iik*4m6~gX#cN*tQZLN^l<%whi z`WPx*Id^(`b0AqnGC>8Q;^`amJv1^>+|ZDCw$`b=qvL0qWQd(8Yalq>T3TABWK>E^ z7o#a&A|0YfH>sy8TZe}ua+Le>-}6~d^>uwRINi^j6h=?n;mz0W|Gw6-5%k~D>6V`C&Cs)7$RoZ|6tGlG$uJ(0@L7WJ)!UsT|aV5Z8z)myLd@S307B6Uy00Jdvz5R z-hEvENEG`;WzzEQEYwwh$r~_?RHI&m#~~W(>Ka+S=p1!f=xD}EhNo1pEw7|R47?sd zz*vX}$Z4c8@f0s-xBJXn4tauJIQsy*N^eVRYavzX-zWo>LY;c?@r~6Dv$IL?W3E1N z3&qKNs$-_Cmj1yAhzg!XWUE~?*0k$sc?g5vLL(6zkf5{ z5pa(Tl`bqdox=l)dUl;D6Fa2pvRHYrhhEp?0pB0R`peIbw`V((>n~0nH`hk);;kGp z6)H69XxEef161Do*B>E>Q71X+y=42R4=?w295+X@?-S!=*b7+YyfBdMoa&p$FP>Lw;baS+~PgU&1zeY2%niVAu z<1`K@^VZshP%2$r-6!;Eu4n0_u6kW576k@eaeK$?(r?~8>5VSD`I!H?-}%v2vEc?6 zuMKAa<4r2V<<@*9BW*p3!o_JvJW1p0NcN*HZEd0bA)&&dMjQDO zu2NUzFh^d;olBNPG1?A*;4)HDzAU!>JZOvk1o{Uf5)!0$(~D1jm3$sGf5R@z&S`_b z(b7s^R9^mDefZf(j`lr9M#gYOg^7k)VIeEfYHI-V3v-P9X z$q|mO{(c4lhShksQEQdf1wDxK&fHsZ@u#56N#^1*H(?G|UoUdBIf`9$(^fCp&1Eq3 zciq*%MfAA)@j8A}BFvjkKp^gC^XqrPHWOLD&$Pz#v?W1kgIJ8`n}GLThgy3F2ToAK zwI2Ojq7%nul%-LA_x@%A+zhl_LcrIR?J|4ho>+AGv~EmeXeumcB{GAlU3W&M@Sy9j zQKb)HDgRqX2Ag_;_8cKV0hyS}0aE z!VOobRRL6)UP@M$;c*JHwxA31v6~=J7Qvga`jS!iz=LI4`Q`(Onx2Wv1N45XAhOTCb)CRM|5f>7GLTrGzC%lne(;u->{~zp zw=%OT!k;q)b?F zNWl+Kd=H|yjY8Mj%vO}xy11AehlmX}XlsJVjhm&h8eN;uYccgbPRv6-fTZ6)AcT>T zFUDG12sPY?#Jy{-rw#|*m<8H`*ob0c5XKZ%yhMb1ULa#854Y_|d3kTArlp#VWYGY4s=X`I2L0zOX+LLsdD*Em@Rv19>eFq8RfVZtL=n^^Blhmfrdat%a41muC9Z{ zZ=sNZM3K%WD2~2`Mei{i&S$Mo%Hcehwk^ zJQya7@}`AEOB5Fu*KwUWLC%kMfMdxi13`@b2S=w@QDuj6Ubl3Gbgrc*Dn zCZ@|QX2S#XEZrS9vTj^b0z;#O$vZ9iVg?LR(fJ6@gUc)Ovvqnr8b{dOe@3zZ7EUW8 z%O_pjn0wFGjP%hXS!-){;NKW%dgcG41hDtoUoevZZvOdxdC8pf;6DnuLi@H9^1qRx ze*ZtnTx=`dOrP#{AY}g6d4suO-XH^$uGK0ys&wbSowJwb&AEdf0-N^VD*XR0vs0=_ z*p);S?-*TA8d4(qnGy17qd2m%++<~F!&PPD=9dUb$g26QY;_YB^NWAUJ7Jj6E09)D z$*v~v6Da=v&SZ=*icr(k?TiZzd8#{M>c)oXl7aNxnv+dOEVC~DpUl;a;H@wAnp*g1 zV_IDq4V@0z9eVW0nT<{9{(?Ww!%9|_Qk&UO~e3~=~=0a*k!M*ueYjn zLs6KIm-q?}z;hHmLzKYXSF` z)(`bhsl`snH5HxS#VkcADFYQl;c8rR2$gZ zoZZ*B>-Fp%wNW$WeMr{i0iB?j;FgV0%q^RnVZ@KV<<~!?7logXYn>z!m3T1=Aw&S^ zHW^>i&CH!^Viy3Ht++bpfl&YSl;5eK#~=sxPor%n1Wo!dM*`PlN-ot~dxDv7f@cQk zE2ICecAxKs@yw6`Sn{sl^S%#+O_`3JD+_C^PxYT?x?n7iG`tjUl1mY`CC>GPIl+c7 zKk{8wvT`Ze(x;Mta5$KcTSDAL>jO*B&CHPr51d^&r@h?ne(9*!{cU|Ql)g(*I=pmx zmGlg9I==Ct)7NCP1DyT$Vb6}(bKg8T6Z;MMXx)=qy0zHwv(haF4gV1h}19oJ!gc@?%eiq@97oOJ^Mn! zvwL+{a?I;nl25?uQDUDVSNIdi3zC)W6l;ao*3s!ysFGpn)tB)y61^{tGa1)2z@2p6 zzkkIZ??K;3txfo4ugxPFM%!62tRCr5YGlgdB9kHJS-{nD!9sLq=`@UFVSdt1%xsn3bZQ+r{- z7%n;9!@KsY_0Zl$L>98d{)f3wq?+kpb-oU5EC}6UR_Hzh#7VtG~rq23P!jzwt5!+SkTUnL z;kSbzDNGWU9afgT*jL%=SE8_v-0lTCtnR5bf(D! zXY1Q=Yxhbu1GKUu8$62cz|a^=tt4p07w_S9L*2`i)jA($mXHvO-1>||7iit zANq&U@mISkjum1#O@(B9_(+@U|V+tQGYehsKQslDF0zAUc`ZP+cAe_HtNMfo) z5$p3yF2&TzN{}E~I|(Inq2Md*QOcT3&bZ20SXxwFdAVYoUbKFt^0f2&X9Ej)cxKG9 zZY5=`OyVqGh(SWbld~n<0|zc!4%MI!NA3?sJa4cYF-K+v6R*_--EvEuKw~pjT)on0 z5x9QSQO{Mk zYh3kNyOsxYPH@F)!rQu9`T3y=za=y&j$Lt)JwdF~ySnFs7twN9DV>Va-EtwzZ58BC z#i?3Ghhgz-KmQhWN>5BoB_J`o0+tvjR%%)_2R=K3^QDQfS;$bV&Ey&_k|*s=zw;r~ zOFC>-F%;I?9EBuu^SFP#T{W&t;K&3)8$X^#Ot-v z{awkc0Rzs72@RE5PH$nlEm7>0i}iW_;wzlbaOCX>|GO`zhYscl>`?f6^Gm9@LUrE{ z+wK8B{5C?gP+i0ul{vy7@QfHL$@jB?wmtX^PGo0!pSQyKdi9@qK2yx_2>LwwV`*e( zRk8M=n@7G;f_9?_ykI_gt+?=jZQR8eS(rE@8u5J(J61-b=NxA^rI%aDia%wLlY>gV zW9a^{pGYHR$id6(QN*WQd**|yoh2zmy$U6SltAof11Z*RAEUD+f@%BxK4(1M3OrA- zyCyEM&!g4YEOW-lRMi5(&U6pHj+FhUz(1hVCHeyO+xlWH*lTriOE)MZqy~6O+&(#bT2QLgXX5JwyxS68t#fed#i6n@hpt2{l_bRvy@{Tf`K2tQ(%auicK^#91eJt ztuk;KH{CiJjioD26c#C|Yy-_;l}ph#l0<~;mwG(SMXtR;I#vO{$|w3?Ga( zI<@pWn?YJ_4pg5C8}G;%DfzO@i=~F6Hn`cs&%N;bDAcipC{g%)NnLG*T%1>Qy26S5 zM#zoN(jQd5GUq&pL?-YFIdXm?=R>pf+>@2$%9F!T7OWwr{RBNthz7mxN_y2M1Wvpi z$HTDS6Y)%DMmJQBJesK2g7}B|VyPV|i%}fMzHir{wsYL)@{I`EeU>sbJAMaWzWB2S z!QUmgx=wGe90MDgO5Zo;W960U)cvcPLFbN3Eftxq*E(|N=~jQ=2MN8kmw8SuwfLta zsrY<})_W0h(&#nAh1=b|gE8t&98#I(20noi-QqPsdznNd&(=OSl;34Bx7YeMaZaRj zvpjZKlMPc&eeiB^D+t$UGE=)tE(GT>BmLJsRYE@6tTga8!UuWk8hfAsyp# zk8WDH!5gVy+|}&{H@w6$WKDBmw_4LV(pOEx$eB#El?shjOWM%)TNz1ucON(wTlW(< zc;DL3#m`cO(BAD%focQe-+K(JOHwWP9L5WOJgZ!l+6v`Vp9JSW5#bE{vu@z3oabUT z`_S-doC)fnaGF|@l*7JMLG9R#bctiTF()|P?%KSCPKC53&@$y6CnSPvz}u9VPsUR{ z?3rsX439~Y2!QsjDx|-r&GF_TqfB6d2Pe2Fm;C+Q-78m1Os3p+c3a;}&X`DAZ1?@= z6~f%L$0GYT^d+PJ9u-$B*|;|{Jl8sUNBiXMxcUzLW}ADeT;AGYvhMoTcD#jLRq1}G zWOr}F!PlM3<{xc8c3N{kYlE9_IM7F4(x`Zk!mv1YQaoM-ym2xfRlV{Pt={OtX+CvG z6x$PW5vjh@IHmooZft4H%EU!Cai%vSi3BIsm!wLNbxwGTQ_eEMuAl49uISh36EDZn z`ow`_U08=9S0kqV#|{I#rA=|C@!?+nI{=Q_lICTNKM>oI9)D^u=kBcsd(^A7w&~b9 zIh#4*G|)VWty`(H`xavZqBX|+soF?E-l!~2VIW#qy^T%s@gzqWR8_zP%PwX14P=xEh54DYT&oT}=jR^NzW>l*)StdDL`9E~NI=-<@O z<9phY{b}|-I??t5E=^P+v=SqL_dC3b#e1{U73${ z8fmPi+3H%!1~?ir{_Kte;FCX=w)+5NLZADQ#juq}I&@`W$?Opt3(pJ1^HLM9{IV8A z=Jn&#%O|}in7`v}i@KvfuQmkDX=L3Sf7M3_#mZR5iTt{xa=5qHnk!cH-J7PNeB*`3 zZED(NGc#op7cahx7@2B>oy;w_XcJ)cmtUXLGbQ>NJ$Cnaa>VCybwrsbb`K4nbOZmd^Zaf<$9?LxzuP~jt1X*r!W?oD=ZEC7O@ z7JtbI5n9=50;U7c`-60#+|M5St0iF}if9Q-kFKe)Xuc`)jGmX*`KF6^GVfc_%slVV z)ew?)!ifXAUU-ZqH?}y9W>B}9ZMKf+$5cVp#^GT+54R8_T`#8^u9Y2!Xs$=ssfC#6 z(Zs64Z0K){`GugCOG50(rA2V3YV~#$gpHLhWWr)w0t4Lv)i+(IhlRSL#$%p_M%poa+}0TX zA&|x#o@}u4)h2D<8;vI-8l*QqX{oGKoJ#UV!Lsx%>3q=^l3;c|BUtq)K~!SLnl{{V z;rYhoIBnsAjM~kYH!f{z9_jsv-&w~j@j7ET!$8F8*Y%TqreGi+K>>{~y+D+D&hc+L zd4!Moh_-fg1P7S7JaGCfqDLd05A1`DF4g8}jMW2vX@myQHj6@w|8iUOoKJe|PhX^I zZ_Gi)l}_fOHsWzh^P~^hPRJ{b8FlF_*XmWhPG5|4HM1<1=|xk_cWMn8If)yceBQFC z+WBI~qsvly3o%}d-V59DhXJf?+dViuCPNqb{f!H6q7{D|Lvwe)nY*UO(YW*n_J0M+ zQH&^#(%6Sp?#k>#XYXKBGH*`5N@KOZkj~BAltnVqGkpV=2YkJMUE<*zHVS!5%vbs? z(OW5iGxKbol^Cfjj0~|fhI-!E&mARaJUKX3u?fmgqVM=7JkzVp;(Yad01S+Js!=01 zZY}ipFA<^4ci%inUp^Mr4T}4QTZx>+D{HoNh62qlamfAE(D9CeuQ~T|^!nfohCTw~ zIYcAlIm&A0Gvv+~G?Ck+S>nt-eUQ6cnc&*(q|U$YgGvs5!#e^9nLKgem2SCB{$bQ< zniX28sKX&%F>8KIW8~soIr|P>@zVa zO;$RW@@FSpCs7oJ>FxHwSMuzf)Cjz)`w-!!$O``%k;^B92;uX7WjPqYPVZgu{o}p) zmo5Tw^%AB8gL#+)p3RrIUj%n(mMbeM!l^tHPw!m-K4M6YLcy&&OHJ@k`%Z?2%2{V6 z`a3%YE`L|`FPKH21f@|nqJ*d zfOa4YI=kNKQnbwt+eHPIPnuB18x#a}>4Mi^JEfrDmFz5@NxT~!AL_MQZf{+o#9{&; z;`?xX<}}DRG(n~}-NrnE;`W|9|Ln;{TPRnP?QmpQ$-p-K-nyYXr+gMr_P}QkkFKaV zyxVKoT^K2^ndr-r7#z(SU5BK5{)k1_rN8;T41x?W5Xj1M&5~vQXb6BV?YbwViYT)K z39>>CsUk=6+YWpiUxQ}fcXO3&h(ALXyfvHu*D_ZqQfpM+m7~NNg?Kg8yFXj$8J#xxZfm`a=Z{Ns&`W?x*dr6ZjZ$rn& zO)m2+*y@tV1!;cM1@`K%@+`GQIl2BzZd-sFVl>vNitnZsI130v@>-t5a%)(1uFh9g zG*yu{JC!~!CML8Vbr`DO$cda#j4nv`jwbe`g23-O<<*RzD_OMrAmdC9%Sv6?%aUx4 zcvVW<-L=d)?*JP5X$d7AEMTpEytYqND=G^Adw=v;Ui)s)S+(WW8E$VQw&wj(jonYb z0fz|&w)_B4sZ!m%SJgTFSxS{c%9Qv`mB!O=*yevJByJUuO?>_JmAdOg{ri#b``haL z{wuM|D$7mUG^69-n148e5;>a^lFHjK@Uh$yl2lEVv*f|iID#%MY`<0*`4o6o4QWf9 z?3wBQs?waWimh;pezT@ktg^;}c|n%-U?RB`x)u)?U|g=K#{tN>!qGQ>CM9On;lYSi z-Rc~_AT*r9rGx9I@#q3NdXJ!KZYXH8|F#3Lbzok9+LFuMC4RXZ_vo(0H9PJ!-qy9& zzpDqxuU@bIwz?_)O-1(PDr<9^P&M-61CJZO(pX zV3?m7ZEs1$XNe|=7e5yZZVEG~sGbt^o8$iiT%A}sdn+SKH1j1d9MHvbppFNTxA6vqNS^R9B7*#<(MEuijkogu!Fy?v; zN)U%tH>Z!C)4$wL2lwZ1REkjgoyA0*b+({1J2vcgv_5p^Nd8$-(T;$M#*-f{Y&Ey( zn_KZvOHO3J1-t1Dm0>`b%v;2%>uBnOJI@!3D|`Fo_;3ctzdJ>EU9EaL=X$zSh1Lgy zXGR0fc!fO>o~mhr7$|Zu!@K7{j%Oq5XanjGfyDi$9fv9vc2tEKVedS8x#A_>fz!Jt z%R4Vhe2kM$96ah`b?YQ!SD&~I#ULzey+iO4>(hcM4I~3oY*@#24^>WPb&H&CnGHI$ zy9{CT#P>G?125dOgNYxw@_EGNnwIyuErPj zT5$CRXcneMolUp*&EzCsr&X8w~&t z7;sCCEz)oOys^BczTa`X?+_VbG;i7bxK2M$dp3g3oI=d!y1on}7qa+yiVkHbVZg@> zUyJB5ZtEFM1-JYOE@ukbFSgxE4A8O%%g8e8cq?oyKi|Io)_XGiyVDvEY)wiW_qQHk zNPB0f|8SWhpti>$2Kd=;kV7|z?%vaAmC^{MQ>&{VolX~k|2ov{B19-eF*_UL9`v0| zp?Z+TCZys33jjPHEtfN8#j2}==Lv3E?^-zfZHgSS`iii@8ZrJ@JQ@Tm zx@Qd4Gh{M@Y$!Ilk``eY0dpucyVvPpAyM;{jreTJ_O9l~4h;O+% ziT=>Ta?5s1a3-;!8wcBc$)r%vv-yuwoy4x6TsjdbeTQQe5>EF3g%O9xzhw79sWzh~h?$jGjwIXW*ebYRfCg=PC6MaRgbyN*kXKp87SDOx8 zUS!%|8M@omTOX1dO8}0UJTyDamHfNi=Fgn5-N&i=m)8xf@gEFay@e)L>m_olnm(WG zunq*wzCGOB;R&j?XW%RI-{mXhu##aiV5@a5-tLXNUJl*LVYv~-#mLth3*KdM^jQ5+ zW_!VT<&AKl-h{^!JzEX*U6yeqwYvL}6r*r#z# zJd+qLJ(S!?$WlJ1};-7^{H_;Dzw@kYoUA`{Y;oq8jQ8H;g z?k(~ikXIEIP9IOZ?`uFXrY0sFKuHX+rFQCFKCIYpNI$ukS%czR6#4+9O!|tqQXY#I zj>?xvG&BFZOnOV(oWD1FOiLIW8!fINoumHHnK?&MKUuxjHT6-#{-%+FUDGjnSuV5s zmkS5iUA;D`gvA}3oqC-*Uv@+-fO;X2Rew&g#9u#sG^QEeQZCQ)Z8*zh zIK>WXEjbcqisNIGgKmphGGTD)G&$d8Gn$vW>Voi4z@e$TtiWiye_~QNHZ$?X+i?+1JH0S=UtEU{WNY-M!?J}V{NP!89L@wveA7dJ9ER(B%o!%-pbvI*B-2DC! zK_j>#aOR<%uyYK`=M@K5dHR{g5|t7(Z5*Rv?AH(}5UtZ@&S+hxBJT8-;S6k@&ulmJDQ*JeXbjjkz|6a{(U(S7J59;ez8f?i{%7Fm?-{ z#8q8-_5TRfKrkoPKu~LKtY=-$2i2Eb3m@m&FA&5fsoN%?#?-#jn>SzxF1)MdOErlK zh~9>J`@KFf7+m~1JxStT2Iq&O;jUOwc0o^fqQ`!PLb4Cml@Q6i;{vb}0^6Pbxs`D$ zhP{9b+{AWd1hO>pP|Zv+V`Hlbm+9@e#naC-#lT0CadFOb`b2kd^&E4q><7~IrSM7w zH;&@)Zh=nh#VgGkM!wqPm(o-f=Q%ze1#+`wHbq(`M1u_ckDWZ3O9~0IG&W^^zx!61 z5(rZscn?GCZC3lGNm+@$6k`Y=5W~;!`##{{dNMy!K1tEUlq3YkQTEeoSr@pdwi)kc~y48U$OEwdz8n z*h@3}zBqm@7_{|LD*r%K%um@d+2qvoE^=wE_{4ndMt+E>Z35=}CqK)S8tl@}F;p_3 z28>^(b_+P8i=C(2#4vDHnc;dTEGciA9w>e%^BXH>OXASBQO%uv*uRr53kXSB&0a*+ z&6m2TrdN@Q4#vnrkfq!E?-BiDefE&CqHyx6TQ;vV)hxaVezt96b#6#`*)*gtBp z9k&O?s3nZ@{o2^>yD+itV(7VY;Wp%@bf8v!pKx7#uH;9YLzY?*17m=903_06U53(p z!s!Ke073A$w>4t`z$e&vFn@1Xo6WzhRAFDx&Soog8=z-o>Tnbbwe-*$GTYs73>U15 zFDAyBo7WA?vR(WpYC&b^+;`MqF=WPdR;Nv&bM@KeMbd-zzN)*L0Le5tUbBIV+K@J| zJ5S@QEcVBpPFdAbboEe*0dhsR>qV)D`W2%^dc!$cY))hhprgI&Huy(9{~c?%*0~L4 zIou274ZX8{Cy^AxopoytWI!MYGwSg!48(wU;jcTs*@%7QS#biGY{J;PXV_Svbm?Xy zu@XD7N>JRE@H8R;5H{eEzm3wn2#3=Em>UMef6X*>kU=;p>c(Pme^nc8B381zT*8-& zo-2AAjKNB^boqH!z-`V=g)PIlosdwQ)ox}}EDk!g1uX3%A}F`1E>lJg(G2{|fdHs} zRJp^AsP8xNw%|Y7d=WJc`pmT18*-4gz^cAUca3^9asCMas}hnO*;XiGeC#RFy=9vw z_RnQO4&I03fFOAh1+9_0Rxbaby1<^KtD-OBfS<(B_iKidycbzjau;3GOzdMow{U71 zlN0G^yv;zNebJ+y_(`gJUJTrZ%~}J*XxZE`TZUXm#VBBm5a``je^`iUO>$fq!#{-D zpOVoey=7-YQAswW@N(s-Z*MYZ-W>HrynIUyS@a9m9gp&VmOyH`dl&Spf7C6E)FVG; zwEj9n?#_&v4IrS+CMr>YMZ7Ouoz&g@r_j>g&$8D2`*4FF{lbJL0G?~76w_UEe<075 zF^YNX0PJ<1&?ESuym5$byh@T1p!KrOSH3mEiwpBIEBUqqV4?O)kjn*|X}MO~i0dJu zcC9_>hfSIKVSef5=XC!u!#(f=#Mu*BWg`F6y7QT6NWFk?^je%da+$b_=to;$U=(Fg zUls`PUrRGT015)!!-|TUZlth3m>K{*r~kM*(iii!x0TbZ6%B>f^)nDPqM!KS10Wx8 zQOeLoq6CK;TbL(hW=n$#N3cedqW7tUV^z%l-u;(9mpL}7{Tj8(?CK+~BZ#I=ZwZ8# z(v+C7_W_`H*M;1UG++lR00#}?FS~MrUi9iX)ezDMso$o~l{BZ>M4h8!UF(0B%|1`}NnMmw?|M zA?`sXU;tk^`k1*+ zPE}K03I=QViEHST0;nNfrneR9O02M*B5$Lo@yO^CWtFjg=)I5J1I zQ(8Cu>#7Wk3i`^@$=4WGH2h}RW>Rx64Rc(dkKX*ZP3GODUD5K8OQ*g}mBghar7cRN zyRqdIyq+bp^y+Im9z6!fTs|dOx_sRK3|;Y?EP7!J!AmLDGyh1xecm}ZQh4o>xLxPI z6iIO?ePOdREzU3fW{K>;i5qm$GHbQFn1^4f|2rf1pD}M+ZRJHQRA^2;Wmw2>H0wn* zbH!?TFUkPgPV)3$!ykB(4#tOyC%l6)YSJv(@6GHkILB{Gxw=`(6mP(EPNpGF7dF)I z6Dx|v2R0A_h%HY7wqN|OB=?PxCFZNnp?not0O0r`m#d@__cS&gVB7A|q!rd76F$i0 zn%7u+aH-g+kl$juv#Wg9n~#EV+5a~SfXKSR)8%}&^vP;B5BFAD`NfOd0}l7{|MF5e6Z8X!5*36YP$q?e|f9J6COs0@l0)%E%R z_uunKZja1+LXcCWc=cjj+u2oQk*`V0(pLK030%~hfp)x6QpaF$T9owC-!|w!Bb5NJ z-~=ynJ!Vumt)(#{4oDC~42UYfeKNF&tt?i%x zCglQ~v)WZ`B~43Z$x}H|vS~foFI#pw!MSKAG_+haA=&GsE9hY|72ax&Hot)(rfh%fe9lu$6Bbb$eAl6*6|eY{C5m_k%;&xrde7&9eJ_0tO(%{{0s! zqwl|5Aa_OWbwX)4e1>Cx=@jc#<@V-S{IOB&!-^Aww-HPq)N6Fkhns5Db)K;5sOPel zDUYC-AJKkeH4W+LMS0C!Tr74iYrK2)!Fv{}X~5oJcanA(?&P=&^lLqIe8Qm-;}GFl zO$ms}8uX#$KQv!&e{^7d$H;Pjt|7g`vc<7paTgPgOC}2~-lpoQSR{%`64@Ou%;_hj z6lralhrD88x-+-Tx%<=OV&~>4g@=q_wl6~l=#~+wYYuWI3X;3*XH!@m=~7qP4%adi zSW|n8Cg(GcqYioRf9vtS8NMSOapBL8I*S9ch`GSPvsK;bVyCGQ-FnxwPycA*yj2nJ z*&%vFJF3wd&aU56NL2Wq7VqEFJbH(r^!jJ2L`#PHv}nwt?vGxrzrG8!c-NTLQ?+4E z%7cm~SL5Z{0UwTCZ`OIgQj1D=%r649G*M-jDi<>jFe&Rnzl-R|Gp3izP_Wd&4!97L z0k3nPTJ=ef*`e47S+jor2ze{3@i)ts_55U==IM+7tjHQ==0hneA@AU1KrL zrpEM?I+8k|qT*3m%DosMS~QkU14R4wll@GWmzQ%jO7@|K#NB`5muT4jcc!;X^hCg#QynTxFf3pRCq1A|3p(w?~SD7ut@ZH%-od`TQ@(DYD-WS%o>#g~nJN05l>%Q((#VmE%C`Jyb2Q%5#d5>oaHS!0 zuneNBkS5eVNL0wd$JaJ6o~mi!i7Bj0E>50zc?jjD5Os|KTICz#Mel9k8=m7weYcfES3F)Aa8DVs`;iA{{lt(SOl7$KZ(yjL2UAc z2T}-hC*AfQ7Fk%R?H_&o2+wfWL=RCO9>iO*Xz%kAvv=mG6#a7q9RM;loV=Wv&xM6$ zrcvFrJ^lTyqn+O{eLUB8D!jJg4=LLj4CU{ATo|D?ANfgT2Nx{v6;-ENW+ZO`xBql= zmq4%KQE*r+trQNr6I!oWhai0Duq3d_XS2FdLoOh!UI1xGsJ5j7x@GzeRNY_gOqHOu z)DQzwZ2N)QXaB|`H94-kTCaIPBx*Epd#LL3@=_gdH1kp-^e-rbLpB; zz*|ask%LarUO9PEZc7q~G(oNea%$PvP)A3o3W$F`u+imMiBGh5bpCkUXgKNhT<;`> zdiAD%WxK%w`66Uo=0WFJSBjn4b;q~g+@9S!b*@C%*x24j{p4VKM{uvQ|FqwCL|(5~ ztyVA_Q`_k9nf&%&efM5|c-k-}yjKp$+VuO2in#BVjoUjo8qY5*cXSvG-h0)YAr$sw zjl_WBZ!jCBPL*SyG2*D?Y^8%*l60>t9bVS z#PEs1c2bdrw+DxKr?z9SLq{z!`rp3gcGw_%75_mRpHv)j;|U}($oUtDc070D;?#iQ z-Cp^|dj|(j&I(OnDc03CL!sz4-e5{#bGk&HE`hGQMHP zvL@wzteO3}^^+@4w_LaJNWIXeHn4q02_D^`qu^RqpO{%w?;Q-yU7P>q_;i48#AbMJ z?qGD&o6CWTDL+P;y-6HePB}sC8e(U5nTN1WZ!o|ADL87d2BIrX;D<>>1S#lCk@;Y$ zlYG(idM4>0o-d2v_2?gI0_w}Z89;@P;Q8?%^@K7#*~|=m5^%XdmMvNIf_Q|^#vtQ> zI$WUbXcDf}Ih?NCjA2KSGa!Wqo5 zfMC2v>XRNGGrZ|GXhjUC({|H-i>&KCdY?JJl~?A(AcNDKa?lPbY4?h6`1$j@Ny*q? zl`IbS@n+FB!!=r|NUe0bI-N>ic+ErtS#zVU^U>P+t8&H%_9_lm)^y@?bdE`tII?!Z zh!^YPI8Qd1k8WE%^G6t`9@G64(Gc)N=)nE~N*5CKHiC5?TMs6oC-pOpK$QKODxR{M z)CCvoUeyZQ3rhhS939*hUc%kz0o*o z@R}Tpi`9k0!H70^o2VS2RkEWRQ9}-kj!zFrFOyHcu(2t1x#}2dyUae??8sZ9PgZl%2I0T*;Ny8o!})FQZ-D1yGZ2TA zOFPHfv1JSQviVw0C=&j^koVf>CB`eNI+^sr6M-6QvL7cmV|@Xqw#TozxT*x4*l<-< ziC)j>qcu9qw2`SbskQ3_@KVDB4Tj~JdiN2h?-^XP4yqqT3mi?RcuO`%Gofxz z!DABAo!)pZ9>+Byp|2*KpEv{Fp5u29w2mMPR zl0w*{o2jw9U!h+7do5cUrt`K7jZhHajE2ZVDMWZZLZ0KTF zt{(;IZ=6j!Tf9T>bDUvtHM=yw^9N)RtzYhfV3+TgZ*>0s?6X@kv)XT%SDYA(diV*x zfx6_f!lkG0dP5{{GQ~nb;W7(VQ3PYHSxi!t6y0-$=Cha zo!|MO=l!A`=VV;?=EAP29QIJr)%5{U;kCG=5tm54vv`r3=*a))?sfS5WJ^YD(R+F6 zVt^MN-^+cV=jV?awDZy0@H#v=bRo5Vw&F%jmY$OEIU)j0+0M(X&g9i;h}uj{g5!$=e5QC@VzX`)VhT>UjPCL(@%Plk;B6by@GOG6(^rsG6lY&GdKwCR z<3>iYg-g`;mjbVwl8@U5^qO3;2;IhoQR7feO*whFe;$bZuGOa@At!zGH;XL*=e66w zA(D-ePCZfItszz06t)3cV<=j_n;&MhwDG7qXm_V7 z+?F+slDWzV?fHd_e?)|wN?P~7Wq*d~V~i&YqIrd8Yd-H4Sd-m)yQXkuWo0QSnf9;Z z*#C(B718jnsj8u26}gJMN6ux3!1a8{H>ROi=eZcUO-iaA1--MYY%9xbV{hE=MpOZ- zYJ#?}#L)_vf6VgR*-Fy`k%OK!g>U5wW-xqDz2Iu^5YDtvt$nEU>WN&+p6E_F8wM!o zQe9GO<6%s@_MQ}kJ-eu=t$bM?cXofkFr*9B|IEsY+0pUv6%*4C z;$4I16}Dv!Ha{^#+y^@71L{)pE(0>Ko(5E0-yg9*n43Zi90yVw^#zsvP-8krZ|JOC z2Tv9{kE=;fzMiSR5^qJ4BS%K^dJkstF-(m&U=W}wPSt^LSx-9VDR#1^&`|g{Ni-(@iC3kOtfbvKmvqm2x;A@^SGKZYMFXMz+tpBEI zW_7P<<*lzTCJt@nTCD{S*>N!CwdVMaehscBboMzLjWTSzw+;_f@uH7hHg^`nqoX$> zJO2UNWPLc9iem&0YOkJn;(Y=w(VGlGx7pROW`OT0KhhVj9lUolV#y26lu$1Scp$ME zgyw@HM}LoSZYtu}g=m6e4bv8qx}5wmzWs}XaN8t13#Q5G`Q`a8kROj~WimvAC9_+q z;avfe5|^z}*N-Z0yBbZ??!zbC!9wDIX_C?+P(fw)L8{q2u9 zIm=sr)2&ya^OO*yjgWeLTeDQ^jNeRj5d33jXBHL_!Tafv4BDW| zdQ`~w3KF<;1Ki_CNQ-`KeN-F(WljZy8jR$<_Wvr4A4xB?0rcuBbX14tPs28*bVoonOWU0(g-|vvEl^H z+yYUoy=$r5+UI|eOofCSE4VOK)9W|02KtOFEXK%!ZLOr#&6Pl5a+hczZ#Gl|A-^oX zcs+K`%g>){miT}Lcm!1+IeRyiIL;g4Z^E{+K<59UHboO@K(zz1yrN0)hhGAMl^)%; z3q&#YF0S?HkE%@HWZx}GI^$>1;c;BXhE>si$d55$9tV{h`N09+#7`53o}!{3Y9BzL z-2MHArNkHPakl*=Ro(jy2=O$$J(?r066ee&d)1LH9+Nc#wNY9B9`Pi;%2a_6>u z+d90otRexUo3J=Rxx+IQGD*}-)UqZB)G$)BX{j;Q}JYJ=zF+r@YJ3z8#WO>!r^4A|A6pk0wK{h&fD;zcz=;c%UoJ53T z6Eg?KC|d) zrt>AHIL)7)7V*}?-H1h)*p1Qfn7*3p&sB7^6j~$R=f)3O1=JWp&p^-1O36=bhVpQF za*f`#qlw#x7|cgK^{a9k5Iw-d{h^77a)3t64SyS^Iz4}idyl&L3LB4@9ReC00bvc( zk-gU5>oZLxg-cP9#TyDig^%I^H+hj4=$)YWcsk*euazz`96-7re{DE`3U<%VfRZ!m z49;c(TxOPtpUf?6z1y{={3hTid6J^hcSjJYwi(KwWst^-v7_~lfiwuENZNAAIJe1) zo}PZ%+F-tjX+c46@{KUF26VLsTnp&+&q+_F5G*>CX_N5FP_V##cd$;65m8A3F3*O| zZrVzV3=>M&z=l2OX@F?gT2dZ9yZRQJi*gQ&h(lm6I8*N z1RERA*f4GO4iQna^Dr^ZgKk5sS8Pl<(k^yE_-kPm(XR6`gY1N#@~@<8cTut+08`nr zd7mDW*IW1K_>P_(H93@?dSN*cvvrMh+`Tz>S(_~kwiUSaT9mGGKbyU*b7TdI8(`5_ zMjr)OJR?ymzsd*ugh^K0ggNRU4lW<|JY4MqpDnVpf6ixOdXmfNHwLI)H8waS!qxCe zClX1Wd})rv-z5KEOnIVm@9FqXkGYOtR&=QQKVMD)Iqe1?Unhxe7O_eJP$jx>V6fPO z2x;_>U|n4}*##yvisHkt_%?1qgXA&9)>QhV_!UF_YqE%--d+~q(7B_bdRAL26N<39`L*2}7)`z#`EEr**_?7p1tYoOGi2eJye`qqK zK^>7paffUqKV@7-(MJ#z8ZUo1NDXmw0obGU_q%);Jf8);y>po{IX~q5bx%>JsXCYb;h3xHQvL++DGpXHtoPVWlwF-Pe{nf9FP9CI#LP?7_-|& zk`szAN@MnBo(%h`bOF&lZm0gnh8+hd$zaI;B=wgZDtV|Kl$h2Xp z#^I!<>Td)BGW0bH6s$3ZxO4!45CB~?&^J#?O~u^X={6jy^mqu`8TYl->1O66Uh-NF zv-72!>YJB^d5@jWLQzi37FLCo8~lQF@ou8$UleC=sMSl{uS*WQI}Eaa{(MNiTkJRt z$OF}nPR0+|+1~w~HZ?I47jdJ_IDvh%&+7D{KAecZbAUU_Q)H>Kb8<-$(+bla3dvZ) z^q)1;BtiZOb=WSYw(=nvciVtru2S}!+`%j*lJ5!W!TCk^ z=?V8tw6c{xW+~ZwP3--yBLO&d=6Su4(+bOC7hFnDuhCXlZRB1~4%@9ac5~VuX}Yk; zDe4t zFe~djxTTz4JCXn&kuN+hqh6b+tMi}`^B^OFKps#F_5*v#oqryGD@?4bBMr##i}b)F zuCf`Ys&}<6g!zqUH0i+~b*JVUCd|!>0nL8y)z!Czbnn!tj$K_xO6M;!6EC*vUin@e zvaj@|=wwf=E06B>i+H^s_-%Zd3jHHb`}Lt>v||0_f(i6Wjyh4f7xm+H7n|&Yy|w7@ z1pp8$R)S5xe^>4e)kIKZIK$M3hQ{BJNnVgjpUc6(mcXp-_7?@>+@5K#O1OP7Hi^OgNuSXlSWO!&TCM6R;G z7-=$TZw7Z_z^D0J#ln%JlFz}x7e3Tt{QQX`tu&rs*FYH9@hSE)(Geh{Q6q?NDz_$@ z5{JzO4pFE4drho}Jk^Ua7VX+lxCWH=6$b`0;^HQ3IXkzTk%`IZcZ)Ab>Fe(sX-%hf#w=!zkCEs6|5#J$m&-Y6Jxf}^_!#&xtgon(XzZRGMZ;ezrd zB2#mE<3gs+We|D-nrm*b;}pNfGw|=X2K8KyxIL!y)_tAe~= ze4p-eV-vF~D@6`=0-yb6M7@_HM_pYV2|4+rx!r;0E1ZdXmkU2K43;S14xmwL&>a|- z2SKAJ%v7frBg8g3SjV7x|geny#%=#GKwC=ULYnDicnSL%c zfPD*i6pVO^@!E0gWoqrt(o_VwfS^W!e#r_CysQ_4;f3Pi$$8%`FVa)N6>yF&sE5LA z{WM(pfCtfX@8sdq@~SGbJN4Sfb79GydGp{rLf{spJ<8Vt1%3R^|sUBlgk|hG$os)Bwl5iAqzg**EawRQTgZh$hNCm=pTomXO-@O~Px@ zobAu@P=Xjx9k=zpdjf8j@$NOp(9rNcy1eUW>lNrd7~Mo7Z|v_3oa`ug8$E9LB1L+$ zQlb|gX#!JLO#9y~0J=V+H(50K*Xdo+OK+7TlZ%5`HwQN-pO;r=%P9obGnH8W^SQGC z`z1DiHj)HUb6pbhU!0X%@pV7wS8fIGJ zdtM77skx6S|1s+eV#QyZ4x7E!lK@y7=mng&M=MD#dpcz~>(5j8)}6Mttr2KzBFTUDmppRIc;Pz(#>YGO zO&D`2kjcwm3<2Eyxc0RgTsg^fxw_gGVqpV~t=U@J@7OPHI_2xqcii>N9uG^E60cCTxFLFw+$v2>}(VGm1=M|caf@$(_P#8k} z>NF9cOvz5lJOudS*-8)p{-o+wc!P4fe(xXB-ko%HDEV4shD6l(IiQqTPJI{~0#4Qq zoR&9SfX(EXr%?q(>gkrX5+A%m}`0tfq4S@7W^2-Jtk>(b#CqDx*;y z4d}G<_#rYRY;}6Qij#xq>~8orpPuR$ zYwUN7jbVEUH^_|n)w|dZWUYGTsxc*B_Yw0PK%=B{Km7?8q!4udqOd*9u@vYF(lf|F zs{GXJ0k0WA96B>P-~p`{;B;2kM$5Q~b0MdW2X0{Rtw+Wt$9FE|`whZ0`B7wtxC)W+ z+KtY16`JL!s`MRoIR90p`F-=bPE7DthhgTnaKPE}INkEj^kP?dUbLT&<*6t4RVw?> znhLh@DtS<##=f_}C@W5NJU=fRXbU4W<+5~m5z!Q$e365tznQduR zKAX0JqJN`c-`%P6UQLpwX{7^Vo;A0La+O=NkTuOnkvLprWa^fQCep+sspr7d)Rpoj z(fStMSEfal(V0lDnjhWKzPYP%Z{hv@YoFmOsT6k}Z|hatUo7=YhIC>6B$5-)?Rw*G zZ1lX3qnwhj7H5QO?euQ=fgyqQOf@M$AI{M}kx`=Vgb~tGiMCAuP?UMoK~sEjzIMmT zMhCWVK{~8dGTL~E3Z@Y9{)%jna`(Cv0J>_AsT@MSH(jg&g-{z4{O@EH%_ioq>wAS{aBz@+ zr@_axY8?p*6*BWBM7H;;!S=p;Ixdy3;&|nm#`gE*XCSrEm+WlJh^v~`&Mr)Xi8?d( zZUyPbB=#p4cB4}SJT^liGy&%pv#YbW7@8#E*Wm(nZVbmtr_-aWoAvVPk&&%o0GTJBW4=1Z-_ZB@Xf?)nKu+cbPxA8!!e zDFR)RXtA|gaSu)>;!9~z0#P?}KeJ*k@k-FmSKGfn<>%lWyuLTq-N0lhcOD7O9>lKa zz?9&bJQgY6FZhl~orlNQuPEH_nLLUT|gm}YsIk52ZGLRxx5`zR&7mn)Y6`haLSxnTGC1;#yK9o=b~AL6i+2YH;hC?5XJWHM02hxgz?J2UC1` zGuRi5hm-VQA1?GPTS9)IM{Xp2DplKS?|1I1t;vZA zq%oDot&GD>E2|-0;_P`_y~p_p^$=&Pw+0?utf4Y^(JjEnK&&z<;WA(~;YC9jf!$24 zbl*yK`=U&q;P-EJS*-i_F+xL$FE=#{Hz6W^3Oz^OQ*ZsBf=5f_DVoo2hXRbrDHF5( z{4{K;kSQdk*T@H9J?K@%kd=eilE-V>cG3Oe?d89Id%8!eDE(wY2z;vFaL`m;}Q8q=4}1L_Hdg zhk>$r^l&;R+qaf)tUlhh%E|E^U?l;?4H#Z$w0aNffhrNv^|_bGIw|Q$(XtG<<(B6b z47o5^Reoq9PHdLBLn+Eup2`ycs zXAVo{m@Pp68IS-Zud|@2V;G9$?Yxb4I9tDhr-UpbhP{oS8)F~??hm?=zvf4kMz4{` zkmfuBzD)ST2)_VN&(DRxS>SKEi&J>Gt&e>Q%=~`0Vn#uQAC`XBq5;_$G?!T5;K05c zIT{!?$O)dxEZx;(Iu|HC9bG*6{(TDJM@3eu7;gN;3U4xir+NHcKFfFN?26dP1Ru4r zYbRx54gl~W``$t?M}3+mt4(kKh`AI7UFR-1`(`a9Hi$EC+%w~)$e zyi~b-bv&g0%+#unx$XK^QNIyMUyKMCpidvF{rLl@yp&s?D@^ZV z6wOUq%aeRYJ#wv}l(?Atj@9g`B|-S5Nc6lstHp{;yc2X~M{XP4FJJ<<8^E-RGNpwxcGs9-hClRgky}+DWO0*VA@C zZ5K7J^_o+@v`GT*PEa34*s_&^gf~%b!q92S3%F2V#a4!hb98dReojNPUY=}2&S%#R zrp!zwA`tq=K-b&I2>Ou7D-g6xL(^^tYR`Zttmh;TKV6}Du<(S|reRq0hrmIbQh-Nxb=-~nLNODhgZV8jQV0YxHn}-HvdZ9R%_@qZ48|IIdjBkR8~Wz^B6Wa2xDM2oO7rHuydpa~ zqoStbmbQwJcIs}USoToJD=1VgF+~eUTB$nDOe3w{-5}!%eQmDy<#_qI+kgKKIr8IF zgZ+1xms?qM{+fEFOv>~tCPyCEW2f+!ieaj6Vt6Ci=Z58q%L98X2e`ayMR|E2=+x_= z*)A@s&zhE6X6EpNSU+Gq|51ED(-oEZ_3z*BJ0cfre($SlO#bl4-l|%&y#6xxU8&Y~y8rCQE7RV~ z&u53eZBtXBS@fSlke7M)+u(Sc{XRxQ?+uPpLjoVx;zFl+B&C?dm8Xl{#fyw~E4y%7 z28Lill;3Le9e<$kP9f^3M(!>|`d<8Fm9RmT%k%^3NcZ)~ZLIU-Jel!GLOnm2S+qz9 z7zf?kj9CU)1-pDI&yY!F<29TR4L_=D*k4&o1nGlbh(2Mv;fwa(g$iihRFUJU{@CbK zE3{{SdV~0BHtk*B2Y-FCU0occi_{!B7XA^wU(w`qS!o5~O*@I6&;ITOR zsGfzx|Mct21Qy+%`CNu0`sVR_10R~z%uG!;aYToPzbU?}f9lOl8)R!?Apy{&a1ySy z48u8Y?y4g(rKeBq8CNRVs-DhmS3u{1+w=Z!RRA5vu#5VhWF(8NuaoBAwdHb_QZ~D) z#t4*b{ThYps(FdgU}MGspp8Z}o~p$=n8Nn@Sdj?eCMkp+LV3ygxb5bRP}Dcl$rr4w zEMOvgAnscx3N2(~V+|@-cHUPD&j6IrEN5ia`5mhff-r~5h{;?lX&&WX|{tM%>0WV zGJy-INehr+>hOHK-{m*fVD$7|ta2Vx>sndm$Udw8+YrUY1*SikT+~qquNkb%%47+u z^UaJCm}6mErcA;OT&z+z+Q7a;MnVGf__&sEM)A+#e-I60CJm`~YHYs!Q=^}^WrKDz zPG<--QxAe=>Fqv1I&n=6)dyQuSM41E@W5na58YShY|A0nJ&M-dOuBfs#)8>dIvxcAv$F%Iz4x{ zKznjafGn*kvl$L%s`<^~Nv)%*2)(3E2J6*jMQ@I1gBpKaaV5vam3rwX_NQZL)p!z& zLk)q4e9Eu-`n6-X?V;pi_3HM4F8Cppug(M@hYsI^6EoD-|+k^?@N>U4Fszl7L@h762yO;uYL;92GsZDG2XyL8}wl4-n4jwctBwTdC9oV3sIW)b~Q@e+^U|g+wVXgR>&0e zlkxw!{)d<3)sy-&EX3x=(@&OXXDVP0$#T3j`@&+nm~>1-qh7G@x(CeAky|mp0B;>m zH(T~eUu!kj&wwc4%y4id2qyPkrYozQPB&6Xw`PcN#YdSkz|^}6)DMiQb-}n-l=Qr< zNC45Si%)?t$ ztySe)RZd-NF&duLg0VpK7*R6|hCB0?o)|&b%trcke*u2|8dJQcI3rEeD`P26mq^si z#LQ`hX?P2&i$?UyD%vf+w#2TfHBt+6z_mybZU=y$aALV4#&# z!yTg@C!Fac=+8n|Z!QtXUsJApbf%JTk~d$r3N1D^o;*7}VCOmm4gGoFsIO}UA8(c} zB{yoMn1y?mh+zwT{R=6 z>oUemjLqksT)^k>osrQCdU|?b0TZ2E)K~gLweT52vveu_M6_ej0UJ!WY>wARef2uo z$QCwD9V-KT8$IWH^0*Cm-D6O>Wz!h??33P7RKOu_iD~Npt|OgY3M>d zgVY1Czv=QUxw#UQ&*A>JTOc+bOdf7Mb;LT@b9SQ@p^X(3W6!ZESplQSkDfW)1J9>uG!s_4cQt96g zjS|-Dg%|u>>n9|uxw3pnoGA|6!H^BkzaZdRTEIjFz^1?#E=GRp#tr-;+Eia*zRz_# zzjCg&I07J9VUlc^xwLk@v$gEIHHqeAzA!MKpM!b)b&G+9^F2)K19T_-%zHu2wErv+ zAm;YyDHqo*ltYNA~StFql=?HJ3|eer2Hz%$fXy zq*ee2#xU7|sv@E`L`ReO4jDXMH$%!I2!bQ27%u-RcQx}p_OC5VsRC(cRv}aVq@Pl$ zIL;bXt7>QNs-VDz=X(QYXRZDgm{j5HZ1Rnb0kQiubt`^gBjOK?fdRJv5Y&@WI3m#0 z;KBCxi0?i)4)#B9xe;O4K+q9551bACamtMAn&}N^OP{Ln9@QBd=H4q`>FkuPu%2vA z1?!Zp!njNJ6%U*&SUbHmNvBs?}NSPJ{oAixFI*>aW);7oueYS^aGAS}CyJO89qlm~{w z0T*|>PT+n5X!i8F`|N0EkQB^l+}Rzg-GjRX0t6544#6$B zySqD$ySp{a=A8FD?>qmRnVPDZs;T*s4@sx*?z`{3_FmWet!rf^Te5qczH6pZo68JJCOEub!< zQ#AE)74&;W^BKeX3rp%;vEYOQ^C~#vy(b*Vs>^(PN4rVS!<6~yOI(;gw2`0oVj(21 zkt5kriDZ0eIBL(NlWHM0AT0A0t?SGAU;gdV`Dv>zd0glV-rP{BA&v1-L`+;#ha^;k z?i=ai>~4BWyHRxXdqASDT`6B2K-8tNTlOyYWv~|>)xCUybgf?J>z$#yNG1#i2T$zE z)IIgbt$oHLzFC^KeJ2&vyPU0$KiuQ8eAsP+2YRTrjm;|55h9rGm7Dwen?_Ab&)aqr zoQda*jEu6fvLNI93^qzyS}DOs25(G6)G=fT1B0yf;evBUCN1pojS-=qNgj`XM5dkr zn1&(y61)$(-Yd zq(;QH-oByD>{htazkfeC9l?U}d>{>urO+e*bf-{H6C7wj3Ci|`f7+1~Q~MVdlE4zR z+Z{njHNE9`M@B+2p2~Xr=g*&S8ox;PM`UO^)w{;Vz!yBvwhu~EgR*h?EH@(ls(Yic zYtM>mI2iLpZEBq4`2#b8b8S{5f8QI^W^XXxp^TqGO{=o$aQ#&*2>i>S_535ZL% zO7$e5mRZiB&ogb+@fIZgpvsSuJ@y-v!9doSZ8RNP*CGLSdUFT{pP=D;WS|19%~c=0 z`eU)TIWwnR?ymF#^de;Xm9Xk*;{V9YyKL9AC$t($Zf+@FmL3ukSkowaMT<-T+B-;J z27Te{b|}hS*^>Zu(z|w)w{<+hK>bVrBkP-&xWFls%$5gq<=g_2z?Sa*4R{66=vsbb zf=M&gqIp?BB+;eSGC2A{N7LDXHq(=;>d^$qZl9RJL~w@e&gkqfeVUb>th%uaxoiIj zAhkaRwosy_O0y~6Yi96E0Jtbhy59RP!X0m_w$@OzUUfjOFC}v2K+d$sVPn}M^(Dx)lfDH z7yNOaVsyv4z60XX+HqNATtWgJz}bMPBy_w41@oj0gVl~(;-uMBTLWXsV|8GZ?xFYa+CHtv0mz4=kUbMJoSUQ%$@oA|CF zz27%!hR5a+v9!pshwnN*l{|4;5E`4~`mbu`=H_M@*fOj_oPEcQGH3ArK9%d|DlLc3 zhA&1gicZfR0r?h+7p8A?tf|U`+%eaeKVUS!>fkP@|=dMWl5>3}cr+!CJga}wTaQ2glw;jh`+ z8>b6AAw^4W1g}5qtuEh}5W~294m_Y`cGwWfn^1Op)3ffQp!F{2U;twq9Nt6XS$59u z5{|?dQlB^g07`Akh+bxr@qi+Up(0BR=&nHS;GzaCZPI2Fj!5Mg86PhlfylM$(3Ouk z4EH)-S2z*%bLe?Rgu3jB@FLPB^v&PjWz<5P^z9zV$jD{%Q@>-hBCKiSh_w0P z;3|Y_I;Z;7S;comLnsB_%&_Vv|g=cEC>MJoqonR$wxVyuYCPIgNKcQ~7y3_DH#CKOj^|Me06R+Oe? zE3hNuiGN9mQ;L|&`A~m-SO$JIpSCxF7&wd4kOptQzc#Pw$cBUx`ExOrm3*s^-45$M z?nI^mv1$VJPq4RpwhRnJfkT$C04IrLD9V4Zz+XlQKjeQnDbCK$ok$`Rn+GG?qq|Wu znb!1&JwrC0z#_ARzXdEH(nuOrJlva>p}r(3|ErdvDM<>If0)ZhHt_Qp#l**xS5n3^ z#mva_!uo_ zt%+07MQ*AU5g!mM1&anRDMha2$XcexqDVYa?2rlt<`KBTE+uj-_0P4Xke;rc0U~zUN)r9yA8_^rDUzt= zpRf7<1{r(ed3nfDoPQg(cD;wPY!e?#EW0-^>r_ZEiTui|iYSq?E_s@ID^QLwT%dvg=tcM@>)HQN7 znSUut@Eeci5?QjdR;ap?D}yNc@3-N6`w76873b%6ZNwk3cuZdThxuc2m-E3Io@o%0 z=4Ab)W(u}Q*O@>n?%Q_sm#wrhNJ>h|^7@BZN!o& zLlzwuA~>Kj3;uj33J*SvE$kT~H-Tg`5%G(#Umqwb)n5Jgf(%Q3{`4MENgdZBa;MB! zjpIef!%>kwWBmSq#LS{Bi{mbw$)ft6nZbEy3oe7#2#ZQa@cmcsIH>gNk;0}qkpL~N zl#6M0~6QWDElLaPguRds(qu%jd1aiSD-Fg^&h2j4T5^Y0m0M#>-m&ut-c>i6)#L=v%-JSYK5+5hbF_uvAN@1?C}^S|C!#)Q>cc8$>ecLJzT82 zU)wl4>_MGrFrd_^w_9BsCFHd3K3eS*W_LJ5Xo(5gBU2nW3z)6S-KKnk?)pdRf!4LQ zy8msGBH9>I1sZ0Cq&6-p+_x-23xFiAh$lkBiE4Ng<35zW!gwxjiaPQA7x%e=S{NjP z<1WY&O{3Q7GWM_8E4SHmR zv(@=lFacYXje#gvjD;rX%ETnjymp!>CH;eEG;|XU5(_~j4>1o|Zj#i{JHNC(jGcw_ zqIZ4(WA~iAjZ`^L!i_y*Gzy8(=25Gguv?$33q@@h(4%*;IThzrQk7dj8h9nKwuemq zE%XX8Z8Z)Hfyu$pSPqj-cvXw&={MZiwPnNcSUr4c$oMMym7F9>u6#}7B;wuj2XVIA z?aYkc*E~MOo>u3TX5n8JKebmP({xn0f7kM-yseFsRnR%vGDj zTS*i6t~Se5ZP9#VFzG`Qji%_Od>VnC+@5fecx`x!#ElCjU|~6>RDX(N8M)k+nZzxN zr}uVTgFVG(Y)C3mEi1X|O$WOVy!{F2F@ov|;XDuu7ntoFxp6XSVnjYpmeb1*DI$WI z^jZ*4usYzC6QG6$>6e#nJfFP_TfWz|edjE=-yi)|jXG|CUx>~? zKdqwtr&l0HgfBQ=1`B4syJXZK^c#G4cCJ0~%MmnnPYtIQXhfoR2kW)R97t&##3n7M zi<6*F<}0Sh<#ZFPS>CZwAGt#l#B-yrj#@t+8p6zgG#zAqkG2N&9^)(vi;GT<$1r9y zO8HrYpz{e|DAZrBS}`Q&l)bNaP(aVNk)s0rsFT&gE0Zo0f~ zUw?boJZ=drbW}dyi~A5kg;eV82C(Ix}sv;UHw65nSy9{2l`08z3_fs zk6DaH!}JDoSKq!RfjWh3fgv&iDvoe(#KV+xOp$VLhJYs;zAZd1E_3#?XHJ<%drX#g z^}rR!Chqz`zv}3PKxSFySwH^k{rO{$Jr0-sFO7HSaN6Uy%x)acuRvIJkGWV& zau!eI_UVhJVAxz61`kXL)NB7D;Xe?l7R9*NJF0FS@o2xfyChr=;Vxmc>q&Es z>GcaqymoK>NTc5Ht2~l%Fp<@uMa^n;TRRV!(qLWROhca3^0Kn&(H-?Xl}vUx$ZlA3 zGlZWo5@2`6ObKo)gkFh5(Xofd&)nG9{f4`xR`+OmhAnPw<4L2@ncY7+ zGn1RA!W9ST+Kf?UKL3G2su(J*_LIn*o`He3oEl8pYAXrpjle1ULP$f%NGTXskh8qI z%NHq#>{RBA4wl);#&pcu-QYT5t_=0BR=6eYpMIdlXK(EQc`;jq*BQ`V-xY>iA+N-P@WzZ zSiIL^+81>a>LDSWntD=|`O!O5wNNg&`r2ly7NnZGFXcLC4(1c4qVU(_MYgV@ONFC2 zb*_Ybc6_zkkVhj>KYP=ih$scF!Z5zWdQG zG+SeUs8rIKVQZf)l8FFzhU-wNjf3xAXM>h-tU7g?Wc)d_qB_CmrJ;qPcG%O+Kp5 z*?0}3gxA0Bk8hF`I=Oa`@y7~|6oILV)2BKKuRonkOpNwwC6>~z918`!5Kdlxqz54#-!kqvWu_6|o& zL4tbz+^n&ncVwj8kuW1u4@SAx6gkzMI|js=bkObA&-i`c=}Ws{@cMr3*^~h?9@9@A zOxn-f+$l9RUz!pbLKa;wxsPuT&u?PaW=gFY!FX-oLo-1`5@Ny7)s|L%EQvq<6x9$9 zt)4qVw~muzbSD=VG)%(bk~7a7NFrQse?Q!EJ^6SXy9GNal{jHg3hL^jnN3@yNi|mk z8yfd*+dT1|h;N#Kt6|xcwGL3hCX*+&U8j*Yt?;CzXDy&|tlVJE%nYp0A$ujV>27R5JdEHM z3R^qc>W@uTe%1&J)y$MCIegr%WCwNyc?9adSN^COmPI(`^VnTe_&QffJT%;IL130M z8rV2kAv|5$9=@?})ddx`)4}S;5t-FhbmzOlX%m96Umyn1?XJ-V1UB&&oEb3R|nLr&R1_->}Lt;5-m8aVkg0v zXrr?#>68+!SdT`n&dJI6-f_?M^*lze?3i<<$UkrKZKD;b`L^#=Q3Em0^p{Fr*Www} zZUTbpdbPj`+$+%>6bs`?&Yv2tm*`bjybo&*srHMfXI7reX_YxzM@p|3t22g_wrlND zEdm3Z+A890t!-_ytx5=(+|!A4T(8RYZxZ-oUAKGa`5ccjUAHdJ_kjiTK3>)BJ(bcuuaNA){+Z0{xe4JEcOM2!Xv8P^_IJyTq==XpA{A88gYgCtJPwU6c7F^n@&_Jvs@)9! zwZ)T9h#IRerN~WNHrozDVkIAMP9|QK>KRH&sUn)(*eNiqO{;kjJ}i}B9Tc#Qlot9$ zrrxZqWo){s6CC6~fapk9?1P)ym_^Lh{Vj}*mG0dNGwFR`%JgQZ3}23}sUzwwvz_6} z52PmLL@GoP&bl*=KweJr6^N1r&pO+qXRS!$Y%r)h{Z95xHllBEZIaxKe{rf?oH4cY zVOsdMD!Hcm$ZOozp6*Xp#9uSa0I?WdaVa5B>i0)9izmioNpbOz%&__&r$lBikO|mV zo6f`&IHMaHIO`mCI)n&A`AVk8OCEVc{ZqB)&avIjE}W){)xt!xGi-B0gCCaN!R;@a zt029+wMQY~{C3k~W4>7B(=HUMtEbmKK=?-noIT!C-TRa@$DgqZJddysd1XK-|om8&rxa8 z{S2}L!*)LjmL3K{Bzir6MGwE?-=}@DCFypwi8Lk+$sf&;tZAQVFi)e%(h6}KG=&tFP5lnlUXl8bE1rkbOJ>cV_KUI$1z245j!jmz@9djg zmmC92B|yJGw>isrj*%nCtYIot@9Nvun)?PP&z452$<^4GH*E^&cO%OR7i)Z*8eL!j zs3o`+dSHC4ZUKWrh`ePZk3<-TBN#7R-F!7_w59@@jC^jdh=}O(M)nr#YcR!>iqjQ> z-t1YIs1#8EShsM##&?Q3!G?<_6gb4WG|xqwDp0Bo(Mw5zSRLA`&0C}hx$*#saB#)B zc+>4FaZ)lB{vV|x*>IWEV1x0hsd*Y_!#2|IAlKMczo2&#W-T_5%9@ z5K?G!bR1}<7VxN=A4OefMppdyzL9Rq%#|NIc4%PQ&?V}KvZAW*Q$rlflp+GxvW1eX z?quHESG`f?EGu`fetd+;$Eiuj=k5>~dLXBI-j>;W`8DIhq;T8D01GVOV}VIbORqN- z2J?<`6X?cFAPvYeiygYYyL+4ZyCuqGoDHNF7kgaY`|;x^Cnp}Cy1SM%`5&7aL0HEG z#i1V1Hw9b~sGgoxu&-k?lxl?w8FD!iMR-Mc+$6k+rB(7XiR?-*D+lG2?_dOwy{STT zqeqCJ2s(Eqf|}8g=5ptI31O+>(xEkth1Y7hxF2bSWWYo2=I;Jt-W3M1CTb!#v9ERSlm~fRjZ9f zZxUgrilFhFP@zyfp09(Z3e>3XOPyuq<%5_Fwe{FC1y+xN=clI~`YxQP+9Z(yph2w+ z*!idf?-hnphU-Ay~|WCPgvIw1RgCyvm$D*(;o&Z)jF?1_M2Srn%KVy zSvkSCi}aHX!zvPjPphgc)2Zw`jDAGbcAiou#}ehHBxW+ozBpt+~DAp@$Y}> z7oMy%mDf9Z;D=Ffu&W)}gU(&-0bEx)k59YFokETs#-~;IJh}i>N_9#`OPy{^Wyi-} z{8td39Yp`%P#3S(DHf(pDh;s7r{$F1CpGtRHB&WPA&Jxu4z=|u^5-t zM1N$7+8RQ?RTq zagbZTMi&tcY;0pSrLu*AENQubmYV|P1rd?f_SQ{%XKI!Epuv08^x)`~_dYX@nQ
R3ZKMMNcA!Hk56ho+f@vO{pc?~iI67gkpe1qY(d1Te}bNv6QM~vpX6m(k|ao#y%@nVND)#L9Me7YqVuLUZ0qF z)|_K&|Kw0tKI;bA<07JeS$f{7^1HCm91kB4>*A23P_;fB-jj+yHP%1O(OQ++imyEp z%D!~u@%#7hZv&HNNbZl3^;0rqkk|!vE;hDW$3-YuLGUl1^#o(nQ+6-pYm{y?%h9f&%Wmg~#hrf%0Hvl^Bvab>VI!fEvU zdw!u_QsE~xx0{Rq0nRT#i2oVyNsk40b_BDSc+X7=kZ(M4Vw zWvd+}DguTR@C?Jron3?YYMA)N%x0O?YA6G*#8u*dC;BHxQf^Mzy}RX9r&J>5w-DQ} z!yt=#G@ni&I6MT*XRsi8|9jdD^H~P?p{tXeR9kA6m}%E5-RD=Zab~4dN zM7`dD+H?C2;UhT7Mdtr9_+D~@ga9X)Im)j6)zZ>3z5j$l5efLmVe&be*KWB*Q!1=) z)s~Bhi|Z=QSUT(@85kLpsa0F#xZUs~oF83PhxJ#^?75xaDBUDrETJtQ2?3wha<@r# zB!qUZ*l>HH)Br%m!(YbRudIGvSg-@$O5w@LKCRjVn2H)fjiJ5zUETAqD^&$jHMw%N zsuk09L`w)Xfd0cct!q{KxU4f}KI08K;_s?xGZYJq$Nyr3q>z}6%~x;bZJ}~`%Iw)D zqiF|+08OgekF|EE-|Usn&IrX_U8@QM<2VruD8%o=Dp+KzC26@PJ|I?A!SmpekbGu* zNX&C`s-Zs|M?H4>?N#?1rw3FYoLp+on#)obY*UVZjo;tT6Fwy|x5JZFEO#ER*Zz*r z<%{7jljBpuPk8r4#iXhc^aSRaJNc8X1ZGJ}CsYd*h~vNmD4EJJyjz)g?XWA}1l_gW z`@rtl_%7?u;)RNhX#R!f>$Lm+%RP1VUk!FQhX&bC0ysGM*Bo7VP#z~UtuQXwU7^g0 z-rg`cwcuhQ34+b8%z0jN^P%nyI0yD2#xx#5TY$2(g*#EnVnp++v5~76J_!>WJO0$` z6VUnt^q9VG-NND9SPhWWAY&+AAp`i)Cv$iG-C3aiw%fQV_|@PcL~^1QtL*>Y4b^~RLecEOR#y8Oyj$; z{t7clfVw*k{#>=*X*EPTvo2diLzi!r-@+9fK9iF0X6uOei(w@|q6FLx0(jHOYC=;DR7u7{Fd zf0ZszadLIGaXh+qQ?=37DHi--{w$V8C^9LcuP3bO1LrCe01nZ(JDqFYaqpp`%I)1J z=sACNE3*;OCAUN)yO490z%s$V1wM+F3%{DzTKhl}v-Nnbr4Uw1C42KhkfsBB- zeD5oahgSjIdRuTFfRSTFq-{NF14Fi$4FGW6wv0it_BLmjd!&xw_N!q0qZ`~Ij`sT3 ztH-eHf;c97678M462r=TJLBoV{UkgyZIvgy$V^Td#$A&D5tT68&g+q@S&pJ573jbq zOHV#h<#xKp$`-p(+alk0xjG>a{THdY-n_(WvDlll)>;;ut zLQ{!~cLR6_fjYwHQRg80DqmkX5sC*MPEGf_9D81z2BOjW!%h4*rhciM_I|XC4X)!uOri?4CSMwhhz@5|cJ1Yp`wBikd#p%me4M5eKpe;zZ zPUB*s=r4b$#dQ`~3YAj&JnsA_TOl&2F@oi*s$k=`s7q+TwcQRtadBkfq&aPdZ>E?!Y)<%t)K(g@L;|%_CBNRW5%ZR47 z*2U#&$KS^%2Hdgz{r%I)x_ZbhLG7E>HrZ3h{@uPec-$ASAs7?%uU$TPBNDa1Re2S%3ZjH7yuO z3=)ZosE&*Z1>580xaFIJTR|@)bL9%yE!puw5dug+LqLhedXV&N8S4gIA9cTC;b&S} z)M(kx2#kW-Gwaox+u<_neg_iC_^`F!>)CR{7gA13DEgvER|G^7X_^lN?7sui6{f%8S-TRA!s+dg!6a;cL8 zX|h_CFB)d5m!oxw=RsXnnap^dz>5OFjRW6VifD@8aZv*a$ccF%som(0cFs7;6wC~7 z?+%qKbNc}57BqBBr}e`hIIhruOaNY>v$~GmF!2W-oIXIBJM@EJ2%BL<_VpA|75<;_@Y2`fP`28JdSGTuYLPxkdNI#ukCN{!?yi0TY z;xKJ;EZ;!xNhh6{VCsu`xxAW91}-Fd_PYyIV#s&4p3LILjiBGa$6m)q+UIe44$h+# zQM5rrlN(J}K0up%fjr->gq}0Xnf2CCTWFgAXrzU3K^0cx5y1D7-egxChqX}1R28RS z%Hnpq9_gvV|6saxW1eBfa?%KLi*q*?Gb#NORW4GTsIm$y>q!cb%D2TSh%5**%H~Aj z`)An1H*tkj0r3;^%;<^?WYIyq?y{veEC3{C9&b+&_d>|DN zga2!>F0==}Tsn91Q58&y2Wp!~3ah`#xY75`0Tm!u4kobZfbtreaxosvTJwDpZCB{l z#17-O9lKx?N0P<7W2wU;!h2ecu3szs){c&A)mom0n}vjIHs@HEmzU=|P#mM76uo{h zrlz7vsI~QLf0R}8iYI#W=hHC*(c8Nd!{#O`&A-9!@JK8+IjnaVo$c*DJP+z^+5NF# zxr`M{nB6wdPOFxG-wZYxNWNoC*U{>XIWMyhZ98>*x~gc{Q*bis>2t= zTwHL~iIp%~ri-U38za?9j!!}4J&ooM&5~}QOj&4}cZKVbf<&pFzg`hg-DQmCw1_B# zof0{jpr~G9HhCY=><^BTdURN9Z>V;uKDgqrVm`I`#Axy*fcshWyV560P!GAs>HF-r!|UN zE-<`($#AEy^8S4OV?&_xsmrh>Ji;tk%pJ`;XOq=x)L%@Zp5M(e)FyH?ru0Lak8?3K zPV8h)`cv#Yki^>O1qQdLiW|n)FA2-*rXBRBeeu}uzb8WpW0u!g*vI}#xK*)ZhlF@{ z{kYtB8uoX5PeSJ+fMzd>u@naBpTz$qRsGZBHH!XnzQR~;5*J~m!-keqH>cjytCYyOqXz(8r>1GGH7^!cS1ej@s9B`o8X!f=Cdj(87=8 z>&l%#)y$3CVu=~dGr{apo5L;gb%U%7>HJqnkC&FJVtHOLY}lP#*b*dv%m1DszdEh} z#Sai#SJ$_XOP;UsE#$Y}fAFc{q_Fi=;guB)v_IE>!k2!Lh9?g~JSAU2Qv*o|MMKZE zKD)yNddhF5O}R~8^1CH9rsO7gf~`i&_LDDPcnOKNq%PjpmK5oQ{Fge0Xlt@VA-5St zP=KM!$_dAHOg?KCCuU_M@a0p{z6P0d8Hz4Z2iLGb_Guo{qosxtSf^+Y0iGc~K9^-b zJ^u@y+5sZwW6jXlqL=s;>j9>hW=3X07x`Zu-HWBk=n{i-516*)BH6Cy?PNcOuBtr> z*vO%YaJl30n=-^ILIo{N(I_}v#SU7ZJqz7c@F^{iCYt|mu*wN=WGNy5`YKBBd-r7! z?OB5KtZ9#g#OnEdp1wM#*zD$F?O%6f5hE#W1}y3P$*BZS_(?0%Nv7vTK8ml@fbk_P zDB<&`rYvUvo2lzS7XeAOxQ&fnmPn@GL_>EAYPIRJ{C%eFaoJzj77Q|Kv61iH!xy5y z$yYh}qFl=`)=)^`Fn9Eh%KZE7z~jxiu$c8f-)+EVyq5lUG5zNDSwmzcNm?@gZScDc zhvHAPj0a6CsY8>#qem#65~Q@=|Gr}YmvOp(BF?Carc&~wDH)A+tFQ828uO*gr%xF_ zQDcL?)Axyt7i#&6#lebZw7yjTA=Q3$OHzXZuz{qcqL1(4{{_D6WRxnX6e^(p>hEA-{C4ao$Y=yJ%X%P6 zdGY|&Ot&8qP5rN5_vy2)0$!y<0wlg@%P;@K%&q1TyZ>J^e9!-J^&u=Pj*fYI>FmkfE<2t<7_yN$9P4Tcy#*(cw+)6()=}Yrr~!5 z!Dfyq@F=gXuYZF7pHJ&8c+3ld+5y1IZC3pbu6CYsP{7Os8H?^vUza&khBO5TbaAia z9*SkWJh_=xUrr_aTs9Xqq^;g z|3p2sO}#Jg)z8DY#suJJa4M6pN+fBem6uX`jI$OeOd{jz!>*Yx4-PAp!!B*O-UAOZ$&m_oU$k}h!mZA5NnpSz( z#w?iE(Dv?ju~i&Roy|5LfqaFw4YjEs!TKnho4PmeHpT2Am2*clZa z-wD>~;qAfz{-6i4pnPXgIxhX2`mt>3EPY)`$SR+&#S04s}i{3{1z|DU7(w! zP3ls~Y(lB9?Qtx&hg|)+ka=Q){wl8gHCvvijeUPQGWFNmTLSBZJ=Rr%8yi}o&hHOx zK0Ln&xjekVyXeqiJ)GEM2$oFSZf{#N1YNtH$Q(t2ZOv#JNKQ4V%}GZ&6aJ%i*DLJJ zz?C0^CA4#U7Bl{g7ZQ(=Ah z1+G?e!E{-jzFyeqSJl*DHE7YeuCyllbxOYC08$Nh`7#rX*Ic4@qnCT5-@uV63qtYpR5G442z2kx$;EE z>9Odszj=8@cyOi)5|7RpvPB<^`mTD)(DAt6OM)^}YMh0OeD_wf{)2ZXkXnG*O(OT$ zhUH>e&_snDpiuV+A^x7a8avqW;;9$tslhmsJC7swpMk))b7GB)4|^E%V%;SnTw}`? z>o3`lc9~kY`AO)H7-mwckQydp&!%khQ^$KdQyh5Hlw1Zj_uF$w0?9+-)86zcb2P5x z=xMb+qZ;%m|10h4y7F%9IW&(E%W8r5K*@U_D)il>j4hCp_;RB!t?0e@W;$^k1B3LO z3LkGLK9RPKD1~6=$&YFYV1WhF6C0rXnOnfV;IT%F77Z9R?qfZ=w$`G%43d%o<_gk} z{0>JPyr4T8z1uS|acJ`P1{5exJCz`R^>0kMT|8&xsv#<~Y!kWfzvaO^f~Oc1^8j*} zyS%rc&!^DgA-1}Po~K^MDWPS2ok|S>ve=FLs4OU!cW9pJbE?00aC_*tw0}$^OCy}| ze}JCDY!yAN+d!JE1}>1eO+BKT?+>g~=egCg#1Ap!=W1=Hx_g-7XJy;}Rz&&fWDahL z)X&ePQzt;H8Q5k@+59oglM*6LLBFw~vvv?N?e$M3zcgVI>lnGPjo-ACsT%` zSoO@qEwy!a&aw{|moDDl_qz=x^MoZQ`vqe3GlF+|)*oFyB-c1)ixnbB@?iB0)QAm$ zz7LbYjJ&eA!VfB-nOkP=Ma-XKskK@Uxm;%&bf{sT7RwcUP|f!fkl76}SuI7uS~UiM z13wHD5lI*F0C#>kiO$N34=flz5)p;tOcv1JwqKo`TpIRG>w4b(tI-Zn(h_1vDCa130{zP~0yx1NeO~nI113>=|_8g!&56ISi1QVU-!S zzrV!)A}(r50jiP!&$eh%WtrA3DL3vF1<>Zo`nqt)@`rz=DFliC2QVZMTr%vj0lN7_ zi7V;pl}*pc6`2}DjQM~7#TIgh^-&7^>TQPCclse}~y zXGni8%X(@}KCXzP4Ja(sXx(nQfFyKLc`RCrJHjY^dL}CQ~x!D`fM}V;B-%`Q%q)NZsv`0F%tM(9kab}y%t?jOLYeko?519 zUq5^Ta|Ik(@r%@0o_I`^!)4>X@vUO?%}Q>7so>df1g z*mtTocBP6bS?|~|v9Oq$Dx&@Y8Xu@OUQw^9O*6N|YIzE^yVyHrUQr6LF9|G?f>Z74 zkrQc$Z|YUn8T7Kk4R$$DFaExiIApxcr9orj++w-It1HGaJ|}=x888Hsn)J4YH0(S#n1Oe=%QOS28x$EhNPHwG zkN^4e+k5a@XCCM?-n-a2**|tBFceX!>yreFu-6Ayz73D9LU^b=KXP(Ntxrzw*&iKm z8`*w00JqhCt#V6zh(x@gogET3HulfMS8Hoh+;C|Q2MJ8((u6QZMn<>IHwYm1pxOub zN1?Q6)6tnNxeaOks)%{b3ovNVJG=QK=IV}64AemwK|>!P0ArSo+OqOMc^m!%m|Oij-Ao@HY|zL9>EJlB=JNx zOjcH<+soarG$$(}&=23jI42{GXzq>GST#$Mj99 z%weEtf4(z`?+HO0fZ7wyJE}h90=}zn3!Nk)A!Z1)jEpr62B`-(3}B*@gvUD8r`Ceb zu1#8X@tjKwES7DFKv#^XtAFcM{|ci+i>XM!rIGHOg@?p7pCvt?bG!dwB5J5~S<6noKOSfv6(|jv!~4 zG`+0D(5jp?dyQJ0{+W^{esB?>CRJF@Mggeyc=4*du)D65q4QT2~I=k!4X&}j0J>~r9s`q*T8M+C}4*VW@Zpug5{ zpK6~oXl3!to?-agZ%kW^N=d|8!LjOtjz)LHq?7_5`p?l(8uh~Jf8Xi3u-}@MIXUix z3Po;q4BQjAFCa&;u%P0@(A?_LcUxV`I2Aa|7Y)B&1AH*zQJDUEE~-kM8+>>yjSf>n zt|oOHO)_=sNLH^L0I@U8VkOrU4%p9(vyT46>*3#r1Al3kGDFt&1| zG+Tglk*1be%dNnD1Xv@(k&zhP)oc#onT`J?F!@cfcMps%bcPMhuqw;U7+Rny?I98+gVErQDo)C1mOO-l8JP=T}rDBI@ zZ9!b25flXFtIwK8i$S1g&m&F;`^)OyOFfedU9r{GRg>v-bYR13coP_HcQ7_vcMr<4 zn}hKJ8=@FDmVHc5F^5`B*1 zB|9}UiAvQ?08^D|S+wgrC0}1Z5IOU<&VSm~J_iuzF!HFyZS{m6Lk~Ve$5)iCV9y2B zCEe@gYH9N5i97}TXw|_!X58(>c^{Ag&A2Yp9id?JMvG!lebo=qCJ|5S1OE!R%xC{A zKor}^sKOPCZoF!EJc;#< z=^u+W%Y9V0aJeW|zXBpRDK}AgX(OWXSPd*tmIaCwp9qa9oFWX$s5Kw@wHJ$x!*fiW ztV+Wm3_rQ!!CXfluPlzHqGQ|7MLYM>`+y;J~Okxc+cT^f=2pLk}(ZpHc@17qoJCkXx|kK^(&a2 zg%Oxb@t&$QpH#hvx??jOBb!k>f^_1ELk9?*82IT9)w-&SU5!YE@G9m$;vZ$~gM{_P zNvUW}eocbzhhgI`eZMj@IV`-@Hc|_!VH^wZikUnN@x_F`-*1dK@f3_LF!XaVoa&WT zrPL*vj@{Uh%UzvUH?^G~C=PV^{RxZFljDR;hT9--9W{Dd&Hcz1Ilq@xyFofNMO3Rq zP<}hug z2e^}FT3&-^02)2nUBD=rIuKsO7u?Kyv4HEF=3vvM&(y|0@j$Lvh{e6Mgolb+jo<~6 ziL^8dfm@IM_k+d@*Uo_bK}5v|9^Zaa-ER6X*^v><2HTR7)D4GH+8a_mJ68@LwOO0fj3$HoU)cjC!-5~Zt-;zjJmBKPJiSac}5qUunaO1IOK<{!F0ocSx z$>fjVa0n`WekcS#0o^_{1n_5q7s`U)B*nz~s}~3s>t!iE049z#f%!G;2lAaIPh<}F zO)Bj8c(4*^1T}TL3JITrSZAQ~vr?t!maYrTdU z()g8Sc(LrJBMs`nf5R2b{=)*qvs+Vvv0q95P@Q9AV?{h0aQ!ym@CmR^z7?VW+scXg>waQh%g3XhzoBOG0T&9!qO2wc**9iU!*M7;J7A-BvwP1HGrD3 zVM+!5^T3t!;#|ykz?H9LO7rYL%+H%`Pi8XWvRWA(bWt}vm@1ih`Unhfw6FoZRe7vPp|rM`%UHEG?;UhChObccBh{QZ~p1FZ?f5a=|N#Vn+)_<=E;@2 zG@YeuE+%-IxgOeW?!$XiD1G4KYQM!lTGf2YA)MLrg$?eN1h|&2=KpmzPfs1J4XrY_7qtNQ~ zztzYjjOTaEDfXm)g$G$itAC)kC)D=9qJ;%d0G-3~+A(t0ysb+>Xeb)XX03Qln&plA zzWr(pm7wPuI}VR$#IzM}_T=g)*>g23D>POsKDB%*Neqe=>5O-5u^)SD(R_*$5&h1Y zoO-^pdHWRn^=KE=EmmJy?|mT}OXC|EDHq-h$#JB0I9z}SbCZVU>g36v-0TYBA`4X; zH;a$5vs4ji06+S9WV*TopEh#|n8p8Z#Jy!)lyBQLiUlI2AYBU54bo+Sba!{d&pG+PDlFos&J?@1ykyGp8wm;OW4QvQN9dnkKf-^8 zFZL~qihi@)K$LNczWpup3wnC0X6m%3-xzg0_j1kzxZshk-z5ALR9g0Rtjh^1&1*f} zlBVV7qam4}M!jbQd@eEd^b(S%FVA&;N}4z{y7tr~hSQuryTg5XZ!6B0@ty<)Us#Vn zH@)E&a??#& zr}%)95@N$cI>9!6&A922m>By(qs6OBj7Iw0VQFQ9Nr&1aW21D^uQDcPxj|AwD$BFF zKY?Xyd0E$>wO~saX0*I?@7#MuJ+LJsJ>8)Lv9o%%XX4$|%(@j^lam3*+8Gf8*r17t z8K?CwmD!N4$~vbQ!*YB7+TWh5zZsGrKCGCfNmb!)8+Z4aEPU|Ro20~v5Y}FAl2k8< zO0cayf_tD}H*v%bk_nnhCo^bQ07~iZkL~Wy`8S}=i&L036)n?&UwwXKT{^&?ko;9W z&2yA~mRe^diJmt5=h|Iz1&cB_!9eKL4v~!6?+CKa%6IrWQjc)CpsbcX*wHmmN;zK| z`_t2|e7y(E_>7KfM%0%h;@zCqyz~a!|Hj3Yjynmrl5AX!$6Qj+O>= z;xYpgbkF3>RRw3ghMXAsQfcP^H3TKf@I9Q3ed(;255mSq3IPQ1qs!_c!o*d!l&$HE z&{-W_juhEr??aA{V+h#SMg{6CD^u_3GnuG}vue?pFJF3x%KpCCe1obgjS!BBtsC`r z>+yQ|@anlRD{%vRls<1h=b|MvIo7SK&%^-n!-il-itSK<;)^}P|FK&%r_Be-!Ie;& z5TU~%e%EHoPr;!ikp7`D%~!Rl`GtZENk5u6p!8#I1U4dW+JR7%J1+4vFFRIrZC<01 z;qI;;9Kt`8V%(b;uK_KhzGlOE|2b`4HDP1QNzv9b=&&J_V~#yB_8^QVOqUt?lG=l?3V zzIK^?xp5NP$MEmgwRGq1z4>qE4M4%vD;TFxynau72ClRKTG zoA!>PPZ?PBqZdd~)16CMZ+7P?(;nlQ2;EpV?X|p*r!Bp6Mlbp3_w#P?<3dBZFadeZ>4tL@W9ss>5`%IUK)s1F;nVBA=AoDK&%3uxX5Q%gsTINku># z-+RTx)Y#fWA>tkDxX7zV`}VCrpCErZm`0EC*nl(dnaFKZD+)Dlp?5te*fjv6kvn2p zJ2PG8u_e0``OD%J^Xtzn+8C@LTYQEJ6O9E4AK{NMy5CvRq;h#p@QACC)#o0f^C>BB z5=xJ>I6NAOHx$O&w`_eR`l_DAWci}3{!zesQ@=_QII$WN0Xgix{vJ_QDm`>stAC!b zXV`AR6XUV=st1}Tu^uqzfc2Q_xUEOxZ!Kv+pNxVD8mIBF;XvO@S}TV7kdRk)I+4>$ z{&QBVI^#-?O401~bw;q!rXw?zpDNFId3mE*Ur!d2KU3@s-qHxdLgM=MGzj+_&owwg z^Mj`w-6%z``I7X6z1Y{g?j3KOkuB57m`rTa{~jCTcRFPz2n}?b_dIH^(A9()QujoV z=ex{A@CgdW#KZ*jnK-_F$tq)DfFkb-O-09puD~d<7PlZh&+za9=Irt%m&HGP7;m?D z&6$aG^1i%ar@iG%0$xrrX=$>ao&si-NwxFdHw^=Yoq=lxOzOo;VAhzQ6K4EIB&CN@ zaK+y~(9d$rl>(UA*Oe8M_Ktz4(}(F>S}=IvNl$n8L8r1X@j;h)#O*`Khsj_HgY)%L zkF9|3RTh5|{giGsYRogJ~`hVafVy5Cuv)F=WjHUnOiKEu5n@Lx@q)WB42s3OkV zVk(n$cbC9QtyF6D>*|HkiU!5{D5^dsB@bk7xO+&O_*`cX183_cvtGj|N##7nN>6SO z#{n-6mfQyq_SrO-lJ^K{!MNj}A>?w}eP^Xo*gibxrBQ2mBTbYFIX^&HHgWDxQ>6t*u_Tw@mCVR*MFnbX z!>9WOvuFk!YIW)_irNeozRQs(vTqOq0&Rgxxlki=wg)`Q^@9)UC<3!?Y}QbCCxRN5 z1;k8E5G(AEMO<(1CQApmn5`>AQy!<4DF?Y!0a*+Cr#rjWUE}}qQ^|XGVUJDD-@TN} zWJx}KpN{UxrTENS1~WL4jGFm1QDyx?#p*zia-q0tHpweo z<%YLj=CHeM;L9nwW~oTRmzRIVdM0CfXQkbXw+5uvsmsV6_p6 z?@Em8JGR~p4CUYBADK2;kg#FZjxbfEo=PHV8@>yvB)60c$QA}0-Y12H%C$VjHhZSF zv_I>yoVv37QqWD<&(=Ju6>hR|8b4FCYXL|3-!|73CXQsOB_lzFbZA|f)ZR@iXCY8t{F*vQ5AebV?V zyuAW=e757}s2K;D_l1n8+nA-%F1t zSEoDq&I*>OE&D=yO=tSJc%`=s++cxth=#`Dv_^K>&YYIE%ZxayOnX#QW_>DkUlh4Fg*tJ&ol)J=oY}LhI|nW%7G^vCNv$KVWi* z-e1}0m*@7-;M3!sv8{^Rk&;}oBeU5V#^~xTU&Q#2F%8>4DFQA2_imd+&sEKab$fwl zfMx^L6GB45`wy-+W(t9R!=9J$ba+TiKBwtln~KUx26Cb|!8K=xJvC_wYa0iAG;1tI zrsD#*crlOBS%;V&WYF-@Ltak;t?+r@9U8Fjb(~Y?FRa~(wVZgY`(r0W%wYH=iFn-u zR)#Nuq;KYLe@ypXV$kf0{RT+&O3KL@c5PM{Y1Te-3l03K%6Mp>k4=ObWZj~lcxp=p z>_N@DHZ9gzbUt-0bsI+t^{(jWA+yg=C?Sw}=$7i;@BPLv1Xd1NU}nyH7(X?A_x@HN z9-85P{L*!A`lH%f?%EY-HC^dKT(LucDYc}r6NB$+eXPlJ>ZyV5MeeS{`R&&qQ??u> zFN;hrhkU$PAA5GUNQk>lG_HB9uWj}>LYfBUmCZSAPlaY#>|WbVq2Rb-fFQ!L%N9PD z^HR=?3&x_|wYd&II67JFv(qKZCcL`5+}}-MI~q9Vm$@_*0Ed7^t%Y*dw9={Ixwxtb zo8j$?(2L!xzU#BJ$@STC7QJ+eBCR7q&;;KGCSb5Yb-wOa@0J#1OdM;fat|dVoUCK? z42@8r-x2BCeD2b%qgJf>(bbh_qEL0QUPSnOeJm=%<7z@1-meK6Q;>nLbw8EuJ+#zNZ$mxSueCD2P8S)ZZeb3 zW3KIBx4bf+a);{OFOfslQgJk%D16(*P7~i&xm;hkJ<-_VQ4k@>!Qk;7K0>MtRtrnL zU*WZXuk1rfvcF_1{~*%lf9}=sb{e@UvQm0-moI&cpvZMdkzVZS%8Nn`xTkH0J={X` zW8YoWyKtQ9V&8Wdq9bb&T#~5ElB!$zuvRITqh4!D^g!BCDTbX$HZTYZW7B*yy>Fiu z<~RmoC59iCpoa`zLHnaN23U#c=;)Mqy+MC=_hAqq%$J7MqG6FZPk4L`BT`&&88@fZ zYWYF7fn++lM-MGz<(@f`?BPW}d{S3zb(@WqUhUMf5^pV z9a<1BUNadXp_`*}be{k;{()#1Ez?WTRjgrgj@Vk>u{eC?SP5V~@W#71uLGK%Dd69R ze7XBv3xl)~UIOBl4<{ME+T2$z4zAzjijxy$d5JKmY}E!?OHAl!%AkitxNZ=d97*j8 z++~Tsm1(m%41` zgv@PvIvUhB9aog&ekwyEw)x#h#bPczh6#ZOgV5E?>V%n9X0PcRx>WqF{@S@@r)cK?V)I|EAvf;^LCyJdP0K_)%g;Hf?4o#`KR6GHv1D)T$NhAZUxoJf`oe z*tPeKN-x#FKZm8tDD-a3pSp^)ioXNrO0pu~p zwV28h+?Q{Q?-S&Qe}7hLzN0AYx)X$w5=gVB?d`ou>5T`Ohheo=Xj4<4Nqg7yqtHe% zpMPH9mtNbC_cD7Q0j|iC{eRAoGo?uB_s>mGQFSHWfAi0icotk;ceKQS4>=bYU1b`xDrNt51_f}2s@T})zz1OHo1uP%=~YDGhz+~nobU9? z=gwDZAH*uD7?Z(>Cc5qq9sj9E4n`Gz**{P5dTSglbG94^giV!u@iwEicz5lO*wq@d zlay;0PmOVvX%`cPp@K!|^xYb~!Uqi;F&Ht|C@DXp@bbTAmmHW~<=_U0IkyMy5BVH5 z65UR7a&g2Tcb!C?65V*0nIjC?Nid4B9(!=#55~NTKL6~FU-4g809Frj1|Yf?r}%5K z=)!!Uw{u1Rerdwh(up@t6ROAq*5Rp&$|EaOy_XMX!6h(dXGu!Rs{Xgh?Q?emVU{#7 zL3DWLuZ0Hc3mSJ`!Q?@+pMC{k5x}ou< znX)DWRFRmo1(p~f-(gGH-QJd|uUKq)ZI2?G{JLRdWWLGN8W#`mVmsz#RdXpfOeU@S zo4g2!S7R@n%x|ezGvecilh>n*R)er|#CzyY!F3+6FYtG%m#af?w0vF^+Pv_xLDHp%{Iz4c% z|1dum=Cy0**maUF;1h4klntWxN$7T^&0I^2qH)jB9I~a=h6f(Kto{-=~-<( zcj%HK?3T_8Cv6uj#mUl{=DfUrOL%?Kg!?Q?a3D)}!@Rhx%?n5zMvj)gsHZkHH7|GR z86JR_&2S{jOmT9xnY5Sc%g<6-84V0lT}?SSx^8#XLU1Zb$LZ{*EQ-)2iF9?zUK;qL zMUV>u`TPbNoHMVp9Yj}xzTw*OkIzA$uVHM+#6%)JFJpH5t4B`A&ol$-K;O_NnaApl zNvIhhqD7Di4!3s=@Y(OP2k5P98{}*(y#UVaeahyeo9Q6Tthiv&hEy}g(Jvz0oDjw~ zWGHC@v+4%>=}5NVO!}*g`1Il6jIhjDs3gVKz2XH7Nkp@?1!g+o3q=b0L*>@IE8_I8@P$z@Pq@dLq6@JY^SfwXMbdNkqvH5^;8QIu&FPc}ntE|2rn zNAk(8>RsnNZ;vih?l2JVF2;1HzfK^A2m9O2Dis^mu%s>$noPHL;I)XjQl}KGn1jEdUKZ{@-pll7qqe28Tyo&2NQec&KYuo~Pcw|Je6NG?iE+diL|@ zckf$Cfegmyl$4a^6Cc~%)#dLQ(TRx?K>XYIa^C0a!toe6)$D}>8Zs|WHt(R0SO&bc zM8ry;@*U;@%*^CKs>IeZiae~y;Ml65ZFSk?ZMUlCyc~FD18+$KfJnK~#u62TmzFlj zkXpRl_6j>XCb~f3yO59P+0w3=tY)p9@CeY#Ogx*v`g?Ti1vyec$R+H|xGlGsA19Wp zl&ZzK!6^pIp6NTP2VANYY4{VOHGl0gGQ9aa5pi)PGLvya%5x|)lJDVQfMkk4Sc1pz zkBz|W_eWng2{l{HHQ^FccTRUzJ*^pY?g}*k_8_8v}A}K`M(B20fYy?9H9}kIKI=@;peYY{cV~E1Z$(h9I zLja(I;32bYptL14fAY4exyi3-)Zuo?^e$oP%z4%SIcPN3sptOCGx=13p;E3j;GgA? znmRaMi1#*OnB2i-XeI&J@#c*rkDTg4qvPY{6bw*s0A*)rQ zlLE{fe%H821M*0Ba7F~m!cmmIVy&wzs?ZhYNb|Wsq>InDHCZ-p+YAvekr~(RwQM(i zHYE>i_Y)Qh3wY3CJ8zA({7xvzw5xfXC@%^yka8XF5hb+JBjpG4zGdIHfR$HNPa ztUXihfE|clhYgu^fLsMDrRKguwkN))@Ci|9e38N2r7Yk|C{>E9ri1JgXjLGmiVMM9 zusq@cP|p%y&pm)$4E*HY;&Wer3>XYfGVo?|N=0iZU4Zn~$MFpyT#(a`}At9_6k;|^+4WmKpC z&8;=%vyiaiG*#&)nxqMwjWzsBaD?9&_(7veYGDoTyD-juOg-E3HZf|{}hFVd?+UmWV$2b_KJtd+^wf5-1JgE(|AA`2(U-iZ__a_H8 zxXdq1FUi2m3d+w%bD_36yvz4IKuPV0fYoq0-nO%=2M_o8hx~{${0$0+Up3^7cjp2A zJZ(c0;eV@t9$6&FJ^J)V+d&WHB09(Ka(MA3bN69!eUI+9PS5;4w^HTw8a7e>J0nw? zmo79zwO4!MLp@SKp5th=7L*ER*G3ZqG;*M6y5 zhnLgP#CY8b?Q&Zio*r~1CwWZxzqR{3WM;gaH}r~*?!jo4gPuZ#6M{9}{m}AH$ql)> zIw9!))2MJJ21<7;=LdKmIG-I3gbq~X)jk%#1P%A^gR!|5auXz*Bm5Cd?XtaHd_4J=gPEW~tem3W32y5ynR64!`A(caO;U`T0@8&K+N8i$^Yk z%Xt{fD5j$$gh9ZXXTIkP>Kk+8r^2&y46FLlz$df9dx9i7MwvAbCMV~-cghYF@0v@T zOx6jr!5;b|Z4dJC>S}j&>LAAZyzjB2WJG7lz%@sfMX$k-il z5+n=Vznr0T+&-7|6#5lM;KpmVyjDDkIb>IzwGH()qH4>1fWb`Yym*pSiNMgYUZ%Yr zG}fhfm8tT}+Da}}2;VJ~6inQEZ&Z#wTZlzNo~-u&1_FAUAI29ZiJcPp-M$+qA$@Ly z6@S6T07^~aQ-=q#2$^Kg8_2&F0Bqa6)$)%5KSCwn5S+-m8 z4-zP>_Z%MO5N+Zt_Jc<$P6(!*Kq zaB%lR!5o(tzI}|fDPG2D#RB(*TBbYTL5()P((l^+{x&b1-rCa>8fDyKJelED>Jf>; z=X(7r8%7bCk%7~k?j5Ff_L}9w1pwN0L585l zcHQ%aM$sK>Eq93B{r3c`J~+tn#^-5PjblZhm>TDCXnJP`{g3#aNu01_ezo?b-MAy~ z=__&C3i0fc)r+}%Pdjj?-@a3VXfm&d*6OQT4oAc=4c@ zaec5sgF`m1$JkGDq;kKG|5S`4nfS?Pwe`FUOdk8qLCqjv_9?{&49u?+<%7b_Ms6QG ze1uxYXhkkBIvs9CXvIAdQqaZ(@ofc%KP4a;9IVH9jDcae;55Q#RTlIR?O^%~N5on$ zXiCZMnhPhdc41Vb@A=dxp+4w~VKh8t|n2P|L+lsj&ghf0f8}+ik5YNaYN$FY7X5 z(AXNEi&h`w16F}bbv%}gAfB?EFM1}eUc`DR@(?vP%d3_(!q2)p^`goeZ-Wo}#A>p= zuP-DJ#**!mqL#|%lAP9fwr{hSZ=oT&*8)|)5oo&lg-GqM6|FVW{$XjU-i%7&vFPT zr;)1&7WLmD!}@8f?mF13*QK{%b!!H+u7chd7LrYKhw*2wT+yk9WA|_$`6*qu!vMI7 zJQ6fyHy9Y|Vxj-MZ?4~|R84}K9rf9C0Nt~JP?FTQXL^88+JYzqgCNG^_;Jb0@9yx4 zr*!(F%!{UyTBPCAV=1^p)FBtP_v$Twc;KkjmdOjp^sN)g@_`r*ME5A)l9IY6;SmE~ ziLj?XZKlee`K`Nbp}05n#5_brMPXmhy*G)EA~IEvH%H;K(ol2NLpg)8KD*)jarCG^ z)BlduFg(ml5Fx;a1JgYs=X$5E#Ys<984>g^f3;FoACXR{|xr)_EVasR|dgyAlbQ zlL=_YPOst3@i%BVczU!|Z;m?pL06dPR1a8P0Q~^Fh=(?W_E>MyLn(1fU?u~Rs=Esn&9nJ%NPfz zjs3V1h7TcfcS3}MA<%e2LMH!VCInVyQY3y_zhHU5YCo4=kSsmSyQqpzV*`s+A07_ zqxLq~F@F#~`qN)W-xPUT(%HDK-xy;Gr?~&F`oz?n?76w{<^CJRb2p~x9iG%CpFSav zPen)O4y6hq+g#@SqCOdN z!PoAa!=hL6UUlGKk}!R}4)A;R>J{hGz_05X6NdL97h!TZ&aY^B{&3Xw&Uz$>j=rK@ z#S(EmT={{46Ww<4>DzB$qa2--q?zOMLmQ!_T$g1tX;$g5W}~;0-|8nlgmrUsvoYGT zgOwl&HoqrfcAnY8X@Uu7G&Yq7J8sKtUZNr|OTXR}mSQd)8B$L*xR6RGu$XUDta`ka zHj$pExJIRsI-l#jFzW%p%xjW^lY>0Tj?34U8kCKo?hjHkyLS1(XE7?P>1U!S~`E^U_n9k_PQyL5YM>ki^N-YO(04OnhGvVNoMy#v?| zHabGec|%!nE_r^dTwNTtQt3%^@V9T1aAQM&4Flf?Ag8!hfl^}fO#Hfe-d1;uq^@Md z17r7ndHKQJZbPW=g{U~|{~Y*y!?O{04>pSdwiaNP95OQL%m=-op`{^gNS(Ino-=Y_ zCZvR3_y7{Qz%Cbv1p&M9@VE6IL4!VM zcb#*%FUazG)3#Ky;tVLc_y_h8bFsH`}(%HdwE7jMM>I~RKL-1xg6BA;SqeB`+)slY{BvY zE1Vl{XOF}3kL&Zr7yv#o?#N>q)NjJ1yBotZfGD?a4{vs^+tb6v#htD(=B-4qEzRuF z9b68uJ+JrvJqBq>nm-xe=6q40q!8a z3sU<0!jVT`ABut)UTr=Fb!-qy0YSe5;NhTK6P`ZOvO-k1`qea@&HkW4LEB?$^z5MV zozuh-M>+8SLY%ZEL#AV?jukzdXQZU18#lS1;_4hHH=`Q=8ZJ35e9e1ue7vxmhqZCC zV$ACeR%<1tHa~tqKn4;OO-F&gs2#ai8(j))4Eo^>OALgt#U|m>!rl5)jP?R3P2FQ_mYKAZXSY7piJ%Y`??Izj zx|PELB{(sJ+!>eSIbysxW-^C)x80AP_osKg{kE&u_nX4p+BBhxZ%+~?_ywQFqMnjn?aMBJ`qiq?~0 zD*&j0;lQ7rghyWj;FSF!E|8RvSrUcZB#<|r8L$(9v}Oemsvcutxqgm(-$K;2?cu@w z*vH4mVmgZf^i;CFP93CNNfjiF*+WYV7rw&2Uas|jnGtDpoApU{`D|P8jhY${U`N3# zc0d9^1-O<$NZlW1dWxs8w{w5D|5hdx6-krpK&ERR=<8E5#$x2#xD&CR>}fCPhnj_R z5Mefr!`RMht(8|sh@U?P{z`Z$NP2fUmVfgjfkmB8e*)8c@Eaf_acYA6n;z*BXQ^1@ zQf$4j*7B~zC;V2`JxKuok&%Pm&@#}ii|CLSFY{J)2CyKLCd^XWfAZHBj}f?6Hsy1R z08jyVi1w($*SKw!$9DQFU;}OkuJ*^Vbi~^VVt7Ms{#Jy`e++B0s>ao$jh(7<2byJ? z2EuS((GY+HF#Z-c0?L7yq$k|pCeQSn|5mSiLj^fGxg_NzFFyWjqB#8zR;E`=0q%NO zVT`}W42DRyce6l}R|}u4n%&}v(iV>S@0?FeER6MwCjD1FWk?;lsI%qfdUWRtfzs;e z+LS1e9yHDW367N^4`6Yo5*AJawmE<<4BGa1@3|Lg ztN(#a^@7wJ=wDKU#|acS4LFm?WIamN6>DZnArJx^0G6PSR_h8E#FHj=}-Pt5?)kwhXijIv9 ztF0vjBMgXSN`#tuWJ|ei%tnoT^zBN7(2bV8)ip9+)~qn%2E2&R3Fuu0>c50&1)@KL+P z1LcS+2wq>4n6#vUa z_?pX<<=(Uv02B9M4;d+DcPq&PdWUZx<{kQ znWmUpdtt>S&wJY5YNDVYFw>smk$!x`0QH5}T_k7E&iB@Ql0wrvA^|NaU`Uj0jWmO% z1c&2#PZqIyapX_k6p5^?$)i5PY{0T46TE{+07&~ow@?5)n!DWH1gQ9XU){XgoCsMs z?^9;hXbPjn+QK8UU-gft@XUMwfVL4gJX&S2Q<;x+v75IU?fz5`E*ouPef58x4NEmg z-9GTS%zfht$lt_=HYdKwOBetWT`V?cE6fBPD0_>#f&fqApz87sY7g7%1K|W48qi;W z;hJ}(Vl1B=KVmJpXw1RM{yW7D(e1=K-LGq^JLSzB%E1(~F*%Dt=rr$?UfI_gHKkKS zHjpJ=#s#4K3lI#({K;3~Z%uLu<|HOe^L|M-NLAE1k)7~G!Th$CGXyCUnXRhID@Uhw z;cNQ@|3T_ww(nEopa5&TZB*yR@o?7JhLp>dwP6R)EuVcLPSYtfMs#jxpzn<0pDDE^ zrp@xz8wl*)wrRAta}dc)ZSr(CI}^2?xvUKy29n)gkYbu0!9i)@bI?P8z4n2wjrmW3 z<3E&B?h1tmR}ObTU$fVlAx{c`*QC>TCWEE$neLDNAMr3D+lB@7Gbe1C(U!_kqw_C{ z+f(&1lHWJ+b<$L##>XjFk^SAtdfkPN+uF^06xJ}n5 zmK~%9wLAL@Twc-AKEu^XR!0?)-Vb~$3xw`^tphH(tasnFAPt|Cl(3GMs0IM`pr?NCf0B@)0p?3hg7c5|cA=$2${gC#1FP4u>k>pY?n5UQc#- zIbopMcDQuplL)h5fXgL@Mb`3y)n$}lUwQd|N`8&-Ky4mP*r+5d10@<@7J<%4-s^`* z{|;L8#2P-nF49i`X7g%AdIQNW9uG2AfKd(@0QR%Nw|z%aA3l7|z**C^;#l6WdPUWl z6cri2&?o-r>fEQf80R*f)>k8;-R)Oj>?sddT{8|_RnvH>OD!rz5r3j2qI9@oamZkP zcR|`QDEtgTv#@EBDMrJq)=bigp=?AfB$(dVuh&co3*M{)qBDe-H%%P)l%Y{;_;c=s z%{aB^2THpJ0&!o<i--`Gv@yiNs}n`-AdkwW_Gzo5R|Y~luaHd5SnGJaz~9@fn=d5+`8&o)zJL} zY92qQOG7I$0N=97rU5(=yGkQh2O2>J|C^YeZ*^WwFJ=Em#}R$}oxZa|OJi@cYf=%t z#8F?jIzhqwstyQk)3OeeROtRgxx3YUg0dQ6;!rzUqPm#&0}<%QBQsoLLeo`g{+nJ2 zXD9pJmR+h2f5y3wVEO8r(d!g)Zse1~S}ob1ZfCjUwf zjXu})(aC|?J`>v#Vk`f@(J=2wpPI~efHs%rkR7BCIGSH`SJ(cp+9>T+}KLKVNvsMde8F!8Tmgsyj2-1!%upZ$dU9*m_(ZHd0 zVPo<8r+=Po)XY~fJeG6w&7WpG9qBKyAONCff5-(v+UIzeKY^4>-Fs(iSvF0J+j5dI z8Zc895nI84=lco&?iTGQ719601pqv;nNQ$s*||A6WyWWAL4YO6GUKM>V-|34`*eVo z?iFo0U~%Fr{u&Q0=vq+M%TYVo1WuSg{r+LnuIT5BfJqn!Kn1|h+z{ShWeS42Hj)SY z`f^7_NC&N9T?VfWYG=v`Ig#-@g6qQjrhqXDda#0?X#Qs&yWGuVd~h>>M@nF^n*s-9 z(D+dFi}r=_WL?LT?B04_lT)R?5Ke%{Uhe|>IMHy?l#Y*=o9 z$+A?j;p!JU9fJwM*tT6&GZif7f9oBT+zw$lcg{mseeyv~l}>havq6vmRH!hqD)8?LXfcZU8X zH16>ZDJ|V&(cTM*p#!oqH~<$N+Ou=*8gVMWrtmD|+JjvYpxl`h7uUj<_oJv^+f4bD zBS~Gf(^B?)uK9c9QyrUlh%oO;a)2)>H2VWo)8=cvQwskSEhF^J4|di^kToN5DJjw! zgnG?34WNN>bs%u;v%}>$Vo?&f8BJ8sJ5l6=o>8mRgels z>;)}jk~|@uqq_tViYi>Vt&*k5y*#cKJNlaXUwm68!BDUq>D>m+MF0wBd=fe>p6`w4 z5`iL~wi&^6Pee?mF}={%*VpEl9kua#c9vwGhcCEU!WX_>k@5R}JtBNS%)QO^l~3@-yfnm0 zb@s>7?h`+);x*r?2dCSjoeC(({>N?81DGRy>mE&}y<-E4*ZQChg+8{o*^#%{866r(6i;rP+&6 z&GZKnQgYqBqx;ooJBszV6md+=6PE~8-GAvAf7o?T;OHK@*bq%Yo2WGSJ8#i#8=2#S zuWS|H3%4&3qruZs;f%t2IZpy?2?P!2F37zrZSPl#T*P(fZZ)L^jQ)C?mi*PX?Gv9j z4@&l-sienK@%BLJ&ygvgO2WDG(p5)Qw=yF_#NciB@=IY$x0GWNp<#nO4+mA*zr}XO zismgkEj$$$52}Jp^33p~W@lxc`)oSPU0poG#}}LCG+l?6vT<9hptT}e--=Kk(9qJ- z4rU03_9@>kT!z2sPhcC!^uIZ~BY(R%rmb%`6W=nd_iidNJu6c^@A%NL! zIa)vrgmyuTStwf&&Z8InG=abt=v!)PdxmoUXr`|)inmWBr_~Aq1@qkIF__pn>XExs zQyP^HM+8(<6ibVGNsykfJcYJT{T$n~)hYN)$i>TWQjJ9I(K?6sBBWE4T*}I~sUk6t zLJ1z&BX)Il=7gtPT#Rd6E&#P6_GPPR7VhiX78Qab~@iWNo+IC8bVczq)hxTg}>} z)&X_kgqA1sBih;Kj3WX&`Q;o&e9@~1Lkcr#Uf!dVW7&z)&wyONtRkX)dY6fsIsp8c z&vOavUy<}0qyF7kn@Sypj3~>{l%Tjcn)j&3ih6hy2j74MC`TO>B2=g{tU4$4+)1$? zC9%fv6VNWO0(A4sKY_ru4EucR1Rl&O* zM$d>yYiuS-?tA~3BkZCe%O zzbCjb035vCpA(BYBxF@x)de2v08qFCMkb9owYAVdTFPs}!KziYO?jJmju%fraEKvs zC)rI|^nE^_S%hRjUxY*J-a=mG!L`qepw=sf=T+m`5Edtq!u*TI9~)IysV&9C8>WIw z1m;lsu*zzRo`C4YeaLgd_ev7#@5SgIv_LFntBsPOx2*f&rq>Y?rjPe4UG-!Z&gOpU zV9U0(YXs-5$`VcfMOA(umr5VS8x{Q8-+dk`u@H>g^+vexTv}P$~s4}El^KcpUM>kc7Zekj3iD@PS@8X?C$G`?fFV|>lx5A zf{H^7q&WQnan@<6li~98Ds0U6c0@Qx+TY)KeKxN7%G>?<#bffgCr~6;*!7_`5aJ61 z>9#D1bx2BT z)KI_M7a4PSeTZL3bTj0ZiopkjW65#aJ2V??9s#{LDsFCk`4L8t72u&@U|^sgBcEd& zB?J>$T3QY!3n%Q`%c8g+t}xtcRz_5qN-1wUpv2Y7-C1?D7A7OKaggcu#R}MdUTtUh zBxGfm6C{=EJ+`oSMC{(y%4Ix#cJS>WCLi>q7dGuyAvHk{vK->Hcw_zo4|If{pVW%R zu^(#!s~zBXW2@p?ECHLJqu-PYmC6alNQ7)Jt?_uopUAyO}=jYHM=B8}|WM&n75cw}Y7QkTy9L^U<`>7&GJ z1oNtgF*P-iXbOcVIcb4c94opy5Fh_>~ocATYi}%#=`X;rNWVpUrKm_j&$`Glc<&l(4 zxG>E5q3=s}?@VdEe*d1_p9Yyd9Y5b{77Z89h>Y5g{gSvI;y__u%@i9+TSM~xgo*-k z3fSQaKU8vPXfw?%C4W83mc+uQJ+Wi=MD1RGm5yO|E&Q9q_TFz2y-@r+I_tu3Ea=71bfKJzXCT;tF5|7B}xSoy2GP zq_2;mu2FrhwMCdrpe*6-gR2MZ=DXfNn%-i*h#^zcnR=y#_KSe03SK;Sfj-Xr2eP%7 zcNM>(N=8)FzfKLn@T%PYmMr3eBGV}!8|6HMU)oXXNqKqswXiidN(}9FdwlrTRJAb^ zP)XByf@uOszT-uTx*LWTrj~tRt2eZ~IDFC3+Un=Wm0zHshnIy#%J~J$8hKA)(-}xR znO@PkSpClVCFlgx(9+7x&dxrLJ>p-Hma!4ik0g^SCYdPMP>uUV9h|9FINglQJZu1% zO%TrJ$81!WAFA0T@Gz2~@^X$Dx1FJi$bxmEI{{?igmsbQBK@wP9!sP4HZQiQBjfCj!S*jnebYJ z`CQy?n8N+rNy@<_tgJz2@s&e$er)QTWvL?iikubKF;V?^CkOlP0F43ATfG78SCInB z1#?xxmp17@=dBMw`gIix7gBzfV!U35CUbLE+QavYtl68m41tjY&6T0Ng6uR=*uTdG zi?FRR-_Y2e$QDlCPs~ynOWaSKk)4yhhLq*_;wcu)y`|^Tpn`$sED=kIL0Xoy;ZR@gy}-x6|=RD?lL{-868dR;fT<<+fY~7o9o|xq6)H2V%Qjn zSUxV)PgS;m=OR`TW=Lm7ygYH89_k(m)L`vb3P&g5F6MKSNQ;Vm z+I8tOG=a^DFqoCfmL#8>B9py2osJ3 z7uRS&p+DHdtwAaAeR0eoK>AV9U=s0KQ)|+Dt&7LQy?FJi1^f>n62El1WU8sDabnB5 zADCs%>C6@9^^0N9te5CsrvDZCQA~`Mk+C>yWDL`uKJPRKv8a+JWon<1pC1uaU-kv1 z%qX8*Z)m(XHr`V9DRpsnc|m~DnkE!FIjtnym;TtpkQH_7$1M7qh1Fx=f4LhINFc+vLmH;?iwUD+K)};O2xU;?l0qDi%&6pv zcXSxurKYyEbx1du8K>99#3+eiI=-W$OXPxmr&1_;OitdR*5E?$b%*VH*4CO|P&t-j zAridR+H_EKLB%z-z427uOLtd?ck21%+{^Fau@O1&tUhi9;ozQs1=+jp(bM5+#eCdp z?aW$J0Xb?cLqrzXEmdRb=GK;RzqgTr$@l8m>>HU^0JXjiMYw(B48QP4`m2}G67@12 zKRPpLG?VCk{`@ht;$bJ7VZx1OHkdPfJ{hz9;&u2yaSCY^!9?J$)W%|(w)gj|EC75t zY~_$3`Ib{!d_iU1ZRm@_u{Ks?OZSKAW@;If(yfOe_S1fJzn@5cMtyoGuT{H z{^y6c&Z^pvE>FkbraGU#)y(5y(ss2%Y8j~%UY(SzG1^lL4)?ze+n;N1%78O2W=x5% zy&s*e&fOZ5tttvvn3SzkV*KvKAJO@#l?7EP;rs;ZKzWcR6cTY@Z*OmHXD8)Bf9%vy z3F--CWJ~X`scBinwmxpEU2M%-xwyEnbF#m{z~HyCdQ2VZZy=6WYB%-tIl+1ROfAnu zfqG|OUm)%ntM(7z98Ml#^x%Js)lX{dYg2N4HCxnqCYw9fmst7M^p^M}6V+|#w*aML z0qwVM(Hw4**g`@mz}d^vsK-@^Quf^9iG}UiyPdT!suh00!y@3XQ3+Cq@2A!WMs^h* ze#=H$BUB}mSQ4u303kKc%P%#DW_1RvC~=>}QEco<>tTZJ0_1B)aN;$Pv>YBiM5Z*N zJyGLB@5Y}3V26|f3!7f8PD~!1P2xH^Ekp4Z zFdkaHMWcr%CNfjJAU-}me0j$=r7#R51Dl@ zN)^rXwU~FIq2ELlLoVVc7#Wmb^ScVQRGPoLJGWmh)cCm2@fuOoG%v?VN2UZ*FH4G| zjo*gaXI(+>bLVdn;r5(Q`pc(iRgJnMG|$pqnXnbVeEB)PBDtRH+S1(oZE^8MhubX{ zDCzF2piM@Md-r2&YwL$Mq^bGih$;j7XJ)mDfr01lw|R|$yL)@UR?*YbvtnS60oZiZ zYurx=QD56VN>Lsmr&X``9-b+&v|{YxY_2yQ?hbu@c6lm0bOZP^45Mk;$kMJsY7mv&FaNgj`FvS!46sktQDSZue$Hmr+G&`gL+wp)4 z@VH$^)F6Bo?9@u!x&SEAr4jODX-uMu1!SZwfjev#!`rcNc@4pXHZWX%U?uDc*KZ|T&R~K1y)5OH$L{J_8(y*(uuq?YdoL#Y zBSPlH{3PU7Tp@l`wP~C0DFRV>u{!#skS+ZuC=^4xY=JM;M&5qZU-2Z5tC4@F+L8JO z074E94ZS0w3+iH~=>8(yJlKQGFRF@Ww)eh>?yEFB$}+viTc_?%gl1EGn^Di&G}ux6 z{IX<57~dC@uFonLK(D+`FWBX3YN`nl)G7iqC?)~wF^8=Jv-bVC`AoIjTF$sbhOZ z?z!=@-CzK@O=LtwL~8j_+C!=0PtG8C6%K+D3Dt2)F5=AnksGe7l;x)5eP>&g>KQD8 zf`Xp~glKFJ0g3MW-GETL-Pxd^_zENQUcFG!^zlKi=4{xE!Kt{d^|jF#p`wAS#k5~=>z?FS?P^vJCDMJ#m8=7 zmB8@b;C3wLF80FztoeEpoYE{Af7sOfg_ z{hF%~3YVC;*dfH_Q||6c=1s{ibS|IxjR`AibY9DBA4~6dvb~wIuy;*h%l)``+s}#9 zzvpX=W}I?K;ixQx7R)*_M3rj)U$R>J0q)Eal;!F6lu-6Js|gFcT${ z;Ewh8Rd@m#f@ffLcQdB{_8cC zz-af%W^7DoXp+QaD&$XxV4A7XXCIZsog}Hf=?d-r8zfSS%)wkqUNLd;pCOV>gM+_T z#om1c{N__-&NP{~H^$>7tO^QIYK;ZT>8CT6f~Is;59`&;-!Ph`o?KQYH#{;H6Bqa1 zim!2lurp>zbNG4$9w^mJkJbzvJUp6Ke_p&n$u056gL%pr>jSEMfLm*QeO(Tglfmt{ z+9mDt{7uA;Er{|6-%DP<*IlReLA(DB+$vij5P=F-Q}d@jIhx`oT*m>{qXp#py?u{m zp*sOPC#O_(37+9V0vQui7{J-rJ&IBg4hjxlI$eoW9T^#Z^1K?lltv+)JF+#}P+p>b zLOzdw3>j#nVm8`Uk49SrJk8vXLsCjik@UI1Imv*k@a-swGcqyh6hhwt1Xbg)-@+9e zDWK6gZ=o&`#5DY0TZ0|V_u%70=?Mn=M_bE*p})gsnOP+J@hKNp-^7P*V|55*_5wss z&#&+^M14O%>7b)+Ki0+ZN?dLYey8bDDz|t8;Nw!;5cHt>9jbs>U?8q+YDq3en%Zp* zD%j?;PwHx0bgbo00J2Q?qzM5@$>{IFAjG^G03vDR9UTemYf!5DQb1U2eLVp2e@!J8 zVDL=2R+|P6t0!^^;KKpT1x`_PO%OBeiK1$6Z=zv2FUYlj4i8v@C4h@YrI-{~yyzmMfc zF}rt&(IX*;0h`EGpRLAm=hKSdvvU5x4Dkr(D_oZe#ZSI~a?Rq=+#i!jMb)8d&&CE! zN~y17rsLKp<8*oXc^6swAP#kq+o!KsXkm`adJ5oQbswSl{wk1w#{bGT#u!N8KsACH zxs6!NRrmIB1VrqNG|vYEo9RS2UO}bRre93_a;ug>x!i%ol+A*KjxH#SOl@;Sm$Kr+ zc#i{_XqD7RZ@8!9!NyS97a;eK_M%&4&2k}KMIMG7HI*UHOxxGbZgqjVA5I6!F@;Xt*fZ1Y_Sq}jutYgGFoF>4%FJs8H1osL zgTsL&1N?@h&+(1?9E=@)#dP_8!g41g<6nS~9;Gqw`^JFEXea+@!NTQpxeh~8XJKM3 z)lzZXpygUOd!CqGmTFJTfr?V7Z|Uw&^aM4L1IFYhdQL%KoO3&WRZkGraV;(Mt5#+W z{YgJQ36Eq24LsYRXgLp6s$_>RueatEhFv5I1^V)A35km!`47VRpknurc0poQH5ZaH zE5D_;HVyFZ2xjUNb?E6W&+CZTyEaG~+S=NFtOz|{-)Yz$wfq8zWl9YspbqT|_i?!s z1w#$Gil=91995od1|b`M*9@vfdSoFWt+9R5?5uGPf+c-PjS*ChcNZ*&GN$0?|%6m zQe7=eiQAW%xw*Mx;UeiW#%GVjTrR$v_8Po$r-Ivgh4tRvj(paU$j2w+PkYC&o3|0B zq6WY4-vo=Khnrs*n(N2zR5#zzgoTAoRvDuX4KXSyt1Qd+pYW;^m8*z@$I6|^14KFb zaR&ky(V9RB`+<_Zi6q1b8d;H+Mn@$R6Wmm7bdXYDDbH~g@%o1c^XMDUy2J}$h|7t% z$EaFHT0d(|$X9KMBL@;PD&ejYRM@TIx`iaR%@@GUpP7pOcYJVCZokCD#Es?$xkTX} zOMc>Gtw9zf72+kfnzExl!x!l8NUW~2_`vAs1>!HMrdk&*9QSc-ryXsht3ea}xp5S# z9|~O4s~_9uSjs@oNn>{mqPCP&GQgn@x*#^Ys-fFXM{TYV>TgTW0OAnSyko}O~k zjm+i0O7rm)^wXgS8n+v-hbzxM*8nuS26?KYOZ~eRK!(h}z7i7lFIrm$3iy06*h&!4ebg7CX z2-2+I14M`1<~lbSgc=klyg;0$QT*ntzHXcu-5y$N+IJE8y77gj2D~cX)5+;C{Qq9U za1OY3l-`bMA4?(kyVhur7o(_T7^ZcHlm`dU0BQ2&0i z&ixgfKYEm(A7cR)^?T1NA~|c@eusF9cPS!5*bov7IZjSJy}GK6g_|wUMU_+p5Cs|j zALN}odXI}PQepwh%Kmmog0bu&$7*lm^|>wiB6q0tkTTmqS62lZ@Q-KJX@=@j*`5I& z>yBx`7T*8fpZOsr%Z-7dD<+m;bRsPp=fnmweH@Ab~7WA6Ul#`6MSx2 z0DNMZ(UzI{$>G1B;_=aZCM-1Lgl@j3tU$ZVzDAYJ&5BO_#&1P-Y~JjE2K^ zwA`NlZJya>_|ZSp{BUui*8~IvJ&`mNt?s-LCv@Wfa18$)WZSjq|IPR~;1+BZE$71p z|Fv%5f)`(f;VzPFX;j5aV|CNsS;D4jz{eLi5pMJvr zSN`0(POv)vedhmHZ=FFQ{`R=Hdk{_nQq|P%J5f!5C-zwf)6ZBK4rk|$bkn5&?{x{e zB09fJcYz#^8j-aB&>w$V1ydxD^fVY%x4%5mtagjvNoUozQdCTI*}{y{QJ4Sd*^%z^ z++ya64EbVYJK8Zc3T6~zvH$F_pWJ|1w+lnqxcdgH=zIFNc+Kj-!?rK4)u)?&i{fo6 z7qIfH*J}SUqzt0@&n7*>)qBo&H2oYo`FDRsY9ZDg#MF4vVA>3?r+HC!_^(&=&)OG$ z1bG>i*P7E^MTm_rUfsWi_CELXYy!U&T?}_{)0`Y|oKVR(*aSC%uv1(44qHTWUn&l)f4;r zcnxE3kES^1*LZw)s=Dsnr32d!3r^dT;S7VHSX1L81oc4AaWjA9I+krw4 z-RpQ;57rEqj#K)D^YR`LoE!KBy`tfzpvVMJtgqnE(9kv)Dx=5G&m9~-cebs%@VdL6 zy``dh!pzKEt@OjG!#m(x4{WZ+uE%Bpl54!;6G6F-@HO4Loo0`joIGl<=sldw$nbpj zdDs5!r^Hl+U^XUdPR;Xc`bxilR)p9R2nw4$t;1}#;gbVp@SI|dy)C1*$8Kv(InD~H zafVoH8 zpF?_D$aI=g2BH@Dbr+af4BqXhh7Apyp)voBh3OB8QtA}cHlW$^x zU~9e{gE~@VikzA{?lK^15!9bFzk>~pjHPRR6pCXr2iRxojLgjP72;xIdLY9J>g(gV z91ngM7KYd^wUk{}VG+z!whtb*PpsuuXoCnd^IcLuxO_Fh=J7`5lCBUl_Hi3e29kWO z3i5yl4v@O5Y}RlA@InNwMxcc{mp)$6nq4x5)o<>9z~wH=apF4IvaTLHZ8k=jX6F zWpDL$>nM7cytc_cJTkmFeIje|2#G3WuG%#klX*r#bUgN1Al!r*6P$^-p^>nAq+JMVpe|@tU1LU^h3KkwOZyaHCzx7I*tD#Kg zn@Do6cDVH!H%-&ksd8JR2GvbEN8hJ5H#dJpMF}q4d2#G{3YyMzbx|S=Xlen$(^p2w zwdd(Ga%XsW!rL06+gW$c14T|ST-z@1+4=oj>(-}Vt&y;8T3!@zIL}twD(<-abh`NU z(-&QH%Yz%+D#;`H83{GDNG^fbcZ(9;4T}%?ssb+!4WD9Bx3vm|{0s>}X&NYiL)v}H z{oF|7pl&={o&O2kEi^$Ep~)5=JHi}{eb6K=voJr_Ja*l{0MpKH6=(uDP+A6LPy66o z(-$236T#9tHi67cmWJ}R&mj2G7{J@7>l*)Z_2&lS$y0rllmPR`^0%}~3Y<1&;!fP@}_ zz5`{pY$hhV*%_;+>BWW`c9eDZ_}0DggmzoM2#ZRR80?R?+nWu&zdfWQ+_w;MVq2=* zxoGkuJM|d((NoRk+_ZK za4ZB83O_3}k%aai%Zo_8czymAunSPoK?s!b1Y`+>3+^Xa0BUR8#Ft{+d@|21%R;J=zSK}cclqL;3Zev>KfBNHK8El!5|Qy` z$(M4TY}~Z}b}l{4QNa2NNGD27p$+&%niA9RIXUAj8}I#o{CEWNo{(Bc?e*lwk^7N( zVBiBsw&mUg3X?&zIt~;#71l$+cfefYV<{N2 zx}rb_IHD90d`dT1niUtFc^lr`vY^GCUy~N7bH?wuN&^be*82_&EG%!4^yLvANGy*% z69Laq9|kTSUMGzA4#CLf8PAh-xb-_o;u~3tjc#ZA!rhD?1b|n_6<5OG=`8|6iO0dN z8v9HNVTw@YfSJ=#+^kSW{IP8jr zfN9c7SSa)xzsSYJU@Z^o#$CTZ8ES-v1?p?M_Kl`g{Nx$Hi!DT*BdJqhKF`D;kbe;h`XTAhqD z+x5xIv*^?(S~ZAPd*?K5F}qu_tmrIC>9E`La6~c zcVJ*3hn><01}!#6%wS!W*3!R^ET=o3JUZpT+B}$2BH5S{u3i1o~Yu;GYMmAK5ShJsD zFC`DcqlO^6Ivjjz&B(99#{UGAJOI1G!NEz%%*;jeBw%)lU>c=cyb-YADY(v8tpw>Z z(uo2H#1pG0I?aVu67AVDDz!Rnp3GEBHgk#=zSBIdaZuxJKTMJ3^$;~%G+V1-Of8(!MzD>vxD*VM$_ z(`7R=O;+44bZ+dw-j7s2+123oIL3@dU_cyPUr`W2F9nfo4BXcp+6!rbIVJALk003Q z<1TY2Ie-)c9N*o!gH`~*_eD&Ml$-c_Ru&~K9UbUuCF3ObnQ`3LG1hKQtaXIXQms`; zDr;p+6QYJ30XW?+UgUJFd+s|5NfF86*PGqkIZ;tjeKDNMPvSf-_Dy-VMhU*^)7+;5 z$R>_yLwg3vb?6;xq=-PY1i}0F@3rQ9#6jx0E6RLkYqCMTVXhXG$jiF)iR0h%rem*3 z>Ne^FJ@lY$ZO&8#gK(nsv+i=o$(YsE2^8p5b67vKv)T9W-Cl6QhL({^sbp&+*4<}@ zzF9V0OH---^;f^ZQQoyy%$+)C2Ctbv`uZU0-Xj^EErNaww^T-W2;9pLx9QF~gKKnAx9gdphMR8m!CwD0*0 zI^h6YJBueYsT0(qJiwlucJi|@GclFSRYp&Ycq;*UlqAnRd3Qjc?@&c(Cp(qlQP0@} z0}5z&zBqPtbd;8VT%$6GIahvVYfvA!?+K{b>l#*%P0Hg|^~9})(q&OYZA8BE972)BU-7ol z7;F}Lp6>8s_qruaWoP;)OzZ8=`LeahuCQwWQX$cF8Sul`7cou?!o%}THuLr|yC*y< zs%`$nsyD?u9=@d(31CNnDl-7U+Lv~$=|Kdkehmt?jPF9vS<_^)ySlm-m(!c@4@z4p z%*)rYcZahfJ0Hvtz#n@sZmULiOawy5E1pK+Kv?aZ6Np4nCQ;aT=UI~+ z(ApBLXB1S|6KS6Dl#~}sw=_;TC;t~OQ1wUfe`sS4& z?D~&k!10m-#YWm@BM#4x)d;-`v+HOem>%4dnczfVlVX51P^mEL`C-jl&r;-coI1T9 zds*|8ljqqB{!jac&Oz=UPF(Y6iu|k_?=nuEsFrsF4acZ=VH{bk_o`72P8l1b4iN4A zg~q}k$REb1F$Q?K;N3OKj{CFOxar08sqxA?Q6Yf1DW2)N}liW$(Z|?KYz&{Bj zJVOF>-=ws=@Syek!S?}Y^)J}X8`;b{JAs+mGHp<+a9p3}RX=VE4jK;Lo6wkuwz*nZ zQf)H8%+jm@ z4#3`5$dE|-r9Y#nZE09Ix;KU13#?QCS@{wh`(6Rsec>k?fj$`CaUXc^*P5r&Kq)F2 zLviIf9nXL5P_mz_|Dbk6uzG3C?SWm@0nwOaEySc&I^4Q+Pl0S`h?(Uvwbe+aeuvVv zPIi5XO{O_PV3B;dIvyUZERTC~BVH?+O3ArG1C+jr)F<_2UJw_$YA{1L9M{#pmTdaE z>MN?L(;&oo^Ck7&Z!GPf&(ns18r2X`AH<7IU0ZDf2&c^&5un#=RegqqwSBx?92{#q z^*a$;H4RqlZMHk%b8dl!D%kljW4Xdxp0kR5lD`p)BMT5f(|Qj zoX}S=34B?N0D$$=(Kpo>!x7K#>z=Kc`GMCB_UzixT=xdbOF1)F<4)13U$9UnaLEJU zCdA__sd%INSy*6Df`{;vp^na{`0@M*dA{450lg`Qt>egt8w1mFab3j^>ib-$H7;^@vP5G` z*>-0yc za$}3w!&o)4rcT7{OEsr zptO@*m?1=;=r44Ib+_RCvj4e%9GUwNt^ndbv(9l{K>hgGeOr89=x;P~xlzCeE&v~d z023J244&UN@P0^?)yAH`Vq8O!mBolExbOvP6{PB&L07^QQ~Ki&r=JI*x;+j6>bciC z)^p$@9;6;cB59ie+$^Xgp@s{>`;elPfnE#^cjhUP&z;aVHAQUdQ?^Y;MlXE%)NcRq zNkDYLTYwA&M3Eo>)dfYhO0^ysLqkJf4ZeM=>~5J&KtXQ-GI(+0C_D>DZ-7)YsM5}a zD2@km(VhF9G~PV^fq#HPBBda+?SX=dfHJk@#)Qq`Vn{#~Ed@2TKL8^86_FqYEVKkb z1K^DMnkMxjwW6UUQAnu%=5h>Y)Pxlg`I+wK;^)G9aM2=L|h^<Nc18GcG`4+rFD(0}A>^Ns zx+f@^BNiflm3Ca$2kLYCKVCm9Ha4)=Vjk$LW)A$o#=1`K(4Xq4FTpeCv4~t@0;T~# z^Y9+m^?u69WN@05;C`5^OyKIuMacblV_>c}knjYO5{oi8I~xeXc_75_3J)(6?Op#f z!;Ka<4jp#jkbML=%>cAy++{vjMcxIrd8Yss1x`0jfJ&ZHc^p=*0?@FOngw|!OzXg+ zGamoL*ouO_3Mv|bm|_G`vGqRHEcvL&NGuW`^zMe{uO$HKqQuIR(r6&CBA0mwLbcWa%DYo3#*FLR^l{s@$k1Bc_g zUoj(S6N;ddjbji(Gd#LcRwh^QBm`YY3iPU95~o=~6@NyN?7Qho)7Fmi+z4kR%?@z> z$WYg%G9APL8k-fB$`8Uh&Qj-F-UtuwI%XaoAnn-dY!a_ew+H;wQH?g$lUpRbLDx*W zj`wlk8;F1ViJ@t})a3`a=}ZdEpqqr>0xYS9z*O&xhj;-{LOklp}<3Kk%2e=EWY zBB+%SL{U)#g90fv>TuLK?X^y>JZ=tmMLmiN;X2Ecx(NS`;Sz?hi1&XZ1U!CR4<9c%!Z)FbfdDRW87~kbUH4$wS$>0E-UI9`QMkDO#JZfIF?WF){^P?5A6gN$3gwlo?4>ynD0sa!gn*T z`nt#WNsl)xlqJgkiNJq)9149dCO4!NxccQ@{=w1xS*$Uzk?1e(*E-u2Va@6@Qd4z~ zZ|VHzZf*S^fB3JI;E@B#34AIov&a>5NpJPVYuyp}vQJHQX!ka*V*gEJ5m75Y`n>u@ z+LmI!!)M*;nqq0b3b*x*qAt5U0X5}EEsY$@ZLW0o7&MBTrU&c6?J@vG~FRw&6B zzB_-7(EjI-FYXy19&bk} zCl){8-xKw&%`*_(x-+2Ht2#9NBbf4#DYZ^S4di&xDwT8`%}wzn{S zhZ;N0JX#)~@Sit)`iUO~EE@mNq<6a9D0StxAxHRMLz7bfPw!BHP)G{az&uv2K@dOQ zMIy-t;qS!%{buu!$r5piw(M;ZNt~a&Lsr=Sd~j@@zVzQru8lBwOOH>LgF6WXUZ@6U z@Y8gHo5pgirr&O#`G=aUnBD{C^@fRw-l9Set={0d z`)=JvyGvZ&!286HBn`Kc1dg9{h!d~TmSzEk{lWxbv3>I7nJdM1VnSGp--w}KK!_sY zwOv>AO>HNIBGYW7w3OpjcQp&pze>^k^V)yI%Qrum(A>>qGB|IFM33W zQ!tXKqV4qkESEJc5Y%Fc93g{6R%^we&{w8uTu>t7p9Ng@`UBFM8j4_E>+sbsX|#|) ztZ_p)7Sda8kY!rwrh3@gGmKy_h)i)iFjS;Lmk)9ak4e4I@OSq#Oo@cMyK&yE?_Tg4 z&n;I&({sl*x9e(^Z)+Xgob5rGFRMv8t~&(s>QxwkNJ;-({M&NX<%P3l+b@sd$N%iA zpXgCw^GM=sy*W-7(yWQF=mr6$DTfi?!?rH9NNqzi@m!r}n@TxvBn+Nky3}!Uayr#0 zf=3S-Gr3=keMC_X%(iowBSwqJJxmJaAt zdAqzs;^T1%(ez~eiDml1nqiga^}2x^>@-Dj;v9q<5q^b+HedB~vAdm;g4~Xie12eg zB$<%p1>=#YZjvg@^&L$44vJiWG}kgbn~+0TU}pjgm9YTP>^!AXzuXD0pFshw%>%)& z#p{iwGJTHSB!U^Zwgb_|&1O47S2Bgg#Qvzo%A9VE!_&}+>Vp)NmvVyv37f^dAVByl zq>kL0z0(CMpoH$E`zY`YYXl&`0#TpfG%v^)WNvG+0*f=YrAe3KcB;XY$kB_xsJP;{ zwO37<(J-I0$6?pO=5Q*jw)WEQyys6#!RJezn)h#6StDzk-|bF2{z78TgtH=FB*v?} z>jhH`G+xU{YtVCZ73#BO4#y`~S1wiZIZfNoR1XVOQEhFR$IYh)DDvY$dx8Oo!cr-W z#x~!&T3_!WYZ;Mc>Fsb?s-Cd;yhjDdtUheQ~_6zq+-plj?oAcEKkSovUO+DrDQ!6XIf!(|tSwRMLN}55 zxO_d-nhkpX=C09;O&8v+U4kuJY`>v_>pGFHnpvS%YaL)8?^svV2RZ-(3E19%3a`eb z#G_+7!w{(UU0f~BR}e$JW3$Gs+@D=bTMxpStmFy~cIZ>CN=Q+4w6S-ankt_01r_T@ z-JSi$BROwCE|&2;nhHRP!&_}=Jl6G$4QxmvM09aXw-4yRhgio6%NmA;h90$)++Uc| zxBGLRT&6UDL((_y343qZO}%z`>l+MctcgXUsRst{>a(}^d;D4PluEU86*xeN`11YU zoTDA4Jiw4JbPS)flX?4t^v58n-KQtRuCjbv#MH#!Qy#xABBpkb+FeVhBz`OYkuQS& z`{N(flrk8ckG=pS_Liimh%}Y*G3^4BBLQ$u*E65QbD=s{IU2wkaL#HAqeYOAwp$%F zq^+cc?Ttp%4jPVR?l|U-eLLI^tNl?fOr`Fx$Np$Xyrxr5mF)1`8&ueBZjFODrh>Nm z{40A?;V^(Rz+$NgT~Lj=~8He8EhUWk=tG+2=DU|HWC~h+}C@25;*Jr&q!lZa#BHf z4)@fGId3f)Bz=vWX6|oP6>{ava}>vRt9hp6R zXxe&Q3^j;_i6BMFHD0?+YeHjTX}EJ5isujP&&G$ff!m8FtWl?cj1&PTffDlTuoC$FjY2|;vKNK^(};S;ksNDzw`&ATx)5iH@&Af7%i3T z(qR-0BetL^#MW>ZdI&e~tOv24Tq8Y2r^#R9Cn^p}c#8UL+*Frm_?-9NA?w7OTAsF0 z+v{31?BQ-9mC+gfahdc4GXObCh`AxYaDZTXGig7OOc>;`B0$aMI)h4%gkxE8$R7X- zIhM=7txv?UxxY>x-c9Pr#&((bCYv4HEk`-O#OJw7SA#pRrlvdN7M}gqsD^fGbJ!n5 z-{+>Y@eIj$9F?Yp$H#dtr%Mer`Ja@9FW)VJNjY6U?8H*w{2W$hs2S*R5L8_0o?Qd{ zFbzPCBn=+r%xYo&99Jn{flj@;rYnw&EK}|LvH{1FS2I?O+}WwByD|ofHP$uPFE07) z&D((Xylr{nGJ2O%8QBq*-Jv@hduwSxdk6j!0BYqOrmo%2xv@@;qB1i(S?ixal?7D{ zNKuameZ*CRm3)cRM?9f z+m(F=ovtDANSEnPpoF%5t{Dt!SCNV#kB@9oc=vm^)m5__z7X^wgy zYI_!-iVVR{YVyR?)O2*}*ShH2nPfDP;qj_kkLKIY3n`_`O{ZIVg{iR#Gm3`a`ExMm zY!@~<<|>>~i%1BUPq6=y`_*TlxHm`SI#dzQVu!ChR%eX}MgX>E3P|14aBv8W<;dBv zdsfO*<^oVX0(Pg#yXrW=N+O2WAf@0?@tlw+NATG;2d$-2qr_dc9|!jLsHfCh@6FHi z{MTCdcu^v0-vvyWq2H5Iv1k3^r(=+hPV1DUgply}GsGlKmr36SjPHsJz#^-{aJ_vZ zY&J2{MUZpMVu!)vSSvYH5Gv{>7p~h&MF2vQa&6f=erdB0@!-5G2jMYYp@U^;I%|H+ zH#-dI;L|2LJ^rjl$T_=InT|y9vJ`11BkVjJcYrB`d-{0^Hs0IUQ*y7?*Ew@{vUPED z{r1Yql`BuPuX7{pdVOt6dDS&@1w-#W&eJ?u@ScYLmIVKh=;Xqc3UR@-y840g(&LHp zD~mfxPJ-l=SM9g*6=E@J>gt6?_x?6_^>+hL4^QMl6CNlMjtmXW2C*cQ@mX)AaZyod zmC=kxJO0f1>FKX_o$;-UN3nsIFnd?`T_JCe^P37NuctRKb?EI}f&4o@K9#z0K7-LM zb0>RhvJ2Z-Q(ZOqMaxFFwUG*6E=^vFsCCF%GQiw4{b;g7hm0sMu)_m-S?4x#oe410 zJ?6g9T^PseJja(&QK

nz4&>7q=}0Fi}=g^nKoB)27XcFo*_iblss?t47UdOWL5HVg%1lID)bTML z{g?$K5tv^#pSN zB4Q#AN=fnYxua!vzQ0BeCH?Kb^=6Ci#=Zxm->@08-Ey%}zpgAP<8#EBx2=Sa7ijU*~}O7*00>*!-=_w)fEU5kXV{ zJ{9!5P%&Sb!mBw2uu{r#Rz-m0o4>F*dH$P>=4`gtl8S<2qa>tR=K~GPp9l|C?7gBJ z*k(UiHfqg^zOmb|hQOMLr%xj?GkpOO`9{&eG^&YBYA?q^2lKmiQ1h|dyDX73>{k^& zkuIp17ILRJ@lkG0MFqQFd56theg!%34iQY9)$MzP7nOB0J7eQJy1ZfW?Z4sC=T$d3 zS#uSo0r|#hM=epV>BjR1HSQCnTJF$F{*36VOJJt4a%0ZrVC9HuAQeNsbiWk%I zxQtZ&RKpeDYfy`o{bY1)evWJBte9x$R+1t|`?iMDdAkf4JMTPs7eslS zv^N%9PrEO={c~hRi&4;be2Jp7gj*@EvvPqdG}`Vvh>VH&GeaFQGVflja(Kc7OsHl5 z%)0aKY2gERZjEG#3l)HLzdd=x-ha6y#QHNQ|FCEbifPfYb%TWv( zOmb&bsds1<2-&k4aFmitp?zIy;8w}UF;&eJ7x?gOHHQjL^z`I=0UTLgzQL4vc3psf za&5OXfXY+kEI6@tb!9KV=@mSnIy$s+Y&>-o1+qY;?h|>q^s}_>$!G@kY8B7j$?T7} z2ho|nT$(KphoFE1fp7MBKmu`~t50qZmC($(!7$lPj(NRr0_fj}Uon3M7iDnoF8Ic> zQ6KEO49ZlW}x&oD{H^h3P8VQtiO zDT5$|WIOg{?61YQL4+J?BL)Lw*x?yHb93V2xPsY=6E_qqAHbvlRb$*WrF|N|8n1|rL{KhRHn?L^bwlyqq;!lW% zggWQKkl^b8v>$h&z!?>r=H0vQrR-V79ZvS^)4hNP z{8Tr$I(d3-F`kV%)#Jrf694(S{<}7Vhn1@uM~i53&UX{7Scgtgw%J!W+>#?*TxZL) z+nno<7(z!n`aO+iRnzXIPgcLM(d@%NR@0qv zxJifcCZ<5Hbs}OT)Au}Y^RaTrbIf})?yJNDrt&~#sZq=77N^V2k6~t}GC*ho42|4z zx;QC2HH=Hi9Ih2U$iBPY*CexF8CVVA>s z!V;xE%m+ii$-aG1oT3AB5l>V?B6xV1c~!MyI@^|9F%LE+wx8Mi(T5Nm#|BXx1M>JKNUvv2o|1+-Hmd9|3v*!Bz zRR28Dh2psE_jp{{um3-I{%R?N8(C+CT&CfX2fqt!*tNAa8O%jqgZDUkEOC0pF>6~( z?;O$5V*_s%{yGPX_y~MAB!G!XL`*D#6zk+XOf{u8@W*p2gzNLpEVt?swlN;ndD2x3;3wy2007^d{X`^lB_KlmeNTAiHf zd(A?)SC^KuS4ZW@NJ+b((2y5@x6fNYSGeV;Ys&c#_w~)p1Wdzv>pLvT3jVuX47>gihOGzBt$sOV=gf}Op>U|;5yVW5+NyY z>?$TNcUZ$MPTm)zV9(2(ezqf#h-joLUD%EqJjv`Sc*a&xBse~-->Y9b^|Y??-T%?v zcZVgt$N$>W>SUf%sU1scI7(B>9OcYR4Ht?cxf^P3bEk%!va&Qs&Xc_^&(B@{w z`Zf?hR4FO!nf-ttPLlS>s{mJ<%+up}bxLy|{~QGVH9 zC>`A&zeSwz7zkF$^0rTOJTq*!;my+whp zgF1b<9u*i!FZfnhUAQBfz6!?GT;K1_6ux90^(|Q6(C4({%9LIv&LvW57neuaQp@sQ z!sL_OLd{A;mWJw=&}S}czS&-6?iPe}hX|6gUe~QI7F+r@%KX~YtnwQAM=J(r+Mh%n ztfeKQ zc&pNdt5Z{sti`KvvxZZ*Ufe(tNG-b~JNuf?5c)~>Q+wow8a3xe9PqX~0es3#(~g6I zDqL5>GgvNxM>(SXuSD}YzkDI6B`!q~H<}FiTh@L#l0oaQzp)@h@Q&xzR5DML9?#R` zWubzD>%b2v)>vQfe?u`lVS`IRk1sW57OID=<3g%SaCQV7;5b%KbIiiV>uckIOX~6> zQ7LQmBeQdJ?IaS3Qwy3P`7e?5c*C>^!G7`K;o+e+taz~?zgJ|8R}q+BAKW`b)x7)h zrnWYVW!CJ+TDa1g!6Z~IZJ1Rwrb`PayI~G7hU?+X&^uZ6OVk`mBN2nRmq*ZuQ_3EQ zZn1Gvg&uG$KAM&im#dCKG(KQ6PD;Z@DuW`${#Lv7=~FJtgxIKWU_=^lnUGe7!huXc zH9(FN(~4p=IOd>XLvMN@K*FDfrD!}zs&XICDm)TBO9CLC%lWO8?%VprBz*P5+T<_BQ5trEANvkO^aBV+*DQ zoi%u>^x~N&`+Z_T=AeExK0#9?a4l^~!FMfC#c$!`XZ_^CNv(Y(oTKkf)mk8bsC&M} zr7g>reR~t);y!%sv??%d=4CI&3rN5wy8g|L(cCm7a>|Q(++3z06p?BL(=FpU>2u$Z z=a*P!@e!M?acM3j15I(~mI+FGd)Y-?Q7UrU<}`lSJerzN=DfWlabm%vuS$EE%A$A^LX$J?cCTnz)*_htp25V2-cfe{ zW@QHCbU4TARx(N2Q7d}mjt-*=PTn7cIB!d`VYP?X{Cl(VG^iLSbMmkfk%77i?^G$S zNl;6aW#Fpo*@fOOwr8#-#1=jzMh>z6H9WBSuR@Ma8StTr^bYf(ZsUb7A&!f!HqfyT zbiH!CYhdW*iL#eiGMxcM#cRb?I(g-hZ4$CHW9GhrmGg-_rcjg`bv(~cw%w5xvC?1d zu#zj>fm%qo^`)E;HEKt?V1%QbX@#D6_0^T_{pfP}HuBv2!1jetrPBlQpKY-Srh1vQPRu^7N0g+lP(-R#8QWaGf-m;*v^3rM@X>>n@#to!r|*!N$BJgXl$;*)d(_Ze znB|K1Rh$P>fY8?qXUuKy2!t@QH0rBszRDU5Fpghe@mF@eQ+Qvb=Zjuk<*q}tE+;n2 zf9tBFyuOi4ott4G=D_2WjlEoLx95zfATQoy+zPaU>wAUGO!ySL`v+-G)>;q(DOD=A zQrZ6xP=61;He#g{&ns+p9FiAd@>K>bJ`QIvM$Bef;e9gDn95S3KTT<;=59#?fr+WL z+n9l~Lxwz!Qdbf|`nM#^b+G7l-FgFR&z^bRmTj+XaYrX7S90K0$0T!%m$mVKmqqW`a;Vn||UucY&Z31(%}69kIq~ zp38EK9FB762e$ggKU~H_2hqRXR#)8qTbAuora~UpGDx~)b_D`4+L(B_#-z|_g$Mo! zHP_dV_}tu)f9v%z`FDmmMD2=Ee}(4O{f5SkiRY0eOu*bCtZ)C&s$yQlV0A<e5Sb$Yej#)jNOuhwh3Uv@zyI9sLC z3)^X3)#j|=+A&z%-q8`?=73;*HFE8lT)Wv!%vHUraJL;6wYY!{cD%&)G)SpKd)pXf z9<=D}b6S0O61!2U7DcnP$#4oI+b885g^2cl6~0No*Y%JnPV1E81Q!d}S{*9PO?>yjtTiU4Fee6f9CG1(kxi=ZPHdL;^6s`q5ag0UUl>0D zfA@CmAicZq)paaV^?Okxe*>O!BPsZa_swqqUnFbWG5^aNC@Az5$|}hyTZO$tTN4J- zBRTZdkm~qe^Ya5m!>N4=k4IoSiTH)w=+KqRr&t{&M><0;-4;sT_EqplQ1|=w;-P$z&?7uNf+W~2Eps7BYM9-g z?cXNy&tKApV`H!O!1w%U_8*Vi&GPpf&SDBg(RG; zb=AeQXSJ-WJo^DRUwiW_q6lfGh(i&l(RU!C#YIJzRvD!JdqIUsowKtP7fqB?q$OYq zHf3I7jglL4WTEs0lNfj{P&w7$MaYmUSmgDI&cyKW`mYT;FVCHKE6`y&1<&A7`1`X^ zmB+tg(dq($0_r;hmvwHL`_wSR3jj;v%v2Eu$;BU`)(wvf05i}Y@uw-?>q7-I-c8jp zqt|dY*KZP*C*lda=^OZu`ojR9ZeKlh|TM#lh3fEQ=v7^rw@DX&d{SNdve z-t|;7y2qI1xVC`eibd3)6&dcfhS!6X2m#4N>I-YXhyDWik~GM(bjJ!9gluMm*H86F z$-)&27V<{!3Gurj4N2PHMS2HOwHB#>f+hqi?P_$6i(Ponz^fyx-{_nl*=+A5W&JRl zANgLPUphWpYVj9?yEZeA2+A#=jJ^twl!}W+%Pv9efE!s>=02z`oLI`njYE#}JIvaT ze`%Ej<0~?83G%e}x@4U7*AF{V%=P&lM=cVL!QqB9dAJp?L#3#b^yDB-f zwOy5@;v0~7_P{z~TwW-Ov518U>~HUEIU}6?(^dYPbAtBec^4&TzlRvo!7ClkHLNx0 zAT(m+tEE{e{4I7k|Im7J4}ErQ;C)Is&{NNaJm5o|`0Hz{>{~$;&L{yX`=bb@y46N< z=;4^vmXGAvN|lq!f%iV!=r@7)$;jj*f1wW!p0rwxE$--^JY z;GL<8rXb(&Fn_G4WXw^K3$O#ad&vg@KhekQ;ds|UzmrC&3SIwqolf+a*QR&wxWEu3 zoG>J4_&r(`&1!onqPP+S8VtK=`&EiTR-B)%PEQ+4OGxN6X9n5zF^?_@LNhc)aNaX7 z*S6F=$qh&}gPz+Q9^(v}4Ey-{njsKzB8sjiSstlIY^HOSm@Q_RO~s@eZ>sA& zB}NG{fVNha0?N zXAVYJtY1-;k&;3oKADQ?&eYl~8A-+)N(zsYHjl0@_TqbXWEVe)AKkilp@u)c*UxE7 zr(&cCm75_fR^8%m0lZU!JhkQKkid~615fwyMY=C-vrp_qRy}xiuk2sP%O@2)+EMZ; zhhOfu%h=35qJ8t3VqlkHv0a5lVdxH$Hl#=6x_CCja>-9Z-Y9vF6oHcQ7s-d9EH;bv9kR+jJIl}(>IpA0O=KR7Tb8zD}(tZY{Sxmb{2{(=u}H)r6bEVVST8fjpE ze!l8#+gTQ&XQ7Kj9qQ3D*wr8M+LB*gju6KeOqY~y9au@$1kv9fD;WR9eI-J9JTotS zISP}x9ZB4qB#o+af4U0vkvL3FP7YXQ<;|HJ8~edf9UDK@_wUcDJR$c#>jtmi)Byf4 zIf-cR>XQD*A9jSRNXEvYoaf(mu3R~gL?5lTf1j%@cU$(fb_FnOZQ|LWHR^>cS4s3b!~iI zkRW7vmmvr{ma->#`JIh_$mkLDsWp6;oDOljYAgi87_EkVJ zY|mS()>nhSr_NbOQOZ+?BdZS$J_@;(C^A?PA+1cybR5VZBmXkhu@71_!p!Q zWo&7 zW3u**2#?W9X+OgBo;^5=VqBh4=KIP@mhbzPHPPV3WvR*_T2&+_RjI}nvouniuDV+V z9fcgvE*5@L0&EO0gGiV@8Ys5`5a0d>+L=9ROLKNBkMl699b%7QedV(u|g{8gfd#x3`@&MU5bDlv&lZf(c|ESO%BM==daA>>nB0RbGjb(+X z>sIR;eZ)r#4Is?$kT0-4fj@*)8cHBYID^3u(VQ{}pPevFFPXQ00(<>1kB4}TDyY6Z z@Mvobs3fCqwc3p*!o1PSsi(Yu+OIQg6H}7%gmt6)*66C0!JS^g-alo4!|<;CB}gH% z2INfY)`a#}X;u}^q>Dz_cuh9%u$HlzZX>L}M;g)L8rutIog798so1);(Rk)7KYjt5 ziNpqYz%~VX+q&9%OAArLfAi?~9WRb_0S>K^P5K8}z6u4`&<0>$BRcdq*ZbT|x{L(S zXhdPa!wV`(1_EeNsftJ~0yTI?YBj)DvAx;7CuX#Nb$$6XaQqQVhrHW6LS&! zJI0``-*+N&Fs;*NBvjlQm>0c`@wGVLJao2Jgh3hg#*>l=_Ths9k9v!Y3aqNGYGcGY z2hW?qr7t!ITkcFFMi)k#tS`Q^;JPQNM;%-!T}QZYMR7s-_a}4rHQi_E8rf&!{_-_; zV}80+OpY(0oI)T=Y6^iK>>k$3e3B<&ki0Cw4ZPa;8}9kaUtmPDNKrz+EH5t~$a}?O z5|?pO0+2nBc@fC(t%N>@sL~vtOAPquYG^ZQ1RFcs#1D#B`Ayn0(i)z$u)McBa1dt zHUmeN*uZ*EDZ6xfxvhTbIlFeTSvy=U4-4ApZ?V_<#{>NluKFo?XjN?q172z9(%7r) z5xgq}_^r-ke2@Z*PLT+54R_@}HOXn2nVFztA~r^2(-2eyfB^+>qeazA3i`2yU{W3q zJ$F_D=-IxSbZZZL9SM2)MBk(oL+%v-n zQha+*<_}-<#+pLOb(!}mxyoK4inN4%XvstE#{MIEqGoH(@qiY zpCHZnUf+PT~9-ixX$xcE%5-L*<~s37+H>C_Z+KQmzDCyztrs`xSR z>`*ZaeP~xCs(V@Lr{fhI8W~6!Yuhc4?gk7w5Wa7f`fUIBD#g3DR>YiGluHGjUN!CXQ}QGAes9*!2pP-ozpL-wkHAc%|frw#OeY=xNJ zzRgh>1by>JUO&vCYU^(p6jJlOQE*f+lYYgj+A~c5KyqJG_!iK9vm>>>$#ZDUjz%(| zsZ~Y@#JMA>SRZDDoPDJ)qUM}M1zkb>b}*K?_uxl|658Tf^f#7(JWVCzVXN66Sl@q1 zi83Bm1J{xLvjTeJRLBh=m2pz!8 z$0mOW?>J0&f`AcOj9Fq)$}s}&u8+Szsp5P_-*cFK0fxvY>Z*bHbh9&UCw+}R3dLYF z!L7I22MN6`Cbmh;0-N$=-wtKa6vlU0|-CSe|b6V{|8)w$K=mFlbul)n`#^-#3iYuA#%^_<5JvUL~UJ- zb621*9spZ}U)vQ!j+us%{rsXFTm7>88h)3!$MSey256h3qDSAI=9fo%Hx9+KS~gzC zi9;X|!Wy*$#1Z26{s*UGZ}7abw%QFvldyqMQI#im#28|SkIG4eO;O)CHx}R5A^aM< zdidb4KwQeWw;tarV?45pYxMIp89n3qvsz7ASs7VmGKH%?b?lf8NG#}@Tx`C^-Okh0 z`RO*8%J}d{PQB#*POPS4m!}7a%W0E%^E(HhP0%6fcA{lD^-pl9x z{u+d*P$b9~1Wkz&KxGYhet>w}oWfKm1Lc>p|GLzqM=s)5Bx!tFm zZOZWUlovSy>|+Zb*9hbEXcT}iTb`P|dL2b@StH%O{LNXR&D}e(zQxF?!cr*m#SJm; zW$yxv4)euX0i?Ltg71MPQ*KpUZYnfccR8(A^0(u3{J`&Lc{Kk>jYJ~1Wqe@#BL~{F!sdBCjSTN{)6dCO3l17nWw|E@a2iV&c&-7`0q>y9v)8F_YKWiGwFz%V<1Bz z{oghcVWXFS$>hIh{VV1qKdice>{vMSXf2Q=*Re;S2wr^g_a?yRn^4@x6C% z>qpz36kQ*x93<6!KdV_c+$|&VDAWbZ!3Er Date: Sat, 25 Dec 2021 12:14:37 +0200 Subject: [PATCH 22/68] [ja] Remove link to compromised github account --- content/ja/docs/concepts/cluster-administration/addons.md | 2 +- content/ja/docs/concepts/cluster-administration/networking.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ja/docs/concepts/cluster-administration/addons.md b/content/ja/docs/concepts/cluster-administration/addons.md index c07cfce07c..b2d97790b4 100644 --- a/content/ja/docs/concepts/cluster-administration/addons.md +++ b/content/ja/docs/concepts/cluster-administration/addons.md @@ -25,7 +25,7 @@ content_type: concept * [Contrail](https://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/)は、[Tungsten Fabric](https://tungsten.io)をベースにしている、オープンソースでマルチクラウドに対応したネットワーク仮想化およびポリシー管理プラットフォームです。ContrailおよびTungsten Fabricは、Kubernetes、OpenShift、OpenStack、Mesosなどのオーケストレーションシステムと統合されており、仮想マシン、コンテナ/Pod、ベアメタルのワークロードに隔離モードを提供します。 * [Flannel](https://github.com/flannel-io/flannel#deploying-flannel-manually)は、Kubernetesで使用できるオーバーレイネットワークプロバイダーです。 * [Knitter](https://github.com/ZTE/Knitter/)は、1つのKubernetes Podで複数のネットワークインターフェイスをサポートするためのプラグインです。 -* [Multus](https://github.com/Intel-Corp/multus-cni)は、すべてのCNIプラグイン(たとえば、Calico、Cilium、Contiv、Flannel)に加えて、SRIOV、DPDK、OVS-DPDK、VPPをベースとするKubernetes上のワークロードをサポートする、複数のネットワークサポートのためのマルチプラグインです。 +* Multus は、すべてのCNIプラグイン(たとえば、Calico、Cilium、Contiv、Flannel)に加えて、SRIOV、DPDK、OVS-DPDK、VPPをベースとするKubernetes上のワークロードをサポートする、複数のネットワークサポートのためのマルチプラグインです。 * [OVN-Kubernetes](https://github.com/ovn-org/ovn-kubernetes/)は、Open vSwitch(OVS)プロジェクトから生まれた仮想ネットワーク実装である[OVN(Open Virtual Network)](https://github.com/ovn-org/ovn/)をベースとする、Kubernetesのためのネットワークプロバイダです。OVN-Kubernetesは、OVSベースのロードバランサーおよびネットワークポリシーの実装を含む、Kubernetes向けのオーバーレイベースのネットワーク実装を提供します。 * [OVN4NFV-K8S-Plugin](https://github.com/opnfv/ovn4nfv-k8s-plugin)は、クラウドネイティブベースのService function chaining(SFC)、Multiple OVNオーバーレイネットワーク、動的なサブネットの作成、動的な仮想ネットワークの作成、VLANプロバイダーネットワーク、Directプロバイダーネットワークを提供し、他のMulti-networkプラグインと付け替え可能なOVNベースのCNIコントローラープラグインです。 * [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) Container Plug-in(NCP)は、VMware NSX-TとKubernetesなどのコンテナオーケストレーター間のインテグレーションを提供します。また、NSX-Tと、Pivotal Container Service(PKS)とOpenShiftなどのコンテナベースのCaaS/PaaSプラットフォームとのインテグレーションも提供します。 diff --git a/content/ja/docs/concepts/cluster-administration/networking.md b/content/ja/docs/concepts/cluster-administration/networking.md index 49daa2d42d..393829cf2e 100644 --- a/content/ja/docs/concepts/cluster-administration/networking.md +++ b/content/ja/docs/concepts/cluster-administration/networking.md @@ -243,7 +243,7 @@ Lars Kellogg-Stedman. ### Multus (a Multi Network plugin) -[Multus](https://github.com/Intel-Corp/multus-cni) is a Multi CNI plugin to support the Multi Networking feature in Kubernetes using CRD based network objects in Kubernetes. +Multus is a Multi CNI plugin to support the Multi Networking feature in Kubernetes using CRD based network objects in Kubernetes. Multus supports all [reference plugins](https://github.com/containernetworking/plugins) (eg. [Flannel](https://github.com/containernetworking/plugins/tree/master/plugins/meta/flannel), [DHCP](https://github.com/containernetworking/plugins/tree/master/plugins/ipam/dhcp), [Macvlan](https://github.com/containernetworking/plugins/tree/master/plugins/main/macvlan)) that implement the CNI specification and 3rd party plugins (eg. [Calico](https://github.com/projectcalico/cni-plugin), [Weave](https://github.com/weaveworks/weave), [Cilium](https://github.com/cilium/cilium), [Contiv](https://github.com/contiv/netplugin)). In addition to it, Multus supports [SRIOV](https://github.com/hustcat/sriov-cni), [DPDK](https://github.com/Intel-Corp/sriov-cni), [OVS-DPDK & VPP](https://github.com/intel/vhost-user-net-plugin) workloads in Kubernetes with both cloud native and NFV based applications in Kubernetes. From 7a3b13dbff7f188d6f90df7eb32cb8f1d63bd55d Mon Sep 17 00:00:00 2001 From: Shivam Singhal Date: Sat, 25 Dec 2021 12:18:00 +0200 Subject: [PATCH 23/68] [pt-br] Remove link to compromised github account --- content/pt-br/docs/concepts/cluster-administration/addons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pt-br/docs/concepts/cluster-administration/addons.md b/content/pt-br/docs/concepts/cluster-administration/addons.md index 79b62bf832..f3a00ae26d 100644 --- a/content/pt-br/docs/concepts/cluster-administration/addons.md +++ b/content/pt-br/docs/concepts/cluster-administration/addons.md @@ -25,7 +25,7 @@ Esta página lista alguns dos complementos disponíveis e links com suas respect * [Contrail](http://www.juniper.net/us/en/products-services/sdn/contrail/contrail-networking/) é uma plataforma open source baseada no [Tungsten Fabric](https://tungsten.io) que oferece virtualização de rede multi-nuvem e gerenciamento de políticas de rede. O Contrail e o Tungsten Fabric são integrados a sistemas de orquestração de contêineres, como Kubernetes, OpenShift, OpenStack e Mesos, e fornecem modos de isolamento para cargas de trabalho executando em máquinas virtuais, contêineres/pods e servidores físicos. * [Flannel](https://github.com/flannel-io/flannel#deploying-flannel-manually) é um provedor de redes _overlay_ (sobrepostas) que pode ser usado com o Kubernetes. * [Knitter](https://github.com/ZTE/Knitter/) é um plug-in para suporte de múltiplas interfaces de rede em Pods do Kubernetes. -* [Multus](https://github.com/Intel-Corp/multus-cni) é um plugin para suporte a várias interfaces de rede em Pods no Kubernetes. Este plug-in pode agir como um "meta-plug-in", ou um plug-in CNI que se comunica com múltiplos outros plug-ins CNI (por exemplo, Calico, Cilium, Contiv, Flannel), além das cargas de trabalho baseadas em SRIOV, DPDK, OVS-DPDK e VPP no Kubernetes. +* Multus é um plugin para suporte a várias interfaces de rede em Pods no Kubernetes. Este plug-in pode agir como um "meta-plug-in", ou um plug-in CNI que se comunica com múltiplos outros plug-ins CNI (por exemplo, Calico, Cilium, Contiv, Flannel), além das cargas de trabalho baseadas em SRIOV, DPDK, OVS-DPDK e VPP no Kubernetes. * [NSX-T](https://docs.vmware.com/en/VMware-NSX-T/2.0/nsxt_20_ncp_kubernetes.pdf) Container Plug-in (NCP) fornece integração entre o VMware NSX-T e sistemas de orquestração de contêineres como o Kubernetes. Além disso, oferece também integração entre o NSX-T e as plataformas CaaS/PaaS baseadas em contêiner, como o Pivotal Container Service (PKS) e o OpenShift. * [Nuage](https://github.com/nuagenetworks/nuage-kubernetes/blob/v5.1.1-1/docs/kubernetes-1-installation.rst) é uma plataforma de rede definida por software que fornece serviços de rede baseados em políticas entre os Pods do Kubernetes e os ambientes não-Kubernetes, com visibilidade e monitoramento de segurança. * [OVN-Kubernetes](https://github.com/ovn-org/ovn-kubernetes/) é um provedor de rede para o Kubernetes baseado no [OVN (Open Virtual Network)](https://github.com/ovn-org/ovn/), uma implementação de redes virtuais que surgiu através do projeto Open vSwitch (OVS). O OVN-Kubernetes fornece uma implementação de rede baseada em _overlay_ (sobreposição) para o Kubernetes, incluindo uma implementação baseada em OVS para serviços de balanceamento de carga e políticas de rede. From 8b64e432a3b88ea358b5f3cd8268004518a66956 Mon Sep 17 00:00:00 2001 From: Shivam Singhal Date: Tue, 28 Dec 2021 14:47:25 +0200 Subject: [PATCH 24/68] [pt] Fix configuration overview example link --- content/pt-br/docs/concepts/configuration/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/pt-br/docs/concepts/configuration/overview.md b/content/pt-br/docs/concepts/configuration/overview.md index 66f369c03b..67ef561605 100644 --- a/content/pt-br/docs/concepts/configuration/overview.md +++ b/content/pt-br/docs/concepts/configuration/overview.md @@ -23,7 +23,7 @@ Isso permite que você reverta rapidamente uma alteração de configuração, ca - Escreva seus arquivos de configuração usando YAML ao invés de JSON. Embora esses formatos possam ser usados alternadamente em quase todos os cenários, YAML tende a ser mais amigável. - Agrupe objetos relacionados em um único arquivo sempre que fizer sentido. Geralmente, um arquivo é mais fácil de -gerenciar do que vários. Veja o [guestbook-all-in-one.yaml](https://github.com/kubernetes/examples/tree/{{< param "githubbranch" >}}/guestbook/all-in-one/guestbook-all-in-one.yaml) como exemplo dessa sintaxe. +gerenciar do que vários. Veja o [guestbook-all-in-one.yaml](https://github.com/kubernetes/examples/tree/master/guestbook/all-in-one/guestbook-all-in-one.yaml) como exemplo dessa sintaxe. - Observe também que vários comandos `kubectl` podem ser chamados em um diretório. Por exemplo, você pode chamar `kubectl apply` em um diretório de arquivos de configuração. From 1c746e37990a987f2d6ea9326b59fcf165af494e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=85=E8=BF=9B=E8=B6=85?= Date: Wed, 29 Dec 2021 20:28:42 +0800 Subject: [PATCH 25/68] [zh] synchronize translate configure-projected-volume-storage.md --- .../configure-projected-volume-storage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/zh/docs/tasks/configure-pod-container/configure-projected-volume-storage.md b/content/zh/docs/tasks/configure-pod-container/configure-projected-volume-storage.md index cb71f70d5c..d0ff476b38 100644 --- a/content/zh/docs/tasks/configure-pod-container/configure-projected-volume-storage.md +++ b/content/zh/docs/tasks/configure-pod-container/configure-projected-volume-storage.md @@ -123,9 +123,9 @@ kubectl delete secret user pass * 进一步了解[`projected`](/zh/docs/concepts/storage/volumes/#projected) 卷。 -* 阅读[一体卷](https://github.com/kubernetes/community/blob/{{< param "githubbranch" >}}/contributors/design-proposals/node/all-in-one-volume.md)设计文档。 +* 阅读[一体卷](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/all-in-one-volume.md)设计文档。 From 808117bf109beaab9aff0b55b752f26a9311f4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=85=E8=BF=9B=E8=B6=85?= Date: Wed, 29 Dec 2021 20:42:17 +0800 Subject: [PATCH 26/68] [zh] synchronize translate configure-service-account.md --- .../configure-pod-container/configure-service-account.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/zh/docs/tasks/configure-pod-container/configure-service-account.md b/content/zh/docs/tasks/configure-pod-container/configure-service-account.md index e7bba36668..46d1c46202 100644 --- a/content/zh/docs/tasks/configure-pod-container/configure-service-account.md +++ b/content/zh/docs/tasks/configure-pod-container/configure-service-account.md @@ -423,7 +423,7 @@ command line arguments to `kube-apiserver`: * `--service-account-issuer` * `--service-account-key-file` * `--service-account-signing-key-file` -* `--api-audiences` +* `--api-audiences` (can be omitted) --> {{< note >}} @@ -432,7 +432,7 @@ command line arguments to `kube-apiserver`: * `--service-account-issuer` * `--service-account-key-file` * `--service-account-signing-key-file` -* `--api-audiences` +* `--api-audiences`(可以省略) {{< /note >}} From a6bc41f9aa06d14685eec7bfba9ec853d2c4d98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=85=E8=BF=9B=E8=B6=85?= Date: Wed, 29 Dec 2021 22:33:27 +0800 Subject: [PATCH 27/68] [zh] synchronize translate pull-image-private-registry.md --- .../pull-image-private-registry.md | 66 +++++++++++-------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/content/zh/docs/tasks/configure-pod-container/pull-image-private-registry.md b/content/zh/docs/tasks/configure-pod-container/pull-image-private-registry.md index c3b896ec35..c29009533f 100644 --- a/content/zh/docs/tasks/configure-pod-container/pull-image-private-registry.md +++ b/content/zh/docs/tasks/configure-pod-container/pull-image-private-registry.md @@ -13,20 +13,26 @@ weight: 100 -本文介绍如何使用 Secret 从私有的 Docker 镜像仓库或代码仓库拉取镜像来创建 Pod。 +本文介绍如何使用 {{< glossary_tooltip text="Secret" term_id="secret" >}} +从私有的镜像仓库或代码仓库拉取镜像来创建 Pod。 + +{{% thirdparty-content single="true" %}} ## {{% heading "prerequisites" %}} -* {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} +* {{< include "task-tutorial-prereqs.md" >}} -你需要 [Docker ID](https://docs.docker.com/docker-id/) 和密码来进行本练习。 + +要进行此练习,你需要 `docker` 命令行工具和一个知道密码的 +[Docker ID](https://docs.docker.com/docker-id/)。 @@ -44,15 +50,18 @@ docker login ``` -当出现提示时,输入 Docker 用户名和密码。 +当出现提示时,输入您的 Docker ID 和登录凭证(访问令牌、 +或 Docker ID 的密码)。 登录过程会创建或更新保存有授权令牌的 `config.json` 文件。 +查看 [Kubernetes 中如何解析这个文件](/zh/docs/concepts/containers/images#config-json)。 查看 `config.json` 文件: @@ -125,7 +134,7 @@ You have successfully set your Docker credentials in the cluster as a Secret cal * `` 是你的 Docker 密码。 * `` 是你的 Docker 邮箱。 -这样你就成功地将集群中的 Docker 凭据设置为名为 `regcred` 的 Secret。 +这样你就成功地将集群中的 Docker 凭证设置为名为 `regcred` 的 Secret。 -`.dockerconfigjson` 字段的值是 Docker 凭据的 base64 表示。 +`.dockerconfigjson` 字段的值是 Docker 凭证的 base64 表示。 要了解 `dockerconfigjson` 字段中的内容,请将 Secret 数据转换为可读格式: @@ -201,24 +210,27 @@ You have successfully set your Docker credentials as a Secret called `regcred` i --> 注意,Secret 数据包含与本地 `~/.docker/config.json` 文件类似的授权令牌。 -这样你就已经成功地将 Docker 凭据设置为集群中的名为 `regcred` 的 Secret。 +这样你就已经成功地将 Docker 凭证设置为集群中的名为 `regcred` 的 Secret。 ## 创建一个使用你的 Secret 的 Pod -下面是一个 Pod 配置文件,它需要访问 `regcred` 中的 Docker 凭据: +下面是一个 Pod 配置清单示例,该示例中 Pod 需要访问你的 Docker 凭证 `regcred`: {{< codenew file="pods/private-reg-pod.yaml" >}} - -下载上述文件: + + +将上述文件下载到你的计算机中: ```shell -wget -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml +curl -L -O my-private-reg-pod.yaml https://k8s.io/examples/pods/private-reg-pod.yaml ``` -* 进一步了解 [Secret](/zh/docs/concepts/configuration/secret/) +* 进一步了解 [Secrets](/zh/docs/concepts/configuration/secret/) + * 或阅读 {{< api-reference page="config-and-storage-resources/secret-v1" >}} 的 API 参考 * 进一步了解 [使用私有仓库](/zh/docs/concepts/containers/images/#using-a-private-registry) -* 参考 [kubectl create secret docker-registry](/docs/reference/generated/kubectl/kubectl-commands/#-em-secret-docker-registry-em-) -* 参考 [Secret](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#secret-v1-core) -* 参考 [PodSpec](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/#podspec-v1-core) 中的 `imagePullSecrets` 字段 - - +* 进一步了解 [为服务账户添加拉取镜像凭证](/zh/docs/tasks/configure-pod-container/configure-service-account/#add-imagepullsecrets-to-a-service-account) +* 查看 [kubectl 创建 docker-registry 凭证](/docs/reference/generated/kubectl/kubectl-commands/#-em-secret-docker-registry-em-) +* 查看 Pod [容器定义](/docs/reference/kubernetes-api/workload-resources/pod-v1/#containers)中的 `imagePullSecrets` 字段。 From 4916d4bd81eb2d627142438f681c56f3b0d20ea9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=85=E8=BF=9B=E8=B6=85?= Date: Wed, 29 Dec 2021 22:59:13 +0800 Subject: [PATCH 28/68] [zh] synchronize translate configure-persistent-volume-storage.md --- .../configure-persistent-volume-storage.md | 19 ++++++++++++++++ .../examples/pods/storage/pv-duplicate.yaml | 22 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 content/zh/examples/pods/storage/pv-duplicate.yaml diff --git a/content/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md b/content/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md index 0b455867e8..b3253b4d00 100644 --- a/content/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md +++ b/content/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage.md @@ -387,6 +387,25 @@ You can now close the shell to your Node. --> 你现在可以关闭连接到节点的 Shell。 + + +## 在两个地方挂载相同的 persistentVolume + +{{< codenew file="pods/storage/pv-duplicate.yaml" >}} + + +你可以在 nginx 容器上执行两个卷挂载: + +`/usr/share/nginx/html` 用于静态网站 +`/etc/nginx/nginx.conf` 作为默认配置 + ## 为 Pod 配置卷访问权限和属主变更策略 -{{< feature-state for_k8s_version="v1.20" state="beta" >}} +{{< feature-state for_k8s_version="v1.23" state="stable" >}} ## 将卷权限和所有权更改委派给 CSI 驱动程序 -{{< feature-state for_k8s_version="v1.22" state="alpha" >}} +{{< feature-state for_k8s_version="v1.23" state="beta" >}} -Esta pagina proporciona información sobre el como controlar el acceso a la API de Kubernetes. +Esta página proporciona información sobre cómo controlar el acceso a la API de Kubernetes. From e4358a121f19b6d3d138ed95fdbdda95a81412b9 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:36:18 -0300 Subject: [PATCH 31/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 978087fb7e..95a36028c9 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -12,7 +12,7 @@ Esta página proporciona información sobre cómo controlar el acceso a la API d Los usuarios acceden a la [API de Kubernetes](/docs/concepts/overview/kubernetes-api/) usando `kubectl`, -client libraries, o haciendo peticiones REST. Humanos y los +bibliotecas de cliente, o haciendo peticiones REST. Usuarios y [Kubernetes service accounts](/docs/tasks/configure-pod-container/configure-service-account/) pueden ser autorizados para acceder a la API. Cuando una peticion llega a la API, pasa por varias etapas, estan ilustradas en el From fc7b76afcb5113fbfe470adc60b5168f0b963e44 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:36:32 -0300 Subject: [PATCH 32/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 95a36028c9..68d22b7c7a 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -15,7 +15,7 @@ Los usuarios acceden a la [API de Kubernetes](/docs/concepts/overview/kubernetes bibliotecas de cliente, o haciendo peticiones REST. Usuarios y [Kubernetes service accounts](/docs/tasks/configure-pod-container/configure-service-account/) pueden ser autorizados para acceder a la API. -Cuando una peticion llega a la API, pasa por varias etapas, estan ilustradas en el +Cuando una petición llega a la API, pasa por varias etapas, están ilustradas en el siguiente diagrama: ![Diagrama de pasos para una petición a la API de Kubernetes](/images/docs/admin/access-control-overview.svg) From 46b06953e509736740456e8e190f9763771fbb57 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:36:45 -0300 Subject: [PATCH 33/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 68d22b7c7a..6426e4cd31 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -23,7 +23,7 @@ siguiente diagrama: ## Transport security En un cluster típico de Kubernetes, la API sirve peticiones en el puerto 443, protegida por TLS. -El server API presenta un certificado. Este certificado puede ser firmando usando +El {{< glossary_tooltip term_id="kube-apiserver" text="API Server" >}} presenta un certificado. Este certificado puede ser firmando usando un certificado de autoridad privada (CA) o basado en una llave publica relacionada generalmente a un CA reconocido. From 900b959b5244863d6b33614a279af06c6fe36d29 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:36:56 -0300 Subject: [PATCH 34/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 6426e4cd31..ea3bc2333a 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -24,7 +24,7 @@ siguiente diagrama: En un cluster típico de Kubernetes, la API sirve peticiones en el puerto 443, protegida por TLS. El {{< glossary_tooltip term_id="kube-apiserver" text="API Server" >}} presenta un certificado. Este certificado puede ser firmando usando -un certificado de autoridad privada (CA) o basado en una llave publica relacionada +un certificado de autoridad privada (CA) o basado en una llave pública relacionada generalmente a un CA reconocido. Si el cluster usa un certificado de autoridad privado, se necesita copiar este certificado From f9541ec21dbc2fb1fa655e71336e33d3e37e235a Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:37:28 -0300 Subject: [PATCH 35/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index ea3bc2333a..2ec9b9e290 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -22,7 +22,7 @@ siguiente diagrama: ## Transport security -En un cluster típico de Kubernetes, la API sirve peticiones en el puerto 443, protegida por TLS. +En un {{< glossary_tooltip term_id="cluster" text="cluster" >}} típico de Kubernetes, la API sirve peticiones en el puerto 443, protegida por TLS. El {{< glossary_tooltip term_id="kube-apiserver" text="API Server" >}} presenta un certificado. Este certificado puede ser firmando usando un certificado de autoridad privada (CA) o basado en una llave pública relacionada generalmente a un CA reconocido. From 1e4927b59cd47131d5ad5d0f467da03f35115030 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:37:38 -0300 Subject: [PATCH 36/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 2ec9b9e290..40c2615704 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -144,7 +144,7 @@ Por defecto, la API de Kubernetes entrega HTTP en 2 puertos: - debe usarse para testeo e iniciar el sistema y para otros componentes del nodo maestro (scheduler, controller-manager) para hablar con la API - no se usa TLS - - el puerto predeterminado es el 8080 + - el puerto predeterminado es el `8080` - la IP por defecto es localhost, la puede cambiar con el flag `--insecure-bind-address`. - request **bypasses** authentication and authorization modules. - peticiones controladas por los modulos de control de admisión. From c2593677fa22fc3d12e3a4444080a17305eb424e Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:38:26 -0300 Subject: [PATCH 37/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 40c2615704..7c9537bbdb 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -28,7 +28,7 @@ un certificado de autoridad privada (CA) o basado en una llave pública relacion generalmente a un CA reconocido. Si el cluster usa un certificado de autoridad privado, se necesita copiar este certificado -CA configurado dentro de su `~/.kube/config` en el cliente, entonces usted podrá +CA configurado dentro de su `~/.kube/config` en el cliente, entonces se podrá confiar en la conección y estar seguro que no será hackeada. Su cliente puede presentar un certificado TLS de cliente en esta etapa. From fed463149e9b422d9671f2e457dba11cbdc1b5d1 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:38:34 -0300 Subject: [PATCH 38/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 7c9537bbdb..9fa36b096e 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -156,7 +156,7 @@ Por defecto, la API de Kubernetes entrega HTTP en 2 puertos: - usa TLS. Se configura el certificado con el flag `--tls-cert-file` y la llave con `--tls-private-key-file`. - el puerto predeterminado es 6443, se cambia con el flag `--secure-port`. - la IP por defecto es la primer interface que no es la localhost. se cambia con el flag `--bind-address`. - - peticiones controladas por los modulos de autenticación y autorización. + - peticiones controladas por los módulos de autenticación y autorización. - peticiones controladas por los modulos de control de admisión. - authentication and authorization modules run. From c3abe90f0cbeb0755fb9c2cd12d5a8e160b242ef Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:38:39 -0300 Subject: [PATCH 39/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 9fa36b096e..d4116a2d5b 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -157,7 +157,7 @@ Por defecto, la API de Kubernetes entrega HTTP en 2 puertos: - el puerto predeterminado es 6443, se cambia con el flag `--secure-port`. - la IP por defecto es la primer interface que no es la localhost. se cambia con el flag `--bind-address`. - peticiones controladas por los módulos de autenticación y autorización. - - peticiones controladas por los modulos de control de admisión. + - peticiones controladas por los módulos de control de admisión. - authentication and authorization modules run. ## {{% heading "whatsnext" %}} From d319828a173202c23d483c4f7be1f3b830f8307e Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:38:56 -0300 Subject: [PATCH 40/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index d4116a2d5b..fd8b97bda4 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -158,7 +158,6 @@ Por defecto, la API de Kubernetes entrega HTTP en 2 puertos: - la IP por defecto es la primer interface que no es la localhost. se cambia con el flag `--bind-address`. - peticiones controladas por los módulos de autenticación y autorización. - peticiones controladas por los módulos de control de admisión. - - authentication and authorization modules run. ## {{% heading "whatsnext" %}} From 6f1f2d600a4fa3494c91118078c2b8fdb4b70a7b Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:39:19 -0300 Subject: [PATCH 41/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index fd8b97bda4..212e90c70d 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -29,7 +29,7 @@ generalmente a un CA reconocido. Si el cluster usa un certificado de autoridad privado, se necesita copiar este certificado CA configurado dentro de su `~/.kube/config` en el cliente, entonces se podrá -confiar en la conección y estar seguro que no será hackeada. +confiar en la conexión y estar seguro que no será comprometida. Su cliente puede presentar un certificado TLS de cliente en esta etapa. From 99bb07287997cd71c50467f159852f7f4d232d3f Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:39:48 -0300 Subject: [PATCH 42/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 212e90c70d..26d57d2854 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -31,7 +31,7 @@ Si el cluster usa un certificado de autoridad privado, se necesita copiar este c CA configurado dentro de su `~/.kube/config` en el cliente, entonces se podrá confiar en la conexión y estar seguro que no será comprometida. -Su cliente puede presentar un certificado TLS de cliente en esta etapa. +El cliente puede presentar un certificado TLS de cliente en esta etapa. ## Autenticación From 0a621a0f41d6ac963f1fea535baa088d8012017f Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:40:31 -0300 Subject: [PATCH 43/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 26d57d2854..994681f224 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -20,7 +20,7 @@ siguiente diagrama: ![Diagrama de pasos para una petición a la API de Kubernetes](/images/docs/admin/access-control-overview.svg) -## Transport security +## Seguridad en la capa de transporte En un {{< glossary_tooltip term_id="cluster" text="cluster" >}} típico de Kubernetes, la API sirve peticiones en el puerto 443, protegida por TLS. El {{< glossary_tooltip term_id="kube-apiserver" text="API Server" >}} presenta un certificado. Este certificado puede ser firmando usando From efc15f6fe4b8eb091514adda2e8334b286bdad36 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:40:53 -0300 Subject: [PATCH 44/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 994681f224..0d1649a105 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -35,7 +35,7 @@ El cliente puede presentar un certificado TLS de cliente en esta etapa. ## Autenticación -Una vez que se estableció el TLS, las peticiones HTTP avanzan a la etapa de autenticación. +Una vez que se estableció la conexión TLS, las peticiones HTTP avanzan a la etapa de autenticación. Esto se muestra en el paso 1 del diagrama. El script de creación del cluster o el administrador del cluster configurada el servidor API para ejecutar uno o mas módulos de autenticación. From 3305c6ab76f46bc483c0ae49e6ed16be9f79dc16 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:41:26 -0300 Subject: [PATCH 45/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 0d1649a105..5f8ea4dcb7 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -37,7 +37,7 @@ El cliente puede presentar un certificado TLS de cliente en esta etapa. Una vez que se estableció la conexión TLS, las peticiones HTTP avanzan a la etapa de autenticación. Esto se muestra en el paso 1 del diagrama. -El script de creación del cluster o el administrador del cluster configurada el servidor API para ejecutar +El script de creación del cluster o el administrador del cluster puede configurar el {{< glossary_tooltip term_id="kube-apiserver" text="API Server" >}} para ejecutar uno o mas módulos de autenticación. Los Autenticadores estan descriptos con más detalle en [Authentication](/docs/reference/access-authn-authz/authentication/). From a4923189e53187524ef7f1502a4814c8b91ddf0a Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:43:03 -0300 Subject: [PATCH 46/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 5f8ea4dcb7..16c2467c04 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -39,7 +39,7 @@ Una vez que se estableció la conexión TLS, las peticiones HTTP avanzan a la et Esto se muestra en el paso 1 del diagrama. El script de creación del cluster o el administrador del cluster puede configurar el {{< glossary_tooltip term_id="kube-apiserver" text="API Server" >}} para ejecutar uno o mas módulos de autenticación. -Los Autenticadores estan descriptos con más detalle en +Los Autenticadores están descritos con más detalle en [Authentication](/docs/reference/access-authn-authz/authentication/). ```The input to the authentication step is the entire HTTP request; however, it typically From 701dd37d61f343db200d2e3a2a9633ed1db94394 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:45:23 -0300 Subject: [PATCH 47/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 16c2467c04..d5dfcd36ad 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -45,7 +45,7 @@ Los Autenticadores están descritos con más detalle en ```The input to the authentication step is the entire HTTP request; however, it typically examines the headers and/or client certificate. ``` -El ingreso al paso de autenticación es la petición HTTP completa, aun así, esta tipicamente +La entrada al paso de autenticación es la petición HTTP completa, aun así, esta tipicamente examina las cabeceras y/o el certificado del cliente. Los modulos de autenticación incluyen certificado de cliente, contraseña, tokens planos, From d1517c5dd9c7c772d2c81ae07163447e8f18bea2 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:45:38 -0300 Subject: [PATCH 48/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index d5dfcd36ad..6d63553a60 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -51,7 +51,7 @@ examina las cabeceras y/o el certificado del cliente. Los modulos de autenticación incluyen certificado de cliente, contraseña, tokens planos, tokens de inicio y JSON Web Tokens (usados para los service accounts). -Multiples modulos de autenticación puede ser especificados, en este caso cada uno es probado secuencialmente, +Múltiples módulos de autenticación puede ser especificados, en este caso cada uno es probado secuencialmente, hasta que uno de ellos tiene éxito. Si la petición no puede ser autenticada, la misma es rechazada con un codigo de estado HTTP 401. From 732887cef62fa41704f6a2aecd16b4fee12e39cd Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:45:51 -0300 Subject: [PATCH 49/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 6d63553a60..3f66bec3da 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -54,7 +54,7 @@ tokens de inicio y JSON Web Tokens (usados para los service accounts). Múltiples módulos de autenticación puede ser especificados, en este caso cada uno es probado secuencialmente, hasta que uno de ellos tiene éxito. -Si la petición no puede ser autenticada, la misma es rechazada con un codigo de estado HTTP 401. +Si la petición no puede ser autenticada, la misma es rechazada con un código HTTP 401. En otro caso, el usuario es validado con el `username` específico, y el nombre de usuario esta disponible para los pasos siguientes. Algunos autenticadores tambien proporcionan membresías de grupo al usuario, mientras que otros From 73de7ea1e32395317e019bb423ad626518360fe1 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:46:24 -0300 Subject: [PATCH 50/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 3f66bec3da..3ac9042a1f 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -60,9 +60,7 @@ esta disponible para los pasos siguientes. Algunos autenticadores tambien proporcionan membresías de grupo al usuario, mientras que otros no lo hacen. -While Kubernetes uses usernames for access control decisions and in request logging, -este n otiene un objeto `User` ni tampoco guarda nombres de usaurio o otra información acerca -de ellos en su API. +Aunque Kubernetes utiliza los nombres de usuario para tomar decisiones durante el control de acceso y para registrar las peticiones de entrada, no tiene un objeto `User` ni tampoco almacena información sobre los usuarios en la API. ## Autorización From a5b79e7fd1af08cff37271c30765c58ab12e8fc6 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:46:43 -0300 Subject: [PATCH 51/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 3ac9042a1f..966a88b81b 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -82,7 +82,7 @@ Por ejemplo, si Bob tiene la siguiente politica, entonces el puede leer pods sol } } ``` -Si Bob hace la siguiente petición, será aturizada porque él tiene permitido leer los objetos en el namespace `projectCaribou` : +Si Bob hace la siguiente petición, será autorizada dado que tiene permitido leer los objetos en el namespace `projectCaribou` : ```json { From 04187d06d6ee36a27e32e4f7f06751994df25c58 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:47:06 -0300 Subject: [PATCH 52/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index 966a88b81b..ea6aef2d19 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -55,7 +55,7 @@ Múltiples módulos de autenticación puede ser especificados, en este caso cada hasta que uno de ellos tiene éxito. Si la petición no puede ser autenticada, la misma es rechazada con un código HTTP 401. -En otro caso, el usuario es validado con el `username` específico, y el nombre de usuario +Si la autenticación tiene éxito, el usuario es validado con el `username` específico, y el nombre de usuario esta disponible para los pasos siguientes. Algunos autenticadores tambien proporcionan membresías de grupo al usuario, mientras que otros no lo hacen. From 1e82410a0a80ee51c97ad83344de8359332105c1 Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:47:19 -0300 Subject: [PATCH 53/68] Update content/es/docs/concepts/security/controlling-access.md Co-authored-by: Rael Garcia --- content/es/docs/concepts/security/controlling-access.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index ea6aef2d19..f273cd9a1d 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -57,7 +57,7 @@ hasta que uno de ellos tiene éxito. Si la petición no puede ser autenticada, la misma es rechazada con un código HTTP 401. Si la autenticación tiene éxito, el usuario es validado con el `username` específico, y el nombre de usuario esta disponible para los pasos siguientes. Algunos autenticadores -tambien proporcionan membresías de grupo al usuario, mientras que otros +también proporcionan membresías de grupo al usuario, mientras que otros no lo hacen. Aunque Kubernetes utiliza los nombres de usuario para tomar decisiones durante el control de acceso y para registrar las peticiones de entrada, no tiene un objeto `User` ni tampoco almacena información sobre los usuarios en la API. From 9a577a0ed6fd2643872db62eb513502d4775072e Mon Sep 17 00:00:00 2001 From: Emilano Vazquez Date: Wed, 29 Dec 2021 12:52:22 -0300 Subject: [PATCH 54/68] Apply suggestions from code review Co-authored-by: Rael Garcia --- .../concepts/security/controlling-access.md | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/content/es/docs/concepts/security/controlling-access.md b/content/es/docs/concepts/security/controlling-access.md index f273cd9a1d..8d33ac49b4 100644 --- a/content/es/docs/concepts/security/controlling-access.md +++ b/content/es/docs/concepts/security/controlling-access.md @@ -42,9 +42,6 @@ uno o mas módulos de autenticación. Los Autenticadores están descritos con más detalle en [Authentication](/docs/reference/access-authn-authz/authentication/). -```The input to the authentication step is the entire HTTP request; however, it typically -examines the headers and/or client certificate. -``` La entrada al paso de autenticación es la petición HTTP completa, aun así, esta tipicamente examina las cabeceras y/o el certificado del cliente. @@ -64,11 +61,11 @@ Aunque Kubernetes utiliza los nombres de usuario para tomar decisiones durante e ## Autorización -Despues de autenticar la petición como proveniente de un usuario específico, la petición debe ser autorizada. Esto se muestra en el paso 2 del diagrama. +Después de autenticar la petición como proveniente de un usuario específico, la petición debe ser autorizada. Esto se muestra en el paso 2 del diagrama. -Una petición debe incluir el nombre de usuario solicitante, la acción solicitada y el objeto afectado por la acción. La petición es autorizada si hay una politica existente que declare que el usuario tiene permisos para la realizar la acción. +Una petición debe incluir el nombre de usuario solicitante, la acción solicitada y el objeto afectado por la acción. La petición es autorizada si hay una política existente que declare que el usuario tiene permisos para la realizar la acción. -Por ejemplo, si Bob tiene la siguiente politica, entonces el puede leer pods solamente en el namespace `projectCaribou`: +Por ejemplo, si el usuario Bob tiene la siguiente política, entonces puede leer pods solamente en el namespace `projectCaribou`: ```json { @@ -98,33 +95,33 @@ Si Bob hace la siguiente petición, será autorizada dado que tiene permitido le } } ``` -Si Bob en su petición intenta escribir (`create` o `update`) en los objetos del namespace `projectCaribou`. Si Bob hace una petición para leer (`get`) objetocs en otro namespace como `projectFish`, entonces la autorización será denegada. +En cambio, si Bob en su petición intenta escribir (`create` o `update`) en los objetos del namespace `projectCaribou`, la petición será denegada. Del mismo modo, si Bob hace una petición para leer (`get`) objetos en otro namespace como `projectFish`, la autorización también será denegada. Las autorizaciones en Kubernetes requieren que se usen atributos REST comunes para interactuar con el existente sistema de control de toda la organización o del proveedor cloud. Es importante usar formatos REST porque esos sistemas de control pueden interactuar con otras APIs además de la API de Kubernetes. -Kubernetes soporta multiples modulos de autorización, como el modo ABAC, el modo RBAC y el modo Webhook. Cuando un administrador crea un cluster, se realiza la configuración de los modulos de autorización que deben ser usados con la API del server. Si mas de uno modulo de autorización es configurado, Kubernetes verificada cada uon y si alguno de ellos autoriza la petición entonces la misma se ejecuta. Si todos los modules deniegan la petición, entonces la misma es denegada (Con un error HTTP con código 403). +Kubernetes soporta múltiples módulos de autorización, como el modo ABAC, el modo RBAC y el modo Webhook. Cuando un administrador crea un cluster, se realiza la configuración de los módulos de autorización que deben ser usados con la API del server. Si más de uno módulo de autorización es configurado, Kubernetes verificada cada uno y si alguno de ellos autoriza la petición entonces la misma se ejecuta. Si todos los modules deniegan la petición, entonces la misma es denegada (Con un error HTTP con código 403). -Para leer más acerca de las autorizaciones en Kubernetes, incluyendo detalles acerca de crear politicas usando los modulos de autorización soportados, vea [Authorization](/docs/reference/access-authn-authz/authorization/). +Para leer más acerca de las autorizaciones en Kubernetes, incluyendo detalles sobre cómo crear politicas usando los módulos de autorización soportados, vea [Authorization](/docs/reference/access-authn-authz/authorization/). ## Control de Admisión -Los modulos de Control de Admisión son modulos de software que solo pueen modificar o rechazar peticiones. -Adicionalmente a los atributos disponibles en los modulos de Autorización, los modulos de +Los módulos de Control de Admisión son módulos de software que solo pueden modificar o rechazar peticiones. +Adicionalmente a los atributos disponibles en los módulos de Autorización, los de Control de Admisión pueden acceder al contenido del objeto que esta siendo creado o modificado. -Los Controles de Admisión actúan en las peticiones que crean, modifican, borran ó se conectan (proxy) a un objeto. -cuando multiples modulos de control de admisión son configurados, son llamados en orden. +Los Controles de Admisión actúan en las peticiones que crean, modifican, borran o se conectan (proxy) a un objeto. +Cuando múltiples módulos de control de admisión son configurados, son llamados en orden. Esto se muestra en el paso 3 del diagrama. -A diferencia de los modulos de Autorización y Autenticación, si uno de los modulos de control de admisión +A diferencia de los módulos de Autorización y Autenticación, si uno de los módulos de control de admisión rechaza la petición, entonces es inmediatamente rechazada. -Adicionalmente a rechazar objetos, los controles de admisión pueden tambien permite establecer +Adicionalmente a rechazar objetos, los controles de admisión también permiten establecer valores predeterminados complejos. -Los modulos de Control de Admisión disponibles están descriptos en [Admission Controllers](/docs/reference/access-authn-authz/admission-controllers/). +Los módulos de Control de Admisión disponibles están descritos en [Admission Controllers](/docs/reference/access-authn-authz/admission-controllers/). Cuando una petición pasa todos los controles de admisión, esta es validada usando la rutinas de validación para el objeto API correspondiente y luego es escrita en el objeto. @@ -144,22 +141,22 @@ Por defecto, la API de Kubernetes entrega HTTP en 2 puertos: - no se usa TLS - el puerto predeterminado es el `8080` - la IP por defecto es localhost, la puede cambiar con el flag `--insecure-bind-address`. - - request **bypasses** authentication and authorization modules. + - la petición no pasa por los mecanismos de autenticación ni autorización - peticiones controladas por los modulos de control de admisión. - - protejidas por necesidad para tener acceso al host + - protegidas por necesidad para tener acceso al host 2. “Puerto seguro”: - usar siempre que sea posible - - usa TLS. Se configura el certificado con el flag `--tls-cert-file` y la llave con `--tls-private-key-file`. - - el puerto predeterminado es 6443, se cambia con el flag `--secure-port`. + - usa TLS. Se configura el certificado con el flag `--tls-cert-file` y la clave con `--tls-private-key-file`. + - el puerto predeterminado es `6443`, se cambia con el flag `--secure-port`. - la IP por defecto es la primer interface que no es la localhost. se cambia con el flag `--bind-address`. - peticiones controladas por los módulos de autenticación y autorización. - peticiones controladas por los módulos de control de admisión. ## {{% heading "whatsnext" %}} -Lea mas documentación sobre autenticación, autorización y el contro de acceso a la API: +En los siguientes enlaces, encontrará mucha más documentación sobre autenticación, autorización y el control de acceso a la API: - [Authenticating](/docs/reference/access-authn-authz/authentication/) - [Authenticating with Bootstrap Tokens](/docs/reference/access-authn-authz/bootstrap-tokens/) @@ -177,7 +174,6 @@ Lea mas documentación sobre autenticación, autorización y el contro de acceso - [Developer guide](/docs/tasks/configure-pod-container/configure-service-account/) - [Administration](/docs/reference/access-authn-authz/service-accounts-admin/) -Tambien puede aprender sobre: -- como los pods pueden usar +- Como los pods pueden usar [Secrets](/docs/concepts/configuration/secret/#service-accounts-automatically-create-and-attach-secrets-with-api-credentials) para obtener credenciales para la API. From 3edbc732dcb68b7101aa5c1cc761a2c5e91979d7 Mon Sep 17 00:00:00 2001 From: Arhell Date: Thu, 30 Dec 2021 00:25:30 +0200 Subject: [PATCH 55/68] [ru] fix typo --- content/ru/docs/concepts/overview/kubernetes-api.md | 2 +- content/ru/docs/templates/feature-state-beta.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/ru/docs/concepts/overview/kubernetes-api.md b/content/ru/docs/concepts/overview/kubernetes-api.md index c669cb973a..e2523c5191 100644 --- a/content/ru/docs/concepts/overview/kubernetes-api.md +++ b/content/ru/docs/concepts/overview/kubernetes-api.md @@ -77,7 +77,7 @@ GET /swagger-2.0.0.pb-v1.gz | GET /openapi/v2 **Accept**: application/com.github - Названия версий включают надпись `beta` (например, `v2beta3`). - Код хорошо протестирован. Активация этой функциональности — безопасно. Поэтому она включена по умолчанию. - Поддержка функциональности в целом не будет прекращена, хотя кое-что может измениться. - - Схема и/или семантика объектов может стать несовместимой с более поздними бета-версиями или стабильными выпусками. Когда это случится, мы даим инструкции по миграции на следующую версию. Это обновление может включать удаление, редактирование и повторного создание API-объектов. Этот процесс может потребовать тщательного анализа. Кроме этого, это может привести к простою приложений, которые используют данную функциональность. + - Схема и/или семантика объектов может стать несовместимой с более поздними бета-версиями или стабильными выпусками. Когда это случится, мы даем инструкции по миграции на следующую версию. Это обновление может включать удаление, редактирование и повторного создание API-объектов. Этот процесс может потребовать тщательного анализа. Кроме этого, это может привести к простою приложений, которые используют данную функциональность. - Рекомендуется только для неосновного производственного использования из-за риска возникновения возможных несовместимых изменений с будущими версиями. Если у вас есть несколько кластеров, которые возможно обновить независимо, вы можете снять это ограничение. - **Пожалуйста, попробуйте в действии бета-версии функциональности и поделитесь своими впечатлениями! После того, как функциональность выйдет из бета-версии, нам может быть нецелесообразно что-то дальше изменять.** - Стабильные версии: diff --git a/content/ru/docs/templates/feature-state-beta.txt b/content/ru/docs/templates/feature-state-beta.txt index 7e4f0d91b6..2d3786020d 100644 --- a/content/ru/docs/templates/feature-state-beta.txt +++ b/content/ru/docs/templates/feature-state-beta.txt @@ -3,6 +3,6 @@ * Названия версий включают надпись "beta" (например, v2beta3). * Код хорошо протестирован. Активация этой функциональности — безопасно. Поэтому она включена по умолчанию. * Поддержка функциональности в целом не будет прекращена, хотя детали могут измениться. -* Схема и/или семантика объектов может стать несовместимой с более поздними бета-версиями или стабильными выпусками. Когда это случится, мы даим инструкции по миграции на следующую версию. Это обновление может включать удаление, редактирование и повторного создание API-объектов. Этот процесс может потребовать тщательного анализа. Кроме этого, он может привести к простою приложений, которые используют данную функциональность. +* Схема и/или семантика объектов может стать несовместимой с более поздними бета-версиями или стабильными выпусками. Когда это случится, мы даем инструкции по миграции на следующую версию. Это обновление может включать удаление, редактирование и повторного создание API-объектов. Этот процесс может потребовать тщательного анализа. Кроме этого, он может привести к простою приложений, которые используют данную функциональность. * Рекомендуется только для неосновного производственного использования из-за риска возникновения возможных несовместимых изменений с будущими версиями. Если у вас есть несколько кластеров, которые возможно обновить независимо, вы можете снять это ограничение. * **Пожалуйста, попробуйте в действии бета-версии функциональности и поделитесь своими впечатлениями! После того, как функциональность выйдет из бета-версии, нам может быть нецелесообразно что-то дальше изменять.** From 6b32203decdffe2409c0012c3ff317966c05ad3d Mon Sep 17 00:00:00 2001 From: Mengjiao Liu Date: Thu, 30 Dec 2021 10:59:11 +0800 Subject: [PATCH 56/68] [zh]Fix translation errors on style-guide.md --- content/zh/docs/contribute/style/style-guide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/zh/docs/contribute/style/style-guide.md b/content/zh/docs/contribute/style/style-guide.md index 433bfbc721..7b51525d09 100644 --- a/content/zh/docs/contribute/style/style-guide.md +++ b/content/zh/docs/contribute/style/style-guide.md @@ -22,7 +22,7 @@ For additional information on creating new content for the Kubernetes documentation, read the [Documentation Content Guide](/docs/contribute/style/content-guide/). Changes to the style guide are made by SIG Docs as a group. To propose a change -or addition, [add it to the agenda](https://docs.google.com/document/d/1ddHwLK3kUMX1wVFIwlksjTk0MsqitBnWPe1LRa1Rx5A/edit) for an upcoming SIG Docs meeting, and attend the meeting to participate in the +or addition, [add it to the agenda](https://bit.ly/sig-docs-agenda) for an upcoming SIG Docs meeting, and attend the meeting to participate in the discussion. --> 本页讨论 Kubernetes 文档的样式指南。 @@ -34,7 +34,7 @@ discussion. 样式指南的变更是 SIG Docs 团队集体决定。 如要提议更改或新增条目,请先将其添加到下一次 SIG Docs 例会的 -[议程表](https://docs.google.com/document/d/1ddHwLK3kUMX1wVFIwlksjTk0MsqitBnWPe1LRa1Rx5A/edit) +[议程表](https://bit.ly/sig-docs-agenda) 上,并按时参加会议讨论。 @@ -123,7 +123,7 @@ For managing confidential data, consider using the Secret API. | For managing co {{< table caption = "使用 Pascal 风格大小写来给出 API 对象的约定" >}} 可以 | 不可以 :--| :----- -该 HorizontalPodAutoscaler 负责... | 该 HorizontalPodAutoscaler 负责... +该 HorizontalPodAutoscaler 负责... | 该 Horizontal pod autoscaler 负责... 每个 PodList 是一个 Pod 组成的列表。 | 每个 Pod List 是一个由 pods 组成的列表。 该 Volume 对象包含一个 `hostPath` 字段。 | 此卷对象包含一个 hostPath 字段。 每个 ConfigMap 对象都是某个名字空间的一部分。| 每个 configMap 对象是某个名字空间的一部分。 From 4ad404518aa13493f1c242651d49316f8a950c2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=85=E8=BF=9B=E8=B6=85?= Date: Thu, 30 Dec 2021 18:46:39 +0800 Subject: [PATCH 57/68] [zh] synchronize translate static-pod.md --- .../tasks/configure-pod-container/static-pod.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/content/zh/docs/tasks/configure-pod-container/static-pod.md b/content/zh/docs/tasks/configure-pod-container/static-pod.md index a202caf1b5..72066ee9dd 100644 --- a/content/zh/docs/tasks/configure-pod-container/static-pod.md +++ b/content/zh/docs/tasks/configure-pod-container/static-pod.md @@ -27,7 +27,7 @@ The kubelet automatically tries to create a {{< glossary_tooltip text="mirror Po on the Kubernetes API server for each static Pod. This means that the Pods running on a node are visible on the API server, but cannot be controlled from there. -The Pod names will suffixed with the node hostname with a leading hyphen +The Pod names will be suffixed with the node hostname with a leading hyphen. {{< note >}} If you are running clustered Kubernetes and are using static @@ -48,6 +48,20 @@ Pod 名称将把以连字符开头的节点主机名作为后缀。 就可能需要考虑使用 {{< glossary_tooltip text="DaemonSet" term_id="daemonset" >}} 替代这种方式。 {{< /note >}} + + +{{< note >}} +静态 Pod 的 `spec` 不能引用其他 API 对象 +(如:{{< glossary_tooltip text="ServiceAccount" term_id="service-account" >}}、 +{{< glossary_tooltip text="ConfigMap" term_id="configmap" >}}、 +{{< glossary_tooltip text="Secret" term_id="secret" >}} 等)。 +{{< /note >}} + ## {{% heading "prerequisites" %}} {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}} From 16f9fcaace9ecd8ef1c87ffd12ae1f595aa7906d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=85=E8=BF=9B=E8=B6=85?= Date: Thu, 30 Dec 2021 18:58:59 +0800 Subject: [PATCH 58/68] [zh] synchronize translate list-all-running-container-images.md --- .../list-all-running-container-images.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/zh/docs/tasks/access-application-cluster/list-all-running-container-images.md b/content/zh/docs/tasks/access-application-cluster/list-all-running-container-images.md index bf205350dd..6459875aeb 100644 --- a/content/zh/docs/tasks/access-application-cluster/list-all-running-container-images.md +++ b/content/zh/docs/tasks/access-application-cluster/list-all-running-container-images.md @@ -107,17 +107,17 @@ Pod is returned instead of a list of items. {{< /note >}} -## 列出 Pod 中的容器 +## 按 Pod 列出容器镜像 可以使用 `range` 操作进一步控制格式化,以单独操作每个元素。 ```shell -kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ +kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort ``` @@ -132,7 +132,7 @@ following matches only Pods with labels matching `app=nginx`. 要获取匹配特定标签的 Pod,请使用 -l 参数。以下匹配仅与标签 `app=nginx` 相符的 Pod。 ```shell -kubectl get pods --all-namespaces -o=jsonpath="{.items[*].spec.containers[*].image}" -l app=nginx +kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" -l app=nginx ``` 本任务使用[外部负载均衡服务](/zh/docs/tasks/access-application-cluster/create-external-load-balancer/), 所以需要对应的可支持此功能的环境。如果你的环境不能支持,你可以使用 -[NodePort](/zh/docs/concepts/services-networking/service/#nodeport) +[NodePort](/zh/docs/concepts/services-networking/service/#type-nodeport) 类型的服务代替。 From 23aaa92e744cd538768c778c23a753dacd6800ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=85=E8=BF=9B=E8=B6=85?= Date: Thu, 30 Dec 2021 19:30:02 +0800 Subject: [PATCH 60/68] [zh] synchronize translate access-cluster.md --- .../access-cluster.md | 208 +----------------- 1 file changed, 4 insertions(+), 204 deletions(-) diff --git a/content/zh/docs/tasks/access-application-cluster/access-cluster.md b/content/zh/docs/tasks/access-application-cluster/access-cluster.md index 52099d3a2a..f680dceb97 100644 --- a/content/zh/docs/tasks/access-application-cluster/access-cluster.md +++ b/content/zh/docs/tasks/access-application-cluster/access-cluster.md @@ -355,214 +355,14 @@ In each case, the credentials of the pod are used to communicate securely with t -## 访问集群中正在运行的服务 {#accessing-services-running-on-the-cluster} -上一节介绍了如何连接 Kubernetes API 服务。本节介绍如何连接到 Kubernetes -集群上运行的其他服务。 -在 Kubernetes 中,[节点](/zh/docs/concepts/architecture/nodes/)、 -[pods](/zh/docs/concepts/workloads/pods/) 和 -[服务](/zh/docs/concepts/services-networking/service/) 都有自己的 IP。 -在许多情况下,集群上的节点 IP、Pod IP 和某些服务 IP 将无法路由, -因此无法从集群外部的计算机(例如桌面计算机)访问它们。 +## 访问集群上运行的服务 {#accessing-services-running-on-the-cluster} - -### 连接的方法 {#ways-to-connect} - -有多种方式可以从集群外部连接节点、Pod 和服务: - -- 通过公共 IP 访问服务。 - - - 类型为 `NodePort` 或 `LoadBalancer` 的服务,集群外部可以访问。 - 请参阅 [服务](/zh/docs/concepts/services-networking/service/) 和 - [kubectl expose](/docs/reference/generated/kubectl/kubectl-commands/#expose) 文档。 - - 取决于你的集群环境,该服务可能仅暴露给你的公司网络,或者也可能暴露给 - 整个互联网。 - 请考虑公开该服务是否安全。它是否进行自己的身份验证? - - 在服务后端放置 Pod。要从一组副本中访问一个特定的 Pod,例如进行调试, - 请在 Pod 上设置一个唯一的标签,然后创建一个选择此标签的新服务。 - - 在大多数情况下,应用程序开发人员不应该通过其 nodeIP 直接访问节点。 - - -- 使用 proxy 动词访问服务、节点或者 Pod。 - - 在访问远程服务之前进行 apiserver 身份验证和授权。 - 如果服务不能够安全地暴露到互联网,或者服务不能获得节点 IP 端口的 - 访问权限,或者是为了调试,那么请使用此选项。 - - 代理可能会给一些 web 应用带来问题。 - - 只适用于 HTTP/HTTPS。 - - 更多详细信息在[这里](#manually-constructing-apiserver-proxy-urls)。 - - -- 从集群中的节点或者 Pod 中访问。 - - - 运行一个 Pod,然后使用 [kubectl exec](/docs/reference/generated/kubectl/kubectl-commands/#exec) - 来连接 Pod 里的 Shell。 - 然后从 Shell 中连接其它的节点、Pod 和服务。 - - 有些集群可能允许你通过 SSH 连接到节点,从那你可能可以访问集群的服务。 - 这是一个非正式的方式,可能可以运行在个别的集群上。 - 浏览器和其它一些工具可能没有被安装。集群的 DNS 可能无法使用。 - - -### 发现内建服务 - -通常来说,集群中会有 kube-system 创建的一些运行的服务。 - -通过 `kubectl cluster-info` 命令获得这些服务列表: - -```shell -kubectl cluster-info -``` - -``` -Kubernetes master is running at https://104.197.5.247 -elasticsearch-logging is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy -kibana-logging is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kibana-logging/proxy -kube-dns is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kube-dns/proxy -grafana is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy -heapster is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy -``` - - -这展示了访问每个服务的 proxy-verb URL。 -例如,如果集群启动了集群级别的日志(使用 Elasticsearch),并且传递合适的凭证, -那么可以通过 -`https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/` -进行访问。日志也能通过 kubectl 代理获取,例如: -`http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`。 -(参阅[使用 Kubernetes API 访问集群](/zh/docs/tasks/administer-cluster/access-cluster-api/) -了解如何传递凭据,或者使用 kubectl proxy) - -#### 手动构建 apiserver 代理 URL {#manually-constructing-apiserver-proxy-urls} - -如上所述,你可以使用 `kubectl cluster-info` 命令来获得服务的代理 URL。 -要创建包含服务端点、后缀和参数的代理 URL,需添加到服务的代理 URL: -`http://`*`kubernetes_master_address`*`/api/v1/namespaces/`*`namespace_name`*`/services/`*`service_name[:port_name]`*`/proxy` - -如果尚未为端口指定名称,则不必在 URL 中指定 *port_name*。 -对于已命名和未命名的端口,也可以使用端口号代替 *port_name*。 - -默认情况下,API server 使用 HTTP 代理你的服务。 -要使用 HTTPS,请在服务名称前加上 `https:`: -`http://`*`kubernetes_master_address`*`/api/v1/namespaces/`*`namespace_name`*`/services/`*`https:service_name:[port_name]`*`/proxy` - -URL 名称段支持的格式为: - -* `` - 使用 http 代理到默认或未命名的端口 -* `:` - 使用 http 代理到指定的端口名称或端口号 -* `https::` - 使用 https 代理到默认或未命名的端口(注意后面的冒号) -* `https::` - 使用 https 代理到指定的端口名称或端口号 - - -##### 示例 - -* 要访问 Elasticsearch 服务端点 `_search?q=user:kimchy`,你需要使用: - `http://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy` -* 要访问 Elasticsearch 集群健康信息 `_cluster/health?pretty=true`,你需要使用: - `https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true` - -```json - { - "cluster_name" : "kubernetes_logging", - "status" : "yellow", - "timed_out" : false, - "number_of_nodes" : 1, - "number_of_data_nodes" : 1, - "active_primary_shards" : 5, - "active_shards" : 5, - "relocating_shards" : 0, - "initializing_shards" : 0, - "unassigned_shards" : 5 - } -``` - - -### 使用 web 浏览器访问运行在集群上的服务 - -你可以在浏览器地址栏中输入 apiserver 代理 URL。但是: - -- Web 浏览器通常不能传递令牌,因此你可能需要使用基本(密码)身份验证。 - Apiserver 可以配置为接受基本身份验证,但你的集群可能未进行配置。 -- 某些 Web 应用程序可能无法运行,尤其是那些使用客户端 javascript - 以不知道代理路径前缀的方式构建 URL 的应用程序。 -1. 更新 `apt` 包索引,并安装使用 Kubernetes `apt` 仓库锁需要的包: + + 1. 更新 `apt` 包索引,并安装使用 Kubernetes `apt` 仓库所需要的包: - ```shell - sudo apt-get update - sudo apt-get install -y apt-transport-https ca-certificates curl - ``` + ```shell + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl + ``` + + 2. 下载 Google Cloud 公开签名秘钥: - -2. 下载 Google Cloud 公开签名秘钥: + ```shell + sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg + ``` - ```shell - sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg - ``` + + 3. 添加 Kubernetes `apt` 仓库: - -3. 添加 Kubernetes `apt` 仓库: + ```shell + echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list + ``` - ```shell - echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list - ``` + + 4. 更新 `apt` 包索引,使之包含新的仓库并安装 kubectl: - -4. 更新 `apt` 包索引,使之包含新的仓库并安装 kubectl: + ```shell + sudo apt-get update + sudo apt-get install -y kubectl + ``` +{{% /tab %}} - ```shell - sudo apt-get update - sudo apt-get install -y kubectl - ``` +{{% tab name="基于 Red Hat 的发行版" %}} -{{< /tab >}} - -{{< tab name="基于 Red Hat 的发行版" codelang="bash" >}} +```shell cat <}} +``` + +{{% /tab %}} {{< /tabs >}} -## 基础知识 +## 基础知识 {#basics} * [Kubernetes 基础知识](/zh/docs/tutorials/Kubernetes-Basics/)是一个深入的 交互式教程,帮助您理解 Kubernetes 系统,并尝试一些基本的 Kubernetes 特性。 @@ -55,7 +55,7 @@ Kubernetes 文档的这一部分包含教程。每个教程展示了如何完成 * [Configuring Redis Using a ConfigMap](/docs/tutorials/configuration/configure-redis-using-configmap/) --> -## 配置 +## 配置 {#configuration} * [示例:配置 Java 微服务](/zh/docs/tutorials/configuration/configure-java-microservice/) @@ -68,7 +68,7 @@ Kubernetes 文档的这一部分包含教程。每个教程展示了如何完成 * [Example: Deploying PHP Guestbook application with MongoDB](/docs/tutorials/stateless-application/guestbook/) --> -## 无状态应用程序 +## 无状态应用程序 {#stateless-applications} * [公开外部 IP 地址访问集群中的应用程序](/zh/docs/tutorials/stateless-application/expose-external-ip-address/) @@ -86,7 +86,7 @@ Kubernetes 文档的这一部分包含教程。每个教程展示了如何完成 * [Running ZooKeeper, A CP Distributed System](/docs/tutorials/stateful-application/zookeeper/) --> -## 有状态应用程序 +## 有状态应用程序 {#stateful-applications} * [StatefulSet 基础](/zh/docs/tutorials/stateful-application/basic-stateful-set/) @@ -99,9 +99,13 @@ Kubernetes 文档的这一部分包含教程。每个教程展示了如何完成 -## 集群 +## 集群 {#clusters} + +* [AppArmor](/zh/docs/tutorials/clusters/apparmor/) * [seccomp](/zh/docs/tutorials/clusters/seccomp/) @@ -110,10 +114,21 @@ Kubernetes 文档的这一部分包含教程。每个教程展示了如何完成 * [Using Source IP](/docs/tutorials/services/source-ip/) --> -## 服务 +## 服务 {#services} * [使用源 IP](/zh/docs/tutorials/services/source-ip/) + +## 安全 {#security} + +* [在集群级别应用 Pod 安全标准](/zh/docs/tutorials/security/cluster-level-pss/) +* [在名字空间级别应用 Pod 安全标准](/zh/docs/tutorials/security/ns-level-pss/) + ## {{% heading "whatsnext" %}} -{{< feature-state state="alpha" for_k8s_version="v1.22" >}} +{{< feature-state state="beta" for_k8s_version="v1.23" >}} -临时容器处于 Alpha 阶段,不适用于生产环境集群。 -根据 [Kubernetes 弃用政策](/zh/docs/reference/using-api/deprecation-policy/), -此 Alpha 功能将来可能发生重大变化或被完全删除。 -{{< /warning >}} - -PDB 不能阻止[非自愿干扰](#voluntary-and-involuntary-disruptions)的发生,但是确实会计入 -预算。 + +PDB 无法防止[非自愿干扰](#voluntary-and-involuntary-disruptions); +但它们确实计入预算。