Skip to content

Commit

Permalink
format error response like kubernetes api server
Browse files Browse the repository at this point in the history
  • Loading branch information
lucasepe committed Nov 27, 2023
1 parent e3caa3d commit dd3f830
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 32 deletions.
36 changes: 14 additions & 22 deletions internal/server/encode/encode.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,24 @@ package encode
import (
"encoding/json"
"net/http"
)

func Success(w http.ResponseWriter, dat []byte) error {
out := response{
Code: http.StatusOK,
Data: dat,
}

w.WriteHeader(http.StatusOK)
w.Header().Set("Content-Type", "application/json")
return json.NewEncoder(w).Encode(&out)
}
cardtemplatev1alpha1 "github.com/krateoplatformops/krateo-bff/apis/ui/cardtemplate/v1alpha1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func Error(w http.ResponseWriter, status int, err error) error {
out := response{
Code: status,
Error: err.Error(),
func Error(w http.ResponseWriter, reason metav1.StatusReason, code int, err error) error {
out := metav1.Status{
Status: "Failure",
Reason: reason,
Code: int32(code),
Details: &metav1.StatusDetails{
Group: cardtemplatev1alpha1.Group,
Kind: cardtemplatev1alpha1.CardTemplateKind,
},
Message: err.Error(),
}

w.WriteHeader(status)
w.WriteHeader(code)
w.Header().Set("Content-Type", "application/json")
return json.NewEncoder(w).Encode(&out)
}

type response struct {
Code int `json:"code"`
Error string `json:"error,omitempty"`
Data json.RawMessage `json:"data,omitempty"`
}
13 changes: 10 additions & 3 deletions internal/server/routes/widgets/cardtemplates/getter.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import (
"github.com/krateoplatformops/krateo-bff/internal/resolvers"
"github.com/krateoplatformops/krateo-bff/internal/server/encode"
"github.com/rs/zerolog"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/rest"
"k8s.io/utils/ptr"
"k8s.io/utils/strings/slices"
Expand Down Expand Up @@ -75,7 +77,12 @@ func (r *getter) ServeHTTP(wri http.ResponseWriter, req *http.Request) {
Str("name", name).
Str("namespace", namespace).
Msg("unable to resolve card template")
encode.Error(wri, http.StatusInternalServerError, err)

if apierrors.IsNotFound(err) {
encode.Error(wri, metav1.StatusReasonNotFound, http.StatusNotFound, err)
} else {
encode.Error(wri, metav1.StatusReasonNotAcceptable, http.StatusNotAcceptable, err)
}
return
}

Expand All @@ -94,7 +101,7 @@ func (r *getter) ServeHTTP(wri http.ResponseWriter, req *http.Request) {
Str("name", name).
Str("namespace", namespace).
Msg("unable to resolve allowed verbs for sub in orgs")
encode.Error(wri, http.StatusInternalServerError, err)
encode.Error(wri, metav1.StatusReasonNotAcceptable, http.StatusNotAcceptable, err)
return
}

Expand All @@ -119,8 +126,8 @@ func (r *getter) ServeHTTP(wri http.ResponseWriter, req *http.Request) {
Msg("successfully resolved allowed verbs for sub in orgs")
}

wri.WriteHeader(http.StatusOK)
wri.Header().Set("Content-Type", "application/json")
wri.WriteHeader(http.StatusOK)

enc := json.NewEncoder(wri)
enc.SetIndent("", " ")
Expand Down
13 changes: 10 additions & 3 deletions internal/server/routes/widgets/cardtemplates/lister.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import (
"github.com/krateoplatformops/krateo-bff/internal/resolvers"
"github.com/krateoplatformops/krateo-bff/internal/server/encode"
"github.com/rs/zerolog"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/rest"
"k8s.io/utils/ptr"
"k8s.io/utils/strings/slices"
Expand Down Expand Up @@ -69,7 +71,12 @@ func (r *lister) ServeHTTP(wri http.ResponseWriter, req *http.Request) {
Strs("orgs", orgs).
Str("namespace", namespace).
Msg("unable to resolve card templates")
encode.Error(wri, http.StatusInternalServerError, err)
if apierrors.IsNotFound(err) {
encode.Error(wri, metav1.StatusReasonNotFound, http.StatusNotFound, err)
} else {
encode.Error(wri, metav1.StatusReasonNotAcceptable, http.StatusNotAcceptable, err)
}

return
}

Expand All @@ -89,7 +96,7 @@ func (r *lister) ServeHTTP(wri http.ResponseWriter, req *http.Request) {
Str("name", el.GetName()).
Str("namespace", namespace).
Msg("unable to resolve allowed verbs for sub in orgs")
encode.Error(wri, http.StatusInternalServerError, err)
encode.Error(wri, metav1.StatusReasonNotAcceptable, http.StatusNotAcceptable, err)
return
}

Expand All @@ -115,8 +122,8 @@ func (r *lister) ServeHTTP(wri http.ResponseWriter, req *http.Request) {
}
}

wri.WriteHeader(http.StatusOK)
wri.Header().Set("Content-Type", "application/json")
wri.WriteHeader(http.StatusOK)

enc := json.NewEncoder(wri)
enc.SetIndent("", " ")
Expand Down
8 changes: 4 additions & 4 deletions kubeconfig
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1URXlOREE0TlRjMU9Wb1hEVE16TVRFeU1UQTROVGMxT1Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTitCCmNyeEIxUDhWTHFCN0lFdUxZZXpXKy9kN2k5dUpjVXl3bUEzQWJONjlVNUlVZ2o3WmdrV1ZtVzN3QWtnSEFQN3gKRjVWNEExSG5OR2F3NFcvZ3RaVUFTTFNCVHhqK21aQnBydXhwUFRqY1NxTEVCRDJ4RThocmZmTFV6VTNiSS9Tcwp3RlV2Qk84VSsxWDFzbHhxTXNxNVR1MVBYVHBGODZqWDFHYWFFNGd5R1dlV0hVM09kUEdyMkh2Ui9FQ2VGWDh6CmNYMjNlZzM2QmpDMEJpdjVMRzNabjFpYVdkV29TME5qOGRYNVpaQ2Q5KzFmQjFtWkRPMFpodDVXNFc0aFg0MkgKK3pRYkJDQ05KaVEwcCsyVDZmWURpSGVrUzRVdDAyNmsvRTU3dTJadHlicngyYk5jL010SVBUZjVYQ3RJTDlxQQp3OW81NS9aRzUzcE1ua003SWs4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZMeGFrZ0w1OXVWMVBlY1R3cmpCaEw1SGVTaW1NQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBTm92YzVleHRpWmErZmRqMDBJbApNV1JQRjRrL0pyMWlWRld5Q2dZWlU5dkxWakJQWFJ2QkJEdDFPVUhNUFoxSFQ0OFZNSjlBc0Naa2trdmJ5RzRwCmN5VU02YUhXSFZDcnNPUUZYbE9kTFQzbGltZnVWcG5Denk3UmYvUU1EbUZyeE1vdGVIWDh1NC9kRTEvMnV4V3MKRDZId0hjbGZwSTZWbmsrUGMwUVFhOW1qQU9aWHR2REx1d3g3L1kxTTQzRzJmSWlkQU1KVTAwZjllaTQwbXY5SgowbXpzTnM0MTQwYTNOeEJZUmVnakJtc2xKL1N6dlZYSXB2c3kraTg3Vkx5NWw5MzR5VUlvVktLYXI3U1hOcjVnClJGUkt2dUdGR3JObHZFWElLUEhwaHV4ZzVIQ1NVZUpjR1Jwcjl1TlhiNXl6eVJHcnZxT1ZBMXEzTUxCRmZhQWoKQlBRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://127.0.0.1:50361
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1URXlOekV6TXpjeU5sb1hEVE16TVRFeU5ERXpNemN5Tmxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTZuCkgzeXREcG5sbVdYUEtnYWF6cFFXcEFvVW5PbXlOMEhsdzdENGgreFF6eElTUG9QQ1lhT044aC9HZlB3QUlGRnEKc2pobk5WN0pFeVROVnl6SVZqMnRGRGovcFNueTZOM0Nkbk9VMStUMFZ6VHJYNW5yS3o1eTh4MlYrS2JiclhDSwp0MWN0RUVlVlhySlBNTURMd0czVkxDN3ZIc1c5S0FYNGZ6T2ZrMHdod1l6OFRpNnlWakxWK3M2MU1HZWd0SVJ1CmIxc1F5QlZMb3luMW85QWtvM2lQR3dZcWpXcTYzeEF0RGRyRUxVMnFleTh3Q0FqcW0zTnMyY3Bpd0xOcFNET1gKdXpKeCtQQVBRaUpYZUIwSHFPWEc0RTA5c1hYRXg4VEZmMGdGSlhhcjVDVWlsYXBKdjUwRkNZdVNUQ3pqUUg4aApvd2ZycHUxNG9QNWtvN09DOGJVQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZETXhtODdHSFFJZEJDNTk2Qm8vdjBLZmhvYTBNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRUhsei9UVW5Ib2RFbXJQNjJPSQpUbFVsN1I2bVg1a3RHVld3R1N6eFh1Y2UySWRlRXVsT3hhZjFwTHlTMG9vZklocEg1TVZSSTFWU2xpTVFyVW1hCllwaHp2bitEM0FkVFlMcmM0NkZjVkJ1MWJoU1hBb056Z3krK1hIVXVHSVorU2MvWUhlRXY0V2o3NFpRekxNV3YKZ0cxNDI0QmVRdHBxV0VHR0VoWW8zZDV3TlBkMnNuU1pRNTF2QW03ZXNOQzcvZVo3akpYMXZEK2x4Vnl4TUZSQQpVSnNWUFpLbmdkMkRKZk9yck1hQUw5Wk5meHQzWDJDYnluYUJob2t1VFdoaDFBQUh4Z1lHRFRhbHpZNDlJampoCmxZQnlOc0NXVDFsWDczSmsrQmZvcEN4Ty9hd2pSZjlLa3o1SG5aOWF6OGdkeWQwcVVaYUxOOXd1RDhTU3dubSsKOVFjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://127.0.0.1:55642
name: kind-local-dev
contexts:
- context:
Expand All @@ -15,5 +15,5 @@ preferences: {}
users:
- name: kind-local-dev
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJSFFSZ3NGa0FQZ1l3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeE1qUXdPRFUzTlRsYUZ3MHlOREV4TWpNd09EVTRNREJhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXpKdlZLalB4MUhEKzZoWXoKZHhCcFpSMnlTdGpkK1V2TW1ubTNqTTlXUWFJMFVuc2ptblNHMi95QmNybVE3MkxKNklXN2IzR01LWEdzSEhRdQpNV0xSalc0bWlWTWpXT25TRUd1aEdYb1BlK0RHcmtBYjRQRGs4cDJJVEFvaU5NenBIWnNEQ1YyakNWYlFkQ3A5Ck9jZy82VFgvaWV5VWZpWEYyNGFtNkMzcjFKQ1VxR1I1T2REb0pRMURSenlDMlREUGR1WlNsa2l6L1E4ajlyM0IKVnRCeCtjVFZGY0tiUi9ZTlova2s5bnlpMThmTTBtd24wT29GNENUbUdTNFVpbWhJMEpFdXhLUjNMMWJJdGhYNQpyS3VwUDlqTnBQaE5NblVSL3l5NThpeEgyVVVVVkl1VVZvdVpPVXhZTTVyWWpKMkpubHExY2plNkdxK08vTjlNClZPNEZzd0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JTOFdwSUMrZmJsZFQzbkU4SzR3WVMrUjNrbwpwakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBdW5MVC83b2FQbThZaC9zYlVvT2VWU0xGbW5pQUpXbkVvVmhLCmNydy9WblN3bGlqdlpsTzdkNHEzS29sK2IyN0dDallqNjU5cjkvWkFLNWFMUU1vOXRMUkxPZkVxSlpYV0pyRFgKWXYyam9wTVd3bW5ld2VuSkpYUkl0MXpCOWVXcnpqNDZhb1krUXRKcGZtU1kwNVJxZDA0UHVFa3JuME9QOGhveApJQkZ0NFFEWXNxeTV3eERhTjVVU09IZTVFcDNjbWNTNS9SMzRSRlBKZ3RPUTgybUFINEdScGN0TThvZ0d5V1IyCnowcFRmUTJFOFFMR3hvOGN4NnhpWmNvNlFiMG9CSFBlY1R1LzU2M0M4d2RzaDZ4a0hTaENidEFMd2FmM2loRHcKb29Ta1pnQXVnM1ozb1RTbkdWanJ3d2pzWXFTZzF5UGVLN3dBU1NmK1ZTMzlIaCsrWUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBekp2VktqUHgxSEQrNmhZemR4QnBaUjJ5U3RqZCtVdk1tbm0zak05V1FhSTBVbnNqCm1uU0cyL3lCY3JtUTcyTEo2SVc3YjNHTUtYR3NISFF1TVdMUmpXNG1pVk1qV09uU0VHdWhHWG9QZStER3JrQWIKNFBEazhwMklUQW9pTk16cEhac0RDVjJqQ1ZiUWRDcDlPY2cvNlRYL2lleVVmaVhGMjRhbTZDM3IxSkNVcUdSNQpPZERvSlExRFJ6eUMyVERQZHVaU2xraXovUThqOXIzQlZ0QngrY1RWRmNLYlIvWU5aL2trOW55aTE4Zk0wbXduCjBPb0Y0Q1RtR1M0VWltaEkwSkV1eEtSM0wxYkl0aFg1ckt1cFA5ak5wUGhOTW5VUi95eTU4aXhIMlVVVVZJdVUKVm91Wk9VeFlNNXJZakoySm5scTFjamU2R3ErTy9OOU1WTzRGc3dJREFRQUJBb0lCQUNmUXR6VmtNRTNud3lNbwpPTkdWaHZ6ZlAzK2pIZWJTSWpsNU1BZWRuU3BlZHhJSjFrN0xHQ2NjeHMvZFhsL0crSVZmNks1eUNSVlRnbXR6CkRENGQvYXNvNFNUZDRjWCtraHNSNXFKL2h4M1RDcmFEMFNqL2wzM0N1L0FZRkxuem1mVmg0Y0JqMFVNUytyTncKUlRnR1NMR0lDWGI4YTVUMG9zRHFQZloyWVNyV3NtNDQxZGROYTVzSHdyeGlEaDErN0k0c0tHUjNFQXBkRlJuaAptdTZoOHdMbVk2aHYyWkJwSUFsMUQycWxZc2NiVDNzU3FEazlHSHh3S3ZsMkNmOXZWZTdZUEJYTzdYK3Y1SWthCnRZRzNyNjhPSEhCY01pWDlUY3psQkNYSDViNkQyaHN2anFXNFZUSjVNTzJsRmFieTJhRTdkekROVkFKRWMrZHgKeFpMWFRVRUNnWUVBMkFSelRRcmNSQWxPN0NUclFyOHFDd3JDRVN4djYrbkFMY3IrRTExZlM4a2E4TUwwaW1yagpFaUplSXlRVXR1ejFZTnE1SmNmcEo3OEgyK1JaVUxNanduWnlwM1gxc09uSzhaM3g1UzZtdG83VFlhYnZER0VvClJBVzZHc0lDZHdGMWFoZW9WbGkzaUFJRXJKbFdiVmhIR3hGTnJBVlYyNldHK244eWJKcWdjTk1DZ1lFQThuck8KUTEya1R0T0N6bk1FbERNT3ZFcG5TbFZ4V2dYV0poRkhCVENiWHcvYTY3Yk5UWlRRcGlYT2lmS1dpMVV3MWpDZwpJZmw2NFpkbENUWExYSDN1MThSeVFlUkFiRlJBbnB0Z3dDZHdBMXVjbGtjMlR2ZEFGUUxpMVVBdVp2SW43OHJnCk1iMnhlMTZkMjlmUUlEVlo3dUZyTnRPaEV5akV6MjNzaHYxYUM2RUNnWUFnRk1FZTd2NzVaN3g5MjVuSTV1VVMKa0wxem1Ycmh1V3hlSUtpTkxhL0tiSXFBdVNOaUx5K2I4TmkwTlZhU09DelUvb2JDc3FiUXpWRVllaGc5b08wdApvek94NVJYZytVZTNqSEp4Uy9WY1pXZkZOK3FHbHlOSXZ1VDl0bFJ4WWhrUzhZS0JtRmxoYkpOUEl0S3dHSTB1CjJ1b0RJeU8ySkNZZ3E2Vk1kY1pnR3dLQmdRQzNqaVZVTTYvdENBcE9WQjFVUHE1WjlRenA1WEpRVG5qRkNuRXoKeVk3a1VIRk4zR3pmM05aeDM4N1ErSFhqOWRKcFloZm1nQi80WkEzVkFnYjI5bEgydmp3c0N5aUZtT1h0NnZzNwptdDhkZTUwMjJhT1A5WFZxTW13YU9HS29CWW9iNlB6OFNuZnZSem5Dc1VWWkRHb08vaytXQ25BMXU3ZjR1bUxCCjhVblg0UUtCZ1FDU253RGduajZPRHFFdE9pVDVqK002eVBTeDk1dHRXdjJlaGtsVlpBUzczUVIzVndlSkRqQnkKVDdLOVlqYlVvMUNhUUpVdWxnQ1Y2ZTgrZnJSZnY0SnJqTjliNXExL3BIKzlXTmRpa3V2MDBXS0NHaE1ycFZWZgpGR0JFZlI5dS9XWjR3TE5GdWhrRWkvZEhCQWdjb1NWbmVkT0lvSUkvbjY0K0ZuU0JsOFpHdWc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJV3dlazBkMDI5UnN3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpFeE1qY3hNek0zTWpaYUZ3MHlOREV4TWpZeE16TTNNamRhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXJpSExuZm9xY1lTNW5oU1UKQk9hMjhsdXJ5RmJyV1lsTDBlNlA4cHhpcVVPaEFnWmZaU0tGNlZ4R0ZXR3R4ZDhDakd1N2haMk42ZTZmNGp5NgpMcDVRYUJ6Qld5K3hPTUl4L1cxUE1CREVmLzJWRnlkR0hSaVNmSEx2WTVLeXo1N0dSalRpZy9ySS9wM0FOTU1sCnJQVXhpaHIzaW12T3JlelNzbWlwYXJWUDNmOHFabk1YNi9ZTmQvSVBFeE5XRkl6TEp6R1J0ckE0alh1a05YQzMKSHhmT3ZwM0xXbmZUTUtqQ0Jub29NY21MQ29sTHVxL2dCcU1NWUN4SU5HTFVVRmNwN1RKdGZna1hxWDE1R1dwbQovZ1Fmb1lEQzZMVG5ZbWpkVThWTTRYQjBlaEp6ZFNBby8ybTZuZ3dtdWtqQkd4VDE5cFo4S0FXa2NGaDUyOFF5CkhTKzVmUUlEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JRek1adk94aDBDSFFRdWZlZ2FQNzlDbjRhRwp0REFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBU3c5UXB0VkpqSFFibGFxQjVORnN1dXIvQ0ozblczYXRIekZWCm5makNCTFVuQllHblpDU0tobmRicWNKZ3Urc056ZnBwSWtRVEYxV21kbnVjYU9qUXdqcmNheHF2NU4xVHgzOGoKY1BSZUM4TUJOM0xjRURkRFZieDVOOUNrdnpIanhUZWNvWmJhM0IxdGhUZXdjL2pBM2VKQ0gvcnJZQXZwT0dGUgpBbFd5czZZTHYvaXMySU12dVJVaSsrbXl0dE9WRDkxT2Z3Y2toOU9ORWVBTXZ0ek44RGkwYzJoY3MrdmozUkxaCjcrR3pjbG8xUFE2QzA0SG9iaWhpT2pPSTZDTXZVbU50RmNkOXJTaWV2bmRIbTRPVUViWkJUdnQ3WWJyeG1KTUwKT2ZRcDd1bGRjZ1Z5QXRLNDZlbk5vVUE0NlBuMjRRaTQxVGYxdWU5VzQyY00yVzZ3dkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcmlITG5mb3FjWVM1bmhTVUJPYTI4bHVyeUZicldZbEwwZTZQOHB4aXFVT2hBZ1pmClpTS0Y2VnhHRldHdHhkOENqR3U3aFoyTjZlNmY0ank2THA1UWFCekJXeSt4T01JeC9XMVBNQkRFZi8yVkZ5ZEcKSFJpU2ZITHZZNUt5ejU3R1JqVGlnL3JJL3AzQU5NTWxyUFV4aWhyM2ltdk9yZXpTc21pcGFyVlAzZjhxWm5NWAo2L1lOZC9JUEV4TldGSXpMSnpHUnRyQTRqWHVrTlhDM0h4Zk92cDNMV25mVE1LakNCbm9vTWNtTENvbEx1cS9nCkJxTU1ZQ3hJTkdMVVVGY3A3VEp0ZmdrWHFYMTVHV3BtL2dRZm9ZREM2TFRuWW1qZFU4Vk00WEIwZWhKemRTQW8KLzJtNm5nd211a2pCR3hUMTlwWjhLQVdrY0ZoNTI4UXlIUys1ZlFJREFRQUJBb0lCQUJqdytFUkJiOURnck9HSwptd1Qwc3VHVjVjNEZQU0tPK3RBdjltaE9wQWNRaThCSmYySnlCbkk5YUVCcHhFVWlRekF2d2lWS1F1aHQ2SEswCk5ncTFYRmo5UFdpOU5Rb25McGZaRDAyWUtUMFg2a0h0dXlveHVkR2ZlTkJ2VTdOUFQ2RUF0QzBwUDU3UW81WXIKR1h0amgxdjdydGNoeC9HN2lSWkt6WEZlVlBrNzlhL2padXJSWVJqN000U1hMOTZEMGhiL200TUxDa3FxbWhsVwpwalVveGUyeVZPREhtYUtFVTU3T3VhelNLS2JLWUVuRnYrSGNrZGFGYnlQK0NrQjVNQ3c3aTVQN1l2blpGSzlrCjNFUVdQREFabmhybHRnRXJORlhjZWxqbDI1VC9oV0F4UDV5SzNBbXdXM1Jicmk2dzEvT3lVVndhUndIRStla3EKSVVTRTluVUNnWUVBMUFGK2Fhd0ZlL3grWXJwd0pBWEx5M1RNNSsrYzBzd1ZlS2R3WkJxSW0vV2tmc3ZwMksyQgpYWXNXV3p0bDhUVlN2bE1PYTZ3MmsrQXRicmgvYittTzRSU21Xc2JWb21kWHBaWld0TUVHM01LR2l1elB5dmdUCmV3OU9Nck4vRGk0ZmI0c1hIZFN2Mk9qSloyWUFxemF0aGgvOHJOb1BHcm05MmlFRGprOGdqemNDZ1lFQTBrUlAKSG42TUx1bUtMNk5ld2hhQjdoV1B4Qk8vdC9YbWI0UjlnNWdTcFZkRlVTbXB6ODB5bis1R3ZqaUhFWTZwQ1h5OAo3VFI1ODM0K0lSYURvbWRKM01HbGhkZTF2SU5hWFVhbnRaZ1hNRzBZaWc3VG11NnRmRE42NHlsOStQRGIyZk5tCldIendCdzR1NDc2cVA4V0JJdmpEMVlMVFdya0lHZndtS1N4aXp1c0NnWUFXWkZuL3UwV1JCT2dzY1ZpcTFWbmoKRVdFYkZqblFJZklhbmtUR3JlN0QyandYa0Y0UW5yTE5PSVdSK1VJWktmS2xXNHhvWHZZY3hFN0lKUUNBeDRCcAowWTZJZy92SWZYWEtiWWlXNnRSWXVNc1JIVllOTUFxT3N0MGxpY1Bmc1l0c2NwcHNjaXhva3AzREtBam1ESTVqClhqbUg0RGc4TUdZWEJlbWtQRU5LSFFLQmdFY3JBN1NJbEo0VVFjZFovbXFtLzVjOENRc092Q2RodlhzbFZ1NUIKZko0bDZicE01Y01GNndxaXRhTVFzdmJJV0lKemkrYWxpbGxWODJWem4xNUtvMzlxczhHWGYxV3RCOXJtWFVGagpsd1czQjBWRE8zQUhOUVVDejZjdmxnbTZURTk2eUx0T25sZGsvNDNxTE9ta3ljNnljR1pGLzQrSGJTeU9ZY1F4CjE4ZTlBb0dCQUl3Q3B6bXNWd2lsOVN3SEFabW0zaXRnNlpZTk0ySHFFV1c2UTVtcjFZY0hEREd6ZHJTaDJxQmMKcFZUSitMbkpyNXF0c0EwNjhDb1krd1JxekhlaTRkNnV5a2dZV2ZWN1E3bWU5N1g4Z014OTU3SWJMNUxhbW80OQp2eEkxSWlMWEowZ1JMM0ZhbFhpYzFRaFhRTGxqUDZRTGV3RlcydG9samxLWVhhUjc0L1orCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

0 comments on commit dd3f830

Please sign in to comment.