From 0fef894b2475ee8c7902fb687435a94833f2ee40 Mon Sep 17 00:00:00 2001 From: Bartosz Leper Date: Wed, 4 Dec 2024 15:14:07 +0100 Subject: [PATCH 01/15] Update e/ reference (#49763) --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index c230021897f8c..41bca8b99d3ae 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit c230021897f8c46826ac5de3fde3280381f42749 +Subproject commit 41bca8b99d3ae9ab6f910ac1c9180b43ece93df8 From ed76973ac8d99aa4d433af8398fde4c7c7c603c7 Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Wed, 4 Dec 2024 11:20:54 -0300 Subject: [PATCH 02/15] chore: Bump opentelemetry modules (#49762) * chore: Bump opentelemetry modules on api/ * chore: Bump opentelemetry modules on / * Tidy integrations/ --- api/go.mod | 24 ++++++------ api/go.sum | 52 ++++++++++++------------- go.mod | 32 ++++++++-------- go.sum | 64 +++++++++++++++---------------- integrations/event-handler/go.mod | 30 +++++++-------- integrations/event-handler/go.sum | 60 ++++++++++++++--------------- integrations/terraform/go.mod | 30 +++++++-------- integrations/terraform/go.sum | 64 +++++++++++++++---------------- 8 files changed, 178 insertions(+), 178 deletions(-) diff --git a/api/go.mod b/api/go.mod index 6d69900733e2f..31e931385e11a 100644 --- a/api/go.mod +++ b/api/go.mod @@ -13,20 +13,20 @@ require ( github.com/jonboulle/clockwork v0.4.0 github.com/russellhaering/gosaml2 v0.9.1 github.com/stretchr/testify v1.10.0 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 - go.opentelemetry.io/otel v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 - go.opentelemetry.io/otel/metric v1.30.0 - go.opentelemetry.io/otel/sdk v1.30.0 - go.opentelemetry.io/otel/trace v1.30.0 - go.opentelemetry.io/proto/otlp v1.3.1 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 + go.opentelemetry.io/proto/otlp v1.4.0 golang.org/x/crypto v0.29.0 golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f golang.org/x/net v0.31.0 golang.org/x/term v0.26.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 google.golang.org/grpc v1.68.0 google.golang.org/protobuf v1.35.2 gopkg.in/yaml.v2 v2.4.0 @@ -41,12 +41,12 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect golang.org/x/sys v0.27.0 // indirect golang.org/x/text v0.20.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/api/go.sum b/api/go.sum index 40ba92bdc3a95..8d2982e63ce17 100644 --- a/api/go.sum +++ b/api/go.sum @@ -800,8 +800,8 @@ github.com/gravitational/trace v1.4.0/go.mod h1:g79NZzwCjWS/VVubYowaFAQsTjVTohGi github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= @@ -861,8 +861,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russellhaering/gosaml2 v0.9.1 h1:H/whrl8NuSoxyW46Ww5lKPskm+5K+qYLw9afqJ/Zef0= github.com/russellhaering/gosaml2 v0.9.1/go.mod h1:ja+qgbayxm+0mxBRLMSUuX3COqy+sb0RRhIGun/W2kc= github.com/russellhaering/goxmldsig v1.3.0/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= @@ -905,27 +905,27 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1500,10 +1500,10 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/go.mod b/go.mod index b580823686695..afe3a459ff1df 100644 --- a/go.mod +++ b/go.mod @@ -186,22 +186,22 @@ require ( go.etcd.io/etcd/api/v3 v3.5.17 go.etcd.io/etcd/client/v3 v3.5.17 go.mongodb.org/mongo-driver v1.14.0 - go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 - go.opentelemetry.io/otel v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 - go.opentelemetry.io/otel/sdk v1.30.0 - go.opentelemetry.io/otel/trace v1.30.0 - go.opentelemetry.io/proto/otlp v1.3.1 + go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 + go.opentelemetry.io/proto/otlp v1.4.0 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.29.0 golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f golang.org/x/mod v0.22.0 golang.org/x/net v0.31.0 - golang.org/x/oauth2 v0.23.0 + golang.org/x/oauth2 v0.24.0 golang.org/x/sync v0.9.0 golang.org/x/sys v0.27.0 golang.org/x/term v0.26.0 @@ -209,7 +209,7 @@ require ( golang.org/x/time v0.6.0 golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 google.golang.org/api v0.197.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 google.golang.org/grpc v1.68.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 google.golang.org/protobuf v1.35.2 @@ -375,7 +375,7 @@ require ( github.com/gorilla/mux v1.8.1 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -469,7 +469,7 @@ require ( github.com/pquerna/cachecontrol v0.1.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/zerolog v1.28.0 // indirect github.com/rubenv/sql-migrate v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -522,7 +522,7 @@ require ( go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.29.0 // indirect - go.opentelemetry.io/otel/metric v1.30.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.29.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/atomic v1.11.0 // indirect @@ -533,7 +533,7 @@ require ( golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index fb99322c67f81..6009a3761443c 100644 --- a/go.sum +++ b/go.sum @@ -1545,8 +1545,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.7.3 h1:p05XDDn7cBTWiBqWb30mrwxd6oU0claAjqeytllnsPY= @@ -2010,8 +2010,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= @@ -2269,33 +2269,33 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= -go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0 h1:MnAevUB0SFfKALzF5ApgrArdvHZduRT3/e59L/lNYKE= -go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0/go.mod h1:MHPbT1EvQOZMGbKeuCovYWcyM9iaxcltRf7+GsU8ziE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0 h1:G47XgH32CEM1I9kZ8xrVExSxivATGHNE0tdxuqlx9MQ= +go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0/go.mod h1:aqXlYGrumc8b/n4z9eDHHoiLN4fq2DAO//wMnqdxPhg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY= go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.step.sm/crypto v0.51.2 h1:5EiCGIMg7IvQTGmJrwRosbXeprtT80OhoS/PJarg60o= @@ -2522,8 +2522,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -3004,10 +3004,10 @@ google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index 1db51b1203e49..4b570cb8ced6f 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -181,7 +181,7 @@ require ( github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -242,7 +242,7 @@ require ( github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rubenv/sql-migrate v1.7.0 // indirect github.com/russellhaering/gosaml2 v0.9.1 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect @@ -271,29 +271,29 @@ require ( github.com/zmap/zlint/v3 v3.6.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect - go.opentelemetry.io/otel v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/metric v1.30.0 // indirect - go.opentelemetry.io/otel/sdk v1.30.0 // indirect - go.opentelemetry.io/otel/trace v1.30.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect golang.org/x/crypto v0.29.0 // indirect golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect golang.org/x/mod v0.22.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect golang.org/x/sync v0.9.0 // indirect golang.org/x/sys v0.27.0 // indirect golang.org/x/term v0.26.0 // indirect golang.org/x/text v0.20.0 // indirect google.golang.org/api v0.197.0 // indirect google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/grpc v1.68.0 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index 8f76fbccfeabe..f9d0d538516d0 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -1225,8 +1225,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -1480,8 +1480,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE= github.com/russellhaering/gosaml2 v0.9.1 h1:H/whrl8NuSoxyW46Ww5lKPskm+5K+qYLw9afqJ/Zef0= @@ -1613,29 +1613,29 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= @@ -1824,8 +1824,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2267,10 +2267,10 @@ google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 46cdc90197d5d..584c835a89b45 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -202,7 +202,7 @@ require ( github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/hashicorp/cli v1.1.6 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect @@ -296,7 +296,7 @@ require ( github.com/prometheus/procfs v0.15.1 // indirect github.com/quic-go/quic-go v0.48.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rubenv/sql-migrate v1.7.0 // indirect github.com/russellhaering/gosaml2 v0.9.1 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect @@ -336,23 +336,23 @@ require ( go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect - go.opentelemetry.io/otel v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/metric v1.30.0 // indirect - go.opentelemetry.io/otel/sdk v1.30.0 // indirect - go.opentelemetry.io/otel/trace v1.30.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/mock v0.4.0 // indirect golang.org/x/crypto v0.29.0 // indirect golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect golang.org/x/mod v0.22.0 // indirect golang.org/x/net v0.31.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect golang.org/x/sync v0.9.0 // indirect golang.org/x/sys v0.27.0 // indirect golang.org/x/term v0.26.0 // indirect @@ -362,8 +362,8 @@ require ( google.golang.org/api v0.197.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 2dacd8c9840a2..c8e5418a3c23d 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -1353,8 +1353,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/cli v1.1.6 h1:CMOV+/LJfL1tXCOKrgAX0uRKnzjj/mpmqNXloRSy2K8= @@ -1756,8 +1756,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= @@ -1943,33 +1943,33 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= -go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0 h1:MnAevUB0SFfKALzF5ApgrArdvHZduRT3/e59L/lNYKE= -go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0/go.mod h1:MHPbT1EvQOZMGbKeuCovYWcyM9iaxcltRf7+GsU8ziE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0 h1:G47XgH32CEM1I9kZ8xrVExSxivATGHNE0tdxuqlx9MQ= +go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0/go.mod h1:aqXlYGrumc8b/n4z9eDHHoiLN4fq2DAO//wMnqdxPhg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY= go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= @@ -2167,8 +2167,8 @@ golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2624,10 +2624,10 @@ google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= From 56e9ea6c8d50436eac0bc361eb55492f8db1ba40 Mon Sep 17 00:00:00 2001 From: Erik Tate Date: Wed, 4 Dec 2024 09:32:18 -0500 Subject: [PATCH 03/15] cleaning up drop users within a single lease rather than grabbing a lease per user (#49096) --- lib/srv/usermgmt.go | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/lib/srv/usermgmt.go b/lib/srv/usermgmt.go index c73e1db41390e..9415c7148096c 100644 --- a/lib/srv/usermgmt.go +++ b/lib/srv/usermgmt.go @@ -485,6 +485,8 @@ func (u *HostUserManagement) UpsertUser(name string, ui services.HostUsersInfo) return closer, nil } +const userLeaseDuration = time.Second * 20 + func (u *HostUserManagement) doWithUserLock(f func(types.SemaphoreLease) error) error { lock, err := services.AcquireSemaphoreWithRetry(u.ctx, services.AcquireSemaphoreWithRetryConfig{ @@ -493,7 +495,7 @@ func (u *HostUserManagement) doWithUserLock(f func(types.SemaphoreLease) error) SemaphoreKind: types.SemaphoreKindHostUserModification, SemaphoreName: "host_user_modification", MaxLeases: 1, - Expires: time.Now().Add(time.Second * 20), + Expires: time.Now().Add(userLeaseDuration), }, Retry: retryutils.LinearConfig{ Step: time.Second * 5, @@ -556,26 +558,35 @@ func (u *HostUserManagement) DeleteAllUsers() error { return trace.Wrap(err) } var errs []error - for _, name := range users { - lt, err := u.storage.GetHostUserInteractionTime(u.ctx, name) - if err != nil { - u.log.DebugContext(u.ctx, "Failed to find user login time", "host_username", name, "error", err) - continue - } - u.doWithUserLock(func(l types.SemaphoreLease) error { + u.doWithUserLock(func(l types.SemaphoreLease) error { + for _, name := range users { + if time.Until(l.Expires) < userLeaseDuration/2 { + l.Expires = time.Now().Add(userLeaseDuration / 2) + if err := u.storage.KeepAliveSemaphoreLease(u.ctx, l); err != nil { + u.log.DebugContext(u.ctx, "Failed to keep alive host user lease", "error", err) + } + } + + lt, err := u.storage.GetHostUserInteractionTime(u.ctx, name) + if err != nil { + u.log.DebugContext(u.ctx, "Failed to find user login time", "host_username", name, "error", err) + continue + } + if time.Since(lt) < u.userGrace { // small grace period in order to avoid deleting users // in-between them starting their SSH session and // entering the shell - return nil + continue } - errs = append(errs, u.DeleteUser(name, teleportGroup.Gid)) - l.Expires = time.Now().Add(time.Second * 10) - u.storage.KeepAliveSemaphoreLease(u.ctx, l) - return nil - }) - } + if err := u.DeleteUser(name, teleportGroup.Gid); err != nil { + errs = append(errs, err) + } + } + + return nil + }) return trace.NewAggregate(errs...) } From 3b1f2b5acbab308c45ad90d968f0d31b064f5af9 Mon Sep 17 00:00:00 2001 From: Bartosz Leper Date: Wed, 4 Dec 2024 15:47:15 +0100 Subject: [PATCH 04/15] Adds a model-level validation capability to our validation library (#49543) * Validation Adds a model-level validation capability to our validation library. * review * Never return undefined from useValidation() --- .../FieldMultiInput/FieldMultiInput.story.tsx | 22 +- .../FieldMultiInput/FieldMultiInput.test.tsx | 54 ++++- .../FieldMultiInput/FieldMultiInput.tsx | 36 +++- .../FieldSelect/FieldSelect.story.tsx | 5 +- .../components/Validation/Validation.jsx | 105 ---------- .../components/Validation/Validation.test.tsx | 101 ++++++--- .../components/Validation/Validation.tsx | 192 ++++++++++++++++++ .../components/Validation/rules.test.ts | 59 ++++++ .../shared/components/Validation/rules.ts | 81 ++++++++ .../shared/components/Validation/useRule.js | 8 +- .../LabelsInput/LabelsInput.test.tsx | 119 +++++++++++ .../components/LabelsInput/LabelsInput.tsx | 71 ++++++- 12 files changed, 699 insertions(+), 154 deletions(-) delete mode 100644 web/packages/shared/components/Validation/Validation.jsx create mode 100644 web/packages/shared/components/Validation/Validation.tsx diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx index 5362236a8b24d..2f798d4d923d1 100644 --- a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx @@ -20,6 +20,12 @@ import React, { useState } from 'react'; import Box from 'design/Box'; +import { Button } from 'design/Button'; + +import Validation from 'shared/components/Validation'; + +import { arrayOf, requiredField } from '../Validation/rules'; + import { FieldMultiInput } from './FieldMultiInput'; export default { @@ -30,7 +36,21 @@ export function Story() { const [items, setItems] = useState([]); return ( - + + {({ validator }) => ( + <> + + + + )} + ); } diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx index ce023a071053a..89b191e1e5b2d 100644 --- a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx @@ -19,20 +19,36 @@ import userEvent from '@testing-library/user-event'; import React, { useState } from 'react'; -import { render, screen } from 'design/utils/testing'; +import { act, render, screen } from 'design/utils/testing'; + +import Validation, { Validator } from 'shared/components/Validation'; + +import { arrayOf, requiredField } from '../Validation/rules'; import { FieldMultiInput, FieldMultiInputProps } from './FieldMultiInput'; const TestFieldMultiInput = ({ onChange, + refValidator, ...rest -}: Partial) => { +}: Partial & { + refValidator?: (v: Validator) => void; +}) => { const [items, setItems] = useState([]); const handleChange = (it: string[]) => { setItems(it); onChange?.(it); }; - return ; + return ( + + {({ validator }) => { + refValidator?.(validator); + return ( + + ); + }} + + ); }; test('adding, editing, and removing items', async () => { @@ -69,3 +85,35 @@ test('keyboard handling', async () => { await user.keyboard('{Enter}bananas'); expect(onChange).toHaveBeenLastCalledWith(['apples', 'bananas', 'oranges']); }); + +test('validation', async () => { + const user = userEvent.setup(); + let validator: Validator; + render( + { + validator = v; + }} + rule={arrayOf(requiredField('required'))} + /> + ); + + act(() => validator.validate()); + expect(validator.state.valid).toBe(true); + expect(screen.getByRole('textbox')).toHaveAccessibleDescription(''); + + await user.click(screen.getByRole('button', { name: 'Add More' })); + await user.type(screen.getAllByRole('textbox')[1], 'foo'); + act(() => validator.validate()); + expect(validator.state.valid).toBe(false); + expect(screen.getAllByRole('textbox')[0]).toHaveAccessibleDescription( + 'required' + ); + expect(screen.getAllByRole('textbox')[1]).toHaveAccessibleDescription(''); + + await user.type(screen.getAllByRole('textbox')[0], 'foo'); + act(() => validator.validate()); + expect(validator.state.valid).toBe(true); + expect(screen.getAllByRole('textbox')[0]).toHaveAccessibleDescription(''); + expect(screen.getAllByRole('textbox')[1]).toHaveAccessibleDescription(''); +}); diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx index e1dbace8c97d5..48a12d403f313 100644 --- a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx @@ -21,15 +21,35 @@ import { ButtonSecondary } from 'design/Button'; import ButtonIcon from 'design/ButtonIcon'; import Flex from 'design/Flex'; import * as Icon from 'design/Icon'; -import Input from 'design/Input'; import { useRef } from 'react'; import styled, { useTheme } from 'styled-components'; +import { + precomputed, + Rule, + ValidationResult, +} from 'shared/components/Validation/rules'; +import { useRule } from 'shared/components/Validation'; + +import FieldInput from '../FieldInput'; + +type StringListValidationResult = ValidationResult & { + /** + * A list of validation results, one per list item. Note: results are + * optional just because `useRule` by default returns only + * `ValidationResult`. For the actual validation, it's not optional; if it's + * undefined, or there are fewer results in this list than the list items, + * the corresponding items will be treated as valid. + */ + results?: ValidationResult[]; +}; + export type FieldMultiInputProps = { label?: string; value: string[]; disabled?: boolean; onChange?(val: string[]): void; + rule?: Rule; }; /** @@ -45,7 +65,13 @@ export function FieldMultiInput({ value, disabled, onChange, + rule = defaultRule, }: FieldMultiInputProps) { + // It's important to first validate, and then treat an empty array as a + // single-item list with an empty string, since this "synthetic" empty + // string is technically not a part of the model and should not be + // validated. + const validationResult: StringListValidationResult = useRule(rule(value)); if (value.length === 0) { value = ['']; } @@ -90,8 +116,11 @@ export function FieldMultiInput({ // procedure whose complexity would probably outweigh the benefits). - onChange?.( @@ -99,6 +128,7 @@ export function FieldMultiInput({ ) } onKeyDown={e => handleKeyDown(i, e)} + mb={0} /> () => ({ valid: true }); + const Fieldset = styled.fieldset` border: none; margin: 0; diff --git a/web/packages/shared/components/FieldSelect/FieldSelect.story.tsx b/web/packages/shared/components/FieldSelect/FieldSelect.story.tsx index cecfa4e84dac0..dde0dc2b97dce 100644 --- a/web/packages/shared/components/FieldSelect/FieldSelect.story.tsx +++ b/web/packages/shared/components/FieldSelect/FieldSelect.story.tsx @@ -53,7 +53,10 @@ export function Default() { return ( {({ validator }) => { - validator.validate(); + // Prevent rendering loop. + if (!validator.state.validating) { + validator.validate(); + } return ( . - */ - -import React from 'react'; - -import { isObject } from 'shared/utils/highbar'; - -import Logger from '../../libs/logger'; - -const logger = Logger.create('validation'); - -// Validator handles input validation -export default class Validator { - valid = true; - - constructor() { - // store subscribers - this._subs = []; - } - - // adds a callback to the list of subscribers - subscribe(cb) { - this._subs.push(cb); - } - - // removes a callback from the list of subscribers - unsubscribe(cb) { - const index = this._subs.indexOf(cb); - if (index > -1) { - this._subs.splice(index, 1); - } - } - - addResult(result) { - // result can be a boolean value or an object - let isValid = false; - if (isObject(result)) { - isValid = result.valid; - } else { - logger.error(`rule should return a valid object`); - } - - this.valid = this.valid && Boolean(isValid); - } - - reset() { - this.valid = true; - this.validating = false; - } - - validate() { - this.reset(); - this.validating = true; - this._subs.forEach(cb => { - try { - cb(); - } catch (err) { - logger.error(err); - } - }); - - return this.valid; - } -} - -const ValidationContext = React.createContext({}); - -export function Validation(props) { - const [validator] = React.useState(() => new Validator()); - // handle render functions - const children = - typeof props.children === 'function' - ? props.children({ validator }) - : props.children; - - return ( - - {children} - - ); -} - -export function useValidation() { - const value = React.useContext(ValidationContext); - if (!(value instanceof Validator)) { - logger.warn('Missing Validation Context declaration'); - } - - return value; -} diff --git a/web/packages/shared/components/Validation/Validation.test.tsx b/web/packages/shared/components/Validation/Validation.test.tsx index 19f40a8d44986..a933e9d916af9 100644 --- a/web/packages/shared/components/Validation/Validation.test.tsx +++ b/web/packages/shared/components/Validation/Validation.test.tsx @@ -17,32 +17,22 @@ */ import React from 'react'; +import { render, fireEvent, screen, act } from 'design/utils/testing'; -import { render, fireEvent, screen } from 'design/utils/testing'; +import Validator, { Result, Validation, useValidation } from './Validation'; -import Logger from '../../libs/logger'; - -import Validator, { Validation, useValidation } from './Validation'; - -jest.mock('../../libs/logger', () => { - const mockLogger = { - error: jest.fn(), - warn: jest.fn(), - }; - - return { - create: () => mockLogger, - }; +afterEach(() => { + jest.restoreAllMocks(); }); -test('methods of Validator: sub, unsub, validate', () => { +test('methods of Validator: addRuleCallback, removeRuleCallback, validate', () => { const mockCb1 = jest.fn(); const mockCb2 = jest.fn(); const validator = new Validator(); // test suscribe - validator.subscribe(mockCb1); - validator.subscribe(mockCb2); + validator.addRuleCallback(mockCb1); + validator.addRuleCallback(mockCb2); // test validate runs all subscribed cb's expect(validator.validate()).toBe(true); @@ -51,42 +41,42 @@ test('methods of Validator: sub, unsub, validate', () => { jest.clearAllMocks(); // test unsubscribe method removes correct cb - validator.unsubscribe(mockCb2); + validator.removeRuleCallback(mockCb2); expect(validator.validate()).toBe(true); expect(mockCb1).toHaveBeenCalledTimes(1); expect(mockCb2).toHaveBeenCalledTimes(0); }); test('methods of Validator: addResult, reset', () => { + const consoleError = jest.spyOn(console, 'error').mockImplementation(); const validator = new Validator(); // test addResult for nil object const result = null; validator.addResult(result); - expect(Logger.create().error).toHaveBeenCalledTimes(1); + expect(consoleError).toHaveBeenCalledTimes(1); // test addResult for boolean validator.addResult(true); - expect(validator.valid).toBe(false); + expect(validator.state.valid).toBe(false); // test addResult with incorrect object - let resultObj = {}; - validator.addResult(resultObj); - expect(validator.valid).toBe(false); + validator.addResult({} as Result); + expect(validator.state.valid).toBe(false); // test addResult with correct object with "valid" prop from prior test set to false - resultObj = { valid: true }; + let resultObj = { valid: true }; validator.addResult(resultObj); - expect(validator.valid).toBe(false); + expect(validator.state.valid).toBe(false); // test reset validator.reset(); - expect(validator.valid).toBe(true); - expect(validator.validating).toBe(false); + expect(validator.state.valid).toBe(true); + expect(validator.state.validating).toBe(false); // test addResult with correct object with "valid" prop reset to true validator.addResult(resultObj); - expect(validator.valid).toBe(true); + expect(validator.state.valid).toBe(true); }); test('trigger validation via useValidation hook', () => { @@ -102,7 +92,7 @@ test('trigger validation via useValidation hook', () => { ); fireEvent.click(screen.getByRole('button')); - expect(validator.validating).toBe(true); + expect(validator.state.validating).toBe(true); }); test('trigger validation via render function', () => { @@ -122,5 +112,56 @@ test('trigger validation via render function', () => { ); fireEvent.click(screen.getByRole('button')); - expect(validator.validating).toBe(true); + expect(validator.state.validating).toBe(true); +}); + +test('rendering validation result via useValidation hook', () => { + let validator: Validator; + const TestComponent = () => { + validator = useValidation(); + return ( + <> +
Validating: {String(validator.state.validating)}
+
Valid: {String(validator.state.valid)}
+ + ); + }; + render( + + + + ); + validator.addRuleCallback(() => validator.addResult({ valid: false })); + + expect(screen.getByText('Validating: false')).toBeInTheDocument(); + expect(screen.getByText('Valid: true')).toBeInTheDocument(); + + act(() => validator.validate()); + expect(screen.getByText('Validating: true')).toBeInTheDocument(); + expect(screen.getByText('Valid: false')).toBeInTheDocument(); +}); + +test('rendering validation result via render function', () => { + let validator: Validator; + render( + + {props => { + validator = props.validator; + return ( + <> +
Validating: {String(validator.state.validating)}
+
Valid: {String(validator.state.valid)}
+ + ); + }} +
+ ); + validator.addRuleCallback(() => validator.addResult({ valid: false })); + + expect(screen.getByText('Validating: false')).toBeInTheDocument(); + expect(screen.getByText('Valid: true')).toBeInTheDocument(); + + act(() => validator.validate()); + expect(screen.getByText('Validating: true')).toBeInTheDocument(); + expect(screen.getByText('Valid: false')).toBeInTheDocument(); }); diff --git a/web/packages/shared/components/Validation/Validation.tsx b/web/packages/shared/components/Validation/Validation.tsx new file mode 100644 index 0000000000000..6450c2915a61d --- /dev/null +++ b/web/packages/shared/components/Validation/Validation.tsx @@ -0,0 +1,192 @@ +/* + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import React from 'react'; + +import { Logger } from 'design/logger'; + +import { isObject } from 'shared/utils/highbar'; +import { Store, useStore } from 'shared/libs/stores'; + +import { ValidationResult } from './rules'; + +const logger = new Logger('validation'); + +/** A per-rule callback that will be executed during validation. */ +type RuleCallback = () => void; + +export type Result = ValidationResult | boolean; + +type ValidatorState = { + /** Indicates whether the last validation was successful. */ + valid: boolean; + /** + * Indicates whether the validator has been activated by a call to + * `validate`. + */ + validating: boolean; +}; + +/** A store that handles input validation and makes its results accessible. */ +export default class Validator extends Store { + state = { + valid: true, + validating: false, + }; + + /** + * @deprecated For temporary Enterprise compatibility only. Use {@link state} + * instead. + */ + valid = true; + + /** Callbacks that will be executed upon validation. */ + private ruleCallbacks: RuleCallback[] = []; + + /** Adds a rule callback that will be executed upon validation. */ + addRuleCallback(cb: RuleCallback) { + this.ruleCallbacks.push(cb); + } + + /** Removes a rule callback. */ + removeRuleCallback(cb: RuleCallback) { + const index = this.ruleCallbacks.indexOf(cb); + if (index > -1) { + this.ruleCallbacks.splice(index, 1); + } + } + + addResult(result: Result) { + // result can be a boolean value or an object + let isValid = false; + if (isObject(result)) { + isValid = result.valid; + } else { + logger.error(`rule should return a valid object`); + } + + const valid = this.state.valid && Boolean(isValid); + this.setState({ valid }); + this.valid = valid; + } + + reset() { + this.setState({ + valid: true, + validating: false, + }); + this.valid = true; + } + + validate() { + this.reset(); + this.setState({ validating: true }); + for (const cb of this.ruleCallbacks) { + try { + cb(); + } catch (err) { + logger.error(err); + } + } + + return this.state.valid; + } +} + +const ValidationContext = React.createContext(undefined); + +type ValidationRenderFunction = (arg: { + validator: Validator; +}) => React.ReactNode; + +/** + * Installs a validation context that provides a {@link Validator} store. The + * store can be retrieved either through {@link useValidation} hook or by a + * render callback, e.g.: + * + * ``` + * function Component() { + * return ( + * + * {({validator}) => ( + * <> + * (...) + * + * + * )} + * + * ); + * } + * ``` + * + * The simplest way to use validation is validating on the view layer: just use + * a `rule` prop with `FieldInput` or a similar component and pass a rule like + * `requiredField`. + * + * Unfortunately, due to architectural limitations, this will not work well in + * scenarios where information about validity about given field or group of + * fields is required outside that field. In cases like this, the best option + * is to validate the model during render time on the top level (for example, + * execute an entire set of rules on a model using `runRules`). The result of + * model validation will then contain information about the validity of each + * field. It can then be used wherever it's needed, and also attached to + * appropriate inputs with a `precomputed` validation rule. Example: + * + * ``` + * function Component(model: Model) { + * const rules = { + * name: requiredField('required'), + * email: requiredEmailLike, + * } + * const validationResult = runRules(model, rules); + * } + * ``` + * + * Note that, as this example shows clearly, the validator itself, despite its + * name, doesn't really validate anything -- it merely aggregates validation + * results. Also it's worth mentioning that the validator will not do it + * without our help -- each validated field needs to be actually attached to a + * field, even if using a `precomputed` rule, for this to work. The validation + * callbacks registered by validation rules on the particular fields are the + * actual points where the errors are consumed by the validator. + */ +export function Validation(props: { + children?: React.ReactNode | ValidationRenderFunction; +}) { + const [validator] = React.useState(() => new Validator()); + useStore(validator); + // handle render functions + const children = + typeof props.children === 'function' + ? props.children({ validator }) + : props.children; + + return ( + + {children} + + ); +} + +export function useValidation(): Validator { + const validator = React.useContext(ValidationContext); + if (!validator) { + throw new Error('useValidation() called without a validation context'); + } + return useStore(validator); +} diff --git a/web/packages/shared/components/Validation/rules.test.ts b/web/packages/shared/components/Validation/rules.test.ts index a07b16fb7aaa7..07ee1bf434d01 100644 --- a/web/packages/shared/components/Validation/rules.test.ts +++ b/web/packages/shared/components/Validation/rules.test.ts @@ -25,6 +25,8 @@ import { requiredEmailLike, requiredIamRoleName, requiredPort, + runRules, + arrayOf, } from './rules'; describe('requiredField', () => { @@ -153,3 +155,60 @@ describe('requiredPort', () => { expect(requiredPort(port)()).toEqual(expected); }); }); + +test('runRules', () => { + expect( + runRules( + { foo: 'val1', bar: 'val2', irrelevant: undefined }, + { foo: requiredField('no foo'), bar: requiredField('no bar') } + ) + ).toEqual({ + valid: true, + fields: { + foo: { valid: true, message: '' }, + bar: { valid: true, message: '' }, + }, + }); + + expect( + runRules( + { foo: '', bar: 'val2', irrelevant: undefined }, + { foo: requiredField('no foo'), bar: requiredField('no bar') } + ) + ).toEqual({ + valid: false, + fields: { + foo: { valid: false, message: 'no foo' }, + bar: { valid: true, message: '' }, + }, + }); +}); + +test.each([ + { + name: 'invalid', + items: ['a', '', 'c'], + expected: { + valid: false, + results: [ + { valid: true, message: '' }, + { valid: false, message: 'required' }, + { valid: true, message: '' }, + ], + }, + }, + { + name: 'valid', + items: ['a', 'b', 'c'], + expected: { + valid: true, + results: [ + { valid: true, message: '' }, + { valid: true, message: '' }, + { valid: true, message: '' }, + ], + }, + }, +])('arrayOf: $name', ({ items, expected }) => { + expect(arrayOf(requiredField('required'))(items)()).toEqual(expected); +}); diff --git a/web/packages/shared/components/Validation/rules.ts b/web/packages/shared/components/Validation/rules.ts index 52063d67fce99..545f28a348fce 100644 --- a/web/packages/shared/components/Validation/rules.ts +++ b/web/packages/shared/components/Validation/rules.ts @@ -31,6 +31,8 @@ export interface ValidationResult { */ export type Rule = (value: T) => () => R; +type RuleResult = ReturnType>; + /** * requiredField checks for empty strings and arrays. * @@ -280,6 +282,83 @@ const requiredAll = return { valid: true }; }; +/** A result of the {@link arrayOf} validation rule. */ +export type ArrayValidationResult = ValidationResult & { + /** Results of validating each separate item. */ + results: R[]; +}; + +/** Validates an array by executing given rule on each of its elements. */ +const arrayOf = + ( + elementRule: Rule + ): Rule> => + (values: T[]) => + () => { + const results = values.map(v => elementRule(v)()); + return { results: results, valid: results.every(r => r.valid) }; + }; + +/** + * Passes a precomputed validation result instead of computing it inside the + * rule. + * + * This rule is a hacky way to allow the validation engine to operate with + * validation results computed outside of the validator's validation cycle. See + * the `Validation` component's documentation for more information about where + * this is useful and a detailed usage example. + */ +const precomputed = + (res: ValidationResult): Rule => + () => + () => + res; + +/** + * A set of rules to be executed using `runRules` on a model object. The rule + * set contains a subset of keys of the object. + */ +export type RuleSet = Record< + K, + Rule +>; + +/** A result of executing a set of rules on a model object. */ +export type RuleSetValidationResult> = { + valid: boolean; + /** + * Each member of the `fields` object corresponds to a rule from within the + * rule set and contains the result of validating a model field of the same + * name. + */ + fields: { [k in keyof R]: RuleResult }; // Record; +}; + +/** + * Executes a set of rules on a model object, producing a precomputed + * validation result that can be used with `precomputed` rule to inject to + * field components, but also allows for consuming the validation data outside + * these fields. + * + * `K` is the subset of model field names. + * `M` is the validated model. + */ +export const runRules = >( + model: M, + rules: RuleSet +): RuleSetValidationResult> => { + const fields = {} as { + [k in keyof RuleSet]: RuleResult[k]>; + }; + let valid = true; + for (const key in rules) { + const modelValue = model[key]; + fields[key] = rules[key](modelValue)(); + valid &&= fields[key].valid; + } + return { fields, valid }; +}; + export { requiredToken, requiredPassword, @@ -292,4 +371,6 @@ export { requiredMatchingRoleNameAndRoleArn, validAwsIAMRoleName, requiredPort, + arrayOf, + precomputed, }; diff --git a/web/packages/shared/components/Validation/useRule.js b/web/packages/shared/components/Validation/useRule.js index ad0ca82157cbf..e8d2a77e391ae 100644 --- a/web/packages/shared/components/Validation/useRule.js +++ b/web/packages/shared/components/Validation/useRule.js @@ -39,7 +39,7 @@ export default function useRule(cb) { // register to validation context to be called on cb() React.useEffect(() => { function onValidate() { - if (validator.validating) { + if (validator.state.validating) { const result = cb(); validator.addResult(result); rerender({}); @@ -47,18 +47,18 @@ export default function useRule(cb) { } // subscribe to store changes - validator.subscribe(onValidate); + validator.addRuleCallback(onValidate); // unsubscribe on unmount function cleanup() { - validator.unsubscribe(onValidate); + validator.removeRuleCallback(onValidate); } return cleanup; }, [cb]); // if validation has been requested, cb right away. - if (validator.validating) { + if (validator.state.validating) { return cb(); } diff --git a/web/packages/teleport/src/components/LabelsInput/LabelsInput.test.tsx b/web/packages/teleport/src/components/LabelsInput/LabelsInput.test.tsx index eaee3b29c7ea6..8f8c07ea95d0c 100644 --- a/web/packages/teleport/src/components/LabelsInput/LabelsInput.test.tsx +++ b/web/packages/teleport/src/components/LabelsInput/LabelsInput.test.tsx @@ -17,7 +17,10 @@ */ import { render, fireEvent, screen } from 'design/utils/testing'; +import Validation, { Validator } from 'shared/components/Validation'; +import { act } from '@testing-library/react'; +import { Label, LabelsInput, LabelsRule, nonEmptyLabels } from './LabelsInput'; import { Default, Custom, @@ -102,3 +105,119 @@ test('removing last label is not possible due to requiring labels', async () => expect(screen.getByPlaceholderText('label key')).toBeInTheDocument(); expect(screen.getByPlaceholderText('label value')).toBeInTheDocument(); }); + +describe('validation rules', () => { + function setup(labels: Label[], rule: LabelsRule) { + let validator: Validator; + render( + + {({ validator: v }) => { + validator = v; + return ( + {}} rule={rule} /> + ); + }} + + ); + return { validator }; + } + + describe.each([ + { name: 'explicitly enforced standard rule', rule: nonEmptyLabels }, + { name: 'implicit standard rule', rule: undefined }, + ])('$name', ({ rule }) => { + test('invalid', () => { + const { validator } = setup( + [ + { name: '', value: 'foo' }, + { name: 'bar', value: '' }, + { name: 'asdf', value: 'qwer' }, + ], + rule + ); + act(() => validator.validate()); + expect(validator.state.valid).toBe(false); + expect(screen.getAllByRole('textbox')[0]).toHaveAccessibleDescription( + 'required' + ); // '' + expect(screen.getAllByRole('textbox')[1]).toHaveAccessibleDescription(''); // 'foo' + expect(screen.getAllByRole('textbox')[2]).toHaveAccessibleDescription(''); // 'bar' + expect(screen.getAllByRole('textbox')[3]).toHaveAccessibleDescription( + 'required' + ); // '' + expect(screen.getAllByRole('textbox')[4]).toHaveAccessibleDescription(''); // 'asdf' + expect(screen.getAllByRole('textbox')[5]).toHaveAccessibleDescription(''); // 'qwer' + }); + + test('valid', () => { + const { validator } = setup( + [ + { name: '', value: 'foo' }, + { name: 'bar', value: '' }, + { name: 'asdf', value: 'qwer' }, + ], + rule + ); + act(() => validator.validate()); + expect(validator.state.valid).toBe(false); + expect(screen.getAllByRole('textbox')[0]).toHaveAccessibleDescription( + 'required' + ); // '' + expect(screen.getAllByRole('textbox')[1]).toHaveAccessibleDescription(''); // 'foo' + expect(screen.getAllByRole('textbox')[2]).toHaveAccessibleDescription(''); // 'bar' + expect(screen.getAllByRole('textbox')[3]).toHaveAccessibleDescription( + 'required' + ); // '' + expect(screen.getAllByRole('textbox')[4]).toHaveAccessibleDescription(''); // 'asdf' + expect(screen.getAllByRole('textbox')[5]).toHaveAccessibleDescription(''); // 'qwer' + }); + }); + + const nameNotFoo: LabelsRule = (labels: Label[]) => () => { + const results = labels.map(label => ({ + name: + label.name === 'foo' + ? { valid: false, message: 'no foo please' } + : { valid: true }, + value: { valid: true }, + })); + return { + valid: results.every(r => r.name.valid && r.value.valid), + results: results, + }; + }; + + test('custom rule, invalid', async () => { + const { validator } = setup( + [ + { name: 'foo', value: 'bar' }, + { name: 'bar', value: 'foo' }, + ], + nameNotFoo + ); + act(() => validator.validate()); + expect(validator.state.valid).toBe(false); + expect(screen.getAllByRole('textbox')[0]).toHaveAccessibleDescription( + 'no foo please' + ); // 'foo' key + expect(screen.getAllByRole('textbox')[1]).toHaveAccessibleDescription(''); + expect(screen.getAllByRole('textbox')[2]).toHaveAccessibleDescription(''); + expect(screen.getAllByRole('textbox')[3]).toHaveAccessibleDescription(''); + }); + + test('custom rule, valid', async () => { + const { validator } = setup( + [ + { name: 'xyz', value: 'bar' }, + { name: 'bar', value: 'foo' }, + ], + nameNotFoo + ); + act(() => validator.validate()); + expect(validator.state.valid).toBe(true); + expect(screen.getAllByRole('textbox')[0]).toHaveAccessibleDescription(''); + expect(screen.getAllByRole('textbox')[1]).toHaveAccessibleDescription(''); + expect(screen.getAllByRole('textbox')[2]).toHaveAccessibleDescription(''); + expect(screen.getAllByRole('textbox')[3]).toHaveAccessibleDescription(''); + }); +}); diff --git a/web/packages/teleport/src/components/LabelsInput/LabelsInput.tsx b/web/packages/teleport/src/components/LabelsInput/LabelsInput.tsx index f163d7df0e0de..eee6025249817 100644 --- a/web/packages/teleport/src/components/LabelsInput/LabelsInput.tsx +++ b/web/packages/teleport/src/components/LabelsInput/LabelsInput.tsx @@ -19,8 +19,17 @@ import styled from 'styled-components'; import { Flex, Box, ButtonSecondary, ButtonIcon } from 'design'; import FieldInput from 'shared/components/FieldInput'; -import { Validator, useValidation } from 'shared/components/Validation'; -import { requiredField } from 'shared/components/Validation/rules'; +import { + Validator, + useRule, + useValidation, +} from 'shared/components/Validation'; +import { + precomputed, + requiredField, + Rule, + ValidationResult, +} from 'shared/components/Validation/rules'; import * as Icons from 'design/Icon'; import { inputGeometry } from 'design/Input/Input'; @@ -34,6 +43,24 @@ export type LabelInputTexts = { placeholder: string; }; +type LabelListValidationResult = ValidationResult & { + /** + * A list of validation results, one per label. Note: items are optional just + * because `useRule` by default returns only `ValidationResult`. For the + * actual validation, it's not optional; if it's undefined, or there are + * fewer items in this list than the labels, a default validation rule will + * be used instead. + */ + results?: LabelValidationResult[]; +}; + +type LabelValidationResult = { + name: ValidationResult; + value: ValidationResult; +}; + +export type LabelsRule = Rule; + export function LabelsInput({ labels = [], setLabels, @@ -44,6 +71,7 @@ export function LabelsInput({ labelKey = { fieldName: 'Key', placeholder: 'label key' }, labelVal = { fieldName: 'Value', placeholder: 'label value' }, inputWidth = 200, + rule = defaultRule, }: { labels: Label[]; setLabels(l: Label[]): void; @@ -57,8 +85,15 @@ export function LabelsInput({ * Makes it so at least one label is required */ areLabelsRequired?: boolean; + /** + * A rule for validating the list of labels as a whole. Note that contrary to + * other input fields, the labels input will default to validating every + * input as required if this property is undefined. + */ + rule?: LabelsRule; }) { const validator = useValidation() as Validator; + const validationResult: LabelListValidationResult = useRule(rule(labels)); function addLabel() { setLabels([...labels, { name: '', value: '' }]); @@ -92,11 +127,8 @@ export function LabelsInput({ setLabels(newList); }; - const requiredUniqueKey = value => () => { + const requiredKey = value => () => { // Check for empty length and duplicate key. - // TODO(bl-nero): This function doesn't really check for uniqueness; it - // needs to be fixed. This control should probably be merged with - // `LabelsCreater`, which has this feature working correctly. let notValid = !value || value.length === 0; return { @@ -121,12 +153,18 @@ export function LabelsInput({ )} {labels.map((label, index) => { + const validationItem: LabelValidationResult | undefined = + validationResult.results?.[index]; return ( () => ({ valid: true }); + const SmallText = styled.span` font-size: ${p => p.theme.fontSizes[1]}px; font-weight: lighter; `; + +export const nonEmptyLabels: LabelsRule = labels => () => { + const results = labels.map(label => ({ + name: requiredField('required')(label.name)(), + value: requiredField('required')(label.value)(), + })); + return { + valid: results.every(r => r.name.valid && r.value.valid), + results: results, + }; +}; From 02d88c2fdfc385010005eb74ba59061e3270d9ef Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Wed, 4 Dec 2024 11:50:34 -0300 Subject: [PATCH 05/15] chore: Bump Go to 1.23.4 (#49757) --- build.assets/tooling/go.mod | 2 +- build.assets/versions.mk | 2 +- go.mod | 2 +- integrations/event-handler/go.mod | 2 +- integrations/terraform/go.mod | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.assets/tooling/go.mod b/build.assets/tooling/go.mod index 1571393ad9fd9..5870c74535be8 100644 --- a/build.assets/tooling/go.mod +++ b/build.assets/tooling/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/build.assets/tooling -go 1.23.3 +go 1.23.4 require ( github.com/Masterminds/sprig/v3 v3.3.0 diff --git a/build.assets/versions.mk b/build.assets/versions.mk index edd1e5b5d7c86..15a01e3006f58 100644 --- a/build.assets/versions.mk +++ b/build.assets/versions.mk @@ -3,7 +3,7 @@ # Keep versions in sync with devbox.json, when applicable. # Sync with devbox.json. -GOLANG_VERSION ?= go1.23.3 +GOLANG_VERSION ?= go1.23.4 GOLANGCI_LINT_VERSION ?= v1.62.2 NODE_VERSION ?= 20.18.0 diff --git a/go.mod b/go.mod index afe3a459ff1df..941b38155fd2c 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport -go 1.23.3 +go 1.23.4 require ( cloud.google.com/go/cloudsqlconn v1.12.1 diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index 4b570cb8ced6f..713951dbd14a1 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/integrations/event-handler -go 1.23.3 +go 1.23.4 require ( github.com/alecthomas/kong v1.5.0 diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 584c835a89b45..4894c3ee47331 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/integrations/terraform -go 1.23.3 +go 1.23.4 // Doc generation tooling require github.com/hashicorp/terraform-plugin-docs v0.0.0 // replaced From ec870e156a44e85998cee8049bdda167046a6196 Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Wed, 4 Dec 2024 12:07:37 -0300 Subject: [PATCH 06/15] fix: Take TTL into account when renewing sessions (#49732) * fix: Take TTL into account when renewing sessions * Update comments --- .../src/services/websession/websession.ts | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/web/packages/teleport/src/services/websession/websession.ts b/web/packages/teleport/src/services/websession/websession.ts index 35f3763fdddfd..a9371db9e060d 100644 --- a/web/packages/teleport/src/services/websession/websession.ts +++ b/web/packages/teleport/src/services/websession/websession.ts @@ -26,9 +26,8 @@ import { KeysEnum, storageService } from 'teleport/services/storageService'; import makeBearerToken from './makeBearerToken'; import { RenewSessionRequest } from './types'; -// Time to determine when to renew session which is -// when expiry time of token is less than 3 minutes. -const RENEW_TOKEN_TIME = 180 * 1000; +const MAX_RENEW_TOKEN_TIME = 180000; // 3m +const MIN_RENEW_TOKEN_TIME = 30000; // 30s const TOKEN_CHECKER_INTERVAL = 15 * 1000; // every 15 sec const logger = Logger.create('services/session'); @@ -146,11 +145,14 @@ const session = { return false; } - // Renew session if token expiry time is less than 3 minutes. + // Renew session if token expiry time is less than renewTime (with MIN_ and + // MAX_RENEW_TOKEN_TIME as floor and ceiling, respectively). // Browsers have js timer throttling behavior in inactive tabs that can go // up to 100s between timer calls from testing. 3 minutes seems to be a safe number // with extra padding. - return this._timeLeft() < RENEW_TOKEN_TIME; + let renewTime = Math.min(this._ttl() / 10, MAX_RENEW_TOKEN_TIME); + renewTime = Math.max(renewTime, MIN_RENEW_TOKEN_TIME); + return this._timeLeft() < renewTime; }, _renewToken(req: RenewSessionRequest = {}, signal?: AbortSignal) { @@ -214,6 +216,21 @@ const session = { return delta; }, + _ttl() { + const token = this._getBearerToken(); + if (!token) { + return 0; + } + + let { expiresIn, created } = token; + if (!created || !expiresIn) { + return 0; + } + + expiresIn = expiresIn * 1000; + return expiresIn; + }, + _shouldCheckStatus() { if (this._getIsRenewing()) { return false; From 27ecd622fb4c3709a4e2f4d3017cbb1f7800c31f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Wed, 4 Dec 2024 17:22:27 +0100 Subject: [PATCH 07/15] Refactor how tsh lists apps as text (#49505) This way it's going to be easier to add a column with target ports, which should be displayed only if the list includes multi-port apps. --- tool/tsh/common/app_test.go | 150 ++++++++++++++++++++++++++++ tool/tsh/common/tsh.go | 190 ++++++++++++++++++++++++++---------- 2 files changed, 287 insertions(+), 53 deletions(-) diff --git a/tool/tsh/common/app_test.go b/tool/tsh/common/app_test.go index 87b9dcb24239b..9a6d9da771d78 100644 --- a/tool/tsh/common/app_test.go +++ b/tool/tsh/common/app_test.go @@ -24,9 +24,11 @@ import ( "crypto/tls" "encoding/json" "fmt" + "io" "net/http" "net/http/httptest" "os/user" + "strings" "testing" "time" @@ -44,6 +46,7 @@ import ( "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/service/servicecfg" + "github.com/gravitational/teleport/lib/tlsca" testserver "github.com/gravitational/teleport/tool/teleport/testenv" ) @@ -597,3 +600,150 @@ uri: https://test-app.example.com:8443 }) } } + +func TestWriteAppTable(t *testing.T) { + defaultAppListings := []appListing{ + appListing{ + Proxy: "example.com", + Cluster: "foo-cluster", + App: mustMakeNewAppV3(t, types.Metadata{Name: "root-app"}, types.AppSpecV3{ + // Short URLs, because in tests the width of the term is just 80 characters and the public + // address column gets truncated very early. + PublicAddr: "https://root-app.example.com", + URI: "http://localhost:8080", + }), + }, + appListing{ + Proxy: "example.com", + Cluster: "bar-cluster", + App: mustMakeNewAppV3(t, types.Metadata{Name: "leaf-app"}, types.AppSpecV3{ + PublicAddr: "https://leaf-app.example.com", + URI: "http://localhost:4242", + }), + }, + } + + tests := []struct { + name string + config appTableConfig + appListings []appListing + wantHeaders []string + wantNoHeaders []string + wantValues []string + wantNoValues []string + }{ + { + name: "regular list", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: false, + listAll: false, + }, + appListings: defaultAppListings, + wantHeaders: []string{"Application", "Public Address"}, + // Public addresses are expected to be truncated when verbose mode is off. + wantValues: []string{"https://root-app...", "https://leaf-app...", "root-app", "leaf-app"}, + wantNoHeaders: []string{"URI", "Proxy", "Cluster"}, + wantNoValues: []string{"http://localhost:8080", "foo-cluster", "bar-cluster"}, + }, + { + name: "regular list with active app", + config: appTableConfig{ + active: []tlsca.RouteToApp{ + tlsca.RouteToApp{Name: "root-app"}, + }, + verbose: false, + listAll: false, + }, + appListings: defaultAppListings, + wantHeaders: []string{"Application"}, + wantValues: []string{"> root-app", "leaf-app"}, + }, + { + name: "regular list with no apps", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: false, + listAll: false, + }, + appListings: []appListing{}, + wantHeaders: []string{"Application", "Public Address"}, + }, + { + name: "verbose", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: true, + listAll: false, + }, + appListings: defaultAppListings, + wantHeaders: []string{"URI", "Application", "Public Address"}, + wantValues: []string{"http://localhost:8080", "http://localhost:4242", + "https://root-app.example.com", "https://leaf-app.example.com", "root-app", "leaf-app"}, + wantNoHeaders: []string{"Proxy", "Cluster"}, + wantNoValues: []string{"foo-cluster", "bar-cluster"}, + }, + { + name: "list all", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: false, + listAll: true, + }, + appListings: defaultAppListings, + wantHeaders: []string{"Proxy", "Cluster", "Application", "Public Address"}, + // Public addresses are expected to be truncated when verbose mode is off. + wantValues: []string{"foo-cluste...", "bar-cluste...", "example.co...", "https://ro...", "https://le...", "root-app", "leaf-app"}, + wantNoHeaders: []string{"URI"}, + wantNoValues: []string{"http://localhost:8080"}, + }, + { + name: "verbose and list all", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: true, + listAll: true, + }, + appListings: defaultAppListings, + wantHeaders: []string{"Proxy", "Cluster", "URI", "Application", "Public Address"}, + wantValues: []string{"foo-cluster", "bar-cluster", "http://localhost:8080", "http://localhost:4242", + "https://root-app.example.com", "https://leaf-app.example.com", "root-app", "leaf-app"}, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + var b bytes.Buffer + w := io.Writer(&b) + + err := writeAppTable(w, test.appListings, test.config) + require.NoError(t, err) + + lines := strings.SplitN(b.String(), "\n", 3) + headers := lines[0] + // The second line contains header separators ("------"), that's why it's skipped here. + values := lines[2] + + for _, wantHeader := range test.wantHeaders { + assert.Contains(t, headers, wantHeader) + } + for _, wantNoHeader := range test.wantNoHeaders { + assert.NotContains(t, headers, wantNoHeader) + } + + for _, wantValue := range test.wantValues { + assert.Contains(t, values, wantValue) + } + for _, wantNoValue := range test.wantNoValues { + assert.NotContains(t, values, wantNoValue) + } + }) + } +} + +func mustMakeNewAppV3(t *testing.T, meta types.Metadata, spec types.AppSpecV3) *types.AppV3 { + t.Helper() + app, err := types.NewAppV3(meta, spec) + require.NoError(t, err) + return app +} diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index 8c51c89641eda..eaf30fba729b2 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -2823,13 +2823,26 @@ func showApps(apps []types.Application, active []tlsca.RouteToApp, w io.Writer, format = strings.ToLower(format) switch format { case teleport.Text, "": - showAppsAsText(apps, active, verbose, w) + appListings := make([]appListing, 0, len(apps)) + for _, app := range apps { + appListings = append(appListings, appListing{App: app}) + } + + if err := writeAppTable(w, appListings, appTableConfig{ + listAll: false, // showApps lists apps from a single cluster. + active: active, + verbose: verbose, + }); err != nil { + return trace.Wrap(err) + } case teleport.JSON, teleport.YAML: out, err := serializeApps(apps, format) if err != nil { return trace.Wrap(err) } - fmt.Fprintln(w, out) + if _, err := fmt.Fprintln(w, out); err != nil { + return trace.Wrap(err) + } default: return trace.BadParameter("unsupported format %q", format) } @@ -2850,46 +2863,118 @@ func serializeApps(apps []types.Application, format string) (string, error) { return string(out), trace.Wrap(err) } -func getAppRow(proxy, cluster string, app types.Application, active []tlsca.RouteToApp, verbose bool) []string { - var row []string - if proxy != "" && cluster != "" { - row = append(row, proxy, cluster) - } +type appTableConfig struct { + // active is a list of apps for which the user retrieved a short-lived cert with tsh app login. + active []tlsca.RouteToApp + // verbose makes the table show extra columns. + verbose bool + // listAll makes the table render two extra columns: Proxy and Cluster. + listAll bool +} - name := app.GetName() - for _, a := range active { - if name == a.Name { - name = fmt.Sprintf("> %v", name) - break - } - } +func writeAppTable(w io.Writer, appListings []appListing, config appTableConfig) error { + getName := func(app types.Application) string { + isActive := slices.ContainsFunc(config.active, func(route tlsca.RouteToApp) bool { + // TODO(ravicious): This should be based on name _and_ route.ClusterName, so that we don't + // incorrectly show multiple apps with the same name but from different clusters as active. + // However, to do this we'd need to double check if route.ClusterName always matches + // appListing.Cluster (and also fill out that field in showApps). + return route.Name == app.GetName() + }) - labels := common.FormatLabels(app.GetAllLabels(), verbose) - if verbose { - row = append(row, name, app.GetDescription(), app.GetProtocol(), app.GetPublicAddr(), app.GetURI(), labels) - } else { - row = append(row, name, app.GetDescription(), app.GetProtocol(), app.GetPublicAddr(), labels) - } + if isActive { + return fmt.Sprintf("> %s", app.GetName()) + } + + return app.GetName() + } + getLabels := func(app types.Application) string { + return common.FormatLabels(app.GetAllLabels(), config.verbose) + } + + const labelsColumn = "Labels" + allColumns := []appTableColumn{ + appTableColumn{ + name: "Proxy", + getFromListing: appListing.GetProxy, + hide: !config.listAll, + }, + appTableColumn{ + name: "Cluster", + getFromListing: appListing.GetCluster, + hide: !config.listAll, + }, + appTableColumn{ + name: "Application", + get: getName, + }, + appTableColumn{ + name: "Description", + get: types.Application.GetDescription, + }, + appTableColumn{ + name: "Type", + get: types.Application.GetProtocol, + }, + appTableColumn{ + name: "Public Address", + get: types.Application.GetPublicAddr, + }, + appTableColumn{ + name: "URI", + get: types.Application.GetURI, + hide: !config.verbose, + }, + appTableColumn{ + name: labelsColumn, + get: getLabels, + }, + } + columns := slices.DeleteFunc(allColumns, func(column appTableColumn) bool { return column.hide }) + + headers := make([]string, 0, len(columns)) + for _, column := range columns { + headers = append(headers, column.name) + } + + rows := make([][]string, 0, len(appListings)) + for _, appListing := range appListings { + appRow := make([]string, 0, len(columns)) + + for _, column := range columns { + var content string + switch { + case column.get != nil: + content = column.get(appListing.App) + case column.getFromListing != nil: + content = column.getFromListing(appListing) + } - return row -} + appRow = append(appRow, content) + } -func showAppsAsText(apps []types.Application, active []tlsca.RouteToApp, verbose bool, w io.Writer) { - var rows [][]string - for _, app := range apps { - rows = append(rows, getAppRow("", "", app, active, verbose)) + rows = append(rows, appRow) } - // In verbose mode, print everything on a single line and include host UUID. + + // In verbose mode, print everything on a single line. // In normal mode, chunk the labels, print two per line and allow multiple - // lines per node. + // lines per app. var t asciitable.Table - if verbose { - t = asciitable.MakeTable([]string{"Application", "Description", "Type", "Public Address", "URI", "Labels"}, rows...) + if config.verbose { + t = asciitable.MakeTable(headers, rows...) } else { - t = asciitable.MakeTableWithTruncatedColumn( - []string{"Application", "Description", "Type", "Public Address", "Labels"}, rows, "Labels") + t = asciitable.MakeTableWithTruncatedColumn(headers, rows, labelsColumn) } - fmt.Fprintln(w, t.AsBuffer().String()) + + _, err := fmt.Fprintln(w, t.AsBuffer().String()) + return trace.Wrap(err) +} + +type appTableColumn struct { + name string + get func(app types.Application) string + getFromListing func(listing appListing) string + hide bool } func showDatabases(cf *CLIConf, databases []types.Database, active []tlsca.RouteToDatabase, accessChecker services.AccessChecker) error { @@ -5218,6 +5303,14 @@ type appListing struct { App types.Application `json:"app"` } +func (al appListing) GetProxy() string { + return al.Proxy +} + +func (al appListing) GetCluster() string { + return al.Cluster +} + type appListings []appListing func (l appListings) Len() int { @@ -5327,37 +5420,28 @@ func listAppsAllClusters(cf *CLIConf) error { format := strings.ToLower(cf.Format) switch format { case teleport.Text, "": - printAppsWithClusters(listings, active, cf.Verbose) + if err := writeAppTable(cf.Stdout(), listings, appTableConfig{ + listAll: true, + active: active, + verbose: cf.Verbose, + }); err != nil { + return trace.Wrap(err) + } + case teleport.JSON, teleport.YAML: out, err := serializeAppsWithClusters(listings, format) if err != nil { return trace.Wrap(err) } - fmt.Fprintln(cf.Stdout(), out) + if _, err := fmt.Fprintln(cf.Stdout(), out); err != nil { + return trace.Wrap(err) + } default: return trace.BadParameter("unsupported format %q", format) } return nil } -func printAppsWithClusters(apps []appListing, active []tlsca.RouteToApp, verbose bool) { - var rows [][]string - for _, app := range apps { - rows = append(rows, getAppRow(app.Proxy, app.Cluster, app.App, active, verbose)) - } - // In verbose mode, print everything on a single line and include host UUID. - // In normal mode, chunk the labels, print two per line and allow multiple - // lines per node. - var t asciitable.Table - if verbose { - t = asciitable.MakeTable([]string{"Proxy", "Cluster", "Application", "Description", "Type", "Public Address", "URI", "Labels"}, rows...) - } else { - t = asciitable.MakeTableWithTruncatedColumn( - []string{"Proxy", "Cluster", "Application", "Description", "Type", "Public Address", "Labels"}, rows, "Labels") - } - fmt.Println(t.AsBuffer().String()) -} - func serializeAppsWithClusters(apps []appListing, format string) (string, error) { var out []byte var err error From 9c4e23db57aac0de12966f521b770fa81525ce49 Mon Sep 17 00:00:00 2001 From: Alan Parra Date: Wed, 4 Dec 2024 13:28:46 -0300 Subject: [PATCH 08/15] fix: Avoid large unix socket paths on lib/service tests (#49673) --- lib/service/service_test.go | 41 ++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/service/service_test.go b/lib/service/service_test.go index 0ff48c3055395..e0b421ff93780 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -103,7 +103,7 @@ func TestAdditionalExpectedRoles(t *testing.T) { name: "everything enabled", cfg: func() *servicecfg.Config { cfg := servicecfg.MakeDefaultConfig() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Auth.StorageConfig.Params["path"] = t.TempDir() cfg.DiagnosticAddr = utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"} @@ -134,7 +134,7 @@ func TestAdditionalExpectedRoles(t *testing.T) { name: "everything enabled with additional roles", cfg: func() *servicecfg.Config { cfg := servicecfg.MakeDefaultConfig() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Auth.StorageConfig.Params["path"] = t.TempDir() cfg.DiagnosticAddr = utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"} @@ -194,7 +194,7 @@ func TestDynamicClientReuse(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.Clock = fakeClock - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Auth.Enabled = true cfg.Auth.ListenAddr = utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"} @@ -276,7 +276,7 @@ func TestMonitor(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.Clock = fakeClock var err error - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.DiagnosticAddr = utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"} cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Auth.Enabled = true @@ -787,7 +787,7 @@ func TestDesktopAccessFIPS(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Clock = clockwork.NewFakeClock() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.Auth.Enabled = false cfg.Proxy.Enabled = false cfg.SSH.Enabled = false @@ -912,7 +912,7 @@ func TestSetupProxyTLSConfig(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.CircuitBreakerConfig = breaker.NoopBreakerConfig() cfg.Proxy.ACME.Enabled = tc.acmeEnabled - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.Proxy.PublicAddrs = utils.MustParseAddrList("localhost") process := TeleportProcess{ Config: cfg, @@ -937,7 +937,7 @@ func TestTeleportProcess_reconnectToAuth(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Clock = clockwork.NewRealClock() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.Auth.Enabled = false cfg.Proxy.Enabled = false cfg.SSH.Enabled = true @@ -1005,7 +1005,7 @@ func TestTeleportProcessAuthVersionCheck(t *testing.T) { authCfg := servicecfg.MakeDefaultConfig() authCfg.SetAuthServerAddress(listenAddr) - authCfg.DataDir = t.TempDir() + authCfg.DataDir = makeTempDir(t) authCfg.Auth.Enabled = true authCfg.Auth.StaticTokens = staticTokens authCfg.Auth.StorageConfig.Type = lite.GetName() @@ -1027,7 +1027,7 @@ func TestTeleportProcessAuthVersionCheck(t *testing.T) { authListenAddr := authProc.Config.AuthServerAddresses()[0] nodeCfg := servicecfg.MakeDefaultConfig() nodeCfg.SetAuthServerAddress(authListenAddr) - nodeCfg.DataDir = t.TempDir() + nodeCfg.DataDir = makeTempDir(t) nodeCfg.SetToken(token) nodeCfg.Auth.Enabled = false nodeCfg.Proxy.Enabled = false @@ -1614,11 +1614,7 @@ func TestDebugServiceStartSocket(t *testing.T) { t.Parallel() fakeClock := clockwork.NewFakeClock() - var err error - dataDir, err := os.MkdirTemp("", "*") - require.NoError(t, err) - t.Cleanup(func() { os.RemoveAll(dataDir) }) - + dataDir := makeTempDir(t) cfg := servicecfg.MakeDefaultConfig() cfg.DebugService.Enabled = true cfg.Clock = fakeClock @@ -1741,7 +1737,7 @@ func TestInstanceMetadata(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { cfg := newCfg() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.Auth.StorageConfig.Params["path"] = t.TempDir() cfg.InstanceMetadataClient = tc.imClient @@ -1802,7 +1798,7 @@ func TestInitDatabaseService(t *testing.T) { t.Parallel() cfg := servicecfg.MakeDefaultConfig() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.DebugService = servicecfg.DebugConfig{ Enabled: false, } @@ -1858,7 +1854,7 @@ func TestAgentRolloutController(t *testing.T) { // Test setup: create a Teleport Auth config fakeClock := clockwork.NewFakeClock() - dataDir := t.TempDir() + dataDir := makeTempDir(t) cfg := servicecfg.MakeDefaultConfig() cfg.Clock = fakeClock @@ -1920,3 +1916,14 @@ func TestAgentRolloutController(t *testing.T) { return rollout.Spec.GetTargetVersion() == version.Spec.GetAgents().GetTargetVersion() }, time.Second, 10*time.Millisecond) } + +// makeTempDir makes a temp dir with a shorter name than t.TempDir() in order to +// avoid https://github.com/golang/go/issues/62614. +func makeTempDir(t *testing.T) string { + t.Helper() + + tempDir, err := os.MkdirTemp("", "teleport-test-") + require.NoError(t, err, "os.MkdirTemp() failed") + t.Cleanup(func() { os.RemoveAll(tempDir) }) + return tempDir +} From e2c803b9c7b40347ebf2e51023b51db48890ad91 Mon Sep 17 00:00:00 2001 From: matheus Date: Wed, 4 Dec 2024 14:03:11 -0300 Subject: [PATCH 09/15] Add Contacts Audit Events (#49755) * Add Contact resource; include it in default editor permissions and web ACL * Add contacts to ACL test * Improve godocs Co-authored-by: Zac Bergquist * Add `contact` to the web user context * Add contact audit events * Lint fix * Use string interpolation Co-authored-by: Grzegorz Zdunek * Comment ContactType enum * make grpc --------- Co-authored-by: Zac Bergquist Co-authored-by: Grzegorz Zdunek --- .../teleport/legacy/types/events/events.proto | 97 + api/types/events/events.go | 8 + api/types/events/events.pb.go | 5038 ++++++++++------- api/types/events/oneof.go | 8 + lib/events/api.go | 5 + lib/events/codes.go | 5 + lib/events/dynamic.go | 5 + lib/events/events_test.go | 2 + .../src/Audit/EventList/EventTypeCell.tsx | 2 + .../teleport/src/services/audit/makeEvent.ts | 25 + .../teleport/src/services/audit/types.ts | 16 + 11 files changed, 3234 insertions(+), 1977 deletions(-) diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 8b00c1749e45b..e7a7bc0440546 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4687,6 +4687,8 @@ message OneOf { events.UserTaskUpdate UserTaskUpdate = 189; events.UserTaskDelete UserTaskDelete = 190; events.SFTPSummary SFTPSummary = 191; + events.ContactCreate ContactCreate = 192; + events.ContactDelete ContactDelete = 193; } } @@ -7580,3 +7582,98 @@ message UserTaskDelete { (gogoproto.jsontag) = "" ]; } + +// ContactCreate is emitted when a contact is created. +message ContactCreate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the creation was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Email is the Email of the contact being deleted + string Email = 6 [(gogoproto.jsontag) = "email"]; + + // ContactType is the type of the contact being deleted ('Business' or 'Security') + ContactType ContactType = 7 [(gogoproto.jsontag) = "contact_type"]; +} + +// ContactDelete is emitted when a contact is deleted. +message ContactDelete { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the deletion was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Email is the Email of the contact being deleted + string Email = 6 [(gogoproto.jsontag) = "email"]; + + // ContactType is the type of the contact being deleted ('Business' or 'Security') + ContactType ContactType = 7 [(gogoproto.jsontag) = "contact_type"]; +} + +// ContactType is the type of contact being added. +enum ContactType { + CONTACT_TYPE_UNSPECIFIED = 0; + CONTACT_TYPE_BUSINESS = 1; + CONTACT_TYPE_SECURITY = 2; +} diff --git a/api/types/events/events.go b/api/types/events/events.go index 19cc44b5e8981..1b11c68e58d56 100644 --- a/api/types/events/events.go +++ b/api/types/events/events.go @@ -2352,3 +2352,11 @@ func (m *AutoUpdateVersionUpdate) TrimToMaxSize(_ int) AuditEvent { func (m *AutoUpdateVersionDelete) TrimToMaxSize(_ int) AuditEvent { return m } + +func (m *ContactCreate) TrimToMaxSize(_ int) AuditEvent { + return m +} + +func (m *ContactDelete) TrimToMaxSize(_ int) AuditEvent { + return m +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index d729768769d0f..c8d1db9a2e430 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -350,6 +350,35 @@ func (AdminActionsMFAStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_007ba1c3d6266d56, []int{7} } +// ContactType is the type of contact being added. +type ContactType int32 + +const ( + ContactType_CONTACT_TYPE_UNSPECIFIED ContactType = 0 + ContactType_CONTACT_TYPE_BUSINESS ContactType = 1 + ContactType_CONTACT_TYPE_SECURITY ContactType = 2 +) + +var ContactType_name = map[int32]string{ + 0: "CONTACT_TYPE_UNSPECIFIED", + 1: "CONTACT_TYPE_BUSINESS", + 2: "CONTACT_TYPE_SECURITY", +} + +var ContactType_value = map[string]int32{ + "CONTACT_TYPE_UNSPECIFIED": 0, + "CONTACT_TYPE_BUSINESS": 1, + "CONTACT_TYPE_SECURITY": 2, +} + +func (x ContactType) String() string { + return proto.EnumName(ContactType_name, int32(x)) +} + +func (ContactType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{8} +} + // Operation is the network operation that was performed or attempted type SessionNetwork_NetworkOperation int32 @@ -7881,6 +7910,8 @@ type OneOf struct { // *OneOf_UserTaskUpdate // *OneOf_UserTaskDelete // *OneOf_SFTPSummary + // *OneOf_ContactCreate + // *OneOf_ContactDelete Event isOneOf_Event `protobuf_oneof:"Event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -8487,6 +8518,12 @@ type OneOf_UserTaskDelete struct { type OneOf_SFTPSummary struct { SFTPSummary *SFTPSummary `protobuf:"bytes,191,opt,name=SFTPSummary,proto3,oneof" json:"SFTPSummary,omitempty"` } +type OneOf_ContactCreate struct { + ContactCreate *ContactCreate `protobuf:"bytes,192,opt,name=ContactCreate,proto3,oneof" json:"ContactCreate,omitempty"` +} +type OneOf_ContactDelete struct { + ContactDelete *ContactDelete `protobuf:"bytes,193,opt,name=ContactDelete,proto3,oneof" json:"ContactDelete,omitempty"` +} func (*OneOf_UserLogin) isOneOf_Event() {} func (*OneOf_UserCreate) isOneOf_Event() {} @@ -8675,6 +8712,8 @@ func (*OneOf_UserTaskCreate) isOneOf_Event() {} func (*OneOf_UserTaskUpdate) isOneOf_Event() {} func (*OneOf_UserTaskDelete) isOneOf_Event() {} func (*OneOf_SFTPSummary) isOneOf_Event() {} +func (*OneOf_ContactCreate) isOneOf_Event() {} +func (*OneOf_ContactDelete) isOneOf_Event() {} func (m *OneOf) GetEvent() isOneOf_Event { if m != nil { @@ -9992,6 +10031,20 @@ func (m *OneOf) GetSFTPSummary() *SFTPSummary { return nil } +func (m *OneOf) GetContactCreate() *ContactCreate { + if x, ok := m.GetEvent().(*OneOf_ContactCreate); ok { + return x.ContactCreate + } + return nil +} + +func (m *OneOf) GetContactDelete() *ContactDelete { + if x, ok := m.GetEvent().(*OneOf_ContactDelete); ok { + return x.ContactDelete + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*OneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -10182,6 +10235,8 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_UserTaskUpdate)(nil), (*OneOf_UserTaskDelete)(nil), (*OneOf_SFTPSummary)(nil), + (*OneOf_ContactCreate)(nil), + (*OneOf_ContactDelete)(nil), } } @@ -14925,6 +14980,114 @@ func (m *UserTaskDelete) XXX_DiscardUnknown() { var xxx_messageInfo_UserTaskDelete proto.InternalMessageInfo +// ContactCreate is emitted when a contact is created. +type ContactCreate struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // Status indicates whether the creation was successful. + Status `protobuf:"bytes,5,opt,name=Status,proto3,embedded=Status" json:""` + // Email is the Email of the contact being deleted + Email string `protobuf:"bytes,6,opt,name=Email,proto3" json:"email"` + // ContactType is the type of the contact being deleted ('Business' or 'Security') + ContactType ContactType `protobuf:"varint,7,opt,name=ContactType,proto3,enum=events.ContactType" json:"contact_type"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ContactCreate) Reset() { *m = ContactCreate{} } +func (m *ContactCreate) String() string { return proto.CompactTextString(m) } +func (*ContactCreate) ProtoMessage() {} +func (*ContactCreate) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{234} +} +func (m *ContactCreate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContactCreate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ContactCreate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ContactCreate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContactCreate.Merge(m, src) +} +func (m *ContactCreate) XXX_Size() int { + return m.Size() +} +func (m *ContactCreate) XXX_DiscardUnknown() { + xxx_messageInfo_ContactCreate.DiscardUnknown(m) +} + +var xxx_messageInfo_ContactCreate proto.InternalMessageInfo + +// ContactDelete is emitted when a contact is deleted. +type ContactDelete struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // Status indicates whether the deletion was successful. + Status `protobuf:"bytes,5,opt,name=Status,proto3,embedded=Status" json:""` + // Email is the Email of the contact being deleted + Email string `protobuf:"bytes,6,opt,name=Email,proto3" json:"email"` + // ContactType is the type of the contact being deleted ('Business' or 'Security') + ContactType ContactType `protobuf:"varint,7,opt,name=ContactType,proto3,enum=events.ContactType" json:"contact_type"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ContactDelete) Reset() { *m = ContactDelete{} } +func (m *ContactDelete) String() string { return proto.CompactTextString(m) } +func (*ContactDelete) ProtoMessage() {} +func (*ContactDelete) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{235} +} +func (m *ContactDelete) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContactDelete) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ContactDelete.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ContactDelete) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContactDelete.Merge(m, src) +} +func (m *ContactDelete) XXX_Size() int { + return m.Size() +} +func (m *ContactDelete) XXX_DiscardUnknown() { + xxx_messageInfo_ContactDelete.DiscardUnknown(m) +} + +var xxx_messageInfo_ContactDelete proto.InternalMessageInfo + func init() { proto.RegisterEnum("events.UserKind", UserKind_name, UserKind_value) proto.RegisterEnum("events.EventAction", EventAction_name, EventAction_value) @@ -14934,6 +15097,7 @@ func init() { proto.RegisterEnum("events.ElasticsearchCategory", ElasticsearchCategory_name, ElasticsearchCategory_value) proto.RegisterEnum("events.OpenSearchCategory", OpenSearchCategory_name, OpenSearchCategory_value) proto.RegisterEnum("events.AdminActionsMFAStatus", AdminActionsMFAStatus_name, AdminActionsMFAStatus_value) + proto.RegisterEnum("events.ContactType", ContactType_name, ContactType_value) proto.RegisterEnum("events.SessionNetwork_NetworkOperation", SessionNetwork_NetworkOperation_name, SessionNetwork_NetworkOperation_value) proto.RegisterType((*Metadata)(nil), "events.Metadata") proto.RegisterType((*SessionMetadata)(nil), "events.SessionMetadata") @@ -15183,6 +15347,8 @@ func init() { proto.RegisterType((*UserTaskUpdate)(nil), "events.UserTaskUpdate") proto.RegisterType((*UserTaskMetadata)(nil), "events.UserTaskMetadata") proto.RegisterType((*UserTaskDelete)(nil), "events.UserTaskDelete") + proto.RegisterType((*ContactCreate)(nil), "events.ContactCreate") + proto.RegisterType((*ContactDelete)(nil), "events.ContactDelete") } func init() { @@ -15190,1069 +15356,1077 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 16990 bytes of a gzipped FileDescriptorProto + // 17120 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x78, 0x24, 0xc9, - 0x75, 0x20, 0x86, 0x3a, 0x50, 0x00, 0x1e, 0xce, 0x8e, 0xbe, 0xb2, 0x7b, 0x7a, 0x1a, 0x33, 0x39, + 0x75, 0x20, 0x86, 0x3a, 0x50, 0x00, 0x1e, 0xce, 0x8e, 0xbe, 0xb2, 0x7b, 0x7a, 0x06, 0x33, 0x39, 0x64, 0xb3, 0x7b, 0x38, 0x83, 0xe6, 0xf4, 0xf4, 0xcc, 0x70, 0x2e, 0x0e, 0x0b, 0x28, 0xa0, 0x51, 0xdd, 0x38, 0x6a, 0xb2, 0xd0, 0xdd, 0x1c, 0x52, 0x64, 0x29, 0x51, 0x19, 0x0d, 0xe4, 0x74, 0x55, - 0x66, 0x29, 0x33, 0xab, 0xd1, 0x18, 0x5f, 0xa2, 0xac, 0xd5, 0x4a, 0x2b, 0x8a, 0x4b, 0x53, 0xd6, - 0xb1, 0x87, 0xbd, 0xd4, 0x1e, 0xb6, 0x56, 0xab, 0x15, 0xad, 0xb5, 0x2c, 0x89, 0x92, 0xe8, 0xdd, - 0xb5, 0x7c, 0x70, 0xa5, 0xcf, 0xfa, 0xb4, 0x6b, 0x7b, 0xbf, 0xfd, 0xec, 0x35, 0xb8, 0x96, 0xbd, - 0x7f, 0xf0, 0xd9, 0xfe, 0xf4, 0xd9, 0xfa, 0xbc, 0xf4, 0x7a, 0xed, 0xcf, 0x5f, 0xbc, 0x88, 0xcc, - 0x8c, 0xbc, 0x0a, 0xe7, 0x08, 0x03, 0x36, 0xfe, 0x74, 0xa3, 0xde, 0x7b, 0xf1, 0x22, 0xf2, 0xc5, - 0x8b, 0x88, 0x17, 0x11, 0x2f, 0xde, 0x83, 0x6b, 0x1e, 0x6d, 0xd1, 0x8e, 0xed, 0x78, 0xd7, 0x5b, - 0x74, 0x4d, 0x6f, 0x6e, 0x5e, 0xf7, 0x36, 0x3b, 0xd4, 0xbd, 0x4e, 0x1f, 0x51, 0xcb, 0xf3, 0xff, - 0x9b, 0xea, 0x38, 0xb6, 0x67, 0x93, 0x12, 0xff, 0x75, 0xf1, 0xcc, 0x9a, 0xbd, 0x66, 0x23, 0xe8, - 0x3a, 0xfb, 0x8b, 0x63, 0x2f, 0x5e, 0x5a, 0xb3, 0xed, 0xb5, 0x16, 0xbd, 0x8e, 0xbf, 0x56, 0xbb, - 0x0f, 0xae, 0xbb, 0x9e, 0xd3, 0x6d, 0x7a, 0x02, 0x3b, 0x19, 0xc7, 0x7a, 0x66, 0x9b, 0xba, 0x9e, - 0xde, 0xee, 0x08, 0x82, 0xcb, 0x71, 0x82, 0x0d, 0x47, 0xef, 0x74, 0xa8, 0x23, 0x2a, 0xbf, 0xf8, - 0x89, 0xa0, 0x9d, 0x7a, 0xb3, 0x49, 0x5d, 0xb7, 0x65, 0xba, 0xde, 0xf5, 0x47, 0x2f, 0x49, 0xbf, - 0x04, 0xe1, 0xb3, 0xe9, 0x1f, 0x84, 0xff, 0x0a, 0x92, 0x17, 0xd3, 0x49, 0xfc, 0x1a, 0x63, 0x55, - 0xab, 0x5f, 0xcf, 0xc3, 0xe0, 0x22, 0xf5, 0x74, 0x43, 0xf7, 0x74, 0x72, 0x09, 0xfa, 0xab, 0x96, - 0x41, 0x1f, 0x2b, 0xb9, 0x67, 0x72, 0x57, 0x0b, 0xd3, 0xa5, 0xed, 0xad, 0xc9, 0x3c, 0x35, 0x35, - 0x0e, 0x24, 0x4f, 0x43, 0x71, 0x65, 0xb3, 0x43, 0x95, 0xfc, 0x33, 0xb9, 0xab, 0x43, 0xd3, 0x43, - 0xdb, 0x5b, 0x93, 0xfd, 0x28, 0x34, 0x0d, 0xc1, 0xe4, 0x59, 0xc8, 0x57, 0x2b, 0x4a, 0x01, 0x91, - 0xa7, 0xb6, 0xb7, 0x26, 0x47, 0xbb, 0xa6, 0xf1, 0x82, 0xdd, 0x36, 0x3d, 0xda, 0xee, 0x78, 0x9b, - 0x5a, 0xbe, 0x5a, 0x21, 0x57, 0xa0, 0x38, 0x63, 0x1b, 0x54, 0x29, 0x22, 0x11, 0xd9, 0xde, 0x9a, + 0x66, 0x31, 0x33, 0xab, 0xd1, 0x18, 0x5f, 0xa2, 0xac, 0xd5, 0x4a, 0x2b, 0x8a, 0x4b, 0x53, 0xd6, + 0xb1, 0x87, 0xbd, 0xd4, 0x1e, 0xb6, 0x56, 0xab, 0x15, 0xad, 0xb5, 0x2c, 0x89, 0x92, 0xe8, 0x95, + 0x2c, 0x1f, 0x5c, 0xe9, 0xb3, 0x3e, 0xed, 0xda, 0xde, 0x6f, 0x3f, 0x7b, 0x0d, 0xae, 0x65, 0xef, + 0x1f, 0x7c, 0xb6, 0x3f, 0x7d, 0xb6, 0x3e, 0x2f, 0xbd, 0x5e, 0xfb, 0xf3, 0x17, 0x2f, 0x22, 0x33, + 0x23, 0xaf, 0xc2, 0x39, 0xc2, 0x60, 0x1a, 0x7f, 0xba, 0x51, 0xef, 0xbd, 0x78, 0x11, 0xf9, 0xe2, + 0x45, 0xc4, 0x8b, 0x88, 0x17, 0xef, 0xc1, 0x55, 0x8f, 0xb6, 0x68, 0xc7, 0x76, 0xbc, 0x6b, 0x2d, + 0xba, 0xa6, 0x37, 0x37, 0xaf, 0x79, 0x9b, 0x1d, 0xea, 0x5e, 0xa3, 0x0f, 0xa9, 0xe5, 0xf9, 0xff, + 0x4d, 0x75, 0x1c, 0xdb, 0xb3, 0x49, 0x89, 0xff, 0xba, 0x78, 0x66, 0xcd, 0x5e, 0xb3, 0x11, 0x74, + 0x8d, 0xfd, 0xc5, 0xb1, 0x17, 0x2f, 0xad, 0xd9, 0xf6, 0x5a, 0x8b, 0x5e, 0xc3, 0x5f, 0xab, 0xdd, + 0xfb, 0xd7, 0x5c, 0xcf, 0xe9, 0x36, 0x3d, 0x81, 0x9d, 0x8c, 0x63, 0x3d, 0xb3, 0x4d, 0x5d, 0x4f, + 0x6f, 0x77, 0x04, 0xc1, 0x53, 0x71, 0x82, 0x0d, 0x47, 0xef, 0x74, 0xa8, 0x23, 0x2a, 0xbf, 0xf8, + 0x89, 0xa0, 0x9d, 0x7a, 0xb3, 0x49, 0x5d, 0xb7, 0x65, 0xba, 0xde, 0xb5, 0x87, 0x2f, 0x4a, 0xbf, + 0x04, 0xe1, 0x33, 0xe9, 0x1f, 0x84, 0xff, 0x0a, 0x92, 0x17, 0xd2, 0x49, 0xfc, 0x1a, 0x63, 0x55, + 0xab, 0xdf, 0xc8, 0xc3, 0xe0, 0x22, 0xf5, 0x74, 0x43, 0xf7, 0x74, 0x72, 0x09, 0xfa, 0xab, 0x96, + 0x41, 0x1f, 0x29, 0xb9, 0xa7, 0x73, 0x57, 0x0a, 0xd3, 0xa5, 0xed, 0xad, 0xc9, 0x3c, 0x35, 0x35, + 0x0e, 0x24, 0x4f, 0x42, 0x71, 0x65, 0xb3, 0x43, 0x95, 0xfc, 0xd3, 0xb9, 0x2b, 0x43, 0xd3, 0x43, + 0xdb, 0x5b, 0x93, 0xfd, 0x28, 0x34, 0x0d, 0xc1, 0xe4, 0x19, 0xc8, 0x57, 0x2b, 0x4a, 0x01, 0x91, + 0xa7, 0xb6, 0xb7, 0x26, 0x47, 0xbb, 0xa6, 0xf1, 0xbc, 0xdd, 0x36, 0x3d, 0xda, 0xee, 0x78, 0x9b, + 0x5a, 0xbe, 0x5a, 0x21, 0x97, 0xa1, 0x38, 0x63, 0x1b, 0x54, 0x29, 0x22, 0x11, 0xd9, 0xde, 0x9a, 0x1c, 0x6b, 0xda, 0x06, 0x95, 0xa8, 0x10, 0x4f, 0x3e, 0x0b, 0xc5, 0x15, 0xb3, 0x4d, 0x95, 0xfe, - 0x67, 0x72, 0x57, 0x87, 0x6f, 0x5c, 0x9c, 0xe2, 0xe2, 0x9b, 0xf2, 0xc5, 0x37, 0xb5, 0xe2, 0xcb, - 0x77, 0x7a, 0xe2, 0x3b, 0x5b, 0x93, 0x7d, 0xdb, 0x5b, 0x93, 0x45, 0x26, 0xf2, 0xaf, 0x7d, 0x77, - 0x32, 0xa7, 0x61, 0x49, 0xf2, 0x16, 0x0c, 0xcf, 0xb4, 0xba, 0xae, 0x47, 0x9d, 0x25, 0xbd, 0x4d, + 0xa7, 0x73, 0x57, 0x86, 0xaf, 0x5f, 0x9c, 0xe2, 0xe2, 0x9b, 0xf2, 0xc5, 0x37, 0xb5, 0xe2, 0xcb, + 0x77, 0x7a, 0xe2, 0xbb, 0x5b, 0x93, 0x7d, 0xdb, 0x5b, 0x93, 0x45, 0x26, 0xf2, 0xaf, 0x7f, 0x6f, + 0x32, 0xa7, 0x61, 0x49, 0xf2, 0x26, 0x0c, 0xcf, 0xb4, 0xba, 0xae, 0x47, 0x9d, 0x25, 0xbd, 0x4d, 0x95, 0x12, 0x56, 0x78, 0x71, 0x7b, 0x6b, 0xf2, 0x5c, 0x93, 0x83, 0x1b, 0x96, 0xde, 0x96, 0x2b, - 0x96, 0xc9, 0xd5, 0xdf, 0xcc, 0xc1, 0x78, 0x9d, 0xba, 0xae, 0x69, 0x5b, 0x81, 0x6c, 0x3e, 0x0e, + 0x96, 0xc9, 0xd5, 0xdf, 0xc8, 0xc1, 0x78, 0x9d, 0xba, 0xae, 0x69, 0x5b, 0x81, 0x6c, 0x3e, 0x0e, 0x43, 0x02, 0x54, 0xad, 0xa0, 0x7c, 0x86, 0xa6, 0x07, 0xb6, 0xb7, 0x26, 0x0b, 0xae, 0x69, 0x68, - 0x21, 0x86, 0x7c, 0x0a, 0x06, 0xee, 0x9b, 0xde, 0xfa, 0xe2, 0x5c, 0x59, 0xc8, 0xe9, 0xdc, 0xf6, - 0xd6, 0x24, 0xd9, 0x30, 0xbd, 0xf5, 0x46, 0xfb, 0x81, 0x2e, 0x55, 0xe8, 0x93, 0x91, 0x05, 0x98, - 0xa8, 0x39, 0xe6, 0x23, 0xdd, 0xa3, 0x77, 0xe8, 0x66, 0xcd, 0x6e, 0x99, 0xcd, 0x4d, 0x21, 0xc5, - 0x67, 0xb6, 0xb7, 0x26, 0x2f, 0x75, 0x38, 0xae, 0xf1, 0x90, 0x6e, 0x36, 0x3a, 0x88, 0x95, 0x98, - 0x24, 0x4a, 0xaa, 0xbf, 0x55, 0x82, 0x91, 0xbb, 0x2e, 0x75, 0x82, 0x76, 0x5f, 0x81, 0x22, 0xfb, - 0x2d, 0x9a, 0x8c, 0x32, 0xef, 0xba, 0xd4, 0x91, 0x65, 0xce, 0xf0, 0xe4, 0x1a, 0xf4, 0x2f, 0xd8, + 0x21, 0x86, 0x7c, 0x0a, 0x06, 0xee, 0x99, 0xde, 0xfa, 0xe2, 0x5c, 0x59, 0xc8, 0xe9, 0xdc, 0xf6, + 0xd6, 0x24, 0xd9, 0x30, 0xbd, 0xf5, 0x46, 0xfb, 0xbe, 0x2e, 0x55, 0xe8, 0x93, 0x91, 0x05, 0x98, + 0xa8, 0x39, 0xe6, 0x43, 0xdd, 0xa3, 0xb7, 0xe9, 0x66, 0xcd, 0x6e, 0x99, 0xcd, 0x4d, 0x21, 0xc5, + 0xa7, 0xb7, 0xb7, 0x26, 0x2f, 0x75, 0x38, 0xae, 0xf1, 0x80, 0x6e, 0x36, 0x3a, 0x88, 0x95, 0x98, + 0x24, 0x4a, 0xaa, 0xbf, 0x59, 0x82, 0x91, 0x3b, 0x2e, 0x75, 0x82, 0x76, 0x5f, 0x86, 0x22, 0xfb, + 0x2d, 0x9a, 0x8c, 0x32, 0xef, 0xba, 0xd4, 0x91, 0x65, 0xce, 0xf0, 0xe4, 0x2a, 0xf4, 0x2f, 0xd8, 0x6b, 0xa6, 0x25, 0x9a, 0x7d, 0x7a, 0x7b, 0x6b, 0x72, 0xbc, 0xc5, 0x00, 0x12, 0x25, 0xa7, 0x20, 0x9f, 0x81, 0x91, 0x6a, 0x9b, 0xe9, 0x90, 0x6d, 0xe9, 0x9e, 0xed, 0x88, 0xd6, 0xa2, 0x74, 0x4d, - 0x09, 0x2e, 0x15, 0x8c, 0xd0, 0x93, 0x37, 0x00, 0xca, 0xf7, 0xeb, 0x9a, 0xdd, 0xa2, 0x65, 0x6d, + 0x09, 0x2e, 0x15, 0x8c, 0xd0, 0x93, 0xd7, 0x01, 0xca, 0xf7, 0xea, 0x9a, 0xdd, 0xa2, 0x65, 0x6d, 0x49, 0x28, 0x03, 0x96, 0xd6, 0x37, 0xdc, 0x86, 0x63, 0xb7, 0x68, 0x43, 0x77, 0xe4, 0x6a, 0x25, - 0x6a, 0x32, 0x0b, 0x63, 0x65, 0x1c, 0x15, 0x1a, 0xfd, 0xa1, 0x2e, 0x75, 0x3d, 0x57, 0xe9, 0x7f, - 0xa6, 0x70, 0x75, 0x68, 0xfa, 0xe9, 0xed, 0xad, 0xc9, 0x0b, 0x7c, 0xbc, 0x34, 0x1c, 0x81, 0x92, - 0x58, 0xc4, 0x0a, 0x91, 0x69, 0x18, 0x2d, 0x7f, 0xd0, 0x75, 0x68, 0xd5, 0xa0, 0x96, 0x67, 0x7a, - 0x9b, 0x42, 0x43, 0x2e, 0x6d, 0x6f, 0x4d, 0x2a, 0x3a, 0x43, 0x34, 0x4c, 0x81, 0x91, 0x98, 0x44, - 0x8b, 0x90, 0x65, 0x38, 0x75, 0x6b, 0xa6, 0x56, 0xa7, 0xce, 0x23, 0xb3, 0x49, 0xcb, 0xcd, 0xa6, - 0xdd, 0xb5, 0x3c, 0x65, 0x00, 0xf9, 0x3c, 0xbb, 0xbd, 0x35, 0xf9, 0xf4, 0x5a, 0xb3, 0xd3, 0x70, - 0x39, 0xb6, 0xa1, 0x73, 0xb4, 0xc4, 0x2c, 0x59, 0x96, 0x7c, 0x1e, 0x46, 0x57, 0x1c, 0xa6, 0x85, - 0x46, 0x85, 0x32, 0xb8, 0x32, 0x88, 0xfa, 0x7f, 0x6e, 0x4a, 0xcc, 0x54, 0x1c, 0xea, 0xf7, 0x2c, - 0x6f, 0xac, 0xc7, 0x0b, 0x34, 0x0c, 0xc4, 0xc9, 0x8d, 0x8d, 0xb0, 0x22, 0x14, 0x14, 0xf6, 0xf1, - 0xa6, 0x43, 0x8d, 0x84, 0xb6, 0x0d, 0x61, 0x9b, 0xaf, 0x6d, 0x6f, 0x4d, 0x7e, 0xdc, 0x11, 0x34, - 0x8d, 0x9e, 0x6a, 0x97, 0xc9, 0x8a, 0xcc, 0xc2, 0x20, 0xd3, 0xa6, 0x3b, 0xa6, 0x65, 0x28, 0xf0, - 0x4c, 0xee, 0xea, 0xd8, 0x8d, 0x09, 0xbf, 0xf5, 0x3e, 0x7c, 0xfa, 0xfc, 0xf6, 0xd6, 0xe4, 0x69, - 0xa6, 0x83, 0x8d, 0x87, 0xa6, 0x25, 0x4f, 0x11, 0x41, 0x51, 0x36, 0x8a, 0xa6, 0x6d, 0x0f, 0x87, - 0xee, 0x70, 0x38, 0x8a, 0x56, 0x6d, 0x2f, 0x3e, 0x6c, 0x7d, 0x32, 0x32, 0x03, 0xa3, 0xd3, 0xb6, - 0x57, 0xb5, 0x5c, 0x4f, 0xb7, 0x9a, 0xb4, 0x5a, 0x51, 0x46, 0xb0, 0x1c, 0xaa, 0x05, 0x2b, 0x67, - 0x0a, 0x4c, 0x23, 0x32, 0x29, 0x45, 0xcb, 0xa8, 0xff, 0xa2, 0x08, 0x63, 0xac, 0x4f, 0xa4, 0xe1, - 0x53, 0x66, 0x33, 0x01, 0x83, 0xb0, 0x5a, 0xdc, 0x8e, 0xde, 0xa4, 0x62, 0x24, 0xe1, 0x57, 0x58, - 0x3e, 0x50, 0xe2, 0x19, 0xa7, 0x27, 0xd7, 0x60, 0x90, 0x83, 0xaa, 0x15, 0x31, 0xb8, 0x46, 0xb7, - 0xb7, 0x26, 0x87, 0x5c, 0x84, 0x35, 0x4c, 0x43, 0x0b, 0xd0, 0x4c, 0xbb, 0xf9, 0xdf, 0xf3, 0xb6, - 0xeb, 0x31, 0xe6, 0x62, 0x6c, 0xe1, 0x67, 0x88, 0x02, 0xeb, 0x02, 0x25, 0x6b, 0x77, 0xb4, 0x10, - 0x79, 0x1d, 0x80, 0x43, 0xca, 0x86, 0xe1, 0x88, 0x01, 0x76, 0x61, 0x7b, 0x6b, 0xf2, 0xac, 0x60, - 0xa1, 0x1b, 0x86, 0x3c, 0x3a, 0x25, 0x62, 0xd2, 0x86, 0x11, 0xfe, 0x6b, 0x41, 0x5f, 0xa5, 0x2d, - 0x3e, 0xba, 0x86, 0x6f, 0x5c, 0xf5, 0x3b, 0x31, 0x2a, 0x9d, 0x29, 0x99, 0x74, 0xd6, 0xf2, 0x9c, - 0xcd, 0xe9, 0x49, 0x31, 0x21, 0x9f, 0x17, 0x55, 0xb5, 0x10, 0x27, 0x4f, 0x05, 0x72, 0x19, 0x36, - 0x4f, 0xcf, 0xd9, 0xce, 0x86, 0xee, 0x18, 0xd4, 0x98, 0xde, 0x94, 0xe7, 0xe9, 0x07, 0x3e, 0xb8, - 0xb1, 0x2a, 0xab, 0x9e, 0x4c, 0xce, 0x3a, 0x9d, 0x73, 0xab, 0x77, 0x57, 0x51, 0xe5, 0x06, 0x12, - 0xd2, 0x72, 0xbb, 0xab, 0x71, 0x35, 0x8b, 0x96, 0x61, 0x53, 0x01, 0x07, 0xdc, 0xa3, 0x0e, 0x9b, - 0xc4, 0x71, 0xd4, 0x89, 0xa9, 0x40, 0x30, 0x79, 0xc4, 0x31, 0x49, 0x1e, 0xa2, 0xc8, 0xc5, 0x77, - 0xe0, 0x54, 0x42, 0x14, 0x64, 0x02, 0x0a, 0x0f, 0xe9, 0x26, 0x57, 0x17, 0x8d, 0xfd, 0x49, 0xce, - 0x40, 0xff, 0x23, 0xbd, 0xd5, 0x15, 0x4b, 0xa8, 0xc6, 0x7f, 0xbc, 0x91, 0xff, 0x74, 0x8e, 0xad, - 0x38, 0x64, 0xc6, 0xb6, 0x2c, 0xda, 0xf4, 0xe4, 0x45, 0xe7, 0x55, 0x18, 0x5a, 0xb0, 0x9b, 0x7a, - 0x0b, 0xfb, 0x91, 0xeb, 0x9d, 0xb2, 0xbd, 0x35, 0x79, 0x86, 0x75, 0xe0, 0x54, 0x8b, 0x61, 0xa4, - 0x36, 0x85, 0xa4, 0x4c, 0x01, 0x34, 0xda, 0xb6, 0x3d, 0x8a, 0x05, 0xf3, 0xa1, 0x02, 0x60, 0x41, - 0x07, 0x51, 0xb2, 0x02, 0x84, 0xc4, 0xe4, 0x3a, 0x0c, 0xd6, 0xd8, 0x3a, 0xdb, 0xb4, 0x5b, 0x42, - 0xf9, 0x70, 0x29, 0xc0, 0xb5, 0x57, 0x1e, 0xab, 0x3e, 0x91, 0x3a, 0x0f, 0x63, 0x33, 0x2d, 0x93, - 0x5a, 0x9e, 0xdc, 0x6a, 0x36, 0x92, 0xcb, 0x6b, 0xd4, 0xf2, 0xe4, 0x56, 0xe3, 0x98, 0xd7, 0x19, - 0x54, 0x6e, 0x75, 0x40, 0xaa, 0xfe, 0x41, 0x01, 0x2e, 0xdc, 0xe9, 0xae, 0x52, 0xc7, 0xa2, 0x1e, - 0x75, 0xc5, 0x82, 0x1c, 0x70, 0x5d, 0x82, 0x53, 0x09, 0xa4, 0xe0, 0x8e, 0x0b, 0xe5, 0xc3, 0x00, - 0xd9, 0x10, 0x6b, 0xbc, 0x3c, 0xdb, 0x26, 0x8a, 0x92, 0x79, 0x18, 0x0f, 0x81, 0xac, 0x11, 0xae, - 0x92, 0xc7, 0xa5, 0xe4, 0xf2, 0xf6, 0xd6, 0xe4, 0x45, 0x89, 0x1b, 0x6b, 0xb6, 0xac, 0xc1, 0xf1, - 0x62, 0xe4, 0x0e, 0x4c, 0x84, 0xa0, 0x5b, 0x8e, 0xdd, 0xed, 0xb8, 0x4a, 0x01, 0x59, 0x4d, 0x6e, - 0x6f, 0x4d, 0x3e, 0x25, 0xb1, 0x5a, 0x43, 0xa4, 0xbc, 0x80, 0xc7, 0x0b, 0x92, 0x1f, 0xcd, 0xc9, - 0xdc, 0xc4, 0x28, 0x2c, 0xe2, 0x28, 0x7c, 0xcd, 0x1f, 0x85, 0x99, 0x42, 0x9a, 0x8a, 0x97, 0x14, + 0x6a, 0x32, 0x0b, 0x63, 0x65, 0x1c, 0x15, 0x1a, 0xfd, 0x72, 0x97, 0xba, 0x9e, 0xab, 0xf4, 0x3f, + 0x5d, 0xb8, 0x32, 0x34, 0xfd, 0xe4, 0xf6, 0xd6, 0xe4, 0x05, 0x3e, 0x5e, 0x1a, 0x8e, 0x40, 0x49, + 0x2c, 0x62, 0x85, 0xc8, 0x34, 0x8c, 0x96, 0xdf, 0xef, 0x3a, 0xb4, 0x6a, 0x50, 0xcb, 0x33, 0xbd, + 0x4d, 0xa1, 0x21, 0x97, 0xb6, 0xb7, 0x26, 0x15, 0x9d, 0x21, 0x1a, 0xa6, 0xc0, 0x48, 0x4c, 0xa2, + 0x45, 0xc8, 0x32, 0x9c, 0xba, 0x39, 0x53, 0xab, 0x53, 0xe7, 0xa1, 0xd9, 0xa4, 0xe5, 0x66, 0xd3, + 0xee, 0x5a, 0x9e, 0x32, 0x80, 0x7c, 0x9e, 0xd9, 0xde, 0x9a, 0x7c, 0x72, 0xad, 0xd9, 0x69, 0xb8, + 0x1c, 0xdb, 0xd0, 0x39, 0x5a, 0x62, 0x96, 0x2c, 0x4b, 0x3e, 0x0f, 0xa3, 0x2b, 0x0e, 0xd3, 0x42, + 0xa3, 0x42, 0x19, 0x5c, 0x19, 0x44, 0xfd, 0x3f, 0x37, 0x25, 0x66, 0x2a, 0x0e, 0xf5, 0x7b, 0x96, + 0x37, 0xd6, 0xe3, 0x05, 0x1a, 0x06, 0xe2, 0xe4, 0xc6, 0x46, 0x58, 0x11, 0x0a, 0x0a, 0xfb, 0x78, + 0xd3, 0xa1, 0x46, 0x42, 0xdb, 0x86, 0xb0, 0xcd, 0x57, 0xb7, 0xb7, 0x26, 0x3f, 0xee, 0x08, 0x9a, + 0x46, 0x4f, 0xb5, 0xcb, 0x64, 0x45, 0x66, 0x61, 0x90, 0x69, 0xd3, 0x6d, 0xd3, 0x32, 0x14, 0x78, + 0x3a, 0x77, 0x65, 0xec, 0xfa, 0x84, 0xdf, 0x7a, 0x1f, 0x3e, 0x7d, 0x7e, 0x7b, 0x6b, 0xf2, 0x34, + 0xd3, 0xc1, 0xc6, 0x03, 0xd3, 0x92, 0xa7, 0x88, 0xa0, 0x28, 0x1b, 0x45, 0xd3, 0xb6, 0x87, 0x43, + 0x77, 0x38, 0x1c, 0x45, 0xab, 0xb6, 0x17, 0x1f, 0xb6, 0x3e, 0x19, 0x99, 0x81, 0xd1, 0x69, 0xdb, + 0xab, 0x5a, 0xae, 0xa7, 0x5b, 0x4d, 0x5a, 0xad, 0x28, 0x23, 0x58, 0x0e, 0xd5, 0x82, 0x95, 0x33, + 0x05, 0xa6, 0x11, 0x99, 0x94, 0xa2, 0x65, 0xd4, 0x7f, 0x51, 0x84, 0x31, 0xd6, 0x27, 0xd2, 0xf0, + 0x29, 0xb3, 0x99, 0x80, 0x41, 0x58, 0x2d, 0x6e, 0x47, 0x6f, 0x52, 0x31, 0x92, 0xf0, 0x2b, 0x2c, + 0x1f, 0x28, 0xf1, 0x8c, 0xd3, 0x93, 0xab, 0x30, 0xc8, 0x41, 0xd5, 0x8a, 0x18, 0x5c, 0xa3, 0xdb, + 0x5b, 0x93, 0x43, 0x2e, 0xc2, 0x1a, 0xa6, 0xa1, 0x05, 0x68, 0xa6, 0xdd, 0xfc, 0xef, 0x79, 0xdb, + 0xf5, 0x18, 0x73, 0x31, 0xb6, 0xf0, 0x33, 0x44, 0x81, 0x75, 0x81, 0x92, 0xb5, 0x3b, 0x5a, 0x88, + 0xbc, 0x06, 0xc0, 0x21, 0x65, 0xc3, 0x70, 0xc4, 0x00, 0xbb, 0xb0, 0xbd, 0x35, 0x79, 0x56, 0xb0, + 0xd0, 0x0d, 0x43, 0x1e, 0x9d, 0x12, 0x31, 0x69, 0xc3, 0x08, 0xff, 0xb5, 0xa0, 0xaf, 0xd2, 0x16, + 0x1f, 0x5d, 0xc3, 0xd7, 0xaf, 0xf8, 0x9d, 0x18, 0x95, 0xce, 0x94, 0x4c, 0x3a, 0x6b, 0x79, 0xce, + 0xe6, 0xf4, 0xa4, 0x98, 0x90, 0xcf, 0x8b, 0xaa, 0x5a, 0x88, 0x93, 0xa7, 0x02, 0xb9, 0x0c, 0x9b, + 0xa7, 0xe7, 0x6c, 0x67, 0x43, 0x77, 0x0c, 0x6a, 0x4c, 0x6f, 0xca, 0xf3, 0xf4, 0x7d, 0x1f, 0xdc, + 0x58, 0x95, 0x55, 0x4f, 0x26, 0x67, 0x9d, 0xce, 0xb9, 0xd5, 0xbb, 0xab, 0xa8, 0x72, 0x03, 0x09, + 0x69, 0xb9, 0xdd, 0xd5, 0xb8, 0x9a, 0x45, 0xcb, 0xb0, 0xa9, 0x80, 0x03, 0xee, 0x52, 0x87, 0x4d, + 0xe2, 0x38, 0xea, 0xc4, 0x54, 0x20, 0x98, 0x3c, 0xe4, 0x98, 0x24, 0x0f, 0x51, 0xe4, 0xe2, 0xdb, + 0x70, 0x2a, 0x21, 0x0a, 0x32, 0x01, 0x85, 0x07, 0x74, 0x93, 0xab, 0x8b, 0xc6, 0xfe, 0x24, 0x67, + 0xa0, 0xff, 0xa1, 0xde, 0xea, 0x8a, 0x25, 0x54, 0xe3, 0x3f, 0x5e, 0xcf, 0x7f, 0x3a, 0xc7, 0x56, + 0x1c, 0x32, 0x63, 0x5b, 0x16, 0x6d, 0x7a, 0xf2, 0xa2, 0xf3, 0x0a, 0x0c, 0x2d, 0xd8, 0x4d, 0xbd, + 0x85, 0xfd, 0xc8, 0xf5, 0x4e, 0xd9, 0xde, 0x9a, 0x3c, 0xc3, 0x3a, 0x70, 0xaa, 0xc5, 0x30, 0x52, + 0x9b, 0x42, 0x52, 0xa6, 0x00, 0x1a, 0x6d, 0xdb, 0x1e, 0xc5, 0x82, 0xf9, 0x50, 0x01, 0xb0, 0xa0, + 0x83, 0x28, 0x59, 0x01, 0x42, 0x62, 0x72, 0x0d, 0x06, 0x6b, 0x6c, 0x9d, 0x6d, 0xda, 0x2d, 0xa1, + 0x7c, 0xb8, 0x14, 0xe0, 0xda, 0x2b, 0x8f, 0x55, 0x9f, 0x48, 0x9d, 0x87, 0xb1, 0x99, 0x96, 0x49, + 0x2d, 0x4f, 0x6e, 0x35, 0x1b, 0xc9, 0xe5, 0x35, 0x6a, 0x79, 0x72, 0xab, 0x71, 0xcc, 0xeb, 0x0c, + 0x2a, 0xb7, 0x3a, 0x20, 0x55, 0xff, 0xb0, 0x00, 0x17, 0x6e, 0x77, 0x57, 0xa9, 0x63, 0x51, 0x8f, + 0xba, 0x62, 0x41, 0x0e, 0xb8, 0x2e, 0xc1, 0xa9, 0x04, 0x52, 0x70, 0xc7, 0x85, 0xf2, 0x41, 0x80, + 0x6c, 0x88, 0x35, 0x5e, 0x9e, 0x6d, 0x13, 0x45, 0xc9, 0x3c, 0x8c, 0x87, 0x40, 0xd6, 0x08, 0x57, + 0xc9, 0xe3, 0x52, 0xf2, 0xd4, 0xf6, 0xd6, 0xe4, 0x45, 0x89, 0x1b, 0x6b, 0xb6, 0xac, 0xc1, 0xf1, + 0x62, 0xe4, 0x36, 0x4c, 0x84, 0xa0, 0x9b, 0x8e, 0xdd, 0xed, 0xb8, 0x4a, 0x01, 0x59, 0x4d, 0x6e, + 0x6f, 0x4d, 0x3e, 0x21, 0xb1, 0x5a, 0x43, 0xa4, 0xbc, 0x80, 0xc7, 0x0b, 0x92, 0x1f, 0xc9, 0xc9, + 0xdc, 0xc4, 0x28, 0x2c, 0xe2, 0x28, 0x7c, 0xd5, 0x1f, 0x85, 0x99, 0x42, 0x9a, 0x8a, 0x97, 0x14, 0x83, 0x32, 0xd6, 0x8c, 0xc4, 0xa0, 0x4c, 0xd4, 0x78, 0x71, 0x06, 0xce, 0xa6, 0xf2, 0xda, 0x93, 0x56, 0xff, 0xf3, 0x82, 0xcc, 0xa5, 0x66, 0x1b, 0x41, 0x67, 0x2e, 0xcb, 0x9d, 0x59, 0xb3, 0x0d, 0x9c, 0xea, 0x73, 0xe1, 0xda, 0x29, 0x35, 0xb6, 0x63, 0x1b, 0xf1, 0x59, 0x3f, 0x59, 0x96, 0x7c, - 0x09, 0xce, 0x25, 0x80, 0x7c, 0xba, 0xe6, 0xda, 0x7f, 0x65, 0x7b, 0x6b, 0x52, 0x4d, 0xe1, 0x1a, + 0x09, 0xce, 0x25, 0x80, 0x7c, 0xba, 0xe6, 0xda, 0x7f, 0x79, 0x7b, 0x6b, 0x52, 0x4d, 0xe1, 0x1a, 0x9f, 0xbd, 0x33, 0xb8, 0x10, 0x1d, 0xce, 0x4b, 0x52, 0xb7, 0x2d, 0x4f, 0x37, 0x2d, 0x61, 0x5c, - 0xf2, 0x51, 0xf2, 0x89, 0xed, 0xad, 0xc9, 0xe7, 0x64, 0x1d, 0xf4, 0x69, 0xe2, 0x8d, 0xcf, 0xe2, - 0x43, 0x0c, 0x50, 0x52, 0x50, 0xd5, 0xb6, 0xbe, 0xe6, 0x5b, 0xcc, 0x57, 0xb7, 0xb7, 0x26, 0x3f, + 0xf2, 0x51, 0xf2, 0x89, 0xed, 0xad, 0xc9, 0x67, 0x65, 0x1d, 0xf4, 0x69, 0xe2, 0x8d, 0xcf, 0xe2, + 0x43, 0x0c, 0x50, 0x52, 0x50, 0xd5, 0xb6, 0xbe, 0xe6, 0x5b, 0xcc, 0x57, 0xb6, 0xb7, 0x26, 0x3f, 0x96, 0x5a, 0x87, 0xc9, 0xa8, 0xe4, 0x15, 0x3a, 0x8b, 0x13, 0xd1, 0x80, 0x84, 0xb8, 0x25, 0xdb, - 0xa0, 0xf8, 0x0d, 0xfd, 0xc8, 0x5f, 0xdd, 0xde, 0x9a, 0xbc, 0x2c, 0xf1, 0xb7, 0x6c, 0x83, 0xc6, - 0x9b, 0x9f, 0x52, 0x5a, 0xfd, 0xcd, 0x02, 0x5c, 0xae, 0x97, 0x17, 0x17, 0xaa, 0x86, 0x6f, 0xd2, - 0xd4, 0x1c, 0xfb, 0x91, 0x69, 0x48, 0xa3, 0x77, 0x15, 0xce, 0xc7, 0x50, 0xb3, 0x68, 0x45, 0x05, - 0xc6, 0x34, 0x7e, 0x9b, 0x6f, 0x2e, 0x75, 0x04, 0x4d, 0x83, 0x9b, 0x5a, 0xd1, 0x45, 0x3b, 0x8b, - 0x11, 0xeb, 0xa3, 0x18, 0xaa, 0xbe, 0x6e, 0x3b, 0x5e, 0xb3, 0xeb, 0x09, 0x25, 0xc0, 0x3e, 0x4a, - 0xd4, 0xe1, 0x0a, 0xa2, 0x1e, 0x55, 0xf8, 0x7c, 0xc8, 0x4f, 0xe4, 0x60, 0xa2, 0xec, 0x79, 0x8e, - 0xb9, 0xda, 0xf5, 0xe8, 0xa2, 0xde, 0xe9, 0x98, 0xd6, 0x1a, 0x8e, 0xf5, 0xe1, 0x1b, 0x6f, 0x05, - 0x6b, 0x64, 0x4f, 0x49, 0x4c, 0xc5, 0x8b, 0x4b, 0x43, 0x54, 0xf7, 0x51, 0x8d, 0x36, 0xc7, 0xc9, - 0x43, 0x34, 0x5e, 0x8e, 0x0d, 0xd1, 0x54, 0x5e, 0x7b, 0x1a, 0xa2, 0x5f, 0x2f, 0xc0, 0xa5, 0xe5, - 0x87, 0x9e, 0xae, 0x51, 0xd7, 0xee, 0x3a, 0x4d, 0xea, 0xde, 0xed, 0x18, 0xba, 0x47, 0xc3, 0x91, - 0x3a, 0x09, 0xfd, 0x65, 0xc3, 0xa0, 0x06, 0xb2, 0xeb, 0xe7, 0xdb, 0x3e, 0x9d, 0x01, 0x34, 0x0e, - 0x27, 0x1f, 0x87, 0x01, 0x51, 0x06, 0xb9, 0xf7, 0x4f, 0x0f, 0x6f, 0x6f, 0x4d, 0x0e, 0x74, 0x39, - 0x48, 0xf3, 0x71, 0x8c, 0xac, 0x42, 0x5b, 0x94, 0x91, 0x15, 0x42, 0x32, 0x83, 0x83, 0x34, 0x1f, - 0x47, 0xde, 0x85, 0x31, 0x64, 0x1b, 0xb4, 0x47, 0xcc, 0x7d, 0x67, 0x7c, 0xe9, 0xca, 0x8d, 0xe5, - 0x4b, 0x13, 0xb6, 0xa6, 0xe1, 0xf8, 0x05, 0xb4, 0x18, 0x03, 0x72, 0x1f, 0x26, 0x44, 0x23, 0x42, - 0xa6, 0xfd, 0x3d, 0x98, 0x9e, 0xdd, 0xde, 0x9a, 0x3c, 0x25, 0xda, 0x2f, 0xb1, 0x4d, 0x30, 0x61, - 0x8c, 0x45, 0xb3, 0x43, 0xc6, 0xa5, 0x9d, 0x18, 0x8b, 0x2f, 0x96, 0x19, 0xc7, 0x99, 0xa8, 0xef, - 0xc1, 0x88, 0x5c, 0x90, 0x9c, 0xc3, 0xad, 0x35, 0x1f, 0x27, 0xb8, 0x29, 0x37, 0x0d, 0xdc, 0x4f, - 0xbf, 0x04, 0xc3, 0x15, 0xea, 0x36, 0x1d, 0xb3, 0xc3, 0xac, 0x06, 0xa1, 0xe4, 0xe3, 0xdb, 0x5b, - 0x93, 0xc3, 0x46, 0x08, 0xd6, 0x64, 0x1a, 0xf5, 0xff, 0xca, 0xc1, 0x39, 0xc6, 0xbb, 0xec, 0xba, - 0xe6, 0x9a, 0xd5, 0x96, 0x97, 0xed, 0x17, 0xa0, 0x54, 0xc7, 0xfa, 0x44, 0x4d, 0x67, 0xb6, 0xb7, - 0x26, 0x27, 0x78, 0x0b, 0x24, 0x3d, 0x14, 0x34, 0xc1, 0xbe, 0x32, 0xbf, 0xc3, 0xbe, 0x92, 0x99, - 0xb4, 0x9e, 0xee, 0x78, 0xa6, 0xb5, 0x56, 0xf7, 0x74, 0xaf, 0xeb, 0x46, 0x4c, 0x5a, 0x81, 0x69, - 0xb8, 0x88, 0x8a, 0x98, 0xb4, 0x91, 0x42, 0xe4, 0x1d, 0x18, 0x99, 0xb5, 0x8c, 0x90, 0x09, 0x9f, - 0x10, 0x9f, 0x62, 0x96, 0x26, 0x45, 0x78, 0x92, 0x45, 0xa4, 0x80, 0xfa, 0xb7, 0x73, 0xa0, 0xf0, - 0x4d, 0xe0, 0x82, 0xe9, 0x7a, 0x8b, 0xb4, 0xbd, 0x2a, 0xcd, 0x4e, 0x73, 0xfe, 0xae, 0x92, 0xe1, - 0xa4, 0xb5, 0x08, 0x4d, 0x01, 0xb1, 0xab, 0x6c, 0x99, 0x6e, 0x62, 0xfb, 0x11, 0x2b, 0x45, 0xaa, - 0x30, 0xc0, 0x39, 0x73, 0x5b, 0x62, 0xf8, 0x86, 0xe2, 0x2b, 0x42, 0xbc, 0x6a, 0xae, 0x0c, 0x6d, - 0x4e, 0x2c, 0x6f, 0x68, 0x44, 0x79, 0xf5, 0x1b, 0x05, 0x98, 0x88, 0x17, 0x22, 0xf7, 0x61, 0xf0, - 0xb6, 0x6d, 0x5a, 0xd4, 0x58, 0xb6, 0xb0, 0x85, 0xbd, 0x0f, 0x47, 0x7c, 0x5b, 0xfc, 0xf4, 0xfb, - 0x58, 0xa6, 0x21, 0x5b, 0xb0, 0x78, 0x56, 0x12, 0x30, 0x23, 0x9f, 0x87, 0x21, 0x66, 0x03, 0x3e, - 0x42, 0xce, 0xf9, 0x1d, 0x39, 0x3f, 0x23, 0x38, 0x9f, 0x71, 0x78, 0xa1, 0x24, 0xeb, 0x90, 0x1d, - 0xd3, 0x2b, 0x8d, 0xea, 0xae, 0x6d, 0x89, 0x9e, 0x47, 0xbd, 0x72, 0x10, 0x22, 0xeb, 0x15, 0xa7, - 0x61, 0xa6, 0x2b, 0xff, 0x58, 0xec, 0x06, 0x69, 0xef, 0xc2, 0x65, 0x15, 0xef, 0x01, 0x89, 0x98, - 0x58, 0x30, 0x2e, 0x04, 0xba, 0x6e, 0x76, 0xd0, 0xea, 0xc7, 0x75, 0x6d, 0xec, 0xc6, 0x95, 0x29, - 0xff, 0x50, 0x6c, 0x4a, 0x3a, 0x52, 0x7b, 0xf4, 0xd2, 0xd4, 0x62, 0x40, 0x8e, 0x3b, 0x53, 0xd4, - 0xc9, 0x18, 0x0b, 0xb9, 0xb7, 0xdb, 0x11, 0x72, 0xf5, 0xc7, 0xf2, 0xf0, 0x62, 0xd8, 0x45, 0x1a, - 0x7d, 0x64, 0xd2, 0x8d, 0x90, 0xa3, 0xd8, 0x23, 0xb3, 0x21, 0xe6, 0xce, 0xac, 0xeb, 0xd6, 0x1a, - 0x35, 0xc8, 0x35, 0xe8, 0xd7, 0xec, 0x16, 0x75, 0x95, 0x1c, 0x9a, 0x87, 0x38, 0x7d, 0x39, 0x0c, - 0x20, 0x1f, 0xb2, 0x20, 0x05, 0xb1, 0xa1, 0xb4, 0xe2, 0xe8, 0xa6, 0xe7, 0x6b, 0x52, 0x39, 0xa9, - 0x49, 0xbb, 0xa8, 0x71, 0x8a, 0xf3, 0xe0, 0x6b, 0x0c, 0x0a, 0xde, 0x43, 0x80, 0x2c, 0x78, 0x4e, - 0x72, 0xf1, 0x75, 0x18, 0x96, 0x88, 0xf7, 0xb4, 0x88, 0x7c, 0xab, 0x28, 0x8f, 0x2d, 0xbf, 0x59, - 0x62, 0x6c, 0x5d, 0x67, 0x63, 0xc2, 0x75, 0x99, 0x15, 0xc3, 0x07, 0x95, 0xd0, 0x7c, 0x04, 0x45, - 0x35, 0x1f, 0x41, 0xe4, 0x65, 0x18, 0xe4, 0x2c, 0x82, 0xfd, 0x32, 0xee, 0xb5, 0x1d, 0x84, 0x45, - 0x4d, 0x81, 0x80, 0x90, 0xfc, 0x52, 0x0e, 0x9e, 0xee, 0x29, 0x09, 0x54, 0xbe, 0xe1, 0x1b, 0xaf, - 0xec, 0x4b, 0x8c, 0xd3, 0x2f, 0x6e, 0x6f, 0x4d, 0x5e, 0x93, 0x34, 0xc3, 0x91, 0x68, 0x1a, 0x4d, - 0x4e, 0x24, 0xb5, 0xab, 0x77, 0x53, 0x98, 0xb1, 0xca, 0x2b, 0x9d, 0xc3, 0xa3, 0x2a, 0xab, 0xb9, - 0xe9, 0x37, 0xb2, 0x18, 0x1a, 0xab, 0xe2, 0x7b, 0x1f, 0xf8, 0x24, 0x29, 0xd5, 0x64, 0x70, 0x21, - 0x4d, 0x38, 0xcf, 0x31, 0x15, 0x7d, 0x73, 0xf9, 0xc1, 0xa2, 0x6d, 0x79, 0xeb, 0x7e, 0x05, 0xfd, - 0xf2, 0x59, 0x0f, 0x56, 0x60, 0xe8, 0x9b, 0x0d, 0xfb, 0x41, 0xa3, 0xcd, 0xa8, 0x52, 0xea, 0xc8, - 0xe2, 0xc4, 0x26, 0x76, 0x31, 0xc6, 0xfd, 0x29, 0xaf, 0x14, 0x9e, 0xc4, 0xf9, 0xf3, 0x42, 0x72, - 0x82, 0x8b, 0x15, 0x52, 0xab, 0x30, 0xb2, 0x60, 0x37, 0x1f, 0x06, 0xea, 0xf2, 0x3a, 0x94, 0x56, - 0x74, 0x67, 0x8d, 0x7a, 0x28, 0x8b, 0xe1, 0x1b, 0xa7, 0xa6, 0xf8, 0xe9, 0x36, 0x23, 0xe2, 0x88, - 0xe9, 0x31, 0x31, 0xfb, 0x94, 0x3c, 0xfc, 0xad, 0x89, 0x02, 0xea, 0x77, 0xfb, 0x61, 0x44, 0x9c, - 0xc4, 0xe2, 0xea, 0x41, 0xde, 0x08, 0xcf, 0xb6, 0xc5, 0x74, 0x19, 0x9c, 0x46, 0x05, 0xa7, 0x68, - 0x23, 0x8c, 0xd9, 0x1f, 0x6e, 0x4d, 0xe6, 0xb6, 0xb7, 0x26, 0xfb, 0xb4, 0x41, 0x69, 0x13, 0x1b, - 0xae, 0x6f, 0xd2, 0x82, 0x2e, 0x9f, 0xad, 0xc6, 0xca, 0xf2, 0xf5, 0xee, 0x1d, 0x18, 0x10, 0x6d, - 0x10, 0x1a, 0x77, 0x3e, 0x3c, 0x3b, 0x89, 0x9c, 0x28, 0xc7, 0x4a, 0xfb, 0xa5, 0xc8, 0x5b, 0x50, - 0xe2, 0x67, 0x09, 0x42, 0x00, 0xe7, 0xd2, 0xcf, 0x5e, 0x62, 0xc5, 0x45, 0x19, 0x32, 0x0f, 0x10, - 0x9e, 0x23, 0x04, 0x07, 0xe8, 0x82, 0x43, 0xf2, 0x84, 0x21, 0xc6, 0x45, 0x2a, 0x4b, 0x5e, 0x85, - 0x91, 0x15, 0xea, 0xb4, 0x4d, 0x4b, 0x6f, 0xd5, 0xcd, 0x0f, 0xfc, 0x33, 0x74, 0x5c, 0xe8, 0x5d, - 0xf3, 0x03, 0x79, 0xe4, 0x46, 0xe8, 0xc8, 0x17, 0xd3, 0xf6, 0xe9, 0x03, 0xd8, 0x90, 0x67, 0x77, - 0xdc, 0xc0, 0xc6, 0xda, 0x93, 0xb2, 0x6d, 0x7f, 0x17, 0x46, 0x23, 0x5b, 0x34, 0x71, 0x48, 0xfa, - 0x74, 0x92, 0xb5, 0xb4, 0xdf, 0x8c, 0xb1, 0x8d, 0x72, 0x60, 0x9a, 0x5c, 0xb5, 0x4c, 0xcf, 0xd4, - 0x5b, 0x33, 0x76, 0xbb, 0xad, 0x5b, 0x86, 0x32, 0x14, 0x6a, 0xb2, 0xc9, 0x31, 0x8d, 0x26, 0x47, - 0xc9, 0x9a, 0x1c, 0x2d, 0x44, 0xee, 0xc0, 0x84, 0xe8, 0x43, 0x8d, 0x36, 0x6d, 0x87, 0xd9, 0x1e, - 0x78, 0x06, 0x2a, 0x8e, 0x01, 0x5c, 0x8e, 0x6b, 0x38, 0x3e, 0x52, 0x36, 0xee, 0xe3, 0x05, 0x6f, - 0x17, 0x07, 0x87, 0x27, 0x46, 0xe2, 0xc7, 0xd6, 0xea, 0xdf, 0x2c, 0xc0, 0xb0, 0x20, 0x65, 0x4b, - 0xf7, 0x89, 0x82, 0x1f, 0x44, 0xc1, 0x53, 0x15, 0xb5, 0x74, 0x58, 0x8a, 0xaa, 0x7e, 0x25, 0x1f, - 0xcc, 0x46, 0x35, 0xc7, 0xb4, 0x0e, 0x36, 0x1b, 0x5d, 0x01, 0x98, 0x59, 0xef, 0x5a, 0x0f, 0xf9, - 0xf5, 0x5c, 0x3e, 0xbc, 0x9e, 0x6b, 0x9a, 0x9a, 0x84, 0x21, 0x4f, 0x43, 0xb1, 0xc2, 0xf8, 0xb3, - 0x9e, 0x19, 0x99, 0x1e, 0xfa, 0x0e, 0xe7, 0x94, 0x7b, 0x51, 0x43, 0x30, 0xdb, 0xcc, 0x4d, 0x6f, - 0x7a, 0x94, 0x9b, 0xcf, 0x05, 0xbe, 0x99, 0x5b, 0x65, 0x00, 0x8d, 0xc3, 0xc9, 0x4d, 0x38, 0x55, - 0xa1, 0x2d, 0x7d, 0x73, 0xd1, 0x6c, 0xb5, 0x4c, 0x97, 0x36, 0x6d, 0xcb, 0x70, 0x51, 0xc8, 0xa2, - 0xba, 0xb6, 0xab, 0x25, 0x09, 0x88, 0x0a, 0xa5, 0xe5, 0x07, 0x0f, 0x5c, 0xea, 0xa1, 0xf8, 0x0a, - 0xd3, 0xc0, 0x26, 0x67, 0x1b, 0x21, 0x9a, 0xc0, 0xa8, 0xdf, 0xcc, 0xb1, 0xdd, 0x92, 0xfb, 0xd0, - 0xb3, 0x3b, 0x81, 0x96, 0x1f, 0x48, 0x24, 0xd7, 0x42, 0xbb, 0x22, 0x8f, 0x5f, 0x3b, 0x2e, 0xbe, - 0x76, 0x40, 0xd8, 0x16, 0xa1, 0x45, 0x91, 0xfa, 0x55, 0x85, 0x1d, 0xbe, 0x4a, 0xfd, 0xe3, 0x3c, - 0x9c, 0x17, 0x2d, 0x9e, 0x69, 0x99, 0x9d, 0x55, 0x5b, 0x77, 0x0c, 0x8d, 0x36, 0xa9, 0xf9, 0x88, - 0x1e, 0xcf, 0x81, 0x17, 0x1d, 0x3a, 0xc5, 0x03, 0x0c, 0x9d, 0x1b, 0xb8, 0xf1, 0x64, 0x92, 0xc1, - 0x03, 0x66, 0x6e, 0x54, 0x4c, 0x6c, 0x6f, 0x4d, 0x8e, 0x18, 0x1c, 0x8c, 0x57, 0x0c, 0x9a, 0x4c, - 0xc4, 0x94, 0x64, 0x81, 0x5a, 0x6b, 0xde, 0x3a, 0x2a, 0x49, 0x3f, 0x57, 0x92, 0x16, 0x42, 0x34, - 0x81, 0x51, 0xff, 0xb7, 0x3c, 0x9c, 0x89, 0x8b, 0xbc, 0x4e, 0x2d, 0xe3, 0x44, 0xde, 0x1f, 0x8e, - 0xbc, 0xff, 0xa4, 0x00, 0x4f, 0x89, 0x32, 0xf5, 0x75, 0xdd, 0xa1, 0x46, 0xc5, 0x74, 0x68, 0xd3, - 0xb3, 0x9d, 0xcd, 0x63, 0x6c, 0x40, 0x1d, 0x9e, 0xd8, 0x6f, 0x42, 0x49, 0x1c, 0x37, 0xf0, 0x75, - 0x66, 0x2c, 0x68, 0x09, 0x42, 0x13, 0x2b, 0x14, 0x3f, 0xaa, 0x88, 0x75, 0x56, 0x69, 0x37, 0x9d, - 0xf5, 0x69, 0x18, 0x0d, 0x44, 0x8f, 0x1b, 0xdf, 0x81, 0xd0, 0xda, 0x32, 0x7c, 0x04, 0xee, 0x7d, - 0xb5, 0x28, 0x21, 0xd6, 0xe6, 0x03, 0xaa, 0x15, 0xb4, 0x86, 0x46, 0x45, 0x6d, 0x41, 0x39, 0xd3, - 0xd0, 0x64, 0x22, 0x75, 0xab, 0x08, 0x17, 0xd3, 0xbb, 0x5d, 0xa3, 0xba, 0x71, 0xd2, 0xeb, 0xdf, - 0x97, 0xbd, 0x4e, 0x9e, 0x85, 0x62, 0x4d, 0xf7, 0xd6, 0xc5, 0x75, 0x3f, 0xde, 0x41, 0x3f, 0x30, - 0x5b, 0xb4, 0xd1, 0xd1, 0xbd, 0x75, 0x0d, 0x51, 0xd2, 0x9c, 0x01, 0xc8, 0x31, 0x65, 0xce, 0x90, - 0x16, 0xfb, 0xe1, 0x67, 0x72, 0x57, 0x8b, 0xa9, 0x8b, 0xfd, 0x77, 0x8b, 0x59, 0xf3, 0xca, 0x7d, - 0xc7, 0xf4, 0xe8, 0x89, 0x86, 0x9d, 0x68, 0xd8, 0x01, 0x35, 0xec, 0x1f, 0xe5, 0x61, 0x34, 0xd8, - 0x34, 0xbd, 0x4f, 0x9b, 0x47, 0xb3, 0x56, 0x85, 0x5b, 0x99, 0xc2, 0x81, 0xb7, 0x32, 0x07, 0x51, - 0x28, 0x35, 0x38, 0x62, 0xe5, 0xa6, 0x01, 0x4a, 0x8c, 0x1f, 0xb1, 0x06, 0x07, 0xab, 0xcf, 0xc2, - 0xc0, 0xa2, 0xfe, 0xd8, 0x6c, 0x77, 0xdb, 0xc2, 0x4a, 0x47, 0xf7, 0xb5, 0xb6, 0xfe, 0x58, 0xf3, - 0xe1, 0xea, 0x7f, 0x9b, 0x83, 0x31, 0x21, 0x54, 0xc1, 0xfc, 0x40, 0x52, 0x0d, 0xa5, 0x93, 0x3f, - 0xb0, 0x74, 0x0a, 0xfb, 0x97, 0x8e, 0xfa, 0x97, 0x0b, 0xa0, 0xcc, 0x99, 0x2d, 0xba, 0xe2, 0xe8, - 0x96, 0xfb, 0x80, 0x3a, 0x62, 0x3b, 0x3d, 0xcb, 0x58, 0x1d, 0xe8, 0x03, 0xa5, 0x29, 0x25, 0xbf, - 0xaf, 0x29, 0xe5, 0x93, 0x30, 0x24, 0x1a, 0x13, 0xb8, 0x4e, 0xe2, 0xa8, 0x71, 0x7c, 0xa0, 0x16, - 0xe2, 0x19, 0x71, 0xb9, 0xd3, 0x71, 0xec, 0x47, 0xd4, 0xe1, 0xb7, 0x62, 0x82, 0x58, 0xf7, 0x81, - 0x5a, 0x88, 0x97, 0x38, 0x53, 0xdf, 0x5e, 0x94, 0x39, 0x53, 0x47, 0x0b, 0xf1, 0xe4, 0x2a, 0x0c, - 0x2e, 0xd8, 0x4d, 0x1d, 0x05, 0xcd, 0xa7, 0x95, 0x91, 0xed, 0xad, 0xc9, 0xc1, 0x96, 0x80, 0x69, - 0x01, 0x96, 0x51, 0x56, 0xec, 0x0d, 0xab, 0x65, 0xeb, 0xdc, 0xd9, 0x66, 0x90, 0x53, 0x1a, 0x02, - 0xa6, 0x05, 0x58, 0x46, 0xc9, 0x64, 0x8e, 0x4e, 0x4c, 0x83, 0x21, 0xcf, 0x07, 0x02, 0xa6, 0x05, - 0x58, 0xf5, 0x9b, 0x45, 0xa6, 0xbd, 0xae, 0xf9, 0xc1, 0x13, 0xbf, 0x2e, 0x84, 0x03, 0xa6, 0x7f, - 0x1f, 0x03, 0xe6, 0x89, 0x39, 0xb0, 0x53, 0xff, 0xc5, 0x00, 0x80, 0x90, 0xfe, 0xec, 0xc9, 0xe6, - 0xf0, 0x60, 0x5a, 0x53, 0x81, 0x53, 0xb3, 0xd6, 0xba, 0x6e, 0x35, 0xa9, 0x11, 0x1e, 0x5b, 0x96, - 0x70, 0x68, 0xa3, 0xd3, 0x25, 0x15, 0xc8, 0xf0, 0xdc, 0x52, 0x4b, 0x16, 0x20, 0x2f, 0xc1, 0x70, - 0xd5, 0xf2, 0xa8, 0xa3, 0x37, 0x3d, 0xf3, 0x11, 0x15, 0x53, 0x03, 0xde, 0x44, 0x9b, 0x21, 0x58, - 0x93, 0x69, 0xc8, 0x4d, 0x18, 0xa9, 0xe9, 0x8e, 0x67, 0x36, 0xcd, 0x8e, 0x6e, 0x79, 0xae, 0x32, - 0x88, 0x33, 0x1a, 0x5a, 0x18, 0x1d, 0x09, 0xae, 0x45, 0xa8, 0xc8, 0x17, 0x61, 0x08, 0xb7, 0xa6, - 0xe8, 0x1f, 0x3e, 0xb4, 0xe3, 0x45, 0xe5, 0x73, 0xa1, 0x3b, 0x22, 0x3f, 0x7d, 0xc5, 0x1b, 0xe7, - 0xf8, 0x5d, 0x65, 0xc0, 0x91, 0x7c, 0x0e, 0x06, 0x66, 0x2d, 0x03, 0x99, 0xc3, 0x8e, 0xcc, 0x55, - 0xc1, 0xfc, 0x5c, 0xc8, 0xdc, 0xee, 0xc4, 0x78, 0xfb, 0xec, 0xd2, 0x47, 0xd9, 0xf0, 0x87, 0x37, - 0xca, 0x46, 0x3e, 0x84, 0x63, 0xf1, 0xd1, 0xc3, 0x3a, 0x16, 0x1f, 0xdb, 0xe7, 0xb1, 0xb8, 0xfa, - 0x01, 0x0c, 0x4f, 0xd7, 0xe6, 0x82, 0xd1, 0x7b, 0x01, 0x0a, 0x35, 0xe1, 0x19, 0x51, 0xe4, 0xf6, - 0x4c, 0xc7, 0x34, 0x34, 0x06, 0x23, 0xd7, 0x60, 0x70, 0x06, 0xdd, 0xed, 0xc4, 0x2d, 0x62, 0x91, - 0xaf, 0x7f, 0x4d, 0x84, 0xa1, 0xd7, 0xad, 0x8f, 0x26, 0x1f, 0x87, 0x81, 0x9a, 0x63, 0xaf, 0x39, - 0x7a, 0x5b, 0xac, 0xc1, 0xe8, 0x9a, 0xd2, 0xe1, 0x20, 0xcd, 0xc7, 0xa9, 0x3f, 0x9d, 0xf3, 0xcd, - 0x76, 0x56, 0xa2, 0xde, 0xc5, 0xa3, 0x79, 0xac, 0x7b, 0x90, 0x97, 0x70, 0x39, 0x48, 0xf3, 0x71, - 0xe4, 0x1a, 0xf4, 0xcf, 0x3a, 0x8e, 0xed, 0xc8, 0x3e, 0xf5, 0x94, 0x01, 0xe4, 0xeb, 0x5e, 0xa4, - 0x20, 0xaf, 0xc1, 0x30, 0x9f, 0x73, 0xf8, 0x89, 0x66, 0xa1, 0xd7, 0x4d, 0xa9, 0x4c, 0xa9, 0xfe, - 0x6e, 0x41, 0xb2, 0xd9, 0xb8, 0xc4, 0x9f, 0xc0, 0x5b, 0x81, 0x97, 0xa1, 0x30, 0x5d, 0x9b, 0x13, - 0x13, 0xe0, 0x69, 0xbf, 0xa8, 0xa4, 0x2a, 0xb1, 0x72, 0x8c, 0x9a, 0x5c, 0x82, 0x62, 0x8d, 0xa9, - 0x4f, 0x09, 0xd5, 0x63, 0x70, 0x7b, 0x6b, 0xb2, 0xd8, 0x61, 0xfa, 0x83, 0x50, 0xc4, 0xb2, 0xcd, - 0x0c, 0xdf, 0x31, 0x71, 0x6c, 0xb8, 0x8f, 0xb9, 0x04, 0xc5, 0xb2, 0xb3, 0xf6, 0x48, 0xcc, 0x5a, - 0x88, 0xd5, 0x9d, 0xb5, 0x47, 0x1a, 0x42, 0xc9, 0x75, 0x00, 0x8d, 0x7a, 0x5d, 0xc7, 0xc2, 0xe7, - 0x2e, 0x43, 0x78, 0xfe, 0x86, 0xb3, 0xa1, 0x83, 0xd0, 0x46, 0xd3, 0x36, 0xa8, 0x26, 0x91, 0xa8, - 0x7f, 0x23, 0xbc, 0xd8, 0xa9, 0x98, 0xee, 0xc3, 0x93, 0x2e, 0xdc, 0x43, 0x17, 0xea, 0xe2, 0x88, - 0x33, 0xd9, 0x49, 0x93, 0xd0, 0x3f, 0xd7, 0xd2, 0xd7, 0x5c, 0xec, 0x43, 0xe1, 0xbb, 0xf6, 0x80, - 0x01, 0x34, 0x0e, 0x8f, 0xf5, 0xd3, 0xe0, 0xce, 0xfd, 0xf4, 0x73, 0xfd, 0xc1, 0x68, 0x5b, 0xa2, - 0xde, 0x86, 0xed, 0x9c, 0x74, 0xd5, 0x6e, 0xbb, 0xea, 0x0a, 0x0c, 0xd4, 0x9d, 0xa6, 0x74, 0x74, - 0x81, 0xfb, 0x01, 0xd7, 0x69, 0xf2, 0x63, 0x0b, 0x1f, 0xc9, 0xe8, 0x2a, 0xae, 0x87, 0x74, 0x03, - 0x21, 0x9d, 0xe1, 0x7a, 0x82, 0x4e, 0x20, 0x05, 0x5d, 0xcd, 0x76, 0x3c, 0xd1, 0x71, 0x01, 0x5d, - 0xc7, 0x76, 0x3c, 0xcd, 0x47, 0x92, 0x4f, 0x02, 0xac, 0xcc, 0xd4, 0x7c, 0xe7, 0xfe, 0xa1, 0xd0, - 0xf7, 0x50, 0x78, 0xf5, 0x6b, 0x12, 0x9a, 0xac, 0xc0, 0xd0, 0x72, 0x87, 0x3a, 0x7c, 0x2b, 0xc4, - 0x1f, 0xb0, 0x7c, 0x22, 0x26, 0x5a, 0xd1, 0xef, 0x53, 0xe2, 0xff, 0x80, 0x9c, 0xaf, 0x2f, 0xb6, - 0xff, 0x53, 0x0b, 0x19, 0x91, 0xd7, 0xa0, 0x54, 0xe6, 0x76, 0xde, 0x30, 0xb2, 0x0c, 0x44, 0x86, - 0x5b, 0x50, 0x8e, 0xe2, 0x7b, 0x76, 0x1d, 0xff, 0xd6, 0x04, 0xb9, 0x7a, 0x0d, 0x26, 0xe2, 0xd5, - 0x90, 0x61, 0x18, 0x98, 0x59, 0x5e, 0x5a, 0x9a, 0x9d, 0x59, 0x99, 0xe8, 0x23, 0x83, 0x50, 0xac, - 0xcf, 0x2e, 0x55, 0x26, 0x72, 0xea, 0x2f, 0x4b, 0x33, 0x08, 0x53, 0xad, 0x93, 0xab, 0xe1, 0x03, - 0xdd, 0xb7, 0x4c, 0xe0, 0x7d, 0x28, 0x9e, 0x18, 0xb4, 0x4d, 0xcf, 0xa3, 0x86, 0x58, 0x25, 0xf0, - 0xbe, 0xd0, 0x7b, 0xac, 0x25, 0xf0, 0xe4, 0x05, 0x18, 0x45, 0x98, 0xb8, 0x22, 0xe4, 0xfb, 0x63, - 0x51, 0xc0, 0x79, 0xac, 0x45, 0x91, 0xea, 0xef, 0x87, 0xb7, 0xc3, 0x0b, 0x54, 0x3f, 0xae, 0x37, - 0x8a, 0x1f, 0x91, 0xfe, 0x52, 0xff, 0x55, 0x91, 0x3f, 0x39, 0xe1, 0xef, 0x13, 0x8f, 0x42, 0x94, - 0xe1, 0x91, 0x6e, 0x61, 0x0f, 0x47, 0xba, 0x2f, 0x40, 0x69, 0x91, 0x7a, 0xeb, 0xb6, 0xef, 0xf8, - 0x85, 0x1e, 0x7a, 0x6d, 0x84, 0xc8, 0x1e, 0x7a, 0x9c, 0x86, 0x3c, 0x04, 0xe2, 0x3f, 0x3e, 0x0c, - 0x1c, 0xbf, 0xfd, 0x23, 0xe4, 0xf3, 0x89, 0x7d, 0x4a, 0x1d, 0x9f, 0x28, 0xa3, 0x4f, 0xff, 0x99, - 0xc0, 0xb1, 0x5c, 0xf2, 0xc4, 0xfa, 0x97, 0x5b, 0x93, 0x25, 0x4e, 0xa3, 0xa5, 0xb0, 0x25, 0xef, - 0xc2, 0xd0, 0xe2, 0x5c, 0x59, 0x3c, 0x44, 0xe4, 0x5e, 0x11, 0x17, 0x02, 0x29, 0xfa, 0x88, 0x40, - 0x24, 0xf8, 0xbe, 0xa7, 0xfd, 0x40, 0x4f, 0xbe, 0x43, 0x0c, 0xb9, 0x30, 0x6d, 0xe1, 0x2f, 0x85, - 0xc4, 0xe9, 0x42, 0xa0, 0x2d, 0xd1, 0xf7, 0x43, 0x71, 0x59, 0x71, 0x6c, 0x4c, 0x5b, 0x06, 0x0f, - 0x30, 0xba, 0x97, 0xe1, 0x54, 0xb9, 0xd3, 0x69, 0x99, 0xd4, 0x40, 0x7d, 0xd1, 0xba, 0x2d, 0xea, - 0x0a, 0x97, 0x1f, 0x7c, 0x7c, 0xa2, 0x73, 0x64, 0x03, 0x9f, 0xbf, 0x36, 0x9c, 0x6e, 0xd4, 0x3f, - 0x33, 0x59, 0x56, 0xfd, 0xd9, 0x3c, 0x9c, 0x9b, 0x71, 0xa8, 0xee, 0xd1, 0xc5, 0xb9, 0x72, 0xb9, - 0x8b, 0x3e, 0x72, 0xad, 0x16, 0xb5, 0xd6, 0x8e, 0x66, 0x58, 0xbf, 0x09, 0x63, 0x41, 0x03, 0xea, - 0x4d, 0xbb, 0x43, 0xe5, 0x87, 0x5c, 0x4d, 0x1f, 0xd3, 0x70, 0x19, 0x4a, 0x8b, 0x91, 0x92, 0x3b, - 0x70, 0x3a, 0x80, 0x94, 0x5b, 0x2d, 0x7b, 0x43, 0xa3, 0x5d, 0x97, 0x3b, 0xe2, 0x0e, 0x72, 0x47, - 0xdc, 0x90, 0x83, 0xce, 0xf0, 0x0d, 0x87, 0x11, 0x68, 0x69, 0xa5, 0xd4, 0x6f, 0x14, 0xe0, 0xfc, - 0x3d, 0xbd, 0x65, 0x1a, 0xa1, 0x68, 0x34, 0xea, 0x76, 0x6c, 0xcb, 0xa5, 0xc7, 0x68, 0x94, 0x46, - 0x86, 0x42, 0xf1, 0x50, 0x86, 0x42, 0xb2, 0x8b, 0xfa, 0x0f, 0xdc, 0x45, 0xa5, 0x7d, 0x75, 0xd1, - 0xff, 0x9a, 0x83, 0x09, 0xff, 0xa1, 0x81, 0xfc, 0x68, 0x5c, 0xf2, 0x82, 0xc7, 0x23, 0xc4, 0x98, - 0xdf, 0x35, 0xe2, 0x49, 0x1d, 0x06, 0x66, 0x1f, 0x77, 0x4c, 0x87, 0xba, 0xbb, 0x70, 0x1a, 0x7f, - 0x5a, 0x1c, 0x97, 0x9c, 0xa2, 0xbc, 0x48, 0xe2, 0xa4, 0x84, 0x83, 0xf1, 0xf9, 0x20, 0x7f, 0x6a, - 0x31, 0xed, 0xbf, 0x84, 0xe7, 0xcf, 0x07, 0xc5, 0x93, 0x8c, 0xc8, 0x7b, 0xd0, 0x90, 0x94, 0x3c, - 0x07, 0x85, 0x95, 0x95, 0x05, 0x31, 0x93, 0x62, 0x04, 0x02, 0xcf, 0x93, 0xdf, 0x47, 0x32, 0xac, - 0xfa, 0x4f, 0xf3, 0x00, 0x4c, 0x15, 0xf8, 0x70, 0x3d, 0x12, 0x25, 0x9c, 0x86, 0x41, 0x5f, 0xe0, - 0x42, 0x0d, 0x83, 0x57, 0x02, 0xf1, 0x8e, 0x88, 0xd7, 0x1d, 0xbc, 0x08, 0x99, 0xf4, 0x1d, 0xc9, - 0xf9, 0x3d, 0x00, 0xee, 0x6c, 0xd0, 0x91, 0xdc, 0x77, 0x1f, 0xff, 0x24, 0x0c, 0x89, 0x19, 0xcf, - 0x8e, 0x9c, 0xff, 0x37, 0x7d, 0xa0, 0x16, 0xe2, 0x63, 0x53, 0x6b, 0xe9, 0x00, 0x0b, 0xb1, 0x2f, - 0x5e, 0xde, 0x2b, 0x27, 0xe2, 0x3d, 0x64, 0xf1, 0x7e, 0x55, 0x88, 0x97, 0xbf, 0x18, 0x3a, 0xb6, - 0xe2, 0x3d, 0xb4, 0xb3, 0x6f, 0xf5, 0x1f, 0xe5, 0x80, 0xb0, 0x66, 0xd5, 0x74, 0xd7, 0xdd, 0xb0, - 0x1d, 0x83, 0x3b, 0xa7, 0x1f, 0x89, 0x60, 0x0e, 0xef, 0xbe, 0xf2, 0x77, 0x07, 0xe1, 0x74, 0xc4, - 0xf1, 0xf7, 0x98, 0x4f, 0x56, 0xd7, 0xa2, 0xa3, 0xa9, 0xd7, 0xab, 0x97, 0x8f, 0xc9, 0x17, 0xa2, - 0xfd, 0x91, 0x07, 0x6f, 0xd2, 0x4d, 0xe8, 0x8b, 0x30, 0x22, 0x7e, 0xb0, 0x15, 0xda, 0xbf, 0xe9, - 0xc2, 0x51, 0xea, 0x32, 0x80, 0x16, 0x41, 0x93, 0x57, 0x60, 0x88, 0x0d, 0x98, 0x35, 0x0c, 0x56, - 0x32, 0x10, 0xbe, 0x28, 0x31, 0x7c, 0xa0, 0xbc, 0x9e, 0x04, 0x94, 0xd2, 0xbb, 0xa5, 0xc1, 0x5d, - 0xbc, 0x5b, 0xfa, 0x12, 0x0c, 0x97, 0x2d, 0xcb, 0xf6, 0x70, 0x93, 0xee, 0x8a, 0xab, 0x89, 0x4c, - 0xab, 0xfc, 0x39, 0x7c, 0x8c, 0x1f, 0xd2, 0xa7, 0x9a, 0xe5, 0x32, 0x43, 0x72, 0xc3, 0x7f, 0x15, - 0x43, 0x1d, 0xe1, 0x55, 0x8e, 0xd7, 0x33, 0x8e, 0x80, 0x25, 0x1f, 0xc5, 0x60, 0xe7, 0x8d, 0xd6, - 0x1c, 0xbb, 0x63, 0xbb, 0xd4, 0xe0, 0x82, 0x1a, 0x0e, 0x43, 0x1b, 0x74, 0x04, 0x02, 0xdf, 0xcd, - 0x45, 0x02, 0x87, 0x44, 0x8a, 0x90, 0x07, 0x70, 0xc6, 0xbf, 0x28, 0x0e, 0x5e, 0x28, 0x56, 0x2b, - 0xae, 0x32, 0x82, 0xaf, 0x92, 0x48, 0x5c, 0x19, 0xaa, 0x95, 0xe9, 0xcb, 0xfe, 0xb5, 0x88, 0xff, - 0xc4, 0xb1, 0x61, 0x1a, 0x72, 0x57, 0xa7, 0xf2, 0x23, 0x3f, 0x08, 0xc3, 0x8b, 0xfa, 0xe3, 0x4a, - 0x57, 0x9c, 0xbd, 0x8c, 0xee, 0xfe, 0xf6, 0xa5, 0xad, 0x3f, 0x6e, 0x18, 0xa2, 0x5c, 0xcc, 0xa6, - 0x90, 0x59, 0x92, 0x06, 0x9c, 0xab, 0x39, 0x76, 0xdb, 0xf6, 0xa8, 0x11, 0x7b, 0xec, 0x37, 0x1e, - 0xbe, 0x0e, 0xee, 0x08, 0x8a, 0x46, 0x8f, 0x57, 0x7f, 0x19, 0x6c, 0x48, 0x1b, 0xc6, 0xcb, 0xae, - 0xdb, 0x6d, 0xd3, 0xf0, 0x86, 0x6a, 0x62, 0xc7, 0xcf, 0xf8, 0x84, 0xf0, 0x5a, 0x7e, 0x4a, 0xc7, - 0xa2, 0xfc, 0x82, 0xaa, 0xe1, 0x99, 0x72, 0x8d, 0xf8, 0x2d, 0x71, 0xde, 0xb7, 0x8b, 0x83, 0x63, - 0x13, 0xe3, 0xda, 0xf9, 0x64, 0x63, 0x56, 0x4c, 0xaf, 0x45, 0xd5, 0x6f, 0xe7, 0x00, 0x42, 0x01, - 0x93, 0x17, 0xa3, 0x11, 0x91, 0x72, 0xe1, 0x45, 0x87, 0x88, 0x96, 0x10, 0x09, 0x81, 0x44, 0x2e, - 0x41, 0x11, 0x23, 0x6a, 0xe4, 0xc3, 0x83, 0xd5, 0x87, 0xa6, 0x65, 0x68, 0x08, 0x65, 0x58, 0xe9, - 0xe9, 0x3b, 0x62, 0xf1, 0x52, 0x9f, 0x5b, 0x85, 0x15, 0x18, 0xaf, 0x77, 0x57, 0xfd, 0xba, 0xa5, - 0x77, 0x7c, 0x18, 0xd8, 0xc3, 0xed, 0xae, 0x06, 0x8f, 0x5f, 0x23, 0x61, 0x53, 0xa2, 0x45, 0xd4, - 0x6f, 0xe6, 0x62, 0xb3, 0xe0, 0x11, 0x2e, 0x7a, 0x1f, 0x4b, 0xfa, 0x69, 0x24, 0xa7, 0x25, 0xf5, - 0xaf, 0xe4, 0x61, 0xb8, 0x66, 0x3b, 0x9e, 0x08, 0x51, 0x72, 0xbc, 0x57, 0x21, 0x69, 0xaf, 0x54, - 0xdc, 0xc3, 0x5e, 0xe9, 0x12, 0x14, 0x25, 0x17, 0x65, 0x7e, 0x2f, 0x62, 0x18, 0x8e, 0x86, 0x50, - 0xf5, 0x87, 0xf3, 0x00, 0x9f, 0x7b, 0xe9, 0xa5, 0x27, 0x58, 0x40, 0xea, 0x5f, 0xca, 0xc1, 0xb8, - 0xb8, 0xa8, 0x93, 0x62, 0x8b, 0x0d, 0xf8, 0x57, 0xac, 0xf2, 0xb8, 0xe4, 0x20, 0xcd, 0xc7, 0xb1, - 0x25, 0x60, 0xf6, 0xb1, 0xe9, 0xe1, 0x5d, 0x85, 0x14, 0x5c, 0x8c, 0x0a, 0x98, 0xbc, 0x04, 0xf8, - 0x74, 0xe4, 0x45, 0xff, 0x0a, 0xb2, 0x10, 0xae, 0x7b, 0xac, 0xc0, 0x6c, 0xea, 0x35, 0xa4, 0xfa, - 0xeb, 0x45, 0x28, 0xce, 0x3e, 0xa6, 0xcd, 0x63, 0xde, 0x35, 0xd2, 0xc1, 0x66, 0xf1, 0x80, 0x07, - 0x9b, 0xfb, 0xf1, 0xa9, 0x78, 0x27, 0xec, 0xcf, 0x52, 0xb4, 0xfa, 0x58, 0xcf, 0xc7, 0xab, 0xf7, - 0x7b, 0xfa, 0xf8, 0xb9, 0xe4, 0xfc, 0x17, 0x05, 0x28, 0xd4, 0x67, 0x6a, 0x27, 0x7a, 0x73, 0xa4, - 0x7a, 0xd3, 0xfb, 0xce, 0x5a, 0x0d, 0xae, 0xa1, 0x06, 0x43, 0x2f, 0xd1, 0xd8, 0x8d, 0xd3, 0x9f, - 0x14, 0x60, 0xac, 0x3e, 0xb7, 0x52, 0x93, 0x4e, 0x82, 0xef, 0x70, 0x4f, 0x3e, 0xf4, 0x29, 0xe3, - 0x5d, 0x7a, 0x29, 0x61, 0xcf, 0xdc, 0xad, 0x5a, 0xde, 0xab, 0x37, 0xef, 0xe9, 0xad, 0x2e, 0xc5, - 0xa3, 0x17, 0xee, 0xf7, 0xeb, 0x9a, 0x1f, 0xd0, 0x6f, 0x60, 0xa0, 0x01, 0x9f, 0x01, 0x79, 0x13, - 0x0a, 0x77, 0x85, 0x47, 0x46, 0x16, 0x9f, 0x97, 0x6f, 0x70, 0x3e, 0x6c, 0x12, 0x2c, 0x74, 0x4d, - 0x03, 0x39, 0xb0, 0x52, 0xac, 0xf0, 0x2d, 0xb1, 0x00, 0xef, 0xaa, 0xf0, 0x9a, 0x5f, 0xf8, 0x56, - 0xb5, 0x42, 0xea, 0x30, 0x5c, 0xa3, 0x4e, 0xdb, 0xc4, 0x8e, 0xf2, 0xe7, 0xec, 0xde, 0x4c, 0xd8, - 0x4e, 0x65, 0xb8, 0x13, 0x16, 0x42, 0x66, 0x32, 0x17, 0xf2, 0x1e, 0x00, 0xb7, 0x51, 0x76, 0x19, - 0xaf, 0xf2, 0x69, 0xb4, 0xfb, 0xb9, 0x69, 0x99, 0x62, 0xe3, 0x49, 0xcc, 0xc8, 0x43, 0x98, 0x58, - 0xb4, 0x0d, 0xf3, 0x81, 0xc9, 0x5d, 0x2f, 0xb1, 0x82, 0xd2, 0xce, 0x0e, 0x4f, 0xcc, 0x94, 0x6c, - 0x4b, 0xe5, 0xd2, 0xaa, 0x49, 0x30, 0x56, 0xff, 0x6e, 0x3f, 0x14, 0x59, 0xb7, 0x9f, 0x8c, 0xdf, - 0x83, 0x8c, 0xdf, 0x32, 0x4c, 0xdc, 0xb7, 0x9d, 0x87, 0xa6, 0xb5, 0x16, 0x78, 0xc5, 0x8b, 0xbd, - 0x29, 0x7a, 0xf2, 0x6c, 0x70, 0x5c, 0x23, 0x70, 0xa0, 0xd7, 0x12, 0xe4, 0x3b, 0x8c, 0xe0, 0xd7, - 0x01, 0xf8, 0x5b, 0x77, 0xa4, 0x19, 0x0c, 0x83, 0x63, 0xf0, 0x97, 0xf0, 0xe8, 0x68, 0x2f, 0x07, - 0xc7, 0x08, 0x89, 0xd9, 0x26, 0x9c, 0xfb, 0x42, 0x0c, 0xa1, 0xdf, 0x3d, 0x6e, 0xc2, 0xd1, 0x17, - 0x42, 0x36, 0x02, 0xb8, 0x57, 0x44, 0x0d, 0x40, 0xba, 0x5f, 0x82, 0x98, 0x20, 0x22, 0x93, 0x83, - 0x08, 0x47, 0x97, 0x72, 0xbd, 0xa4, 0x49, 0x3c, 0xc8, 0xab, 0xb1, 0x0b, 0x70, 0x12, 0xe1, 0x96, - 0x79, 0xff, 0x1d, 0x3a, 0x50, 0x8d, 0xec, 0xe4, 0x40, 0xa5, 0xfe, 0xad, 0x02, 0x0c, 0x33, 0x6e, - 0xf5, 0x6e, 0xbb, 0xad, 0x3b, 0x9b, 0x27, 0x8a, 0x7c, 0x10, 0x45, 0x6e, 0xc0, 0x29, 0xd9, 0x61, - 0x9e, 0x99, 0xae, 0x7e, 0x68, 0xa3, 0xe0, 0xf8, 0x27, 0x4e, 0xc0, 0x6d, 0x4b, 0x9c, 0xf7, 0x3d, - 0x01, 0xc6, 0xb3, 0x05, 0x57, 0x4b, 0xf2, 0x52, 0x7f, 0x26, 0x07, 0x13, 0x71, 0x68, 0xa0, 0xfb, - 0xb9, 0x54, 0xdd, 0x7f, 0x01, 0x86, 0xc4, 0x15, 0xba, 0x6e, 0x08, 0x8f, 0xbe, 0xb1, 0xed, 0xad, - 0x49, 0xc0, 0xf7, 0xcb, 0x0d, 0x87, 0xea, 0x86, 0x16, 0x12, 0x90, 0x57, 0x60, 0x04, 0x7f, 0xdc, - 0x77, 0x4c, 0xcf, 0xa3, 0xbc, 0x33, 0x8a, 0xfc, 0x56, 0x80, 0x17, 0xd8, 0xe0, 0x08, 0x2d, 0x42, - 0xa6, 0xfe, 0x5e, 0x1e, 0x86, 0xea, 0xdd, 0x55, 0x77, 0xd3, 0xf5, 0x68, 0xfb, 0x98, 0xeb, 0x90, - 0xbf, 0x49, 0x2f, 0xa6, 0x6e, 0xd2, 0x9f, 0xf3, 0x87, 0x96, 0x74, 0x7a, 0x1d, 0x6c, 0x0c, 0x7c, - 0xaf, 0xc4, 0x50, 0x8b, 0x4a, 0x7b, 0xd7, 0x22, 0xf5, 0xef, 0xe4, 0x61, 0x82, 0x5f, 0xde, 0x56, - 0x4c, 0xb7, 0x79, 0x08, 0x0f, 0x4a, 0x8e, 0x5e, 0xa6, 0x07, 0x73, 0x78, 0xd8, 0xc5, 0x33, 0x1d, - 0xf5, 0xcb, 0x79, 0x18, 0x2e, 0x77, 0xbd, 0xf5, 0xb2, 0x87, 0xf3, 0xdb, 0x13, 0xb9, 0x47, 0xfe, - 0x07, 0x39, 0x18, 0x67, 0x0d, 0x59, 0xb1, 0x1f, 0x52, 0xeb, 0x10, 0x0e, 0xbf, 0xe5, 0x43, 0xec, - 0xfc, 0x3e, 0x0f, 0xb1, 0x7d, 0x59, 0x16, 0xf6, 0x26, 0x4b, 0xbc, 0xb2, 0xd1, 0xec, 0x16, 0x3d, - 0xde, 0x9f, 0x71, 0x88, 0x57, 0x36, 0xbe, 0x40, 0x0e, 0xe1, 0x8a, 0xf0, 0xfb, 0x4b, 0x20, 0x87, - 0x70, 0xbe, 0xf9, 0xfd, 0x21, 0x90, 0xdf, 0xcd, 0xc1, 0xd0, 0xb4, 0xed, 0x1d, 0xf3, 0x81, 0x2f, - 0xbe, 0xe2, 0x78, 0xab, 0xb9, 0xff, 0x15, 0xc7, 0x5b, 0x37, 0xd5, 0x9f, 0xcf, 0xc3, 0x19, 0x11, + 0xa0, 0xf8, 0x0d, 0xfd, 0xc8, 0x5f, 0xdd, 0xde, 0x9a, 0x7c, 0x4a, 0xe2, 0x6f, 0xd9, 0x06, 0x8d, + 0x37, 0x3f, 0xa5, 0xb4, 0xfa, 0x1b, 0x05, 0x78, 0xaa, 0x5e, 0x5e, 0x5c, 0xa8, 0x1a, 0xbe, 0x49, + 0x53, 0x73, 0xec, 0x87, 0xa6, 0x21, 0x8d, 0xde, 0x55, 0x38, 0x1f, 0x43, 0xcd, 0xa2, 0x15, 0x15, + 0x18, 0xd3, 0xf8, 0x6d, 0xbe, 0xb9, 0xd4, 0x11, 0x34, 0x0d, 0x6e, 0x6a, 0x45, 0x17, 0xed, 0x2c, + 0x46, 0xac, 0x8f, 0x62, 0xa8, 0xfa, 0xba, 0xed, 0x78, 0xcd, 0xae, 0x27, 0x94, 0x00, 0xfb, 0x28, + 0x51, 0x87, 0x2b, 0x88, 0x7a, 0x54, 0xe1, 0xf3, 0x21, 0x3f, 0x9e, 0x83, 0x89, 0xb2, 0xe7, 0x39, + 0xe6, 0x6a, 0xd7, 0xa3, 0x8b, 0x7a, 0xa7, 0x63, 0x5a, 0x6b, 0x38, 0xd6, 0x87, 0xaf, 0xbf, 0x19, + 0xac, 0x91, 0x3d, 0x25, 0x31, 0x15, 0x2f, 0x2e, 0x0d, 0x51, 0xdd, 0x47, 0x35, 0xda, 0x1c, 0x27, + 0x0f, 0xd1, 0x78, 0x39, 0x36, 0x44, 0x53, 0x79, 0xed, 0x69, 0x88, 0x7e, 0xa3, 0x00, 0x97, 0x96, + 0x1f, 0x78, 0xba, 0x46, 0x5d, 0xbb, 0xeb, 0x34, 0xa9, 0x7b, 0xa7, 0x63, 0xe8, 0x1e, 0x0d, 0x47, + 0xea, 0x24, 0xf4, 0x97, 0x0d, 0x83, 0x1a, 0xc8, 0xae, 0x9f, 0x6f, 0xfb, 0x74, 0x06, 0xd0, 0x38, + 0x9c, 0x7c, 0x1c, 0x06, 0x44, 0x19, 0xe4, 0xde, 0x3f, 0x3d, 0xbc, 0xbd, 0x35, 0x39, 0xd0, 0xe5, + 0x20, 0xcd, 0xc7, 0x31, 0xb2, 0x0a, 0x6d, 0x51, 0x46, 0x56, 0x08, 0xc9, 0x0c, 0x0e, 0xd2, 0x7c, + 0x1c, 0x79, 0x07, 0xc6, 0x90, 0x6d, 0xd0, 0x1e, 0x31, 0xf7, 0x9d, 0xf1, 0xa5, 0x2b, 0x37, 0x96, + 0x2f, 0x4d, 0xd8, 0x9a, 0x86, 0xe3, 0x17, 0xd0, 0x62, 0x0c, 0xc8, 0x3d, 0x98, 0x10, 0x8d, 0x08, + 0x99, 0xf6, 0xf7, 0x60, 0x7a, 0x76, 0x7b, 0x6b, 0xf2, 0x94, 0x68, 0xbf, 0xc4, 0x36, 0xc1, 0x84, + 0x31, 0x16, 0xcd, 0x0e, 0x19, 0x97, 0x76, 0x62, 0x2c, 0xbe, 0x58, 0x66, 0x1c, 0x67, 0xa2, 0xbe, + 0x0b, 0x23, 0x72, 0x41, 0x72, 0x0e, 0xb7, 0xd6, 0x7c, 0x9c, 0xe0, 0xa6, 0xdc, 0x34, 0x70, 0x3f, + 0xfd, 0x22, 0x0c, 0x57, 0xa8, 0xdb, 0x74, 0xcc, 0x0e, 0xb3, 0x1a, 0x84, 0x92, 0x8f, 0x6f, 0x6f, + 0x4d, 0x0e, 0x1b, 0x21, 0x58, 0x93, 0x69, 0xd4, 0xff, 0x2b, 0x07, 0xe7, 0x18, 0xef, 0xb2, 0xeb, + 0x9a, 0x6b, 0x56, 0x5b, 0x5e, 0xb6, 0x9f, 0x87, 0x52, 0x1d, 0xeb, 0x13, 0x35, 0x9d, 0xd9, 0xde, + 0x9a, 0x9c, 0xe0, 0x2d, 0x90, 0xf4, 0x50, 0xd0, 0x04, 0xfb, 0xca, 0xfc, 0x0e, 0xfb, 0x4a, 0x66, + 0xd2, 0x7a, 0xba, 0xe3, 0x99, 0xd6, 0x5a, 0xdd, 0xd3, 0xbd, 0xae, 0x1b, 0x31, 0x69, 0x05, 0xa6, + 0xe1, 0x22, 0x2a, 0x62, 0xd2, 0x46, 0x0a, 0x91, 0xb7, 0x61, 0x64, 0xd6, 0x32, 0x42, 0x26, 0x7c, + 0x42, 0x7c, 0x82, 0x59, 0x9a, 0x14, 0xe1, 0x49, 0x16, 0x91, 0x02, 0xea, 0xdf, 0xcd, 0x81, 0xc2, + 0x37, 0x81, 0x0b, 0xa6, 0xeb, 0x2d, 0xd2, 0xf6, 0xaa, 0x34, 0x3b, 0xcd, 0xf9, 0xbb, 0x4a, 0x86, + 0x93, 0xd6, 0x22, 0x34, 0x05, 0xc4, 0xae, 0xb2, 0x65, 0xba, 0x89, 0xed, 0x47, 0xac, 0x14, 0xa9, + 0xc2, 0x00, 0xe7, 0xcc, 0x6d, 0x89, 0xe1, 0xeb, 0x8a, 0xaf, 0x08, 0xf1, 0xaa, 0xb9, 0x32, 0xb4, + 0x39, 0xb1, 0xbc, 0xa1, 0x11, 0xe5, 0xd5, 0x6f, 0x16, 0x60, 0x22, 0x5e, 0x88, 0xdc, 0x83, 0xc1, + 0x5b, 0xb6, 0x69, 0x51, 0x63, 0xd9, 0xc2, 0x16, 0xf6, 0x3e, 0x1c, 0xf1, 0x6d, 0xf1, 0xd3, 0xef, + 0x61, 0x99, 0x86, 0x6c, 0xc1, 0xe2, 0x59, 0x49, 0xc0, 0x8c, 0x7c, 0x1e, 0x86, 0x98, 0x0d, 0xf8, + 0x10, 0x39, 0xe7, 0x77, 0xe4, 0xfc, 0xb4, 0xe0, 0x7c, 0xc6, 0xe1, 0x85, 0x92, 0xac, 0x43, 0x76, + 0x4c, 0xaf, 0x34, 0xaa, 0xbb, 0xb6, 0x25, 0x7a, 0x1e, 0xf5, 0xca, 0x41, 0x88, 0xac, 0x57, 0x9c, + 0x86, 0x99, 0xae, 0xfc, 0x63, 0xb1, 0x1b, 0xa4, 0xbd, 0x0b, 0x97, 0x55, 0xbc, 0x07, 0x24, 0x62, + 0x62, 0xc1, 0xb8, 0x10, 0xe8, 0xba, 0xd9, 0x41, 0xab, 0x1f, 0xd7, 0xb5, 0xb1, 0xeb, 0x97, 0xa7, + 0xfc, 0x43, 0xb1, 0x29, 0xe9, 0x48, 0xed, 0xe1, 0x8b, 0x53, 0x8b, 0x01, 0x39, 0xee, 0x4c, 0x51, + 0x27, 0x63, 0x2c, 0xe4, 0xde, 0x6e, 0x47, 0xc8, 0xd5, 0x1f, 0xcd, 0xc3, 0x0b, 0x61, 0x17, 0x69, + 0xf4, 0xa1, 0x49, 0x37, 0x42, 0x8e, 0x62, 0x8f, 0xcc, 0x86, 0x98, 0x3b, 0xb3, 0xae, 0x5b, 0x6b, + 0xd4, 0x20, 0x57, 0xa1, 0x5f, 0xb3, 0x5b, 0xd4, 0x55, 0x72, 0x68, 0x1e, 0xe2, 0xf4, 0xe5, 0x30, + 0x80, 0x7c, 0xc8, 0x82, 0x14, 0xc4, 0x86, 0xd2, 0x8a, 0xa3, 0x9b, 0x9e, 0xaf, 0x49, 0xe5, 0xa4, + 0x26, 0xed, 0xa2, 0xc6, 0x29, 0xce, 0x83, 0xaf, 0x31, 0x28, 0x78, 0x0f, 0x01, 0xb2, 0xe0, 0x39, + 0xc9, 0xc5, 0xd7, 0x60, 0x58, 0x22, 0xde, 0xd3, 0x22, 0xf2, 0xed, 0xa2, 0x3c, 0xb6, 0xfc, 0x66, + 0x89, 0xb1, 0x75, 0x8d, 0x8d, 0x09, 0xd7, 0x65, 0x56, 0x0c, 0x1f, 0x54, 0x42, 0xf3, 0x11, 0x14, + 0xd5, 0x7c, 0x04, 0x91, 0x97, 0x60, 0x90, 0xb3, 0x08, 0xf6, 0xcb, 0xb8, 0xd7, 0x76, 0x10, 0x16, + 0x35, 0x05, 0x02, 0x42, 0xf2, 0x8b, 0x39, 0x78, 0xb2, 0xa7, 0x24, 0x50, 0xf9, 0x86, 0xaf, 0xbf, + 0xbc, 0x2f, 0x31, 0x4e, 0xbf, 0xb0, 0xbd, 0x35, 0x79, 0x55, 0xd2, 0x0c, 0x47, 0xa2, 0x69, 0x34, + 0x39, 0x91, 0xd4, 0xae, 0xde, 0x4d, 0x61, 0xc6, 0x2a, 0xaf, 0x74, 0x0e, 0x8f, 0xaa, 0xac, 0xe6, + 0xa6, 0xdf, 0xc8, 0x62, 0x68, 0xac, 0x8a, 0xef, 0xbd, 0xef, 0x93, 0xa4, 0x54, 0x93, 0xc1, 0x85, + 0x34, 0xe1, 0x3c, 0xc7, 0x54, 0xf4, 0xcd, 0xe5, 0xfb, 0x8b, 0xb6, 0xe5, 0xad, 0xfb, 0x15, 0xf4, + 0xcb, 0x67, 0x3d, 0x58, 0x81, 0xa1, 0x6f, 0x36, 0xec, 0xfb, 0x8d, 0x36, 0xa3, 0x4a, 0xa9, 0x23, + 0x8b, 0x13, 0x9b, 0xd8, 0xc5, 0x18, 0xf7, 0xa7, 0xbc, 0x52, 0x78, 0x12, 0xe7, 0xcf, 0x0b, 0xc9, + 0x09, 0x2e, 0x56, 0x48, 0xad, 0xc2, 0xc8, 0x82, 0xdd, 0x7c, 0x10, 0xa8, 0xcb, 0x6b, 0x50, 0x5a, + 0xd1, 0x9d, 0x35, 0xea, 0xa1, 0x2c, 0x86, 0xaf, 0x9f, 0x9a, 0xe2, 0xa7, 0xdb, 0x8c, 0x88, 0x23, + 0xa6, 0xc7, 0xc4, 0xec, 0x53, 0xf2, 0xf0, 0xb7, 0x26, 0x0a, 0xa8, 0xdf, 0xeb, 0x87, 0x11, 0x71, + 0x12, 0x8b, 0xab, 0x07, 0x79, 0x3d, 0x3c, 0xdb, 0x16, 0xd3, 0x65, 0x70, 0x1a, 0x15, 0x9c, 0xa2, + 0x8d, 0x30, 0x66, 0x7f, 0xb4, 0x35, 0x99, 0xdb, 0xde, 0x9a, 0xec, 0xd3, 0x06, 0xa5, 0x4d, 0x6c, + 0xb8, 0xbe, 0x49, 0x0b, 0xba, 0x7c, 0xb6, 0x1a, 0x2b, 0xcb, 0xd7, 0xbb, 0xb7, 0x61, 0x40, 0xb4, + 0x41, 0x68, 0xdc, 0xf9, 0xf0, 0xec, 0x24, 0x72, 0xa2, 0x1c, 0x2b, 0xed, 0x97, 0x22, 0x6f, 0x42, + 0x89, 0x9f, 0x25, 0x08, 0x01, 0x9c, 0x4b, 0x3f, 0x7b, 0x89, 0x15, 0x17, 0x65, 0xc8, 0x3c, 0x40, + 0x78, 0x8e, 0x10, 0x1c, 0xa0, 0x0b, 0x0e, 0xc9, 0x13, 0x86, 0x18, 0x17, 0xa9, 0x2c, 0x79, 0x05, + 0x46, 0x56, 0xa8, 0xd3, 0x36, 0x2d, 0xbd, 0x55, 0x37, 0xdf, 0xf7, 0xcf, 0xd0, 0x71, 0xa1, 0x77, + 0xcd, 0xf7, 0xe5, 0x91, 0x1b, 0xa1, 0x23, 0x5f, 0x4c, 0xdb, 0xa7, 0x0f, 0x60, 0x43, 0x9e, 0xd9, + 0x71, 0x03, 0x1b, 0x6b, 0x4f, 0xca, 0xb6, 0xfd, 0x1d, 0x18, 0x8d, 0x6c, 0xd1, 0xc4, 0x21, 0xe9, + 0x93, 0x49, 0xd6, 0xd2, 0x7e, 0x33, 0xc6, 0x36, 0xca, 0x81, 0x69, 0x72, 0xd5, 0x32, 0x3d, 0x53, + 0x6f, 0xcd, 0xd8, 0xed, 0xb6, 0x6e, 0x19, 0xca, 0x50, 0xa8, 0xc9, 0x26, 0xc7, 0x34, 0x9a, 0x1c, + 0x25, 0x6b, 0x72, 0xb4, 0x10, 0xb9, 0x0d, 0x13, 0xa2, 0x0f, 0x35, 0xda, 0xb4, 0x1d, 0x66, 0x7b, + 0xe0, 0x19, 0xa8, 0x38, 0x06, 0x70, 0x39, 0xae, 0xe1, 0xf8, 0x48, 0xd9, 0xb8, 0x8f, 0x17, 0xbc, + 0x55, 0x1c, 0x1c, 0x9e, 0x18, 0x89, 0x1f, 0x5b, 0xab, 0x7f, 0xbb, 0x00, 0xc3, 0x82, 0x94, 0x2d, + 0xdd, 0x27, 0x0a, 0x7e, 0x10, 0x05, 0x4f, 0x55, 0xd4, 0xd2, 0x61, 0x29, 0xaa, 0xfa, 0xd5, 0x7c, + 0x30, 0x1b, 0xd5, 0x1c, 0xd3, 0x3a, 0xd8, 0x6c, 0x74, 0x19, 0x60, 0x66, 0xbd, 0x6b, 0x3d, 0xe0, + 0xd7, 0x73, 0xf9, 0xf0, 0x7a, 0xae, 0x69, 0x6a, 0x12, 0x86, 0x3c, 0x09, 0xc5, 0x0a, 0xe3, 0xcf, + 0x7a, 0x66, 0x64, 0x7a, 0xe8, 0xbb, 0x9c, 0x53, 0xee, 0x05, 0x0d, 0xc1, 0x6c, 0x33, 0x37, 0xbd, + 0xe9, 0x51, 0x6e, 0x3e, 0x17, 0xf8, 0x66, 0x6e, 0x95, 0x01, 0x34, 0x0e, 0x27, 0x37, 0xe0, 0x54, + 0x85, 0xb6, 0xf4, 0xcd, 0x45, 0xb3, 0xd5, 0x32, 0x5d, 0xda, 0xb4, 0x2d, 0xc3, 0x45, 0x21, 0x8b, + 0xea, 0xda, 0xae, 0x96, 0x24, 0x20, 0x2a, 0x94, 0x96, 0xef, 0xdf, 0x77, 0xa9, 0x87, 0xe2, 0x2b, + 0x4c, 0x03, 0x9b, 0x9c, 0x6d, 0x84, 0x68, 0x02, 0xa3, 0x7e, 0x2b, 0xc7, 0x76, 0x4b, 0xee, 0x03, + 0xcf, 0xee, 0x04, 0x5a, 0x7e, 0x20, 0x91, 0x5c, 0x0d, 0xed, 0x8a, 0x3c, 0x7e, 0xed, 0xb8, 0xf8, + 0xda, 0x01, 0x61, 0x5b, 0x84, 0x16, 0x45, 0xea, 0x57, 0x15, 0x76, 0xf8, 0x2a, 0xf5, 0x4f, 0xf2, + 0x70, 0x5e, 0xb4, 0x78, 0xa6, 0x65, 0x76, 0x56, 0x6d, 0xdd, 0x31, 0x34, 0xda, 0xa4, 0xe6, 0x43, + 0x7a, 0x3c, 0x07, 0x5e, 0x74, 0xe8, 0x14, 0x0f, 0x30, 0x74, 0xae, 0xe3, 0xc6, 0x93, 0x49, 0x06, + 0x0f, 0x98, 0xb9, 0x51, 0x31, 0xb1, 0xbd, 0x35, 0x39, 0x62, 0x70, 0x30, 0x5e, 0x31, 0x68, 0x32, + 0x11, 0x53, 0x92, 0x05, 0x6a, 0xad, 0x79, 0xeb, 0xa8, 0x24, 0xfd, 0x5c, 0x49, 0x5a, 0x08, 0xd1, + 0x04, 0x46, 0xfd, 0xdf, 0xf2, 0x70, 0x26, 0x2e, 0xf2, 0x3a, 0xb5, 0x8c, 0x13, 0x79, 0x7f, 0x30, + 0xf2, 0xfe, 0xd3, 0x02, 0x3c, 0x21, 0xca, 0xd4, 0xd7, 0x75, 0x87, 0x1a, 0x15, 0xd3, 0xa1, 0x4d, + 0xcf, 0x76, 0x36, 0x8f, 0xb1, 0x01, 0x75, 0x78, 0x62, 0xbf, 0x01, 0x25, 0x71, 0xdc, 0xc0, 0xd7, + 0x99, 0xb1, 0xa0, 0x25, 0x08, 0x4d, 0xac, 0x50, 0xfc, 0xa8, 0x22, 0xd6, 0x59, 0xa5, 0xdd, 0x74, + 0xd6, 0xa7, 0x61, 0x34, 0x10, 0x3d, 0x6e, 0x7c, 0x07, 0x42, 0x6b, 0xcb, 0xf0, 0x11, 0xb8, 0xf7, + 0xd5, 0xa2, 0x84, 0x58, 0x9b, 0x0f, 0xa8, 0x56, 0xd0, 0x1a, 0x1a, 0x15, 0xb5, 0x05, 0xe5, 0x4c, + 0x43, 0x93, 0x89, 0xd4, 0xad, 0x22, 0x5c, 0x4c, 0xef, 0x76, 0x8d, 0xea, 0xc6, 0x49, 0xaf, 0x7f, + 0x24, 0x7b, 0x9d, 0x3c, 0x03, 0xc5, 0x9a, 0xee, 0xad, 0x8b, 0xeb, 0x7e, 0xbc, 0x83, 0xbe, 0x6f, + 0xb6, 0x68, 0xa3, 0xa3, 0x7b, 0xeb, 0x1a, 0xa2, 0xa4, 0x39, 0x03, 0x90, 0x63, 0xca, 0x9c, 0x21, + 0x2d, 0xf6, 0xc3, 0x4f, 0xe7, 0xae, 0x14, 0x53, 0x17, 0xfb, 0xef, 0x15, 0xb3, 0xe6, 0x95, 0x7b, + 0x8e, 0xe9, 0xd1, 0x13, 0x0d, 0x3b, 0xd1, 0xb0, 0x03, 0x6a, 0xd8, 0x3f, 0xca, 0xc3, 0x68, 0xb0, + 0x69, 0x7a, 0x8f, 0x36, 0x8f, 0x66, 0xad, 0x0a, 0xb7, 0x32, 0x85, 0x03, 0x6f, 0x65, 0x0e, 0xa2, + 0x50, 0x6a, 0x70, 0xc4, 0xca, 0x4d, 0x03, 0x94, 0x18, 0x3f, 0x62, 0x0d, 0x0e, 0x56, 0x9f, 0x81, + 0x81, 0x45, 0xfd, 0x91, 0xd9, 0xee, 0xb6, 0x85, 0x95, 0x8e, 0xee, 0x6b, 0x6d, 0xfd, 0x91, 0xe6, + 0xc3, 0xd5, 0xff, 0x36, 0x07, 0x63, 0x42, 0xa8, 0x82, 0xf9, 0x81, 0xa4, 0x1a, 0x4a, 0x27, 0x7f, + 0x60, 0xe9, 0x14, 0xf6, 0x2f, 0x1d, 0xf5, 0xaf, 0x16, 0x40, 0x99, 0x33, 0x5b, 0x74, 0xc5, 0xd1, + 0x2d, 0xf7, 0x3e, 0x75, 0xc4, 0x76, 0x7a, 0x96, 0xb1, 0x3a, 0xd0, 0x07, 0x4a, 0x53, 0x4a, 0x7e, + 0x5f, 0x53, 0xca, 0x27, 0x61, 0x48, 0x34, 0x26, 0x70, 0x9d, 0xc4, 0x51, 0xe3, 0xf8, 0x40, 0x2d, + 0xc4, 0x33, 0xe2, 0x72, 0xa7, 0xe3, 0xd8, 0x0f, 0xa9, 0xc3, 0x6f, 0xc5, 0x04, 0xb1, 0xee, 0x03, + 0xb5, 0x10, 0x2f, 0x71, 0xa6, 0xbe, 0xbd, 0x28, 0x73, 0xa6, 0x8e, 0x16, 0xe2, 0xc9, 0x15, 0x18, + 0x5c, 0xb0, 0x9b, 0x3a, 0x0a, 0x9a, 0x4f, 0x2b, 0x23, 0xdb, 0x5b, 0x93, 0x83, 0x2d, 0x01, 0xd3, + 0x02, 0x2c, 0xa3, 0xac, 0xd8, 0x1b, 0x56, 0xcb, 0xd6, 0xb9, 0xb3, 0xcd, 0x20, 0xa7, 0x34, 0x04, + 0x4c, 0x0b, 0xb0, 0x8c, 0x92, 0xc9, 0x1c, 0x9d, 0x98, 0x06, 0x43, 0x9e, 0xf7, 0x05, 0x4c, 0x0b, + 0xb0, 0xea, 0xb7, 0x8a, 0x4c, 0x7b, 0x5d, 0xf3, 0xfd, 0xc7, 0x7e, 0x5d, 0x08, 0x07, 0x4c, 0xff, + 0x3e, 0x06, 0xcc, 0x63, 0x73, 0x60, 0xa7, 0xfe, 0x8b, 0x01, 0x00, 0x21, 0xfd, 0xd9, 0x93, 0xcd, + 0xe1, 0xc1, 0xb4, 0xa6, 0x02, 0xa7, 0x66, 0xad, 0x75, 0xdd, 0x6a, 0x52, 0x23, 0x3c, 0xb6, 0x2c, + 0xe1, 0xd0, 0x46, 0xa7, 0x4b, 0x2a, 0x90, 0xe1, 0xb9, 0xa5, 0x96, 0x2c, 0x40, 0x5e, 0x84, 0xe1, + 0xaa, 0xe5, 0x51, 0x47, 0x6f, 0x7a, 0xe6, 0x43, 0x2a, 0xa6, 0x06, 0xbc, 0x89, 0x36, 0x43, 0xb0, + 0x26, 0xd3, 0x90, 0x1b, 0x30, 0x52, 0xd3, 0x1d, 0xcf, 0x6c, 0x9a, 0x1d, 0xdd, 0xf2, 0x5c, 0x65, + 0x10, 0x67, 0x34, 0xb4, 0x30, 0x3a, 0x12, 0x5c, 0x8b, 0x50, 0x91, 0x2f, 0xc2, 0x10, 0x6e, 0x4d, + 0xd1, 0x3f, 0x7c, 0x68, 0xc7, 0x8b, 0xca, 0x67, 0x43, 0x77, 0x44, 0x7e, 0xfa, 0x8a, 0x37, 0xce, + 0xf1, 0xbb, 0xca, 0x80, 0x23, 0xf9, 0x1c, 0x0c, 0xcc, 0x5a, 0x06, 0x32, 0x87, 0x1d, 0x99, 0xab, + 0x82, 0xf9, 0xb9, 0x90, 0xb9, 0xdd, 0x89, 0xf1, 0xf6, 0xd9, 0xa5, 0x8f, 0xb2, 0xe1, 0x0f, 0x6e, + 0x94, 0x8d, 0x7c, 0x00, 0xc7, 0xe2, 0xa3, 0x87, 0x75, 0x2c, 0x3e, 0xb6, 0xcf, 0x63, 0x71, 0xf5, + 0x7d, 0x18, 0x9e, 0xae, 0xcd, 0x05, 0xa3, 0xf7, 0x02, 0x14, 0x6a, 0xc2, 0x33, 0xa2, 0xc8, 0xed, + 0x99, 0x8e, 0x69, 0x68, 0x0c, 0x46, 0xae, 0xc2, 0xe0, 0x0c, 0xba, 0xdb, 0x89, 0x5b, 0xc4, 0x22, + 0x5f, 0xff, 0x9a, 0x08, 0x43, 0xaf, 0x5b, 0x1f, 0x4d, 0x3e, 0x0e, 0x03, 0x35, 0xc7, 0x5e, 0x73, + 0xf4, 0xb6, 0x58, 0x83, 0xd1, 0x35, 0xa5, 0xc3, 0x41, 0x9a, 0x8f, 0x53, 0x7f, 0x2a, 0xe7, 0x9b, + 0xed, 0xac, 0x44, 0xbd, 0x8b, 0x47, 0xf3, 0x58, 0xf7, 0x20, 0x2f, 0xe1, 0x72, 0x90, 0xe6, 0xe3, + 0xc8, 0x55, 0xe8, 0x9f, 0x75, 0x1c, 0xdb, 0x91, 0x7d, 0xea, 0x29, 0x03, 0xc8, 0xd7, 0xbd, 0x48, + 0x41, 0x5e, 0x85, 0x61, 0x3e, 0xe7, 0xf0, 0x13, 0xcd, 0x42, 0xaf, 0x9b, 0x52, 0x99, 0x52, 0xfd, + 0xbd, 0x82, 0x64, 0xb3, 0x71, 0x89, 0x3f, 0x86, 0xb7, 0x02, 0x2f, 0x41, 0x61, 0xba, 0x36, 0x27, + 0x26, 0xc0, 0xd3, 0x7e, 0x51, 0x49, 0x55, 0x62, 0xe5, 0x18, 0x35, 0xb9, 0x04, 0xc5, 0x1a, 0x53, + 0x9f, 0x12, 0xaa, 0xc7, 0xe0, 0xf6, 0xd6, 0x64, 0xb1, 0xc3, 0xf4, 0x07, 0xa1, 0x88, 0x65, 0x9b, + 0x19, 0xbe, 0x63, 0xe2, 0xd8, 0x70, 0x1f, 0x73, 0x09, 0x8a, 0x65, 0x67, 0xed, 0xa1, 0x98, 0xb5, + 0x10, 0xab, 0x3b, 0x6b, 0x0f, 0x35, 0x84, 0x92, 0x6b, 0x00, 0x1a, 0xf5, 0xba, 0x8e, 0x85, 0xcf, + 0x5d, 0x86, 0xf0, 0xfc, 0x0d, 0x67, 0x43, 0x07, 0xa1, 0x8d, 0xa6, 0x6d, 0x50, 0x4d, 0x22, 0x51, + 0xff, 0x56, 0x78, 0xb1, 0x53, 0x31, 0xdd, 0x07, 0x27, 0x5d, 0xb8, 0x87, 0x2e, 0xd4, 0xc5, 0x11, + 0x67, 0xb2, 0x93, 0x26, 0xa1, 0x7f, 0xae, 0xa5, 0xaf, 0xb9, 0xd8, 0x87, 0xc2, 0x77, 0xed, 0x3e, + 0x03, 0x68, 0x1c, 0x1e, 0xeb, 0xa7, 0xc1, 0x9d, 0xfb, 0xe9, 0x67, 0xfb, 0x83, 0xd1, 0xb6, 0x44, + 0xbd, 0x0d, 0xdb, 0x39, 0xe9, 0xaa, 0xdd, 0x76, 0xd5, 0x65, 0x18, 0xa8, 0x3b, 0x4d, 0xe9, 0xe8, + 0x02, 0xf7, 0x03, 0xae, 0xd3, 0xe4, 0xc7, 0x16, 0x3e, 0x92, 0xd1, 0x55, 0x5c, 0x0f, 0xe9, 0x06, + 0x42, 0x3a, 0xc3, 0xf5, 0x04, 0x9d, 0x40, 0x0a, 0xba, 0x9a, 0xed, 0x78, 0xa2, 0xe3, 0x02, 0xba, + 0x8e, 0xed, 0x78, 0x9a, 0x8f, 0x24, 0x9f, 0x04, 0x58, 0x99, 0xa9, 0xf9, 0xce, 0xfd, 0x43, 0xa1, + 0xef, 0xa1, 0xf0, 0xea, 0xd7, 0x24, 0x34, 0x59, 0x81, 0xa1, 0xe5, 0x0e, 0x75, 0xf8, 0x56, 0x88, + 0x3f, 0x60, 0xf9, 0x44, 0x4c, 0xb4, 0xa2, 0xdf, 0xa7, 0xc4, 0xff, 0x01, 0x39, 0x5f, 0x5f, 0x6c, + 0xff, 0xa7, 0x16, 0x32, 0x22, 0xaf, 0x42, 0xa9, 0xcc, 0xed, 0xbc, 0x61, 0x64, 0x19, 0x88, 0x0c, + 0xb7, 0xa0, 0x1c, 0xc5, 0xf7, 0xec, 0x3a, 0xfe, 0xad, 0x09, 0x72, 0xf5, 0x2a, 0x4c, 0xc4, 0xab, + 0x21, 0xc3, 0x30, 0x30, 0xb3, 0xbc, 0xb4, 0x34, 0x3b, 0xb3, 0x32, 0xd1, 0x47, 0x06, 0xa1, 0x58, + 0x9f, 0x5d, 0xaa, 0x4c, 0xe4, 0xd4, 0x5f, 0x92, 0x66, 0x10, 0xa6, 0x5a, 0x27, 0x57, 0xc3, 0x07, + 0xba, 0x6f, 0x99, 0xc0, 0xfb, 0x50, 0x3c, 0x31, 0x68, 0x9b, 0x9e, 0x47, 0x0d, 0xb1, 0x4a, 0xe0, + 0x7d, 0xa1, 0xf7, 0x48, 0x4b, 0xe0, 0xc9, 0xf3, 0x30, 0x8a, 0x30, 0x71, 0x45, 0xc8, 0xf7, 0xc7, + 0xa2, 0x80, 0xf3, 0x48, 0x8b, 0x22, 0xd5, 0x3f, 0x08, 0x6f, 0x87, 0x17, 0xa8, 0x7e, 0x5c, 0x6f, + 0x14, 0x3f, 0x24, 0xfd, 0xa5, 0xfe, 0xab, 0x22, 0x7f, 0x72, 0xc2, 0xdf, 0x27, 0x1e, 0x85, 0x28, + 0xc3, 0x23, 0xdd, 0xc2, 0x1e, 0x8e, 0x74, 0x9f, 0x87, 0xd2, 0x22, 0xf5, 0xd6, 0x6d, 0xdf, 0xf1, + 0x0b, 0x3d, 0xf4, 0xda, 0x08, 0x91, 0x3d, 0xf4, 0x38, 0x0d, 0x79, 0x00, 0xc4, 0x7f, 0x7c, 0x18, + 0x38, 0x7e, 0xfb, 0x47, 0xc8, 0xe7, 0x13, 0xfb, 0x94, 0x3a, 0x3e, 0x51, 0x46, 0x9f, 0xfe, 0x33, + 0x81, 0x63, 0xb9, 0xe4, 0x89, 0xf5, 0x2f, 0xb7, 0x26, 0x4b, 0x9c, 0x46, 0x4b, 0x61, 0x4b, 0xde, + 0x81, 0xa1, 0xc5, 0xb9, 0xb2, 0x78, 0x88, 0xc8, 0xbd, 0x22, 0x2e, 0x04, 0x52, 0xf4, 0x11, 0x81, + 0x48, 0xf0, 0x7d, 0x4f, 0xfb, 0xbe, 0x9e, 0x7c, 0x87, 0x18, 0x72, 0x61, 0xda, 0xc2, 0x5f, 0x0a, + 0x89, 0xd3, 0x85, 0x40, 0x5b, 0xa2, 0xef, 0x87, 0xe2, 0xb2, 0xe2, 0xd8, 0x98, 0xb6, 0x0c, 0x1e, + 0x60, 0x74, 0x2f, 0xc3, 0xa9, 0x72, 0xa7, 0xd3, 0x32, 0xa9, 0x81, 0xfa, 0xa2, 0x75, 0x5b, 0xd4, + 0x15, 0x2e, 0x3f, 0xf8, 0xf8, 0x44, 0xe7, 0xc8, 0x06, 0x3e, 0x7f, 0x6d, 0x38, 0xdd, 0xa8, 0x7f, + 0x66, 0xb2, 0xac, 0xfa, 0x33, 0x79, 0x38, 0x37, 0xe3, 0x50, 0xdd, 0xa3, 0x8b, 0x73, 0xe5, 0x72, + 0x17, 0x7d, 0xe4, 0x5a, 0x2d, 0x6a, 0xad, 0x1d, 0xcd, 0xb0, 0x7e, 0x03, 0xc6, 0x82, 0x06, 0xd4, + 0x9b, 0x76, 0x87, 0xca, 0x0f, 0xb9, 0x9a, 0x3e, 0xa6, 0xe1, 0x32, 0x94, 0x16, 0x23, 0x25, 0xb7, + 0xe1, 0x74, 0x00, 0x29, 0xb7, 0x5a, 0xf6, 0x86, 0x46, 0xbb, 0x2e, 0x77, 0xc4, 0x1d, 0xe4, 0x8e, + 0xb8, 0x21, 0x07, 0x9d, 0xe1, 0x1b, 0x0e, 0x23, 0xd0, 0xd2, 0x4a, 0xa9, 0xdf, 0x2c, 0xc0, 0xf9, + 0xbb, 0x7a, 0xcb, 0x34, 0x42, 0xd1, 0x68, 0xd4, 0xed, 0xd8, 0x96, 0x4b, 0x8f, 0xd1, 0x28, 0x8d, + 0x0c, 0x85, 0xe2, 0xa1, 0x0c, 0x85, 0x64, 0x17, 0xf5, 0x1f, 0xb8, 0x8b, 0x4a, 0xfb, 0xea, 0xa2, + 0xff, 0x35, 0x07, 0x13, 0xfe, 0x43, 0x03, 0xf9, 0xd1, 0xb8, 0xe4, 0x05, 0x8f, 0x47, 0x88, 0x31, + 0xbf, 0x6b, 0xc4, 0x93, 0x3a, 0x0c, 0xcc, 0x3e, 0xea, 0x98, 0x0e, 0x75, 0x77, 0xe1, 0x34, 0xfe, + 0xa4, 0x38, 0x2e, 0x39, 0x45, 0x79, 0x91, 0xc4, 0x49, 0x09, 0x07, 0xe3, 0xf3, 0x41, 0xfe, 0xd4, + 0x62, 0xda, 0x7f, 0x09, 0xcf, 0x9f, 0x0f, 0x8a, 0x27, 0x19, 0x91, 0xf7, 0xa0, 0x21, 0x29, 0x79, + 0x16, 0x0a, 0x2b, 0x2b, 0x0b, 0x62, 0x26, 0xc5, 0x08, 0x04, 0x9e, 0x27, 0xbf, 0x8f, 0x64, 0x58, + 0xf5, 0x9f, 0xe6, 0x01, 0x98, 0x2a, 0xf0, 0xe1, 0x7a, 0x24, 0x4a, 0x38, 0x0d, 0x83, 0xbe, 0xc0, + 0x85, 0x1a, 0x06, 0xaf, 0x04, 0xe2, 0x1d, 0x11, 0xaf, 0x3b, 0x78, 0x11, 0x32, 0xe9, 0x3b, 0x92, + 0xf3, 0x7b, 0x00, 0xdc, 0xd9, 0xa0, 0x23, 0xb9, 0xef, 0x3e, 0xfe, 0x49, 0x18, 0x12, 0x33, 0x9e, + 0x1d, 0x39, 0xff, 0x6f, 0xfa, 0x40, 0x2d, 0xc4, 0xc7, 0xa6, 0xd6, 0xd2, 0x01, 0x16, 0x62, 0x5f, + 0xbc, 0xbc, 0x57, 0x4e, 0xc4, 0x7b, 0xc8, 0xe2, 0xfd, 0x9a, 0x10, 0x2f, 0x7f, 0x31, 0x74, 0x6c, + 0xc5, 0x7b, 0x68, 0x67, 0xdf, 0xea, 0x3f, 0xca, 0x01, 0x61, 0xcd, 0xaa, 0xe9, 0xae, 0xbb, 0x61, + 0x3b, 0x06, 0x77, 0x4e, 0x3f, 0x12, 0xc1, 0x1c, 0xde, 0x7d, 0xe5, 0xef, 0x0d, 0xc2, 0xe9, 0x88, + 0xe3, 0xef, 0x31, 0x9f, 0xac, 0xae, 0x46, 0x47, 0x53, 0xaf, 0x57, 0x2f, 0x1f, 0x93, 0x2f, 0x44, + 0xfb, 0x23, 0x0f, 0xde, 0xa4, 0x9b, 0xd0, 0x17, 0x60, 0x44, 0xfc, 0x60, 0x2b, 0xb4, 0x7f, 0xd3, + 0x85, 0xa3, 0xd4, 0x65, 0x00, 0x2d, 0x82, 0x26, 0x2f, 0xc3, 0x10, 0x1b, 0x30, 0x6b, 0x18, 0xac, + 0x64, 0x20, 0x7c, 0x51, 0x62, 0xf8, 0x40, 0x79, 0x3d, 0x09, 0x28, 0xa5, 0x77, 0x4b, 0x83, 0xbb, + 0x78, 0xb7, 0xf4, 0x25, 0x18, 0x2e, 0x5b, 0x96, 0xed, 0xe1, 0x26, 0xdd, 0x15, 0x57, 0x13, 0x99, + 0x56, 0xf9, 0xb3, 0xf8, 0x18, 0x3f, 0xa4, 0x4f, 0x35, 0xcb, 0x65, 0x86, 0xe4, 0xba, 0xff, 0x2a, + 0x86, 0x3a, 0xc2, 0xab, 0x1c, 0xaf, 0x67, 0x1c, 0x01, 0x4b, 0x3e, 0x8a, 0xc1, 0xce, 0x1b, 0xad, + 0x39, 0x76, 0xc7, 0x76, 0xa9, 0xc1, 0x05, 0x35, 0x1c, 0x86, 0x36, 0xe8, 0x08, 0x04, 0xbe, 0x9b, + 0x8b, 0x04, 0x0e, 0x89, 0x14, 0x21, 0xf7, 0xe1, 0x8c, 0x7f, 0x51, 0x1c, 0xbc, 0x50, 0xac, 0x56, + 0x5c, 0x65, 0x04, 0x5f, 0x25, 0x91, 0xb8, 0x32, 0x54, 0x2b, 0xd3, 0x4f, 0xf9, 0xd7, 0x22, 0xfe, + 0x13, 0xc7, 0x86, 0x69, 0xc8, 0x5d, 0x9d, 0xca, 0x8f, 0xfc, 0x20, 0x0c, 0x2f, 0xea, 0x8f, 0x2a, + 0x5d, 0x71, 0xf6, 0x32, 0xba, 0xfb, 0xdb, 0x97, 0xb6, 0xfe, 0xa8, 0x61, 0x88, 0x72, 0x31, 0x9b, + 0x42, 0x66, 0x49, 0x1a, 0x70, 0xae, 0xe6, 0xd8, 0x6d, 0xdb, 0xa3, 0x46, 0xec, 0xb1, 0xdf, 0x78, + 0xf8, 0x3a, 0xb8, 0x23, 0x28, 0x1a, 0x3d, 0x5e, 0xfd, 0x65, 0xb0, 0x21, 0x6d, 0x18, 0x2f, 0xbb, + 0x6e, 0xb7, 0x4d, 0xc3, 0x1b, 0xaa, 0x89, 0x1d, 0x3f, 0xe3, 0x13, 0xc2, 0x6b, 0xf9, 0x09, 0x1d, + 0x8b, 0xf2, 0x0b, 0xaa, 0x86, 0x67, 0xca, 0x35, 0xe2, 0xb7, 0xc4, 0x79, 0xdf, 0x2a, 0x0e, 0x8e, + 0x4d, 0x8c, 0x6b, 0xe7, 0x93, 0x8d, 0x59, 0x31, 0xbd, 0x16, 0x55, 0xbf, 0x93, 0x03, 0x08, 0x05, + 0x4c, 0x5e, 0x88, 0x46, 0x44, 0xca, 0x85, 0x17, 0x1d, 0x22, 0x5a, 0x42, 0x24, 0x04, 0x12, 0xb9, + 0x04, 0x45, 0x8c, 0xa8, 0x91, 0x0f, 0x0f, 0x56, 0x1f, 0x98, 0x96, 0xa1, 0x21, 0x94, 0x61, 0xa5, + 0xa7, 0xef, 0x88, 0xc5, 0x4b, 0x7d, 0x6e, 0x15, 0x56, 0x60, 0xbc, 0xde, 0x5d, 0xf5, 0xeb, 0x96, + 0xde, 0xf1, 0x61, 0x60, 0x0f, 0xb7, 0xbb, 0x1a, 0x3c, 0x7e, 0x8d, 0x84, 0x4d, 0x89, 0x16, 0x51, + 0xbf, 0x95, 0x8b, 0xcd, 0x82, 0x47, 0xb8, 0xe8, 0x7d, 0x2c, 0xe9, 0xa7, 0x91, 0x9c, 0x96, 0xd4, + 0xbf, 0x96, 0x87, 0xe1, 0x9a, 0xed, 0x78, 0x22, 0x44, 0xc9, 0xf1, 0x5e, 0x85, 0xa4, 0xbd, 0x52, + 0x71, 0x0f, 0x7b, 0xa5, 0x4b, 0x50, 0x94, 0x5c, 0x94, 0xf9, 0xbd, 0x88, 0x61, 0x38, 0x1a, 0x42, + 0xd5, 0x1f, 0xca, 0x03, 0x7c, 0xee, 0xc5, 0x17, 0x1f, 0x63, 0x01, 0xa9, 0x7f, 0x25, 0x07, 0xe3, + 0xe2, 0xa2, 0x4e, 0x8a, 0x2d, 0x36, 0xe0, 0x5f, 0xb1, 0xca, 0xe3, 0x92, 0x83, 0x34, 0x1f, 0xc7, + 0x96, 0x80, 0xd9, 0x47, 0xa6, 0x87, 0x77, 0x15, 0x52, 0x70, 0x31, 0x2a, 0x60, 0xf2, 0x12, 0xe0, + 0xd3, 0x91, 0x17, 0xfc, 0x2b, 0xc8, 0x42, 0xb8, 0xee, 0xb1, 0x02, 0xb3, 0xa9, 0xd7, 0x90, 0xea, + 0xaf, 0x15, 0xa1, 0x38, 0xfb, 0x88, 0x36, 0x8f, 0x79, 0xd7, 0x48, 0x07, 0x9b, 0xc5, 0x03, 0x1e, + 0x6c, 0xee, 0xc7, 0xa7, 0xe2, 0xed, 0xb0, 0x3f, 0x4b, 0xd1, 0xea, 0x63, 0x3d, 0x1f, 0xaf, 0xde, + 0xef, 0xe9, 0xe3, 0xe7, 0x92, 0xf3, 0x5f, 0x14, 0xa0, 0x50, 0x9f, 0xa9, 0x9d, 0xe8, 0xcd, 0x91, + 0xea, 0x4d, 0xef, 0x3b, 0x6b, 0x35, 0xb8, 0x86, 0x1a, 0x0c, 0xbd, 0x44, 0x63, 0x37, 0x4e, 0x7f, + 0x5a, 0x80, 0xb1, 0xfa, 0xdc, 0x4a, 0x4d, 0x3a, 0x09, 0xbe, 0xcd, 0x3d, 0xf9, 0xd0, 0xa7, 0x8c, + 0x77, 0xe9, 0xa5, 0x84, 0x3d, 0x73, 0xa7, 0x6a, 0x79, 0xaf, 0xdc, 0xb8, 0xab, 0xb7, 0xba, 0x14, + 0x8f, 0x5e, 0xb8, 0xdf, 0xaf, 0x6b, 0xbe, 0x4f, 0xbf, 0x89, 0x81, 0x06, 0x7c, 0x06, 0xe4, 0x0d, + 0x28, 0xdc, 0x11, 0x1e, 0x19, 0x59, 0x7c, 0x5e, 0xba, 0xce, 0xf9, 0xb0, 0x49, 0xb0, 0xd0, 0x35, + 0x0d, 0xe4, 0xc0, 0x4a, 0xb1, 0xc2, 0x37, 0xc5, 0x02, 0xbc, 0xab, 0xc2, 0x6b, 0x7e, 0xe1, 0x9b, + 0xd5, 0x0a, 0xa9, 0xc3, 0x70, 0x8d, 0x3a, 0x6d, 0x13, 0x3b, 0xca, 0x9f, 0xb3, 0x7b, 0x33, 0x61, + 0x3b, 0x95, 0xe1, 0x4e, 0x58, 0x08, 0x99, 0xc9, 0x5c, 0xc8, 0xbb, 0x00, 0xdc, 0x46, 0xd9, 0x65, + 0xbc, 0xca, 0x27, 0xd1, 0xee, 0xe7, 0xa6, 0x65, 0x8a, 0x8d, 0x27, 0x31, 0x23, 0x0f, 0x60, 0x62, + 0xd1, 0x36, 0xcc, 0xfb, 0x26, 0x77, 0xbd, 0xc4, 0x0a, 0x4a, 0x3b, 0x3b, 0x3c, 0x31, 0x53, 0xb2, + 0x2d, 0x95, 0x4b, 0xab, 0x26, 0xc1, 0x58, 0xfd, 0xfb, 0xfd, 0x50, 0x64, 0xdd, 0x7e, 0x32, 0x7e, + 0x0f, 0x32, 0x7e, 0xcb, 0x30, 0x71, 0xcf, 0x76, 0x1e, 0x98, 0xd6, 0x5a, 0xe0, 0x15, 0x2f, 0xf6, + 0xa6, 0xe8, 0xc9, 0xb3, 0xc1, 0x71, 0x8d, 0xc0, 0x81, 0x5e, 0x4b, 0x90, 0xef, 0x30, 0x82, 0x5f, + 0x03, 0xe0, 0x6f, 0xdd, 0x91, 0x66, 0x30, 0x0c, 0x8e, 0xc1, 0x5f, 0xc2, 0xa3, 0xa3, 0xbd, 0x1c, + 0x1c, 0x23, 0x24, 0x66, 0x9b, 0x70, 0xee, 0x0b, 0x31, 0x84, 0x7e, 0xf7, 0xb8, 0x09, 0x47, 0x5f, + 0x08, 0xd9, 0x08, 0xe0, 0x5e, 0x11, 0x35, 0x00, 0xe9, 0x7e, 0x09, 0x62, 0x82, 0x88, 0x4c, 0x0e, + 0x22, 0x1c, 0x5d, 0xca, 0xf5, 0x92, 0x26, 0xf1, 0x20, 0xaf, 0xc4, 0x2e, 0xc0, 0x49, 0x84, 0x5b, + 0xe6, 0xfd, 0x77, 0xe8, 0x40, 0x35, 0xb2, 0x93, 0x03, 0x95, 0xfa, 0x77, 0x0a, 0x30, 0xcc, 0xb8, + 0xd5, 0xbb, 0xed, 0xb6, 0xee, 0x6c, 0x9e, 0x28, 0xf2, 0x41, 0x14, 0xb9, 0x01, 0xa7, 0x64, 0x87, + 0x79, 0x66, 0xba, 0xfa, 0xa1, 0x8d, 0x82, 0xe3, 0x9f, 0x38, 0x01, 0xb7, 0x2d, 0x71, 0xde, 0xf7, + 0x04, 0x18, 0xcf, 0x16, 0x5c, 0x2d, 0xc9, 0x4b, 0xfd, 0xe9, 0x1c, 0x4c, 0xc4, 0xa1, 0x81, 0xee, + 0xe7, 0x52, 0x75, 0xff, 0x79, 0x18, 0x12, 0x57, 0xe8, 0xba, 0x21, 0x3c, 0xfa, 0xc6, 0xb6, 0xb7, + 0x26, 0x01, 0xdf, 0x2f, 0x37, 0x1c, 0xaa, 0x1b, 0x5a, 0x48, 0x40, 0x5e, 0x86, 0x11, 0xfc, 0x71, + 0xcf, 0x31, 0x3d, 0x8f, 0xf2, 0xce, 0x28, 0xf2, 0x5b, 0x01, 0x5e, 0x60, 0x83, 0x23, 0xb4, 0x08, + 0x99, 0xfa, 0xfb, 0x79, 0x18, 0xaa, 0x77, 0x57, 0xdd, 0x4d, 0xd7, 0xa3, 0xed, 0x63, 0xae, 0x43, + 0xfe, 0x26, 0xbd, 0x98, 0xba, 0x49, 0x7f, 0xd6, 0x1f, 0x5a, 0xd2, 0xe9, 0x75, 0xb0, 0x31, 0xf0, + 0xbd, 0x12, 0x43, 0x2d, 0x2a, 0xed, 0x5d, 0x8b, 0xd4, 0xbf, 0x97, 0x87, 0x09, 0x7e, 0x79, 0x5b, + 0x31, 0xdd, 0xe6, 0x21, 0x3c, 0x28, 0x39, 0x7a, 0x99, 0x1e, 0xcc, 0xe1, 0x61, 0x17, 0xcf, 0x74, + 0xd4, 0xaf, 0xe4, 0x61, 0xb8, 0xdc, 0xf5, 0xd6, 0xcb, 0x1e, 0xce, 0x6f, 0x8f, 0xe5, 0x1e, 0xf9, + 0x1f, 0xe4, 0x60, 0x9c, 0x35, 0x64, 0xc5, 0x7e, 0x40, 0xad, 0x43, 0x38, 0xfc, 0x96, 0x0f, 0xb1, + 0xf3, 0xfb, 0x3c, 0xc4, 0xf6, 0x65, 0x59, 0xd8, 0x9b, 0x2c, 0xf1, 0xca, 0x46, 0xb3, 0x5b, 0xf4, + 0x78, 0x7f, 0xc6, 0x21, 0x5e, 0xd9, 0xf8, 0x02, 0x39, 0x84, 0x2b, 0xc2, 0x8f, 0x96, 0x40, 0x0e, + 0xe1, 0x7c, 0xf3, 0xa3, 0x21, 0x90, 0xdf, 0xcb, 0xc1, 0xd0, 0xb4, 0xed, 0x1d, 0xf3, 0x81, 0x2f, + 0xbe, 0xe2, 0x78, 0xab, 0xb9, 0xff, 0x15, 0xc7, 0x5b, 0x37, 0xd5, 0x9f, 0xcb, 0xc3, 0x19, 0x11, 0x0f, 0x5f, 0x9c, 0x81, 0x9d, 0x4c, 0xc7, 0x62, 0xb0, 0x25, 0x45, 0x73, 0x32, 0x0f, 0x09, 0xd1, - 0xfc, 0x62, 0x01, 0xce, 0x60, 0xf8, 0x5e, 0xb6, 0xa3, 0xfa, 0x3e, 0xb0, 0x45, 0x48, 0x33, 0x7a, - 0x11, 0xbf, 0x98, 0x72, 0x11, 0xff, 0x2f, 0xb7, 0x26, 0x5f, 0x5d, 0x33, 0xbd, 0xf5, 0xee, 0xea, - 0x54, 0xd3, 0x6e, 0x5f, 0x5f, 0x73, 0xf4, 0x47, 0x26, 0xbf, 0x82, 0xd6, 0x5b, 0xd7, 0xc3, 0x34, - 0x35, 0x1d, 0x53, 0x24, 0x9d, 0xa9, 0xe3, 0x4e, 0x89, 0x71, 0xf5, 0xaf, 0xf0, 0x5d, 0x80, 0xdb, - 0xb6, 0x69, 0x09, 0xbf, 0x56, 0x6e, 0xe8, 0xd6, 0xb7, 0xb7, 0x26, 0xcf, 0xbe, 0x6f, 0x9b, 0x56, - 0x23, 0xee, 0xdc, 0xba, 0xd7, 0xfa, 0x42, 0xd6, 0x9a, 0x54, 0x8d, 0xfa, 0xdf, 0xe4, 0xe0, 0x42, - 0x54, 0x8b, 0xbf, 0x1f, 0x6c, 0xc7, 0xbf, 0x90, 0x87, 0xb3, 0xb7, 0x50, 0x38, 0x81, 0x33, 0xd1, - 0xc9, 0xbc, 0x25, 0x06, 0x67, 0x8a, 0x6c, 0x4e, 0x2c, 0xca, 0x6c, 0xd9, 0x9c, 0x4c, 0xea, 0x42, - 0x36, 0xff, 0x75, 0x0e, 0x4e, 0x2f, 0x57, 0x2b, 0x33, 0xdf, 0x27, 0x23, 0x2a, 0xf9, 0x3d, 0xc7, - 0xdc, 0xe0, 0x4c, 0x7c, 0xcf, 0x31, 0x37, 0x3d, 0xbf, 0x9e, 0x87, 0xd3, 0xf5, 0xf2, 0xe2, 0xc2, - 0xf7, 0xcb, 0x0c, 0x3e, 0x23, 0x7b, 0xbe, 0xfa, 0x87, 0x60, 0xc2, 0x16, 0x90, 0x3f, 0xf3, 0xde, - 0x8d, 0x6c, 0x8f, 0xd8, 0xa4, 0x50, 0x8e, 0xf9, 0xd4, 0x7d, 0x28, 0x42, 0x61, 0x9a, 0x1f, 0xa1, - 0x3e, 0xe6, 0x9a, 0xff, 0x9f, 0x97, 0x60, 0xf8, 0x4e, 0x77, 0x95, 0x0a, 0x07, 0xa9, 0x27, 0xfa, - 0xe4, 0xf7, 0x06, 0x0c, 0x0b, 0x31, 0xe0, 0x0d, 0x87, 0x14, 0xc0, 0x51, 0x04, 0xe4, 0xe1, 0x31, - 0xb2, 0x64, 0x22, 0x72, 0x09, 0x8a, 0xf7, 0xa8, 0xb3, 0x2a, 0xbf, 0x6d, 0x7e, 0x44, 0x9d, 0x55, - 0x0d, 0xa1, 0x64, 0x21, 0x7c, 0xb6, 0x51, 0xae, 0x55, 0x31, 0x79, 0x90, 0xb8, 0x34, 0xc4, 0x6c, - 0x48, 0x81, 0xef, 0xa5, 0xde, 0x31, 0x79, 0xda, 0x21, 0x39, 0xae, 0x42, 0xbc, 0x24, 0x59, 0x82, - 0x53, 0xb2, 0xf3, 0x1d, 0xcf, 0x9c, 0x33, 0x98, 0xc2, 0x2e, 0x2d, 0x67, 0x4e, 0xb2, 0x28, 0x79, - 0x07, 0x46, 0x7c, 0x20, 0xba, 0x11, 0x0e, 0x85, 0xe9, 0x1a, 0x02, 0x56, 0xb1, 0xe8, 0xfa, 0x91, - 0x02, 0x32, 0x03, 0xbc, 0xc4, 0x80, 0x14, 0x06, 0x31, 0xb7, 0xcc, 0x48, 0x01, 0xf2, 0x0a, 0x32, - 0xc0, 0xa7, 0x46, 0xe8, 0x30, 0x35, 0x8c, 0x0f, 0x7f, 0xf1, 0x02, 0xc8, 0x11, 0x70, 0xfe, 0xbc, - 0x3b, 0x42, 0x46, 0x96, 0x01, 0x42, 0xc7, 0x16, 0x11, 0x44, 0x63, 0xcf, 0x2e, 0x37, 0x12, 0x0b, - 0xf9, 0x26, 0x6f, 0x74, 0x3f, 0x37, 0x79, 0xea, 0xcf, 0x16, 0x60, 0xb8, 0xdc, 0xe9, 0x04, 0x43, - 0xe1, 0x45, 0x28, 0x95, 0x3b, 0x9d, 0xbb, 0x5a, 0x55, 0x0e, 0xa7, 0xaf, 0x77, 0x3a, 0x8d, 0xae, - 0x63, 0xca, 0x7e, 0xc9, 0x9c, 0x88, 0xcc, 0xc0, 0x68, 0xb9, 0xd3, 0xa9, 0x75, 0x57, 0x5b, 0x66, - 0x53, 0xca, 0x06, 0xc6, 0xf3, 0x25, 0x76, 0x3a, 0x8d, 0x0e, 0x62, 0xe2, 0x29, 0xe1, 0xa2, 0x65, - 0xc8, 0x97, 0x30, 0xf4, 0x94, 0x48, 0x46, 0xc5, 0xd3, 0xdd, 0xa8, 0x41, 0x20, 0xfd, 0xb0, 0x6d, - 0x53, 0x01, 0x11, 0x4f, 0x38, 0x70, 0xc9, 0x4f, 0x13, 0xc1, 0x2a, 0x4a, 0x24, 0x9d, 0x0a, 0x59, - 0x92, 0x4f, 0xc1, 0x40, 0xb9, 0xd3, 0x91, 0x6e, 0xab, 0xd0, 0xb1, 0x8d, 0x95, 0x8a, 0xe7, 0xfb, - 0x13, 0x64, 0xe2, 0xb3, 0xc4, 0xfd, 0xb6, 0xed, 0x78, 0x38, 0xa4, 0x46, 0xc3, 0xcf, 0xf2, 0x2f, - 0xc4, 0x6d, 0x39, 0xda, 0x8b, 0x16, 0x2d, 0x73, 0xf1, 0x2d, 0x18, 0x8b, 0xb6, 0x78, 0x4f, 0x59, - 0x0f, 0xbe, 0x97, 0x43, 0xa9, 0x1c, 0x73, 0xe7, 0xfc, 0x97, 0xa1, 0x50, 0xee, 0x74, 0xc4, 0xa4, - 0x76, 0x3a, 0xa5, 0x53, 0xe3, 0x6f, 0xf9, 0xcb, 0x9d, 0x8e, 0xff, 0xe9, 0xc7, 0xfc, 0x95, 0xcf, - 0xbe, 0x3e, 0xfd, 0x77, 0xf9, 0xa7, 0x1f, 0xef, 0x17, 0x38, 0xea, 0xaf, 0x17, 0x60, 0xbc, 0xdc, - 0xe9, 0x9c, 0x64, 0x4b, 0x38, 0xac, 0x88, 0x01, 0x2f, 0x01, 0x48, 0x73, 0xec, 0x40, 0xf0, 0x06, - 0x71, 0x58, 0x9a, 0x5f, 0x95, 0x9c, 0x26, 0x11, 0xf9, 0xea, 0x37, 0xb8, 0x27, 0xf5, 0xfb, 0x72, - 0x01, 0x27, 0xbe, 0xe3, 0x1e, 0xfd, 0xec, 0xa3, 0xd2, 0x6d, 0xa2, 0x0f, 0x4a, 0x7b, 0xea, 0x83, - 0xbf, 0x1f, 0x19, 0x3c, 0x18, 0x7d, 0xff, 0xa4, 0x17, 0xfa, 0x0f, 0x64, 0x5b, 0x8f, 0xc9, 0xc2, - 0x14, 0x21, 0x99, 0xfc, 0x0c, 0x64, 0x22, 0x40, 0x58, 0x93, 0xa1, 0x1a, 0xa6, 0xa1, 0xc5, 0x68, - 0xfd, 0x3e, 0x1c, 0xd8, 0x53, 0x1f, 0x6e, 0xe5, 0x31, 0x08, 0x40, 0x10, 0x60, 0xec, 0xe0, 0x5b, - 0x94, 0xeb, 0x00, 0xdc, 0x7d, 0x21, 0xf0, 0xcf, 0x1f, 0xe5, 0xb1, 0x84, 0x78, 0x62, 0x32, 0x11, - 0x4b, 0x28, 0x24, 0x09, 0xdc, 0x9d, 0x0a, 0xa9, 0xee, 0x4e, 0xd7, 0x60, 0x50, 0xd3, 0x37, 0xde, - 0xed, 0x52, 0x67, 0x53, 0xd8, 0x44, 0x3c, 0x7e, 0xa7, 0xbe, 0xd1, 0xf8, 0x21, 0x06, 0xd4, 0x02, - 0x34, 0x51, 0x83, 0x28, 0x12, 0x92, 0x5b, 0x09, 0x3f, 0x68, 0x0f, 0x62, 0x47, 0xec, 0x47, 0xd1, - 0xc9, 0x1b, 0x50, 0x28, 0xdf, 0xaf, 0x0b, 0xc9, 0x06, 0x5d, 0x5b, 0xbe, 0x5f, 0x17, 0xf2, 0xca, - 0x2c, 0x7b, 0xbf, 0xae, 0x7e, 0x39, 0x0f, 0x24, 0x49, 0x49, 0x5e, 0x85, 0x21, 0x84, 0xae, 0x31, - 0x9d, 0x91, 0x33, 0xda, 0x6e, 0xb8, 0x0d, 0x07, 0xa1, 0x11, 0x0b, 0xd1, 0x27, 0x25, 0xaf, 0x63, - 0xce, 0x70, 0x91, 0x53, 0x31, 0x92, 0xd1, 0x76, 0xc3, 0xf5, 0xb3, 0x6c, 0xc7, 0x52, 0x86, 0x0b, - 0x62, 0x34, 0x2e, 0xef, 0xd7, 0xe7, 0x6d, 0xd7, 0x13, 0xa2, 0xe6, 0xc6, 0xe5, 0x86, 0x8b, 0xa9, - 0x94, 0x23, 0xc6, 0x25, 0x27, 0xc3, 0x74, 0x70, 0xf7, 0xeb, 0xfc, 0xbd, 0x95, 0xa1, 0xd9, 0x2d, - 0xdf, 0x2a, 0xe5, 0xe9, 0xe0, 0x36, 0xdc, 0x06, 0x7f, 0xab, 0x65, 0x60, 0xb2, 0xf2, 0x48, 0x3a, - 0xb8, 0x48, 0x29, 0xf5, 0xa7, 0x06, 0x61, 0xa2, 0xa2, 0x7b, 0xfa, 0xaa, 0xee, 0x52, 0x69, 0x4b, - 0x3e, 0xee, 0xc3, 0xfc, 0xcf, 0x91, 0xe4, 0x60, 0xac, 0xa6, 0x7c, 0x4d, 0xbc, 0x00, 0x79, 0x33, - 0xe4, 0x1b, 0x24, 0xeb, 0x95, 0xb3, 0xff, 0xad, 0x36, 0x3a, 0x02, 0xac, 0x25, 0x08, 0xc9, 0x0b, - 0x30, 0xec, 0xc3, 0xd8, 0x2e, 0xa2, 0x10, 0xea, 0x8c, 0xb1, 0xca, 0x36, 0x11, 0x9a, 0x8c, 0x26, - 0xaf, 0xc3, 0x88, 0xff, 0x53, 0xb2, 0xcf, 0x79, 0x2a, 0xc3, 0xd5, 0xc4, 0x16, 0x4c, 0x26, 0x95, - 0x8b, 0xe2, 0xfc, 0xd6, 0x1f, 0x29, 0x1a, 0xcb, 0x16, 0x18, 0x21, 0x25, 0x3f, 0x04, 0x63, 0xfe, - 0x6f, 0xb1, 0xeb, 0xe0, 0xde, 0x87, 0x2f, 0x04, 0xb9, 0xd0, 0x63, 0x62, 0x9d, 0x8a, 0x92, 0xf3, - 0xfd, 0xc7, 0x53, 0x7e, 0x02, 0x3c, 0x63, 0x35, 0xb9, 0xfd, 0x88, 0x55, 0x40, 0xaa, 0x70, 0xca, - 0x87, 0x84, 0x1a, 0x3a, 0x10, 0x6e, 0x3b, 0x8d, 0xd5, 0x46, 0xaa, 0x92, 0x26, 0x4b, 0x91, 0x16, - 0x5c, 0x8a, 0x00, 0x0d, 0x77, 0xdd, 0x7c, 0xe0, 0x89, 0x3d, 0xa3, 0x08, 0xa6, 0x2d, 0x32, 0x9e, - 0x06, 0x5c, 0x39, 0x8d, 0x9f, 0xba, 0x38, 0x9a, 0xe6, 0xac, 0x27, 0x37, 0x52, 0x87, 0x33, 0x3e, - 0xfe, 0xd6, 0x4c, 0xad, 0xe6, 0xd8, 0xef, 0xd3, 0xa6, 0x57, 0xad, 0x88, 0x3d, 0x37, 0x06, 0x59, - 0x34, 0x56, 0x1b, 0x6b, 0xcd, 0x0e, 0x53, 0x0a, 0x86, 0x8b, 0x32, 0x4f, 0x2d, 0x4c, 0xee, 0xc1, - 0x59, 0x09, 0x2e, 0xe5, 0x55, 0x87, 0xf0, 0x50, 0x40, 0x70, 0x4d, 0x4f, 0xad, 0x9e, 0x5e, 0x9c, - 0xbc, 0x05, 0xa3, 0x3e, 0x82, 0x5f, 0x45, 0x0e, 0xe3, 0x55, 0x24, 0x0e, 0x49, 0x63, 0xb5, 0x11, - 0x7f, 0x16, 0x1c, 0x25, 0x96, 0x35, 0x6a, 0x65, 0xb3, 0x43, 0x85, 0x5b, 0xb0, 0xaf, 0x51, 0xde, - 0x66, 0x27, 0x55, 0x19, 0x19, 0x29, 0x79, 0x27, 0xd4, 0xa8, 0x65, 0xc7, 0x5c, 0x33, 0xf9, 0x76, - 0xdc, 0x7f, 0x09, 0xbc, 0xda, 0xb0, 0x11, 0x98, 0xa6, 0x1f, 0x9c, 0xfc, 0x62, 0x19, 0x4e, 0xa7, - 0xe8, 0xd8, 0x9e, 0x76, 0x8c, 0x5f, 0xc9, 0x87, 0x8d, 0x38, 0xe6, 0xdb, 0xc6, 0x69, 0x18, 0xf4, - 0xbf, 0x44, 0x18, 0x0f, 0x4a, 0xd6, 0xd0, 0x8c, 0xf3, 0xf0, 0xf1, 0x11, 0x71, 0x1c, 0xf3, 0xad, - 0xe4, 0x61, 0x88, 0xe3, 0x3b, 0xb9, 0x50, 0x1c, 0xc7, 0x7c, 0x7b, 0xf9, 0x93, 0xc5, 0x70, 0x4e, - 0x3a, 0xd9, 0x63, 0x1e, 0x96, 0x99, 0x1c, 0x3a, 0xd3, 0x96, 0xf6, 0xf0, 0x22, 0x57, 0x56, 0xcd, - 0x81, 0xfd, 0xa9, 0x26, 0x79, 0x0b, 0x86, 0x6b, 0xb6, 0xeb, 0xad, 0x39, 0xd4, 0xad, 0x05, 0xc9, - 0x20, 0xf0, 0x35, 0x77, 0x47, 0x80, 0x1b, 0x9d, 0xc8, 0xec, 0x2f, 0x93, 0xab, 0xff, 0xb8, 0x90, - 0xd0, 0x06, 0x6e, 0xb8, 0x1e, 0x4b, 0x6d, 0x38, 0x84, 0xa1, 0x4e, 0x6e, 0x84, 0xab, 0x20, 0xb7, - 0xf0, 0xfb, 0xa5, 0x48, 0x97, 0xab, 0xc2, 0xc0, 0x8f, 0x92, 0x90, 0x2f, 0xc0, 0xf9, 0x08, 0xa0, - 0xa6, 0x3b, 0x7a, 0x9b, 0x7a, 0x61, 0xe2, 0x4d, 0x8c, 0x5d, 0xe6, 0x97, 0x6e, 0x74, 0x02, 0xb4, - 0x9c, 0xcc, 0x33, 0x83, 0x83, 0xa4, 0x5a, 0x03, 0x7b, 0xf0, 0xd3, 0xfe, 0xb9, 0x42, 0x68, 0xe8, - 0x44, 0x63, 0x10, 0x6b, 0xd4, 0xed, 0xb6, 0xbc, 0x27, 0xb7, 0x83, 0xf7, 0x97, 0xe1, 0x65, 0x1e, - 0xc6, 0xcb, 0x0f, 0x1e, 0xd0, 0xa6, 0xe7, 0x87, 0x56, 0x77, 0x45, 0xd4, 0x49, 0xbe, 0xf1, 0x10, - 0x28, 0x11, 0x2a, 0x5b, 0xee, 0xd7, 0x78, 0x31, 0xf5, 0x9f, 0x14, 0x41, 0x09, 0x0c, 0xff, 0xe0, - 0xbd, 0xe2, 0x11, 0x2e, 0xb2, 0x1f, 0x89, 0x5e, 0x31, 0xe1, 0x54, 0x28, 0x0c, 0xf1, 0x50, 0x4c, - 0xa4, 0x82, 0x9f, 0x8c, 0x33, 0x0b, 0x09, 0xf9, 0x5e, 0xe2, 0xa2, 0xd8, 0x4b, 0x90, 0xf0, 0x3d, - 0x68, 0xc3, 0xe5, 0x2c, 0xb4, 0x24, 0x57, 0xf2, 0xd5, 0x1c, 0x9c, 0xf1, 0x3b, 0x65, 0x79, 0x95, - 0x19, 0xd5, 0x33, 0x76, 0xd7, 0x0a, 0x5e, 0x51, 0xbd, 0x91, 0x5d, 0x1d, 0xef, 0xa4, 0xa9, 0xb4, - 0xc2, 0xbc, 0x25, 0x41, 0x7c, 0x95, 0x40, 0x21, 0x6c, 0xa4, 0x69, 0x34, 0x91, 0x48, 0x4b, 0xad, - 0xf7, 0xe2, 0x2d, 0xb8, 0x90, 0xc9, 0x72, 0x27, 0x23, 0xb6, 0x5f, 0x36, 0x62, 0xff, 0xbb, 0x5c, - 0x38, 0x11, 0xc5, 0x84, 0x44, 0xa6, 0x00, 0x42, 0x90, 0xd8, 0xd6, 0xe2, 0x23, 0xad, 0x50, 0x68, - 0x9a, 0x44, 0x41, 0x96, 0xa1, 0x24, 0xc4, 0xc2, 0x93, 0x5c, 0x7f, 0x72, 0x87, 0x5e, 0x98, 0x92, - 0xe5, 0x80, 0x5b, 0x56, 0xf1, 0xcd, 0x82, 0xcd, 0xc5, 0xd7, 0x61, 0x78, 0xbf, 0xdf, 0xf5, 0xd5, - 0x02, 0x10, 0x79, 0x0f, 0x7a, 0x84, 0x06, 0xfa, 0x31, 0x9e, 0xc2, 0xae, 0xc2, 0x20, 0xfb, 0x04, - 0x4c, 0xfb, 0x22, 0x85, 0x79, 0xee, 0x0a, 0x98, 0x16, 0x60, 0xc3, 0x18, 0x6b, 0x03, 0xe9, 0x31, - 0xd6, 0xd4, 0x9f, 0x29, 0xc0, 0x39, 0xb9, 0x43, 0x2a, 0x14, 0x33, 0x47, 0x9c, 0x74, 0xca, 0x87, - 0xd8, 0x29, 0x2a, 0x94, 0xf8, 0xd6, 0x43, 0xa4, 0xf0, 0xe0, 0xc7, 0x42, 0x08, 0xd1, 0x04, 0x46, - 0xfd, 0x9f, 0xf3, 0x30, 0x1a, 0x98, 0x77, 0xba, 0xe3, 0x3e, 0xc1, 0xdd, 0xf1, 0x69, 0x18, 0xc5, - 0x28, 0x59, 0x6d, 0x6a, 0xf1, 0x48, 0x52, 0xfd, 0x52, 0xce, 0x1d, 0x1f, 0x21, 0xd2, 0xab, 0x45, - 0x08, 0x99, 0xf6, 0x73, 0xcb, 0x4f, 0x8a, 0x5d, 0xc6, 0xcd, 0x3e, 0x0e, 0x57, 0xff, 0x6a, 0x01, - 0x46, 0x7c, 0x29, 0x4f, 0x9b, 0xc7, 0xf5, 0x9e, 0xe7, 0x68, 0x85, 0x7c, 0x1d, 0xa0, 0x66, 0x3b, - 0x9e, 0xde, 0x5a, 0x0a, 0x35, 0x1f, 0x0f, 0x48, 0x3b, 0x08, 0xe5, 0x65, 0x24, 0x12, 0x5c, 0xbf, - 0x42, 0xb3, 0x9a, 0x4f, 0x4c, 0x7c, 0xfd, 0x0a, 0xa0, 0x9a, 0x44, 0xa1, 0xfe, 0x76, 0x1e, 0xc6, - 0xfd, 0x4e, 0x9a, 0x7d, 0x4c, 0x9b, 0xdd, 0x27, 0x79, 0x6e, 0x8a, 0x4a, 0xbb, 0x7f, 0x47, 0x69, - 0xab, 0xff, 0xa7, 0x34, 0x91, 0xcc, 0xb4, 0xec, 0x93, 0x89, 0xe4, 0x4f, 0x43, 0xc7, 0xd5, 0x1f, - 0x2d, 0xc0, 0x19, 0x5f, 0xea, 0x73, 0x5d, 0x0b, 0x8f, 0x16, 0x66, 0xf4, 0x56, 0xeb, 0x49, 0xde, - 0x8d, 0x0f, 0xfb, 0x82, 0x58, 0x16, 0x61, 0x27, 0x45, 0xaa, 0xcb, 0x07, 0x02, 0xdc, 0xb0, 0x4d, - 0x43, 0x93, 0x89, 0xc8, 0x3b, 0x30, 0xe2, 0xff, 0x2c, 0x3b, 0x6b, 0xfe, 0x16, 0x1c, 0x2f, 0x0a, - 0x82, 0x42, 0xba, 0x13, 0x89, 0xae, 0x11, 0x29, 0xa0, 0x7e, 0x79, 0x00, 0x2e, 0xde, 0x37, 0x2d, - 0xc3, 0xde, 0x70, 0xfd, 0x4c, 0xa9, 0xc7, 0xfe, 0xa0, 0xec, 0xa8, 0x33, 0xa4, 0xbe, 0x0b, 0x67, - 0xe3, 0x22, 0x75, 0x82, 0xf8, 0xf5, 0xa2, 0x77, 0x36, 0x38, 0x41, 0xc3, 0xcf, 0x99, 0x2a, 0x6e, - 0xdb, 0xb4, 0xf4, 0x92, 0xf1, 0xa4, 0xab, 0x03, 0xbb, 0x49, 0xba, 0xfa, 0x3c, 0x94, 0x2a, 0x76, - 0x5b, 0x37, 0xfd, 0x38, 0x4b, 0x38, 0x8a, 0x83, 0x7a, 0x11, 0xa3, 0x09, 0x0a, 0xc6, 0x5f, 0x54, - 0x8c, 0x5d, 0x36, 0x14, 0xf2, 0xf7, 0x0b, 0x30, 0x2b, 0x4d, 0x93, 0x89, 0x88, 0x0d, 0xa3, 0xa2, - 0x3a, 0x71, 0x37, 0x06, 0xb8, 0x79, 0x7a, 0xc5, 0x97, 0x51, 0xb6, 0x5a, 0x4d, 0x45, 0xca, 0xf1, - 0x6d, 0x14, 0xcf, 0x05, 0x2b, 0x3e, 0x86, 0xdf, 0x92, 0x69, 0x51, 0xfe, 0x92, 0x10, 0x70, 0x92, - 0x19, 0x4e, 0x0a, 0x01, 0x67, 0x19, 0x99, 0x88, 0xcc, 0xc2, 0x29, 0x8c, 0x32, 0x1e, 0x6c, 0xa5, - 0x98, 0x4a, 0x8c, 0xa0, 0x51, 0x89, 0x57, 0x2e, 0x3c, 0x30, 0x39, 0xfb, 0xb8, 0x46, 0x53, 0xa0, - 0xb5, 0x64, 0x09, 0x72, 0x01, 0x0a, 0x4b, 0x0b, 0x65, 0xbc, 0xab, 0x19, 0xe4, 0x19, 0xbe, 0xac, - 0x96, 0xae, 0x31, 0xd8, 0xc5, 0xcf, 0x02, 0x49, 0x7e, 0xce, 0x9e, 0xee, 0x63, 0xfe, 0x4b, 0x69, - 0xcb, 0x77, 0xdc, 0x3d, 0x6a, 0x0e, 0x63, 0x22, 0x8c, 0x24, 0xd7, 0xeb, 0xff, 0x30, 0x93, 0xeb, - 0x95, 0x0e, 0x35, 0xb9, 0x9e, 0xfa, 0x2b, 0x39, 0x38, 0x95, 0x88, 0xc4, 0x4f, 0x5e, 0x06, 0xe0, - 0x10, 0x29, 0xe2, 0x29, 0x86, 0x10, 0x0a, 0xa3, 0xf3, 0x8b, 0xe5, 0x31, 0x24, 0x23, 0xd7, 0x61, - 0x90, 0xff, 0x12, 0x51, 0xca, 0x92, 0x45, 0xba, 0x5d, 0xd3, 0xd0, 0x02, 0xa2, 0xb0, 0x16, 0xbc, - 0x91, 0x2c, 0xa4, 0x16, 0xf1, 0x36, 0x3b, 0x41, 0x2d, 0x8c, 0x4c, 0xfd, 0xa9, 0x3c, 0x8c, 0x04, - 0x0d, 0x2e, 0x1b, 0x47, 0xa5, 0x73, 0x25, 0x91, 0xd4, 0xa0, 0xb0, 0x53, 0x52, 0x83, 0xd8, 0x7c, - 0x2b, 0xb2, 0x18, 0x1c, 0xde, 0xab, 0xac, 0xaf, 0xe5, 0x61, 0x3c, 0xa8, 0xf5, 0x08, 0x2f, 0xbf, - 0x3e, 0x42, 0x22, 0xf9, 0x6a, 0x0e, 0x94, 0x69, 0xb3, 0xd5, 0x32, 0xad, 0xb5, 0xaa, 0xf5, 0xc0, - 0x76, 0xda, 0x38, 0x21, 0x1e, 0xdd, 0x11, 0xae, 0xfa, 0x67, 0x73, 0x70, 0x4a, 0x34, 0x68, 0x46, - 0x77, 0x8c, 0xa3, 0x3b, 0x1f, 0x8b, 0xb7, 0xe4, 0xe8, 0xf4, 0x45, 0xfd, 0x56, 0x1e, 0x60, 0xc1, - 0x6e, 0x3e, 0x3c, 0xe6, 0x8f, 0xba, 0xde, 0x84, 0x12, 0x77, 0x8b, 0x17, 0x1a, 0x7b, 0x4a, 0x3c, - 0x5e, 0x62, 0x9f, 0xc6, 0x11, 0xd3, 0x13, 0x62, 0x3e, 0x2e, 0x71, 0xcf, 0x7a, 0x25, 0xa7, 0x89, - 0x22, 0xac, 0x52, 0x46, 0x27, 0x16, 0x8c, 0xa0, 0x52, 0x06, 0x8b, 0x56, 0xba, 0xbd, 0x35, 0x59, - 0x6c, 0xd9, 0xcd, 0x87, 0x1a, 0xd2, 0xab, 0xff, 0x2a, 0xc7, 0x65, 0x77, 0xcc, 0x9f, 0xa6, 0xfa, - 0x9f, 0x5f, 0xdc, 0xe3, 0xe7, 0xff, 0xb9, 0x1c, 0x9c, 0xd1, 0x68, 0xd3, 0x7e, 0x44, 0x9d, 0xcd, - 0x19, 0xdb, 0xa0, 0xb7, 0xa8, 0x45, 0x9d, 0xa3, 0x1a, 0x51, 0xbf, 0x83, 0x59, 0x60, 0xc2, 0xc6, - 0xdc, 0x75, 0xa9, 0x71, 0x7c, 0x32, 0xf4, 0xa8, 0xbf, 0x36, 0x00, 0x4a, 0xaa, 0xd5, 0x7b, 0x6c, - 0xcd, 0xb9, 0xcc, 0xad, 0x4c, 0xf1, 0xb0, 0xb6, 0x32, 0xfd, 0x7b, 0xdb, 0xca, 0x94, 0xf6, 0xba, - 0x95, 0x19, 0xd8, 0xcd, 0x56, 0xa6, 0x1d, 0xdf, 0xca, 0x0c, 0xe2, 0x56, 0xe6, 0xe5, 0x9e, 0x5b, - 0x99, 0x59, 0xcb, 0xd8, 0xe7, 0x46, 0xe6, 0xd8, 0x66, 0x8f, 0xde, 0xcf, 0x0e, 0xec, 0x2a, 0x9b, - 0x14, 0x9b, 0xb6, 0x63, 0x50, 0x43, 0x6c, 0xbc, 0xf0, 0xd4, 0xdf, 0x11, 0x30, 0x2d, 0xc0, 0x26, - 0x52, 0x71, 0x8f, 0xee, 0x26, 0x15, 0xf7, 0x21, 0xec, 0xbf, 0xbe, 0x92, 0x87, 0x53, 0x33, 0xd4, - 0xf1, 0x78, 0x2c, 0xda, 0xc3, 0x70, 0x89, 0x2b, 0xc3, 0xb8, 0xc4, 0x10, 0x2d, 0xf2, 0x7c, 0xe8, - 0xe6, 0xd7, 0xa4, 0x8e, 0x17, 0xf7, 0x12, 0x8c, 0xd3, 0xb3, 0xea, 0xfd, 0x74, 0x78, 0x62, 0xec, - 0x06, 0xd5, 0xfb, 0x70, 0x2e, 0x48, 0x53, 0xfc, 0xd2, 0x02, 0x7a, 0x29, 0xc3, 0x5d, 0x71, 0xef, - 0x19, 0xee, 0xd4, 0x5f, 0xce, 0xc1, 0x15, 0x8d, 0x5a, 0x74, 0x43, 0x5f, 0x6d, 0x51, 0xa9, 0x59, - 0x62, 0x65, 0x60, 0xb3, 0x86, 0xe9, 0xb6, 0x75, 0xaf, 0xb9, 0x7e, 0x20, 0x19, 0xcd, 0xc1, 0x88, - 0x3c, 0x7f, 0xed, 0x61, 0x6e, 0x8b, 0x94, 0x53, 0x7f, 0xad, 0x08, 0x03, 0xd3, 0xb6, 0x77, 0xdb, - 0x3e, 0x60, 0xca, 0xc5, 0x70, 0xca, 0xcf, 0xef, 0xe1, 0xac, 0xe7, 0x53, 0x58, 0xb9, 0x94, 0x85, - 0x02, 0x5d, 0x48, 0x57, 0xed, 0x44, 0xb6, 0x0e, 0x9f, 0x6c, 0x8f, 0xc9, 0x16, 0x5f, 0x85, 0x21, - 0x0c, 0x21, 0x23, 0x9d, 0xc6, 0xa2, 0x83, 0xb6, 0xc7, 0x80, 0xf1, 0x3a, 0x42, 0x52, 0xf2, 0x85, - 0x48, 0xf0, 0xdc, 0xd2, 0xc1, 0x93, 0x33, 0xca, 0x71, 0x74, 0x5f, 0xe6, 0x17, 0x79, 0xd8, 0x26, - 0x29, 0x91, 0x0d, 0x9e, 0xa2, 0xc4, 0x9a, 0x14, 0x10, 0x1e, 0x62, 0xe2, 0xc4, 0x19, 0x18, 0x9d, - 0xb6, 0x3d, 0xc9, 0x19, 0x78, 0x28, 0x7c, 0x4b, 0xca, 0x24, 0x9f, 0xee, 0x09, 0x1c, 0x2d, 0xa3, - 0xfe, 0x49, 0x11, 0x46, 0xfc, 0x9f, 0x47, 0xa4, 0x3b, 0x2f, 0x42, 0x69, 0xde, 0x96, 0x72, 0x79, - 0xa0, 0x03, 0xf1, 0xba, 0xed, 0xc6, 0x3c, 0xa3, 0x05, 0x11, 0x93, 0xfa, 0x92, 0x6d, 0xc8, 0xee, - 0xef, 0x28, 0x75, 0xcb, 0x36, 0x12, 0x6f, 0x90, 0x03, 0x42, 0x72, 0x05, 0x8a, 0xf8, 0x72, 0x40, - 0x3a, 0xc8, 0x8f, 0xbd, 0x16, 0x40, 0xbc, 0xa4, 0x95, 0xa5, 0xbd, 0x6a, 0xe5, 0xc0, 0x7e, 0xb5, - 0x72, 0xf0, 0x70, 0xb5, 0xf2, 0x3d, 0x18, 0xc1, 0x9a, 0xfc, 0x54, 0x80, 0x3b, 0x2f, 0xac, 0x17, - 0xc4, 0xda, 0x37, 0xca, 0xdb, 0x2d, 0x12, 0x02, 0xe2, 0x92, 0x17, 0x61, 0x15, 0xd3, 0x5d, 0x38, - 0xc0, 0x76, 0xfa, 0x1f, 0xe7, 0x60, 0xe0, 0xae, 0xf5, 0xd0, 0xb2, 0x37, 0x0e, 0xa6, 0x71, 0x2f, - 0xc3, 0xb0, 0x60, 0x23, 0xad, 0x2e, 0xf8, 0xac, 0xbc, 0xcb, 0xc1, 0x0d, 0xe4, 0xa4, 0xc9, 0x54, - 0xe4, 0xad, 0xa0, 0x10, 0x3e, 0x0e, 0x2a, 0x84, 0xd9, 0x70, 0xfc, 0x42, 0xcd, 0x68, 0x02, 0x0f, - 0x99, 0x9c, 0x5c, 0x82, 0x62, 0x85, 0x35, 0x55, 0x0a, 0xe4, 0xcb, 0x9a, 0xa2, 0x21, 0x54, 0xfd, - 0x4a, 0x11, 0xc6, 0x62, 0x07, 0x5f, 0xcf, 0xc3, 0x90, 0x38, 0x78, 0x32, 0xfd, 0x8c, 0x22, 0xf8, - 0x78, 0x28, 0x00, 0x6a, 0x83, 0xfc, 0xcf, 0xaa, 0x41, 0x3e, 0x03, 0x03, 0xb6, 0x8b, 0x8b, 0x22, - 0x7e, 0xcb, 0x58, 0x38, 0x84, 0x96, 0xeb, 0xac, 0xed, 0x7c, 0x70, 0x08, 0x12, 0x59, 0x23, 0x6d, - 0x17, 0x3f, 0xed, 0x26, 0x0c, 0xe9, 0xae, 0x4b, 0xbd, 0x86, 0xa7, 0xaf, 0xc9, 0x49, 0x46, 0x02, - 0xa0, 0x3c, 0x3a, 0x10, 0xb8, 0xa2, 0xaf, 0x91, 0xcf, 0xc2, 0x68, 0xd3, 0xa1, 0xb8, 0x6c, 0xea, - 0x2d, 0xd6, 0x4a, 0xc9, 0xac, 0x8d, 0x20, 0xe4, 0xfb, 0x93, 0x10, 0x51, 0x35, 0xc8, 0x3d, 0x18, - 0x15, 0x9f, 0xc3, 0x3d, 0xf7, 0x71, 0xa0, 0x8d, 0x85, 0xcb, 0x18, 0x17, 0x09, 0xf7, 0xdd, 0x17, - 0x0f, 0x38, 0x64, 0x72, 0x99, 0xaf, 0x21, 0x91, 0x92, 0x65, 0x20, 0x1b, 0x74, 0xb5, 0xa1, 0x77, - 0xbd, 0x75, 0x56, 0x17, 0x8f, 0x91, 0x2f, 0x72, 0x6b, 0xe2, 0xab, 0x87, 0x24, 0x56, 0x7e, 0x0c, - 0xb2, 0x41, 0x57, 0xcb, 0x11, 0x24, 0xb9, 0x0f, 0x67, 0x93, 0x45, 0xd8, 0x27, 0xf3, 0xcb, 0x81, - 0xe7, 0xb6, 0xb7, 0x26, 0x27, 0x53, 0x09, 0x24, 0xb6, 0xa7, 0x13, 0x6c, 0xab, 0xc6, 0xed, 0xe2, - 0xe0, 0xc0, 0xc4, 0xa0, 0x36, 0xc6, 0xca, 0xfa, 0x26, 0xa4, 0x69, 0xa8, 0xbf, 0x9f, 0x63, 0xa6, - 0x22, 0xfb, 0x20, 0x4c, 0x2e, 0xce, 0x74, 0xbd, 0xbd, 0x47, 0x5d, 0x6f, 0x87, 0x69, 0x40, 0x4b, - 0x6e, 0x8f, 0xd9, 0x55, 0x13, 0x58, 0x32, 0x05, 0x25, 0x43, 0x3e, 0x35, 0x3b, 0x17, 0xed, 0x04, - 0xbf, 0x1e, 0x4d, 0x50, 0x91, 0xab, 0x50, 0x64, 0x4b, 0x56, 0x7c, 0xcb, 0x2c, 0x5b, 0x17, 0x1a, - 0x52, 0xa8, 0x3f, 0x9c, 0x87, 0x11, 0xe9, 0x6b, 0x6e, 0x1c, 0xe8, 0x73, 0xde, 0xd8, 0x5d, 0x33, - 0x7d, 0xa7, 0x17, 0xdc, 0x4b, 0xf9, 0x4d, 0xbe, 0x19, 0x88, 0x62, 0x57, 0x17, 0x52, 0x42, 0x30, - 0xaf, 0x8a, 0x0f, 0x2d, 0xed, 0x7e, 0xfb, 0xc8, 0xe8, 0x6f, 0x17, 0x07, 0xf3, 0x13, 0x85, 0xdb, - 0xc5, 0xc1, 0xe2, 0x44, 0x3f, 0x06, 0xf3, 0xc2, 0xf8, 0xd9, 0x7c, 0x6f, 0x6e, 0x3d, 0x30, 0xd7, - 0x8e, 0xf9, 0xdb, 0x91, 0xc3, 0x0d, 0x74, 0x16, 0x93, 0xcd, 0x31, 0x7f, 0x48, 0xf2, 0xa1, 0xca, - 0xe6, 0x24, 0x6d, 0xa8, 0x90, 0xcd, 0x3f, 0xc9, 0x81, 0x92, 0x2a, 0x9b, 0xf2, 0x11, 0xf9, 0x41, - 0x1c, 0x5e, 0xf2, 0xd0, 0x3f, 0xca, 0xc3, 0xa9, 0xaa, 0xe5, 0xd1, 0x35, 0xbe, 0x63, 0x3c, 0xe6, - 0x53, 0xc5, 0x1d, 0x18, 0x96, 0x3e, 0x46, 0xf4, 0xf9, 0x53, 0xc1, 0x7e, 0x3c, 0x44, 0x65, 0x70, - 0x92, 0x4b, 0x1f, 0xde, 0x4b, 0x9c, 0xb8, 0x90, 0x8f, 0xf9, 0x9c, 0x73, 0x3c, 0x84, 0x7c, 0xcc, - 0x27, 0xaf, 0x8f, 0xa8, 0x90, 0xff, 0xb3, 0x3c, 0x9c, 0x4e, 0xa9, 0x9c, 0x5c, 0x81, 0x81, 0x7a, - 0x77, 0x15, 0x63, 0x77, 0xe5, 0x42, 0x8f, 0x61, 0xb7, 0xbb, 0x8a, 0x61, 0xbb, 0x34, 0x1f, 0x49, - 0x56, 0xf0, 0x71, 0xfd, 0x72, 0xb5, 0x32, 0x23, 0xa4, 0xaa, 0x4a, 0x61, 0x02, 0x18, 0x38, 0xed, - 0xcb, 0x82, 0x07, 0xf8, 0xb6, 0x69, 0x34, 0x63, 0x0f, 0xf0, 0x59, 0x19, 0xf2, 0x03, 0x30, 0x54, - 0xfe, 0xa0, 0xeb, 0x50, 0xe4, 0xcb, 0x25, 0xfe, 0xb1, 0x80, 0xaf, 0x8f, 0x48, 0xe3, 0xcc, 0x63, - 0x09, 0x30, 0x8a, 0x38, 0xef, 0x90, 0x21, 0x59, 0x86, 0xd2, 0x2d, 0xd3, 0x9b, 0xef, 0xae, 0x8a, - 0x5e, 0x08, 0xe2, 0x7b, 0x71, 0x68, 0x1a, 0x5f, 0xdc, 0x95, 0xf3, 0x38, 0xc5, 0xf2, 0x1e, 0x88, - 0x17, 0x50, 0x7f, 0x2a, 0x07, 0x17, 0xb3, 0x3f, 0x97, 0x7c, 0x0a, 0x06, 0xd8, 0x56, 0xbf, 0xac, - 0x2d, 0x09, 0x59, 0xf2, 0xcc, 0xbd, 0x76, 0x8b, 0x36, 0x74, 0x47, 0xde, 0x3d, 0xf8, 0x64, 0xe4, - 0x6d, 0x18, 0xae, 0xba, 0x6e, 0x97, 0x3a, 0xf5, 0x97, 0xef, 0x6a, 0x55, 0xb1, 0xc9, 0xc4, 0x4d, - 0x8c, 0x89, 0xe0, 0x86, 0xfb, 0x72, 0x2c, 0xdc, 0x97, 0x4c, 0xaf, 0xfe, 0x78, 0x0e, 0x2e, 0xf5, - 0x12, 0x13, 0x79, 0x19, 0x06, 0x57, 0xa8, 0xa5, 0x5b, 0x5e, 0xb5, 0x22, 0x9a, 0x84, 0x7b, 0x36, - 0x0f, 0x61, 0xd1, 0xad, 0x47, 0x40, 0xc8, 0x0a, 0xf1, 0x83, 0xca, 0xc0, 0x33, 0x82, 0x1f, 0xaa, - 0x22, 0x2c, 0x56, 0xc8, 0x27, 0x54, 0xbf, 0x00, 0x17, 0x32, 0xa5, 0x4a, 0x3e, 0x03, 0x23, 0xcb, - 0xce, 0x9a, 0x6e, 0x99, 0x1f, 0xf0, 0x41, 0x91, 0x0b, 0xf7, 0xc5, 0xb6, 0x04, 0x97, 0xf7, 0x6a, - 0x32, 0xbd, 0xfa, 0x07, 0x79, 0x18, 0xa9, 0xb5, 0xba, 0x6b, 0xa6, 0xb4, 0xcc, 0xed, 0x7b, 0x77, - 0xe0, 0xdb, 0xea, 0xf9, 0xbd, 0xd9, 0xea, 0x6c, 0x72, 0x70, 0xf6, 0x39, 0x39, 0xf8, 0xe5, 0xc8, - 0x5b, 0x50, 0xea, 0xe0, 0x77, 0xc4, 0xcf, 0x8d, 0xf9, 0xd7, 0x65, 0x9d, 0x1b, 0xf3, 0x32, 0x6c, - 0x36, 0x68, 0x1e, 0x60, 0x36, 0x08, 0xcb, 0x4a, 0x02, 0x0d, 0x97, 0xb4, 0x13, 0x81, 0x1e, 0x8a, - 0x40, 0xc3, 0xe5, 0xeb, 0x44, 0xa0, 0x07, 0x10, 0xe8, 0xaf, 0xe5, 0x61, 0x2c, 0x5a, 0x25, 0xf9, - 0x14, 0x0c, 0xf3, 0x6a, 0xf8, 0x29, 0x56, 0x4e, 0x72, 0x81, 0x0e, 0xc1, 0x1a, 0xf0, 0x1f, 0xe2, - 0x38, 0x6e, 0x7c, 0x5d, 0x77, 0x1b, 0xe1, 0x79, 0x12, 0xbf, 0x6d, 0x1e, 0xe4, 0x7e, 0x5b, 0x31, - 0x94, 0x36, 0xb6, 0xae, 0xbb, 0x33, 0xe1, 0x6f, 0x32, 0x0b, 0xc4, 0xa1, 0x5d, 0x97, 0x46, 0x19, - 0x14, 0x91, 0x81, 0xc8, 0xc9, 0x1e, 0xc7, 0x6a, 0xa7, 0x38, 0x4c, 0x66, 0xf3, 0xc5, 0xa0, 0xd9, - 0xa8, 0x0c, 0xfd, 0xbb, 0x48, 0x18, 0x2f, 0xd1, 0xa7, 0x1f, 0xca, 0x72, 0x82, 0x8a, 0xee, 0xe9, - 0xfc, 0x08, 0xc1, 0xef, 0x00, 0xf5, 0x47, 0x3a, 0xd0, 0xbf, 0x6c, 0xd1, 0xe5, 0x07, 0xe4, 0x25, - 0x18, 0x62, 0x0a, 0xb3, 0x60, 0xb3, 0xbe, 0xcc, 0x09, 0x6f, 0x0f, 0x49, 0x93, 0x10, 0x31, 0xdf, - 0xa7, 0x85, 0x54, 0xe4, 0x26, 0x40, 0xf8, 0x20, 0x4e, 0x68, 0x1f, 0x91, 0xcb, 0x70, 0xcc, 0x7c, - 0x9f, 0x26, 0xd1, 0xf9, 0xa5, 0xc4, 0x73, 0xa2, 0x42, 0xb2, 0x14, 0xc7, 0xf8, 0xa5, 0xc4, 0xf8, - 0x58, 0x00, 0xc2, 0x7e, 0xd5, 0x74, 0xd7, 0xdd, 0xb0, 0x1d, 0x63, 0x66, 0x5d, 0xb7, 0xd6, 0x68, - 0x7c, 0xaf, 0x97, 0xa4, 0x98, 0xef, 0xd3, 0x52, 0xca, 0x91, 0x37, 0x60, 0x44, 0x76, 0x7f, 0x8d, - 0xbb, 0xa8, 0xc8, 0xb8, 0xf9, 0x3e, 0x2d, 0x42, 0x4b, 0x5e, 0x83, 0x61, 0xf1, 0xfb, 0xb6, 0x2d, - 0xee, 0xbf, 0xa5, 0xc8, 0x49, 0x12, 0x6a, 0xbe, 0x4f, 0x93, 0x29, 0xa5, 0x4a, 0x6b, 0x8e, 0x69, - 0x79, 0xe2, 0x45, 0x75, 0xbc, 0x52, 0xc4, 0x49, 0x95, 0xe2, 0x6f, 0xf2, 0x36, 0x8c, 0x06, 0x21, - 0xa9, 0xde, 0xa7, 0x4d, 0x4f, 0x1c, 0xd5, 0x9f, 0x8d, 0x15, 0xe6, 0xc8, 0xf9, 0x3e, 0x2d, 0x4a, - 0x4d, 0xae, 0x42, 0x49, 0xa3, 0xae, 0xf9, 0x81, 0x7f, 0xb9, 0x3d, 0x26, 0x8d, 0x73, 0xf3, 0x03, - 0x26, 0x25, 0x81, 0x67, 0xbd, 0x13, 0xde, 0xa6, 0x8b, 0x83, 0x75, 0x12, 0xab, 0x65, 0xd6, 0x32, - 0x58, 0xef, 0x48, 0xae, 0x14, 0x9f, 0x0d, 0x03, 0x75, 0x89, 0x3c, 0xb5, 0xc3, 0xf1, 0x88, 0x08, - 0x32, 0x76, 0xbe, 0x4f, 0x8b, 0xd1, 0x4b, 0x52, 0xad, 0x98, 0xee, 0x43, 0x11, 0x60, 0x35, 0x2e, - 0x55, 0x86, 0x92, 0xa4, 0xca, 0x7e, 0x4a, 0x55, 0x2f, 0x51, 0x6f, 0xc3, 0x76, 0x1e, 0x8a, 0x70, - 0xaa, 0xf1, 0xaa, 0x05, 0x56, 0xaa, 0x5a, 0x40, 0xe4, 0xaa, 0xd9, 0x80, 0x1b, 0x4b, 0xaf, 0x5a, - 0xf7, 0x74, 0xb9, 0x6a, 0x7e, 0x6e, 0xe8, 0x77, 0xd2, 0x02, 0xd5, 0x1f, 0x51, 0x65, 0x3c, 0xb5, - 0x43, 0x11, 0x27, 0x75, 0x28, 0xfe, 0x66, 0x95, 0x4a, 0x29, 0xe1, 0x95, 0x89, 0x68, 0xa5, 0x12, - 0x8a, 0x55, 0x2a, 0x27, 0x8f, 0xbf, 0x29, 0x67, 0x4a, 0x57, 0x4e, 0x45, 0x3b, 0x28, 0xc4, 0xb0, - 0x0e, 0x92, 0x32, 0xaa, 0x4f, 0x62, 0x16, 0x66, 0x85, 0x20, 0xf9, 0x70, 0xd0, 0xc2, 0x99, 0xda, - 0x7c, 0x9f, 0x86, 0xf9, 0x99, 0x55, 0x9e, 0xdf, 0x5b, 0x39, 0x8d, 0x14, 0x23, 0x3e, 0x05, 0x83, - 0xcd, 0xf7, 0x69, 0x3c, 0xf7, 0xf7, 0x4b, 0x52, 0x0e, 0x44, 0xe5, 0x4c, 0x74, 0x8a, 0x08, 0x10, - 0x6c, 0x8a, 0x08, 0x33, 0x25, 0xce, 0x25, 0x33, 0xfd, 0x29, 0x67, 0xa3, 0x4b, 0x4d, 0x1c, 0x3f, - 0xdf, 0xa7, 0x25, 0xb3, 0x03, 0xbe, 0x16, 0x49, 0x7e, 0xa7, 0x9c, 0x8b, 0x85, 0x2b, 0x0b, 0x51, - 0x4c, 0x5c, 0x72, 0x9a, 0xbc, 0x65, 0x38, 0xcd, 0x73, 0xe7, 0x8a, 0x80, 0x63, 0x62, 0xb2, 0x3a, - 0x1f, 0xdd, 0x66, 0xa5, 0x90, 0xcc, 0xf7, 0x69, 0x69, 0x25, 0xc9, 0x4c, 0x22, 0x05, 0x9d, 0xa2, - 0x44, 0x3d, 0x79, 0x62, 0xe8, 0xf9, 0x3e, 0x2d, 0x91, 0xb4, 0xee, 0xa6, 0x9c, 0xfb, 0x4d, 0xb9, - 0x10, 0xed, 0xc4, 0x10, 0xc3, 0x3a, 0x51, 0xca, 0x11, 0x77, 0x53, 0xce, 0x07, 0xa6, 0x5c, 0x4c, - 0x96, 0x0a, 0x67, 0x4e, 0x29, 0x6f, 0x98, 0x96, 0x9e, 0xe2, 0x48, 0x79, 0x4a, 0x24, 0x3a, 0x16, - 0xe5, 0xd3, 0x68, 0xe6, 0xfb, 0xb4, 0xf4, 0xf4, 0x48, 0x5a, 0x7a, 0x6e, 0x20, 0xe5, 0x52, 0x2f, - 0x9e, 0x41, 0xeb, 0xd2, 0xf3, 0x0a, 0xe9, 0x3d, 0x32, 0xb5, 0x28, 0x4f, 0x47, 0x37, 0x64, 0x99, - 0x84, 0xf3, 0x7d, 0x5a, 0x8f, 0x7c, 0x2f, 0x77, 0x33, 0xd2, 0xa6, 0x28, 0x97, 0xa3, 0x79, 0xce, - 0x53, 0x89, 0xe6, 0xfb, 0xb4, 0x8c, 0xa4, 0x2b, 0x77, 0x33, 0xb2, 0x6a, 0x28, 0x93, 0x3d, 0xd9, - 0x06, 0xf2, 0xc8, 0xc8, 0xc9, 0xb1, 0x9c, 0x9a, 0x90, 0x42, 0x79, 0x26, 0xaa, 0xba, 0x29, 0x24, - 0x4c, 0x75, 0xd3, 0x52, 0x59, 0x2c, 0xa7, 0x66, 0x50, 0x50, 0x9e, 0xed, 0xc1, 0x30, 0x68, 0x63, - 0x6a, 0xee, 0x85, 0xe5, 0xd4, 0x14, 0x06, 0x8a, 0x1a, 0x65, 0x98, 0x42, 0xc2, 0x18, 0xa6, 0x25, - 0x3f, 0x58, 0x4e, 0x8d, 0x74, 0xaf, 0x3c, 0xd7, 0x83, 0x61, 0xd8, 0xc2, 0xb4, 0x18, 0xf9, 0xaf, - 0x45, 0x42, 0xcd, 0x2b, 0x1f, 0x8b, 0xce, 0x1b, 0x12, 0x8a, 0xcd, 0x1b, 0x72, 0x50, 0xfa, 0x99, - 0x44, 0x1c, 0x5c, 0xe5, 0xe3, 0xd1, 0x61, 0x1e, 0x43, 0xb3, 0x61, 0x1e, 0x8f, 0x9c, 0x3b, 0x93, - 0x88, 0x07, 0xaa, 0x5c, 0xc9, 0x62, 0x82, 0xe8, 0x28, 0x13, 0x1e, 0x41, 0xb4, 0x9a, 0x12, 0x90, - 0x52, 0xf9, 0x44, 0xd4, 0x0b, 0x3d, 0x41, 0x30, 0xdf, 0xa7, 0xa5, 0x84, 0xb1, 0xd4, 0xd2, 0xa3, - 0x2f, 0x29, 0x57, 0xa3, 0xc3, 0x36, 0x8d, 0x86, 0x0d, 0xdb, 0xd4, 0xc8, 0x4d, 0x0b, 0x69, 0x4f, - 0x65, 0x94, 0x6b, 0x51, 0xc3, 0x2c, 0x49, 0xc1, 0x0c, 0xb3, 0x94, 0x27, 0x36, 0x5a, 0x7a, 0x44, - 0x20, 0xe5, 0xf9, 0x9e, 0x2d, 0x44, 0x9a, 0x94, 0x16, 0xf2, 0x00, 0x39, 0xa1, 0xed, 0x74, 0xb7, - 0xd3, 0xb2, 0x75, 0x43, 0xf9, 0x64, 0xaa, 0xed, 0xc4, 0x91, 0x92, 0xed, 0xc4, 0x01, 0x6c, 0x95, - 0x97, 0x5f, 0x64, 0x28, 0x2f, 0x44, 0x57, 0x79, 0x19, 0xc7, 0x56, 0xf9, 0xc8, 0xeb, 0x8d, 0x99, - 0xc4, 0xeb, 0x05, 0xe5, 0xc5, 0xa8, 0x02, 0xc4, 0xd0, 0x4c, 0x01, 0xe2, 0xef, 0x1d, 0xbe, 0x94, - 0xed, 0xef, 0xaf, 0x4c, 0x21, 0xb7, 0x67, 0x7c, 0x6e, 0x59, 0x74, 0xf3, 0x7d, 0x5a, 0xf6, 0x9b, - 0x81, 0x6a, 0x8a, 0xfb, 0xbe, 0x72, 0x3d, 0xaa, 0x60, 0x09, 0x02, 0xa6, 0x60, 0x49, 0xa7, 0xff, - 0x6a, 0x8a, 0xff, 0xbd, 0xf2, 0xa9, 0x4c, 0x56, 0xc1, 0x37, 0xa7, 0x78, 0xed, 0xdf, 0x94, 0x1d, - 0xe8, 0x95, 0x97, 0xa2, 0x8b, 0x5d, 0x88, 0x61, 0x8b, 0x9d, 0xe4, 0x68, 0x7f, 0x53, 0x76, 0x1d, - 0x57, 0x6e, 0x24, 0x4b, 0x85, 0x4b, 0xa4, 0xe4, 0x62, 0xae, 0xa5, 0x7b, 0x5c, 0x2b, 0x2f, 0x47, - 0xb5, 0x2e, 0x8d, 0x86, 0x69, 0x5d, 0xaa, 0xb7, 0xf6, 0x5c, 0xd2, 0x71, 0x5a, 0xb9, 0x19, 0xdf, - 0x64, 0x47, 0xf1, 0xcc, 0xf2, 0x49, 0x38, 0x5b, 0x7f, 0x36, 0x1e, 0x1a, 0x50, 0x79, 0x25, 0x76, - 0x49, 0x1d, 0xc1, 0x32, 0xfb, 0x36, 0x16, 0x4a, 0xf0, 0xb3, 0xf1, 0x68, 0x7a, 0xca, 0xab, 0xe9, - 0x1c, 0x02, 0x5d, 0x89, 0x47, 0xdf, 0xfb, 0x6c, 0x3c, 0x00, 0x9d, 0xf2, 0x5a, 0x3a, 0x87, 0x40, - 0xba, 0xf1, 0x80, 0x75, 0x2f, 0x49, 0x21, 0xf1, 0x95, 0x4f, 0x47, 0x4d, 0xc7, 0x00, 0xc1, 0x4c, - 0xc7, 0x30, 0x70, 0xfe, 0x4b, 0x52, 0x28, 0x79, 0xe5, 0xf5, 0x44, 0x91, 0xa0, 0xb1, 0x52, 0xc0, - 0xf9, 0x97, 0xa4, 0x10, 0xec, 0xca, 0x1b, 0x89, 0x22, 0x41, 0xeb, 0xa4, 0x40, 0xed, 0x46, 0xaf, - 0xd7, 0xb6, 0xca, 0x9b, 0xd1, 0xa3, 0xeb, 0x6c, 0xca, 0xf9, 0x3e, 0xad, 0xd7, 0xab, 0xdd, 0x2f, - 0x65, 0xbb, 0xa1, 0x2b, 0x6f, 0x45, 0x87, 0x70, 0x16, 0x1d, 0x1b, 0xc2, 0x99, 0xae, 0xec, 0x6f, - 0xc7, 0x22, 0x6f, 0x28, 0x6f, 0x47, 0xa7, 0xb8, 0x08, 0x92, 0x4d, 0x71, 0xf1, 0x38, 0x1d, 0x91, - 0x90, 0x12, 0xca, 0x67, 0xa2, 0x53, 0x9c, 0x8c, 0x63, 0x53, 0x5c, 0x24, 0xfc, 0xc4, 0x4c, 0x22, - 0xd2, 0x81, 0xf2, 0x4e, 0x74, 0x8a, 0x8b, 0xa1, 0xd9, 0x14, 0x17, 0x8f, 0x8d, 0xf0, 0x76, 0xec, - 0xc1, 0xbf, 0xf2, 0xd9, 0xf4, 0xf6, 0x23, 0x52, 0x6e, 0x3f, 0x0f, 0x0f, 0xa0, 0xa5, 0xbf, 0x5c, - 0x57, 0xca, 0xd1, 0xf1, 0x9b, 0x46, 0xc3, 0xc6, 0x6f, 0xea, 0xab, 0xf7, 0xf8, 0xc6, 0x41, 0x68, - 0xd5, 0x74, 0x8f, 0x8d, 0x43, 0x68, 0x8a, 0xa4, 0x80, 0x23, 0x7b, 0x64, 0xbe, 0x11, 0x9a, 0xc9, - 0xd8, 0x23, 0xfb, 0xdb, 0xa0, 0x18, 0x3d, 0x9b, 0x5d, 0x13, 0x5e, 0xd1, 0x4a, 0x25, 0x3a, 0xbb, - 0x26, 0x08, 0xd8, 0xec, 0x9a, 0xf4, 0xa5, 0x9e, 0x83, 0x09, 0xa1, 0x45, 0xdc, 0xd9, 0xdb, 0xb4, - 0xd6, 0x94, 0xd9, 0xd8, 0xeb, 0xd0, 0x18, 0x9e, 0xcd, 0x4e, 0x71, 0x18, 0xae, 0xd7, 0x1c, 0x36, - 0xd3, 0x32, 0x3b, 0xab, 0xb6, 0xee, 0x18, 0x75, 0x6a, 0x19, 0xca, 0x5c, 0x6c, 0xbd, 0x4e, 0xa1, - 0xc1, 0xf5, 0x3a, 0x05, 0x8e, 0x01, 0xed, 0x62, 0x70, 0x8d, 0x36, 0xa9, 0xf9, 0x88, 0x2a, 0xb7, - 0x90, 0xed, 0x64, 0x16, 0x5b, 0x41, 0x36, 0xdf, 0xa7, 0x65, 0x71, 0x60, 0xb6, 0xfa, 0xe2, 0x66, - 0xfd, 0xdd, 0x85, 0x20, 0x58, 0x42, 0xcd, 0xa1, 0x1d, 0xdd, 0xa1, 0xca, 0x7c, 0xd4, 0x56, 0x4f, - 0x25, 0x62, 0xb6, 0x7a, 0x2a, 0x22, 0xc9, 0xd6, 0x1f, 0x0b, 0xd5, 0x5e, 0x6c, 0xc3, 0x11, 0x91, - 0x5e, 0x9a, 0xcd, 0x4e, 0x51, 0x04, 0x13, 0xd0, 0x82, 0x6d, 0xad, 0xe1, 0x49, 0xc5, 0xed, 0xe8, - 0xec, 0x94, 0x4d, 0xc9, 0x66, 0xa7, 0x6c, 0x2c, 0x53, 0xf5, 0x28, 0x96, 0x8f, 0xc1, 0x3b, 0x51, - 0x55, 0x4f, 0x21, 0x61, 0xaa, 0x9e, 0x02, 0x4e, 0x32, 0xd4, 0xa8, 0x4b, 0x3d, 0x65, 0xa1, 0x17, - 0x43, 0x24, 0x49, 0x32, 0x44, 0x70, 0x92, 0xe1, 0x1c, 0xf5, 0x9a, 0xeb, 0xca, 0x62, 0x2f, 0x86, - 0x48, 0x92, 0x64, 0x88, 0x60, 0xb6, 0xd9, 0x8c, 0x82, 0xa7, 0xbb, 0xad, 0x87, 0x7e, 0x9f, 0x2d, - 0x45, 0x37, 0x9b, 0x99, 0x84, 0x6c, 0xb3, 0x99, 0x89, 0x24, 0x3f, 0xbe, 0x6b, 0xaf, 0x7d, 0x65, - 0x19, 0x2b, 0x9c, 0x0a, 0xed, 0x82, 0xdd, 0x94, 0x9a, 0xef, 0xd3, 0x76, 0xfb, 0x2a, 0xe0, 0x93, - 0x81, 0x8b, 0xab, 0x52, 0xc3, 0xaa, 0xc6, 0x83, 0xb3, 0x0a, 0x0e, 0x9e, 0xef, 0xd3, 0x02, 0x27, - 0xd8, 0xd7, 0x60, 0x18, 0x3f, 0xaa, 0x6a, 0x99, 0x5e, 0x65, 0x5a, 0x79, 0x37, 0xba, 0x65, 0x92, - 0x50, 0x6c, 0xcb, 0x24, 0xfd, 0x64, 0x93, 0x38, 0xfe, 0xe4, 0x53, 0x4c, 0x65, 0x5a, 0xd1, 0xa2, - 0x93, 0x78, 0x04, 0xc9, 0x26, 0xf1, 0x08, 0x20, 0xa8, 0xb7, 0xe2, 0xd8, 0x9d, 0xca, 0xb4, 0x52, - 0x4f, 0xa9, 0x97, 0xa3, 0x82, 0x7a, 0xf9, 0xcf, 0xa0, 0xde, 0xfa, 0x7a, 0xd7, 0xab, 0xb0, 0x6f, - 0x5c, 0x49, 0xa9, 0xd7, 0x47, 0x06, 0xf5, 0xfa, 0x00, 0x36, 0x15, 0x22, 0xa0, 0xe6, 0xd8, 0x6c, - 0xd2, 0xbe, 0x63, 0xb6, 0x5a, 0xca, 0xdd, 0xe8, 0x54, 0x18, 0xc7, 0xb3, 0xa9, 0x30, 0x0e, 0x63, - 0xa6, 0x27, 0x6f, 0x15, 0x5d, 0xed, 0xae, 0x29, 0xf7, 0xa2, 0xa6, 0x67, 0x88, 0x61, 0xa6, 0x67, - 0xf8, 0x0b, 0x77, 0x17, 0xec, 0x97, 0x46, 0x1f, 0x38, 0xd4, 0x5d, 0x57, 0xee, 0xc7, 0x76, 0x17, - 0x12, 0x0e, 0x77, 0x17, 0xd2, 0x6f, 0xb2, 0x06, 0x4f, 0x45, 0x16, 0x1a, 0xff, 0xd2, 0xa6, 0x4e, - 0x75, 0xa7, 0xb9, 0xae, 0x7c, 0x0e, 0x59, 0x3d, 0x97, 0xba, 0x54, 0x45, 0x49, 0xe7, 0xfb, 0xb4, - 0x5e, 0x9c, 0x70, 0x5b, 0xfe, 0xee, 0x02, 0x8f, 0x5b, 0xab, 0xd5, 0x66, 0xfc, 0x4d, 0xe8, 0x7b, - 0xb1, 0x6d, 0x79, 0x92, 0x04, 0xb7, 0xe5, 0x49, 0x30, 0xe9, 0xc0, 0xe5, 0xd8, 0x56, 0x6d, 0x51, - 0x6f, 0xb1, 0x7d, 0x09, 0x35, 0x6a, 0x7a, 0xf3, 0x21, 0xf5, 0x94, 0xcf, 0x23, 0xef, 0x2b, 0x19, - 0x1b, 0xbe, 0x18, 0xf5, 0x7c, 0x9f, 0xb6, 0x03, 0x3f, 0xa2, 0x42, 0xb1, 0x3e, 0xb7, 0x52, 0x53, - 0xbe, 0x10, 0x3d, 0xdf, 0x64, 0xb0, 0xf9, 0x3e, 0x0d, 0x71, 0xcc, 0x4a, 0xbb, 0xdb, 0x59, 0x73, - 0x74, 0x83, 0x72, 0x43, 0x0b, 0x6d, 0x37, 0x61, 0x80, 0xfe, 0x40, 0xd4, 0x4a, 0xcb, 0xa2, 0x63, - 0x56, 0x5a, 0x16, 0x8e, 0x29, 0x6a, 0x24, 0x45, 0x8b, 0xf2, 0xc5, 0xa8, 0xa2, 0x46, 0x90, 0x4c, - 0x51, 0xa3, 0x09, 0x5d, 0x3e, 0x07, 0xe7, 0x82, 0xfd, 0xbc, 0x58, 0x7f, 0x79, 0xa7, 0x29, 0x5f, - 0x42, 0x3e, 0x97, 0x13, 0x97, 0x01, 0x11, 0xaa, 0xf9, 0x3e, 0x2d, 0xa3, 0x3c, 0x5b, 0x71, 0x13, + 0xfc, 0x42, 0x01, 0xce, 0x60, 0xf8, 0x5e, 0xb6, 0xa3, 0xfa, 0x08, 0xd8, 0x22, 0xa4, 0x19, 0xbd, + 0x88, 0x5f, 0x4c, 0xb9, 0x88, 0xff, 0x97, 0x5b, 0x93, 0xaf, 0xac, 0x99, 0xde, 0x7a, 0x77, 0x75, + 0xaa, 0x69, 0xb7, 0xaf, 0xad, 0x39, 0xfa, 0x43, 0x93, 0x5f, 0x41, 0xeb, 0xad, 0x6b, 0x61, 0x9a, + 0x9a, 0x8e, 0x29, 0x92, 0xce, 0xd4, 0x71, 0xa7, 0xc4, 0xb8, 0xfa, 0x57, 0xf8, 0x2e, 0xc0, 0x2d, + 0xdb, 0xb4, 0x84, 0x5f, 0x2b, 0x37, 0x74, 0xeb, 0xdb, 0x5b, 0x93, 0x67, 0xdf, 0xb3, 0x4d, 0xab, + 0x11, 0x77, 0x6e, 0xdd, 0x6b, 0x7d, 0x21, 0x6b, 0x4d, 0xaa, 0x46, 0xfd, 0x6f, 0x72, 0x70, 0x21, + 0xaa, 0xc5, 0x1f, 0x05, 0xdb, 0xf1, 0x2f, 0xe5, 0xe1, 0xec, 0x4d, 0x14, 0x4e, 0xe0, 0x4c, 0x74, + 0x32, 0x6f, 0x89, 0xc1, 0x99, 0x22, 0x9b, 0x13, 0x8b, 0x32, 0x5b, 0x36, 0x27, 0x93, 0xba, 0x90, + 0xcd, 0x7f, 0x9d, 0x83, 0xd3, 0xcb, 0xd5, 0xca, 0xcc, 0x47, 0x64, 0x44, 0x25, 0xbf, 0xe7, 0x98, + 0x1b, 0x9c, 0x89, 0xef, 0x39, 0xe6, 0xa6, 0xe7, 0x37, 0xf2, 0x70, 0xba, 0x5e, 0x5e, 0x5c, 0xf8, + 0xa8, 0xcc, 0xe0, 0x33, 0xb2, 0xe7, 0xab, 0x7f, 0x08, 0x26, 0x6c, 0x01, 0xf9, 0x33, 0xef, 0x5e, + 0xcf, 0xf6, 0x88, 0x4d, 0x0a, 0xe5, 0x98, 0x4f, 0xdd, 0x87, 0x22, 0x14, 0xa6, 0xf9, 0x11, 0xea, + 0x63, 0xae, 0xf9, 0xff, 0x79, 0x09, 0x86, 0x6f, 0x77, 0x57, 0xa9, 0x70, 0x90, 0x7a, 0xac, 0x4f, + 0x7e, 0xaf, 0xc3, 0xb0, 0x10, 0x03, 0xde, 0x70, 0x48, 0x01, 0x1c, 0x45, 0x40, 0x1e, 0x1e, 0x23, + 0x4b, 0x26, 0x22, 0x97, 0xa0, 0x78, 0x97, 0x3a, 0xab, 0xf2, 0xdb, 0xe6, 0x87, 0xd4, 0x59, 0xd5, + 0x10, 0x4a, 0x16, 0xc2, 0x67, 0x1b, 0xe5, 0x5a, 0x15, 0x93, 0x07, 0x89, 0x4b, 0x43, 0xcc, 0x86, + 0x14, 0xf8, 0x5e, 0xea, 0x1d, 0x93, 0xa7, 0x1d, 0x92, 0xe3, 0x2a, 0xc4, 0x4b, 0x92, 0x25, 0x38, + 0x25, 0x3b, 0xdf, 0xf1, 0xcc, 0x39, 0x83, 0x29, 0xec, 0xd2, 0x72, 0xe6, 0x24, 0x8b, 0x92, 0xb7, + 0x61, 0xc4, 0x07, 0xa2, 0x1b, 0xe1, 0x50, 0x98, 0xae, 0x21, 0x60, 0x15, 0x8b, 0xae, 0x1f, 0x29, + 0x20, 0x33, 0xc0, 0x4b, 0x0c, 0x48, 0x61, 0x10, 0x73, 0xcb, 0x8c, 0x14, 0x20, 0x2f, 0x23, 0x03, + 0x7c, 0x6a, 0x84, 0x0e, 0x53, 0xc3, 0xf8, 0xf0, 0x17, 0x2f, 0x80, 0x1c, 0x01, 0xe7, 0xcf, 0xbb, + 0x23, 0x64, 0x64, 0x19, 0x20, 0x74, 0x6c, 0x11, 0x41, 0x34, 0xf6, 0xec, 0x72, 0x23, 0xb1, 0x90, + 0x6f, 0xf2, 0x46, 0xf7, 0x73, 0x93, 0xa7, 0xfe, 0x4c, 0x01, 0x86, 0xcb, 0x9d, 0x4e, 0x30, 0x14, + 0x5e, 0x80, 0x52, 0xb9, 0xd3, 0xb9, 0xa3, 0x55, 0xe5, 0x70, 0xfa, 0x7a, 0xa7, 0xd3, 0xe8, 0x3a, + 0xa6, 0xec, 0x97, 0xcc, 0x89, 0xc8, 0x0c, 0x8c, 0x96, 0x3b, 0x9d, 0x5a, 0x77, 0xb5, 0x65, 0x36, + 0xa5, 0x6c, 0x60, 0x3c, 0x5f, 0x62, 0xa7, 0xd3, 0xe8, 0x20, 0x26, 0x9e, 0x12, 0x2e, 0x5a, 0x86, + 0x7c, 0x09, 0x43, 0x4f, 0x89, 0x64, 0x54, 0x3c, 0xdd, 0x8d, 0x1a, 0x04, 0xd2, 0x0f, 0xdb, 0x36, + 0x15, 0x10, 0xf1, 0x84, 0x03, 0x97, 0xfc, 0x34, 0x11, 0xac, 0xa2, 0x44, 0xd2, 0xa9, 0x90, 0x25, + 0xf9, 0x14, 0x0c, 0x94, 0x3b, 0x1d, 0xe9, 0xb6, 0x0a, 0x1d, 0xdb, 0x58, 0xa9, 0x78, 0xbe, 0x3f, + 0x41, 0x26, 0x3e, 0x4b, 0xdc, 0x6f, 0xdb, 0x8e, 0x87, 0x43, 0x6a, 0x34, 0xfc, 0x2c, 0xff, 0x42, + 0xdc, 0x96, 0xa3, 0xbd, 0x68, 0xd1, 0x32, 0x17, 0xdf, 0x84, 0xb1, 0x68, 0x8b, 0xf7, 0x94, 0xf5, + 0xe0, 0xfb, 0x39, 0x94, 0xca, 0x31, 0x77, 0xce, 0x7f, 0x09, 0x0a, 0xe5, 0x4e, 0x47, 0x4c, 0x6a, + 0xa7, 0x53, 0x3a, 0x35, 0xfe, 0x96, 0xbf, 0xdc, 0xe9, 0xf8, 0x9f, 0x7e, 0xcc, 0x5f, 0xf9, 0xec, + 0xeb, 0xd3, 0x7f, 0x8f, 0x7f, 0xfa, 0xf1, 0x7e, 0x81, 0xa3, 0xfe, 0x5a, 0x01, 0xc6, 0xcb, 0x9d, + 0xce, 0x49, 0xb6, 0x84, 0xc3, 0x8a, 0x18, 0xf0, 0x22, 0x80, 0x34, 0xc7, 0x0e, 0x04, 0x6f, 0x10, + 0x87, 0xa5, 0xf9, 0x55, 0xc9, 0x69, 0x12, 0x91, 0xaf, 0x7e, 0x83, 0x7b, 0x52, 0xbf, 0xaf, 0x14, + 0x70, 0xe2, 0x3b, 0xee, 0xd1, 0xcf, 0x3e, 0x2c, 0xdd, 0x26, 0xfa, 0xa0, 0xb4, 0xa7, 0x3e, 0xf8, + 0xdd, 0xc8, 0xe0, 0xc1, 0xe8, 0xfb, 0x27, 0xbd, 0xd0, 0x7f, 0x20, 0xdb, 0x7a, 0x4c, 0x16, 0xa6, + 0x08, 0xc9, 0xe4, 0x67, 0x20, 0x13, 0x01, 0xc2, 0x9a, 0x0c, 0xd5, 0x30, 0x0d, 0x2d, 0x46, 0xeb, + 0xf7, 0xe1, 0xc0, 0x9e, 0xfa, 0x70, 0x2b, 0x8f, 0x41, 0x00, 0x82, 0x00, 0x63, 0x07, 0xdf, 0xa2, + 0x5c, 0x03, 0xe0, 0xee, 0x0b, 0x81, 0x7f, 0xfe, 0x28, 0x8f, 0x25, 0xc4, 0x13, 0x93, 0x89, 0x58, + 0x42, 0x21, 0x49, 0xe0, 0xee, 0x54, 0x48, 0x75, 0x77, 0xba, 0x0a, 0x83, 0x9a, 0xbe, 0xf1, 0x4e, + 0x97, 0x3a, 0x9b, 0xc2, 0x26, 0xe2, 0xf1, 0x3b, 0xf5, 0x8d, 0xc6, 0x97, 0x19, 0x50, 0x0b, 0xd0, + 0x44, 0x0d, 0xa2, 0x48, 0x48, 0x6e, 0x25, 0xfc, 0xa0, 0x3d, 0x88, 0x1d, 0xb1, 0x1f, 0x45, 0x27, + 0xaf, 0x43, 0xa1, 0x7c, 0xaf, 0x2e, 0x24, 0x1b, 0x74, 0x6d, 0xf9, 0x5e, 0x5d, 0xc8, 0x2b, 0xb3, + 0xec, 0xbd, 0xba, 0xfa, 0x95, 0x3c, 0x90, 0x24, 0x25, 0x79, 0x05, 0x86, 0x10, 0xba, 0xc6, 0x74, + 0x46, 0xce, 0x68, 0xbb, 0xe1, 0x36, 0x1c, 0x84, 0x46, 0x2c, 0x44, 0x9f, 0x94, 0xbc, 0x86, 0x39, + 0xc3, 0x45, 0x4e, 0xc5, 0x48, 0x46, 0xdb, 0x0d, 0xd7, 0xcf, 0xb2, 0x1d, 0x4b, 0x19, 0x2e, 0x88, + 0xd1, 0xb8, 0xbc, 0x57, 0x9f, 0xb7, 0x5d, 0x4f, 0x88, 0x9a, 0x1b, 0x97, 0x1b, 0x2e, 0xa6, 0x52, + 0x8e, 0x18, 0x97, 0x9c, 0x0c, 0xd3, 0xc1, 0xdd, 0xab, 0xf3, 0xf7, 0x56, 0x86, 0x66, 0xb7, 0x7c, + 0xab, 0x94, 0xa7, 0x83, 0xdb, 0x70, 0x1b, 0xfc, 0xad, 0x96, 0x81, 0xc9, 0xca, 0x23, 0xe9, 0xe0, + 0x22, 0xa5, 0xd4, 0x9f, 0x1c, 0x84, 0x89, 0x8a, 0xee, 0xe9, 0xab, 0xba, 0x4b, 0xa5, 0x2d, 0xf9, + 0xb8, 0x0f, 0xf3, 0x3f, 0x47, 0x92, 0x83, 0xb1, 0x9a, 0xf2, 0x35, 0xf1, 0x02, 0xe4, 0x8d, 0x90, + 0x6f, 0x90, 0xac, 0x57, 0xce, 0xfe, 0xb7, 0xda, 0xe8, 0x08, 0xb0, 0x96, 0x20, 0x24, 0xcf, 0xc3, + 0xb0, 0x0f, 0x63, 0xbb, 0x88, 0x42, 0xa8, 0x33, 0xc6, 0x2a, 0xdb, 0x44, 0x68, 0x32, 0x9a, 0xbc, + 0x06, 0x23, 0xfe, 0x4f, 0xc9, 0x3e, 0xe7, 0xa9, 0x0c, 0x57, 0x13, 0x5b, 0x30, 0x99, 0x54, 0x2e, + 0x8a, 0xf3, 0x5b, 0x7f, 0xa4, 0x68, 0x2c, 0x5b, 0x60, 0x84, 0x94, 0x7c, 0x19, 0xc6, 0xfc, 0xdf, + 0x62, 0xd7, 0xc1, 0xbd, 0x0f, 0x9f, 0x0f, 0x72, 0xa1, 0xc7, 0xc4, 0x3a, 0x15, 0x25, 0xe7, 0xfb, + 0x8f, 0x27, 0xfc, 0x04, 0x78, 0xc6, 0x6a, 0x72, 0xfb, 0x11, 0xab, 0x80, 0x54, 0xe1, 0x94, 0x0f, + 0x09, 0x35, 0x74, 0x20, 0xdc, 0x76, 0x1a, 0xab, 0x8d, 0x54, 0x25, 0x4d, 0x96, 0x22, 0x2d, 0xb8, + 0x14, 0x01, 0x1a, 0xee, 0xba, 0x79, 0xdf, 0x13, 0x7b, 0x46, 0x11, 0x4c, 0x5b, 0x64, 0x3c, 0x0d, + 0xb8, 0x72, 0x1a, 0x3f, 0x75, 0x71, 0x34, 0xcd, 0x59, 0x4f, 0x6e, 0xa4, 0x0e, 0x67, 0x7c, 0xfc, + 0xcd, 0x99, 0x5a, 0xcd, 0xb1, 0xdf, 0xa3, 0x4d, 0xaf, 0x5a, 0x11, 0x7b, 0x6e, 0x0c, 0xb2, 0x68, + 0xac, 0x36, 0xd6, 0x9a, 0x1d, 0xa6, 0x14, 0x0c, 0x17, 0x65, 0x9e, 0x5a, 0x98, 0xdc, 0x85, 0xb3, + 0x12, 0x5c, 0xca, 0xab, 0x0e, 0xe1, 0xa1, 0x80, 0xe0, 0x9a, 0x9e, 0x5a, 0x3d, 0xbd, 0x38, 0x79, + 0x13, 0x46, 0x7d, 0x04, 0xbf, 0x8a, 0x1c, 0xc6, 0xab, 0x48, 0x1c, 0x92, 0xc6, 0x6a, 0x23, 0xfe, + 0x2c, 0x38, 0x4a, 0x2c, 0x6b, 0xd4, 0xca, 0x66, 0x87, 0x0a, 0xb7, 0x60, 0x5f, 0xa3, 0xbc, 0xcd, + 0x4e, 0xaa, 0x32, 0x32, 0x52, 0xf2, 0x76, 0xa8, 0x51, 0xcb, 0x8e, 0xb9, 0x66, 0xf2, 0xed, 0xb8, + 0xff, 0x12, 0x78, 0xb5, 0x61, 0x23, 0x30, 0x4d, 0x3f, 0x38, 0xf9, 0xc5, 0x32, 0x9c, 0x4e, 0xd1, + 0xb1, 0x3d, 0xed, 0x18, 0xbf, 0x9a, 0x0f, 0x1b, 0x71, 0xcc, 0xb7, 0x8d, 0xd3, 0x30, 0xe8, 0x7f, + 0x89, 0x30, 0x1e, 0x94, 0xac, 0xa1, 0x19, 0xe7, 0xe1, 0xe3, 0x23, 0xe2, 0x38, 0xe6, 0x5b, 0xc9, + 0xc3, 0x10, 0xc7, 0x77, 0x73, 0xa1, 0x38, 0x8e, 0xf9, 0xf6, 0xf2, 0x27, 0x8a, 0xe1, 0x9c, 0x74, + 0xb2, 0xc7, 0x3c, 0x2c, 0x33, 0x39, 0x74, 0xa6, 0x2d, 0xed, 0xe1, 0x45, 0xae, 0xac, 0x9a, 0x03, + 0xfb, 0x53, 0x4d, 0xf2, 0x26, 0x0c, 0xd7, 0x6c, 0xd7, 0x5b, 0x73, 0xa8, 0x5b, 0x0b, 0x92, 0x41, + 0xe0, 0x6b, 0xee, 0x8e, 0x00, 0x37, 0x3a, 0x91, 0xd9, 0x5f, 0x26, 0x57, 0xff, 0x71, 0x21, 0xa1, + 0x0d, 0xdc, 0x70, 0x3d, 0x96, 0xda, 0x70, 0x08, 0x43, 0x9d, 0x5c, 0x0f, 0x57, 0x41, 0x6e, 0xe1, + 0xf7, 0x4b, 0x91, 0x2e, 0x57, 0x85, 0x81, 0x1f, 0x25, 0x21, 0x5f, 0x80, 0xf3, 0x11, 0x40, 0x4d, + 0x77, 0xf4, 0x36, 0xf5, 0xc2, 0xc4, 0x9b, 0x18, 0xbb, 0xcc, 0x2f, 0xdd, 0xe8, 0x04, 0x68, 0x39, + 0x99, 0x67, 0x06, 0x07, 0x49, 0xb5, 0x06, 0xf6, 0xe0, 0xa7, 0xfd, 0xb3, 0x85, 0xd0, 0xd0, 0x89, + 0xc6, 0x20, 0xd6, 0xa8, 0xdb, 0x6d, 0x79, 0x8f, 0x6f, 0x07, 0xef, 0x2f, 0xc3, 0xcb, 0x3c, 0x8c, + 0x97, 0xef, 0xdf, 0xa7, 0x4d, 0xcf, 0x0f, 0xad, 0xee, 0x8a, 0xa8, 0x93, 0x7c, 0xe3, 0x21, 0x50, + 0x22, 0x54, 0xb6, 0xdc, 0xaf, 0xf1, 0x62, 0xea, 0x3f, 0x29, 0x82, 0x12, 0x18, 0xfe, 0xc1, 0x7b, + 0xc5, 0x23, 0x5c, 0x64, 0x3f, 0x14, 0xbd, 0x62, 0xc2, 0xa9, 0x50, 0x18, 0xe2, 0xa1, 0x98, 0x48, + 0x05, 0x3f, 0x19, 0x67, 0x16, 0x12, 0xf2, 0xbd, 0xc4, 0x45, 0xb1, 0x97, 0x20, 0xe1, 0x7b, 0xd0, + 0x86, 0xcb, 0x59, 0x68, 0x49, 0xae, 0xe4, 0x6b, 0x39, 0x38, 0xe3, 0x77, 0xca, 0xf2, 0x2a, 0x33, + 0xaa, 0x67, 0xec, 0xae, 0x15, 0xbc, 0xa2, 0x7a, 0x3d, 0xbb, 0x3a, 0xde, 0x49, 0x53, 0x69, 0x85, + 0x79, 0x4b, 0x82, 0xf8, 0x2a, 0x81, 0x42, 0xd8, 0x48, 0xd3, 0x68, 0x22, 0x91, 0x96, 0x5a, 0xef, + 0xc5, 0x9b, 0x70, 0x21, 0x93, 0xe5, 0x4e, 0x46, 0x6c, 0xbf, 0x6c, 0xc4, 0xfe, 0x77, 0xb9, 0x70, + 0x22, 0x8a, 0x09, 0x89, 0x4c, 0x01, 0x84, 0x20, 0xb1, 0xad, 0xc5, 0x47, 0x5a, 0xa1, 0xd0, 0x34, + 0x89, 0x82, 0x2c, 0x43, 0x49, 0x88, 0x85, 0x27, 0xb9, 0xfe, 0xe4, 0x0e, 0xbd, 0x30, 0x25, 0xcb, + 0x01, 0xb7, 0xac, 0xe2, 0x9b, 0x05, 0x9b, 0x8b, 0xaf, 0xc1, 0xf0, 0x7e, 0xbf, 0xeb, 0x6b, 0x05, + 0x20, 0xf2, 0x1e, 0xf4, 0x08, 0x0d, 0xf4, 0x63, 0x3c, 0x85, 0x5d, 0x81, 0x41, 0xf6, 0x09, 0x98, + 0xf6, 0x45, 0x0a, 0xf3, 0xdc, 0x15, 0x30, 0x2d, 0xc0, 0x86, 0x31, 0xd6, 0x06, 0xd2, 0x63, 0xac, + 0xa9, 0x3f, 0x5d, 0x80, 0x73, 0x72, 0x87, 0x54, 0x28, 0x66, 0x8e, 0x38, 0xe9, 0x94, 0x0f, 0xb0, + 0x53, 0x54, 0x28, 0xf1, 0xad, 0x87, 0x48, 0xe1, 0xc1, 0x8f, 0x85, 0x10, 0xa2, 0x09, 0x8c, 0xfa, + 0x3f, 0xe7, 0x61, 0x34, 0x30, 0xef, 0x74, 0xc7, 0x7d, 0x8c, 0xbb, 0xe3, 0xd3, 0x30, 0x8a, 0x51, + 0xb2, 0xda, 0xd4, 0xe2, 0x91, 0xa4, 0xfa, 0xa5, 0x9c, 0x3b, 0x3e, 0x42, 0xa4, 0x57, 0x8b, 0x10, + 0x32, 0xed, 0xe7, 0x96, 0x9f, 0x14, 0xbb, 0x8c, 0x9b, 0x7d, 0x1c, 0xae, 0xfe, 0xf5, 0x02, 0x8c, + 0xf8, 0x52, 0x9e, 0x36, 0x8f, 0xeb, 0x3d, 0xcf, 0xd1, 0x0a, 0xf9, 0x1a, 0x40, 0xcd, 0x76, 0x3c, + 0xbd, 0xb5, 0x14, 0x6a, 0x3e, 0x1e, 0x90, 0x76, 0x10, 0xca, 0xcb, 0x48, 0x24, 0xb8, 0x7e, 0x85, + 0x66, 0x35, 0x9f, 0x98, 0xf8, 0xfa, 0x15, 0x40, 0x35, 0x89, 0x42, 0xfd, 0xad, 0x3c, 0x8c, 0xfb, + 0x9d, 0x34, 0xfb, 0x88, 0x36, 0xbb, 0x8f, 0xf3, 0xdc, 0x14, 0x95, 0x76, 0xff, 0x8e, 0xd2, 0x56, + 0xff, 0x4f, 0x69, 0x22, 0x99, 0x69, 0xd9, 0x27, 0x13, 0xc9, 0x9f, 0x85, 0x8e, 0xab, 0x3f, 0x52, + 0x80, 0x33, 0xbe, 0xd4, 0xe7, 0xba, 0x16, 0x1e, 0x2d, 0xcc, 0xe8, 0xad, 0xd6, 0xe3, 0xbc, 0x1b, + 0x1f, 0xf6, 0x05, 0xb1, 0x2c, 0xc2, 0x4e, 0x8a, 0x54, 0x97, 0xf7, 0x05, 0xb8, 0x61, 0x9b, 0x86, + 0x26, 0x13, 0x91, 0xb7, 0x61, 0xc4, 0xff, 0x59, 0x76, 0xd6, 0xfc, 0x2d, 0x38, 0x5e, 0x14, 0x04, + 0x85, 0x74, 0x27, 0x12, 0x5d, 0x23, 0x52, 0x40, 0xfd, 0xca, 0x00, 0x5c, 0xbc, 0x67, 0x5a, 0x86, + 0xbd, 0xe1, 0xfa, 0x99, 0x52, 0x8f, 0xfd, 0x41, 0xd9, 0x51, 0x67, 0x48, 0x7d, 0x07, 0xce, 0xc6, + 0x45, 0xea, 0x04, 0xf1, 0xeb, 0x45, 0xef, 0x6c, 0x70, 0x82, 0x86, 0x9f, 0x33, 0x55, 0xdc, 0xb6, + 0x69, 0xe9, 0x25, 0xe3, 0x49, 0x57, 0x07, 0x76, 0x93, 0x74, 0xf5, 0x39, 0x28, 0x55, 0xec, 0xb6, + 0x6e, 0xfa, 0x71, 0x96, 0x70, 0x14, 0x07, 0xf5, 0x22, 0x46, 0x13, 0x14, 0x8c, 0xbf, 0xa8, 0x18, + 0xbb, 0x6c, 0x28, 0xe4, 0xef, 0x17, 0x60, 0x56, 0x9a, 0x26, 0x13, 0x11, 0x1b, 0x46, 0x45, 0x75, + 0xe2, 0x6e, 0x0c, 0x70, 0xf3, 0xf4, 0xb2, 0x2f, 0xa3, 0x6c, 0xb5, 0x9a, 0x8a, 0x94, 0xe3, 0xdb, + 0x28, 0x9e, 0x0b, 0x56, 0x7c, 0x0c, 0xbf, 0x25, 0xd3, 0xa2, 0xfc, 0x25, 0x21, 0xe0, 0x24, 0x33, + 0x9c, 0x14, 0x02, 0xce, 0x32, 0x32, 0x11, 0x99, 0x85, 0x53, 0x18, 0x65, 0x3c, 0xd8, 0x4a, 0x31, + 0x95, 0x18, 0x41, 0xa3, 0x12, 0xaf, 0x5c, 0x78, 0x60, 0x72, 0xf6, 0x71, 0x8d, 0xa6, 0x40, 0x6b, + 0xc9, 0x12, 0xe4, 0x02, 0x14, 0x96, 0x16, 0xca, 0x78, 0x57, 0x33, 0xc8, 0x33, 0x7c, 0x59, 0x2d, + 0x5d, 0x63, 0xb0, 0x8b, 0x9f, 0x05, 0x92, 0xfc, 0x9c, 0x3d, 0xdd, 0xc7, 0xfc, 0x97, 0xd2, 0x96, + 0xef, 0xb8, 0x7b, 0xd4, 0x1c, 0xc6, 0x44, 0x18, 0x49, 0xae, 0xd7, 0xff, 0x41, 0x26, 0xd7, 0x2b, + 0x1d, 0x6a, 0x72, 0x3d, 0xf5, 0x97, 0x73, 0x70, 0x2a, 0x11, 0x89, 0x9f, 0xbc, 0x04, 0xc0, 0x21, + 0x52, 0xc4, 0x53, 0x0c, 0x21, 0x14, 0x46, 0xe7, 0x17, 0xcb, 0x63, 0x48, 0x46, 0xae, 0xc1, 0x20, + 0xff, 0x25, 0xa2, 0x94, 0x25, 0x8b, 0x74, 0xbb, 0xa6, 0xa1, 0x05, 0x44, 0x61, 0x2d, 0x78, 0x23, + 0x59, 0x48, 0x2d, 0xe2, 0x6d, 0x76, 0x82, 0x5a, 0x18, 0x99, 0xfa, 0x93, 0x79, 0x18, 0x09, 0x1a, + 0x5c, 0x36, 0x8e, 0x4a, 0xe7, 0x4a, 0x22, 0xa9, 0x41, 0x61, 0xa7, 0xa4, 0x06, 0xb1, 0xf9, 0x56, + 0x64, 0x31, 0x38, 0xbc, 0x57, 0x59, 0x5f, 0xcf, 0xc3, 0x78, 0x50, 0xeb, 0x11, 0x5e, 0x7e, 0x7d, + 0x88, 0x44, 0xf2, 0xb5, 0x1c, 0x28, 0xd3, 0x66, 0xab, 0x65, 0x5a, 0x6b, 0x55, 0xeb, 0xbe, 0xed, + 0xb4, 0x71, 0x42, 0x3c, 0xba, 0x23, 0x5c, 0xf5, 0xcf, 0xe7, 0xe0, 0x94, 0x68, 0xd0, 0x8c, 0xee, + 0x18, 0x47, 0x77, 0x3e, 0x16, 0x6f, 0xc9, 0xd1, 0xe9, 0x8b, 0xfa, 0xed, 0x3c, 0xc0, 0x82, 0xdd, + 0x7c, 0x70, 0xcc, 0x1f, 0x75, 0xbd, 0x01, 0x25, 0xee, 0x16, 0x2f, 0x34, 0xf6, 0x94, 0x78, 0xbc, + 0xc4, 0x3e, 0x8d, 0x23, 0xa6, 0x27, 0xc4, 0x7c, 0x5c, 0xe2, 0x9e, 0xf5, 0x4a, 0x4e, 0x13, 0x45, + 0x58, 0xa5, 0x8c, 0x4e, 0x2c, 0x18, 0x41, 0xa5, 0x0c, 0x16, 0xad, 0x74, 0x7b, 0x6b, 0xb2, 0xd8, + 0xb2, 0x9b, 0x0f, 0x34, 0xa4, 0x57, 0xff, 0x55, 0x8e, 0xcb, 0xee, 0x98, 0x3f, 0x4d, 0xf5, 0x3f, + 0xbf, 0xb8, 0xc7, 0xcf, 0xff, 0x0b, 0x39, 0x38, 0xa3, 0xd1, 0xa6, 0xfd, 0x90, 0x3a, 0x9b, 0x33, + 0xb6, 0x41, 0x6f, 0x52, 0x8b, 0x3a, 0x47, 0x35, 0xa2, 0x7e, 0x1b, 0xb3, 0xc0, 0x84, 0x8d, 0xb9, + 0xe3, 0x52, 0xe3, 0xf8, 0x64, 0xe8, 0x51, 0x7f, 0x75, 0x00, 0x94, 0x54, 0xab, 0xf7, 0xd8, 0x9a, + 0x73, 0x99, 0x5b, 0x99, 0xe2, 0x61, 0x6d, 0x65, 0xfa, 0xf7, 0xb6, 0x95, 0x29, 0xed, 0x75, 0x2b, + 0x33, 0xb0, 0x9b, 0xad, 0x4c, 0x3b, 0xbe, 0x95, 0x19, 0xc4, 0xad, 0xcc, 0x4b, 0x3d, 0xb7, 0x32, + 0xb3, 0x96, 0xb1, 0xcf, 0x8d, 0xcc, 0xb1, 0xcd, 0x1e, 0xbd, 0x9f, 0x1d, 0xd8, 0x15, 0x36, 0x29, + 0x36, 0x6d, 0xc7, 0xa0, 0x86, 0xd8, 0x78, 0xe1, 0xa9, 0xbf, 0x23, 0x60, 0x5a, 0x80, 0x4d, 0xa4, + 0xe2, 0x1e, 0xdd, 0x4d, 0x2a, 0xee, 0x43, 0xd8, 0x7f, 0x7d, 0x35, 0x0f, 0xa7, 0x66, 0xa8, 0xe3, + 0xf1, 0x58, 0xb4, 0x87, 0xe1, 0x12, 0x57, 0x86, 0x71, 0x89, 0x21, 0x5a, 0xe4, 0xf9, 0xd0, 0xcd, + 0xaf, 0x49, 0x1d, 0x2f, 0xee, 0x25, 0x18, 0xa7, 0x67, 0xd5, 0xfb, 0xe9, 0xf0, 0xc4, 0xd8, 0x0d, + 0xaa, 0xf7, 0xe1, 0x5c, 0x90, 0xa6, 0xf8, 0xa5, 0x05, 0xf4, 0x52, 0x86, 0xbb, 0xe2, 0xde, 0x33, + 0xdc, 0xa9, 0xbf, 0x94, 0x83, 0xcb, 0x1a, 0xb5, 0xe8, 0x86, 0xbe, 0xda, 0xa2, 0x52, 0xb3, 0xc4, + 0xca, 0xc0, 0x66, 0x0d, 0xd3, 0x6d, 0xeb, 0x5e, 0x73, 0xfd, 0x40, 0x32, 0x9a, 0x83, 0x11, 0x79, + 0xfe, 0xda, 0xc3, 0xdc, 0x16, 0x29, 0xa7, 0xfe, 0x6a, 0x11, 0x06, 0xa6, 0x6d, 0xef, 0x96, 0x7d, + 0xc0, 0x94, 0x8b, 0xe1, 0x94, 0x9f, 0xdf, 0xc3, 0x59, 0xcf, 0xa7, 0xb0, 0x72, 0x29, 0x0b, 0x05, + 0xba, 0x90, 0xae, 0xda, 0x89, 0x6c, 0x1d, 0x3e, 0xd9, 0x1e, 0x93, 0x2d, 0xbe, 0x02, 0x43, 0x18, + 0x42, 0x46, 0x3a, 0x8d, 0x45, 0x07, 0x6d, 0x8f, 0x01, 0xe3, 0x75, 0x84, 0xa4, 0xe4, 0x0b, 0x91, + 0xe0, 0xb9, 0xa5, 0x83, 0x27, 0x67, 0x94, 0xe3, 0xe8, 0xbe, 0xc4, 0x2f, 0xf2, 0xb0, 0x4d, 0x52, + 0x22, 0x1b, 0x3c, 0x45, 0x89, 0x35, 0x29, 0x20, 0x3c, 0xc4, 0xc4, 0x89, 0x33, 0x30, 0x3a, 0x6d, + 0x7b, 0x92, 0x33, 0xf0, 0x50, 0xf8, 0x96, 0x94, 0x49, 0x3e, 0xdd, 0x13, 0x38, 0x5a, 0x46, 0xfd, + 0xd3, 0x22, 0x8c, 0xf8, 0x3f, 0x8f, 0x48, 0x77, 0x5e, 0x80, 0xd2, 0xbc, 0x2d, 0xe5, 0xf2, 0x40, + 0x07, 0xe2, 0x75, 0xdb, 0x8d, 0x79, 0x46, 0x0b, 0x22, 0x26, 0xf5, 0x25, 0xdb, 0x90, 0xdd, 0xdf, + 0x51, 0xea, 0x96, 0x6d, 0x24, 0xde, 0x20, 0x07, 0x84, 0xe4, 0x32, 0x14, 0xf1, 0xe5, 0x80, 0x74, + 0x90, 0x1f, 0x7b, 0x2d, 0x80, 0x78, 0x49, 0x2b, 0x4b, 0x7b, 0xd5, 0xca, 0x81, 0xfd, 0x6a, 0xe5, + 0xe0, 0xe1, 0x6a, 0xe5, 0xbb, 0x30, 0x82, 0x35, 0xf9, 0xa9, 0x00, 0x77, 0x5e, 0x58, 0x2f, 0x88, + 0xb5, 0x6f, 0x94, 0xb7, 0x5b, 0x24, 0x04, 0xc4, 0x25, 0x2f, 0xc2, 0x2a, 0xa6, 0xbb, 0x70, 0x80, + 0xed, 0xf4, 0x3f, 0xce, 0xc1, 0xc0, 0x1d, 0xeb, 0x81, 0x65, 0x6f, 0x1c, 0x4c, 0xe3, 0x5e, 0x82, + 0x61, 0xc1, 0x46, 0x5a, 0x5d, 0xf0, 0x59, 0x79, 0x97, 0x83, 0x1b, 0xc8, 0x49, 0x93, 0xa9, 0xc8, + 0x9b, 0x41, 0x21, 0x7c, 0x1c, 0x54, 0x08, 0xb3, 0xe1, 0xf8, 0x85, 0x9a, 0xd1, 0x04, 0x1e, 0x32, + 0x39, 0xb9, 0x04, 0xc5, 0x0a, 0x6b, 0xaa, 0x14, 0xc8, 0x97, 0x35, 0x45, 0x43, 0xa8, 0xfa, 0xd5, + 0x22, 0x8c, 0xc5, 0x0e, 0xbe, 0x9e, 0x83, 0x21, 0x71, 0xf0, 0x64, 0xfa, 0x19, 0x45, 0xf0, 0xf1, + 0x50, 0x00, 0xd4, 0x06, 0xf9, 0x9f, 0x55, 0x83, 0x7c, 0x06, 0x06, 0x6c, 0x17, 0x17, 0x45, 0xfc, + 0x96, 0xb1, 0x70, 0x08, 0x2d, 0xd7, 0x59, 0xdb, 0xf9, 0xe0, 0x10, 0x24, 0xb2, 0x46, 0xda, 0x2e, + 0x7e, 0xda, 0x0d, 0x18, 0xd2, 0x5d, 0x97, 0x7a, 0x0d, 0x4f, 0x5f, 0x93, 0x93, 0x8c, 0x04, 0x40, + 0x79, 0x74, 0x20, 0x70, 0x45, 0x5f, 0x23, 0x9f, 0x85, 0xd1, 0xa6, 0x43, 0x71, 0xd9, 0xd4, 0x5b, + 0xac, 0x95, 0x92, 0x59, 0x1b, 0x41, 0xc8, 0xf7, 0x27, 0x21, 0xa2, 0x6a, 0x90, 0xbb, 0x30, 0x2a, + 0x3e, 0x87, 0x7b, 0xee, 0xe3, 0x40, 0x1b, 0x0b, 0x97, 0x31, 0x2e, 0x12, 0xee, 0xbb, 0x2f, 0x1e, + 0x70, 0xc8, 0xe4, 0x32, 0x5f, 0x43, 0x22, 0x25, 0xcb, 0x40, 0x36, 0xe8, 0x6a, 0x43, 0xef, 0x7a, + 0xeb, 0xac, 0x2e, 0x1e, 0x23, 0x5f, 0xe4, 0xd6, 0xc4, 0x57, 0x0f, 0x49, 0xac, 0xfc, 0x18, 0x64, + 0x83, 0xae, 0x96, 0x23, 0x48, 0x72, 0x0f, 0xce, 0x26, 0x8b, 0xb0, 0x4f, 0xe6, 0x97, 0x03, 0xcf, + 0x6e, 0x6f, 0x4d, 0x4e, 0xa6, 0x12, 0x48, 0x6c, 0x4f, 0x27, 0xd8, 0x56, 0x8d, 0x5b, 0xc5, 0xc1, + 0x81, 0x89, 0x41, 0x6d, 0x8c, 0x95, 0xf5, 0x4d, 0x48, 0xd3, 0x50, 0xff, 0x20, 0xc7, 0x4c, 0x45, + 0xf6, 0x41, 0x98, 0x5c, 0x9c, 0xe9, 0x7a, 0x7b, 0x8f, 0xba, 0xde, 0x0e, 0xd3, 0x80, 0x96, 0xdc, + 0x1e, 0xb3, 0xab, 0x26, 0xb0, 0x64, 0x0a, 0x4a, 0x86, 0x7c, 0x6a, 0x76, 0x2e, 0xda, 0x09, 0x7e, + 0x3d, 0x9a, 0xa0, 0x22, 0x57, 0xa0, 0xc8, 0x96, 0xac, 0xf8, 0x96, 0x59, 0xb6, 0x2e, 0x34, 0xa4, + 0x50, 0x7f, 0x28, 0x0f, 0x23, 0xd2, 0xd7, 0x5c, 0x3f, 0xd0, 0xe7, 0xbc, 0xbe, 0xbb, 0x66, 0xfa, + 0x4e, 0x2f, 0xb8, 0x97, 0xf2, 0x9b, 0x7c, 0x23, 0x10, 0xc5, 0xae, 0x2e, 0xa4, 0x84, 0x60, 0x5e, + 0x11, 0x1f, 0x5a, 0xda, 0xfd, 0xf6, 0x91, 0xd1, 0xdf, 0x2a, 0x0e, 0xe6, 0x27, 0x0a, 0xb7, 0x8a, + 0x83, 0xc5, 0x89, 0x7e, 0x0c, 0xe6, 0x85, 0xf1, 0xb3, 0xf9, 0xde, 0xdc, 0xba, 0x6f, 0xae, 0x1d, + 0xf3, 0xb7, 0x23, 0x87, 0x1b, 0xe8, 0x2c, 0x26, 0x9b, 0x63, 0xfe, 0x90, 0xe4, 0x03, 0x95, 0xcd, + 0x49, 0xda, 0x50, 0x21, 0x9b, 0x7f, 0x92, 0x03, 0x25, 0x55, 0x36, 0xe5, 0x23, 0xf2, 0x83, 0x38, + 0xbc, 0xe4, 0xa1, 0x7f, 0x9c, 0x87, 0x53, 0x55, 0xcb, 0xa3, 0x6b, 0x7c, 0xc7, 0x78, 0xcc, 0xa7, + 0x8a, 0xdb, 0x30, 0x2c, 0x7d, 0x8c, 0xe8, 0xf3, 0x27, 0x82, 0xfd, 0x78, 0x88, 0xca, 0xe0, 0x24, + 0x97, 0x3e, 0xbc, 0x97, 0x38, 0x71, 0x21, 0x1f, 0xf3, 0x39, 0xe7, 0x78, 0x08, 0xf9, 0x98, 0x4f, + 0x5e, 0x1f, 0x52, 0x21, 0xff, 0x67, 0x79, 0x38, 0x9d, 0x52, 0x39, 0xb9, 0x0c, 0x03, 0xf5, 0xee, + 0x2a, 0xc6, 0xee, 0xca, 0x85, 0x1e, 0xc3, 0x6e, 0x77, 0x15, 0xc3, 0x76, 0x69, 0x3e, 0x92, 0xac, + 0xe0, 0xe3, 0xfa, 0xe5, 0x6a, 0x65, 0x46, 0x48, 0x55, 0x95, 0xc2, 0x04, 0x30, 0x70, 0xda, 0x97, + 0x05, 0x0f, 0xf0, 0x6d, 0xd3, 0x68, 0xc6, 0x1e, 0xe0, 0xb3, 0x32, 0xe4, 0x07, 0x60, 0xa8, 0xfc, + 0x7e, 0xd7, 0xa1, 0xc8, 0x97, 0x4b, 0xfc, 0x63, 0x01, 0x5f, 0x1f, 0x91, 0xc6, 0x99, 0xc7, 0x12, + 0x60, 0x14, 0x71, 0xde, 0x21, 0x43, 0xb2, 0x0c, 0xa5, 0x9b, 0xa6, 0x37, 0xdf, 0x5d, 0x15, 0xbd, + 0x10, 0xc4, 0xf7, 0xe2, 0xd0, 0x34, 0xbe, 0xb8, 0x2b, 0xe7, 0x71, 0x8a, 0xe5, 0x3d, 0x10, 0x2f, + 0xa0, 0xfe, 0x64, 0x0e, 0x2e, 0x66, 0x7f, 0x2e, 0xf9, 0x14, 0x0c, 0xb0, 0xad, 0x7e, 0x59, 0x5b, + 0x12, 0xb2, 0xe4, 0x99, 0x7b, 0xed, 0x16, 0x6d, 0xe8, 0x8e, 0xbc, 0x7b, 0xf0, 0xc9, 0xc8, 0x5b, + 0x30, 0x5c, 0x75, 0xdd, 0x2e, 0x75, 0xea, 0x2f, 0xdd, 0xd1, 0xaa, 0x62, 0x93, 0x89, 0x9b, 0x18, + 0x13, 0xc1, 0x0d, 0xf7, 0xa5, 0x58, 0xb8, 0x2f, 0x99, 0x5e, 0xfd, 0xb1, 0x1c, 0x5c, 0xea, 0x25, + 0x26, 0xf2, 0x12, 0x0c, 0xae, 0x50, 0x4b, 0xb7, 0xbc, 0x6a, 0x45, 0x34, 0x09, 0xf7, 0x6c, 0x1e, + 0xc2, 0xa2, 0x5b, 0x8f, 0x80, 0x90, 0x15, 0xe2, 0x07, 0x95, 0x81, 0x67, 0x04, 0x3f, 0x54, 0x45, + 0x58, 0xac, 0x90, 0x4f, 0xa8, 0x7e, 0x01, 0x2e, 0x64, 0x4a, 0x95, 0x7c, 0x06, 0x46, 0x96, 0x9d, + 0x35, 0xdd, 0x32, 0xdf, 0xe7, 0x83, 0x22, 0x17, 0xee, 0x8b, 0x6d, 0x09, 0x2e, 0xef, 0xd5, 0x64, + 0x7a, 0xf5, 0x0f, 0xf3, 0x30, 0x52, 0x6b, 0x75, 0xd7, 0x4c, 0x69, 0x99, 0xdb, 0xf7, 0xee, 0xc0, + 0xb7, 0xd5, 0xf3, 0x7b, 0xb3, 0xd5, 0xd9, 0xe4, 0xe0, 0xec, 0x73, 0x72, 0xf0, 0xcb, 0x91, 0x37, + 0xa1, 0xd4, 0xc1, 0xef, 0x88, 0x9f, 0x1b, 0xf3, 0xaf, 0xcb, 0x3a, 0x37, 0xe6, 0x65, 0xd8, 0x6c, + 0xd0, 0x3c, 0xc0, 0x6c, 0x10, 0x96, 0x95, 0x04, 0x1a, 0x2e, 0x69, 0x27, 0x02, 0x3d, 0x14, 0x81, + 0x86, 0xcb, 0xd7, 0x89, 0x40, 0x0f, 0x20, 0xd0, 0x5f, 0xcd, 0xc3, 0x58, 0xb4, 0x4a, 0xf2, 0x29, + 0x18, 0xe6, 0xd5, 0xf0, 0x53, 0xac, 0x9c, 0xe4, 0x02, 0x1d, 0x82, 0x35, 0xe0, 0x3f, 0xc4, 0x71, + 0xdc, 0xf8, 0xba, 0xee, 0x36, 0xc2, 0xf3, 0x24, 0x7e, 0xdb, 0x3c, 0xc8, 0xfd, 0xb6, 0x62, 0x28, + 0x6d, 0x6c, 0x5d, 0x77, 0x67, 0xc2, 0xdf, 0x64, 0x16, 0x88, 0x43, 0xbb, 0x2e, 0x8d, 0x32, 0x28, + 0x22, 0x03, 0x91, 0x93, 0x3d, 0x8e, 0xd5, 0x4e, 0x71, 0x98, 0xcc, 0xe6, 0x8b, 0x41, 0xb3, 0x51, + 0x19, 0xfa, 0x77, 0x91, 0x30, 0x5e, 0xa2, 0x4f, 0x3f, 0x94, 0xe5, 0x04, 0x15, 0xdd, 0xd3, 0xf9, + 0x11, 0x82, 0xdf, 0x01, 0xea, 0x0f, 0x7f, 0x19, 0xfa, 0x97, 0x2d, 0xba, 0x7c, 0x9f, 0xbc, 0x08, + 0x43, 0x4c, 0x61, 0x16, 0x6c, 0xd6, 0x97, 0x39, 0xe1, 0xed, 0x21, 0x69, 0x12, 0x22, 0xe6, 0xfb, + 0xb4, 0x90, 0x8a, 0xdc, 0x00, 0x08, 0x1f, 0xc4, 0x09, 0xed, 0x23, 0x72, 0x19, 0x8e, 0x99, 0xef, + 0xd3, 0x24, 0x3a, 0xbf, 0x94, 0x78, 0x4e, 0x54, 0x48, 0x96, 0xe2, 0x18, 0xbf, 0x94, 0x18, 0x1f, + 0x0b, 0x40, 0xd8, 0xaf, 0x9a, 0xee, 0xba, 0x1b, 0xb6, 0x63, 0xcc, 0xac, 0xeb, 0xd6, 0x1a, 0x8d, + 0xef, 0xf5, 0x92, 0x14, 0xf3, 0x7d, 0x5a, 0x4a, 0x39, 0xf2, 0x3a, 0x8c, 0xc8, 0xee, 0xaf, 0x71, + 0x17, 0x15, 0x19, 0x37, 0xdf, 0xa7, 0x45, 0x68, 0xc9, 0xab, 0x30, 0x2c, 0x7e, 0xdf, 0xb2, 0xc5, + 0xfd, 0xb7, 0x14, 0x39, 0x49, 0x42, 0xcd, 0xf7, 0x69, 0x32, 0xa5, 0x54, 0x69, 0xcd, 0x31, 0x2d, + 0x4f, 0xbc, 0xa8, 0x8e, 0x57, 0x8a, 0x38, 0xa9, 0x52, 0xfc, 0x4d, 0xde, 0x82, 0xd1, 0x20, 0x24, + 0xd5, 0x7b, 0xb4, 0xe9, 0x89, 0xa3, 0xfa, 0xb3, 0xb1, 0xc2, 0x1c, 0x39, 0xdf, 0xa7, 0x45, 0xa9, + 0xc9, 0x15, 0x28, 0x69, 0xd4, 0x35, 0xdf, 0xf7, 0x2f, 0xb7, 0xc7, 0xa4, 0x71, 0x6e, 0xbe, 0xcf, + 0xa4, 0x24, 0xf0, 0xac, 0x77, 0xc2, 0xdb, 0x74, 0x71, 0xb0, 0x4e, 0x62, 0xb5, 0xcc, 0x5a, 0x06, + 0xeb, 0x1d, 0xc9, 0x95, 0xe2, 0xb3, 0x61, 0xa0, 0x2e, 0x91, 0xa7, 0x76, 0x38, 0x1e, 0x11, 0x41, + 0xc6, 0xce, 0xf7, 0x69, 0x31, 0x7a, 0x49, 0xaa, 0x15, 0xd3, 0x7d, 0x20, 0x02, 0xac, 0xc6, 0xa5, + 0xca, 0x50, 0x92, 0x54, 0xd9, 0x4f, 0xa9, 0xea, 0x25, 0xea, 0x6d, 0xd8, 0xce, 0x03, 0x11, 0x4e, + 0x35, 0x5e, 0xb5, 0xc0, 0x4a, 0x55, 0x0b, 0x88, 0x5c, 0x35, 0x1b, 0x70, 0x63, 0xe9, 0x55, 0xeb, + 0x9e, 0x2e, 0x57, 0xcd, 0xcf, 0x0d, 0xfd, 0x4e, 0x5a, 0xa0, 0xfa, 0x43, 0xaa, 0x8c, 0xa7, 0x76, + 0x28, 0xe2, 0xa4, 0x0e, 0xc5, 0xdf, 0xac, 0x52, 0x29, 0x25, 0xbc, 0x32, 0x11, 0xad, 0x54, 0x42, + 0xb1, 0x4a, 0xe5, 0xe4, 0xf1, 0x37, 0xe4, 0x4c, 0xe9, 0xca, 0xa9, 0x68, 0x07, 0x85, 0x18, 0xd6, + 0x41, 0x52, 0x46, 0xf5, 0x49, 0xcc, 0xc2, 0xac, 0x10, 0x24, 0x1f, 0x0e, 0x5a, 0x38, 0x53, 0x9b, + 0xef, 0xd3, 0x30, 0x3f, 0xb3, 0xca, 0xf3, 0x7b, 0x2b, 0xa7, 0x91, 0x62, 0xc4, 0xa7, 0x60, 0xb0, + 0xf9, 0x3e, 0x8d, 0xe7, 0xfe, 0x7e, 0x51, 0xca, 0x81, 0xa8, 0x9c, 0x89, 0x4e, 0x11, 0x01, 0x82, + 0x4d, 0x11, 0x61, 0xa6, 0xc4, 0xb9, 0x64, 0xa6, 0x3f, 0xe5, 0x6c, 0x74, 0xa9, 0x89, 0xe3, 0xe7, + 0xfb, 0xb4, 0x64, 0x76, 0xc0, 0x57, 0x23, 0xc9, 0xef, 0x94, 0x73, 0xb1, 0x70, 0x65, 0x21, 0x8a, + 0x89, 0x4b, 0x4e, 0x93, 0xb7, 0x0c, 0xa7, 0x79, 0xee, 0x5c, 0x11, 0x70, 0x4c, 0x4c, 0x56, 0xe7, + 0xa3, 0xdb, 0xac, 0x14, 0x92, 0xf9, 0x3e, 0x2d, 0xad, 0x24, 0x99, 0x49, 0xa4, 0xa0, 0x53, 0x94, + 0xa8, 0x27, 0x4f, 0x0c, 0x3d, 0xdf, 0xa7, 0x25, 0x92, 0xd6, 0xdd, 0x90, 0x73, 0xbf, 0x29, 0x17, + 0xa2, 0x9d, 0x18, 0x62, 0x58, 0x27, 0x4a, 0x39, 0xe2, 0x6e, 0xc8, 0xf9, 0xc0, 0x94, 0x8b, 0xc9, + 0x52, 0xe1, 0xcc, 0x29, 0xe5, 0x0d, 0xd3, 0xd2, 0x53, 0x1c, 0x29, 0x4f, 0x88, 0x44, 0xc7, 0xa2, + 0x7c, 0x1a, 0xcd, 0x7c, 0x9f, 0x96, 0x9e, 0x1e, 0x49, 0x4b, 0xcf, 0x0d, 0xa4, 0x5c, 0xea, 0xc5, + 0x33, 0x68, 0x5d, 0x7a, 0x5e, 0x21, 0xbd, 0x47, 0xa6, 0x16, 0xe5, 0xc9, 0xe8, 0x86, 0x2c, 0x93, + 0x70, 0xbe, 0x4f, 0xeb, 0x91, 0xef, 0xe5, 0x4e, 0x46, 0xda, 0x14, 0xe5, 0xa9, 0x68, 0x9e, 0xf3, + 0x54, 0xa2, 0xf9, 0x3e, 0x2d, 0x23, 0xe9, 0xca, 0x9d, 0x8c, 0xac, 0x1a, 0xca, 0x64, 0x4f, 0xb6, + 0x81, 0x3c, 0x32, 0x72, 0x72, 0x2c, 0xa7, 0x26, 0xa4, 0x50, 0x9e, 0x8e, 0xaa, 0x6e, 0x0a, 0x09, + 0x53, 0xdd, 0xb4, 0x54, 0x16, 0xcb, 0xa9, 0x19, 0x14, 0x94, 0x67, 0x7a, 0x30, 0x0c, 0xda, 0x98, + 0x9a, 0x7b, 0x61, 0x39, 0x35, 0x85, 0x81, 0xa2, 0x46, 0x19, 0xa6, 0x90, 0x30, 0x86, 0x69, 0xc9, + 0x0f, 0x96, 0x53, 0x23, 0xdd, 0x2b, 0xcf, 0xf6, 0x60, 0x18, 0xb6, 0x30, 0x2d, 0x46, 0xfe, 0xab, + 0x91, 0x50, 0xf3, 0xca, 0xc7, 0xa2, 0xf3, 0x86, 0x84, 0x62, 0xf3, 0x86, 0x1c, 0x94, 0x7e, 0x26, + 0x11, 0x07, 0x57, 0xf9, 0x78, 0x74, 0x98, 0xc7, 0xd0, 0x6c, 0x98, 0xc7, 0x23, 0xe7, 0xce, 0x24, + 0xe2, 0x81, 0x2a, 0x97, 0xb3, 0x98, 0x20, 0x3a, 0xca, 0x84, 0x47, 0x10, 0xad, 0xa6, 0x04, 0xa4, + 0x54, 0x3e, 0x11, 0xf5, 0x42, 0x4f, 0x10, 0xcc, 0xf7, 0x69, 0x29, 0x61, 0x2c, 0xb5, 0xf4, 0xe8, + 0x4b, 0xca, 0x95, 0xe8, 0xb0, 0x4d, 0xa3, 0x61, 0xc3, 0x36, 0x35, 0x72, 0xd3, 0x42, 0xda, 0x53, + 0x19, 0xe5, 0x6a, 0xd4, 0x30, 0x4b, 0x52, 0x30, 0xc3, 0x2c, 0xe5, 0x89, 0x8d, 0x96, 0x1e, 0x11, + 0x48, 0x79, 0xae, 0x67, 0x0b, 0x91, 0x26, 0xa5, 0x85, 0x3c, 0x40, 0x4e, 0x68, 0x3b, 0xdd, 0xe9, + 0xb4, 0x6c, 0xdd, 0x50, 0x3e, 0x99, 0x6a, 0x3b, 0x71, 0xa4, 0x64, 0x3b, 0x71, 0x00, 0x5b, 0xe5, + 0xe5, 0x17, 0x19, 0xca, 0xf3, 0xd1, 0x55, 0x5e, 0xc6, 0xb1, 0x55, 0x3e, 0xf2, 0x7a, 0x63, 0x26, + 0xf1, 0x7a, 0x41, 0x79, 0x21, 0xaa, 0x00, 0x31, 0x34, 0x53, 0x80, 0xf8, 0x7b, 0x87, 0x2f, 0x65, + 0xfb, 0xfb, 0x2b, 0x53, 0xc8, 0xed, 0x69, 0x9f, 0x5b, 0x16, 0xdd, 0x7c, 0x9f, 0x96, 0xfd, 0x66, + 0xa0, 0x9a, 0xe2, 0xbe, 0xaf, 0x5c, 0x8b, 0x2a, 0x58, 0x82, 0x80, 0x29, 0x58, 0xd2, 0xe9, 0xbf, + 0x9a, 0xe2, 0x7f, 0xaf, 0x7c, 0x2a, 0x93, 0x55, 0xf0, 0xcd, 0x29, 0x5e, 0xfb, 0x37, 0x64, 0x07, + 0x7a, 0xe5, 0xc5, 0xe8, 0x62, 0x17, 0x62, 0xd8, 0x62, 0x27, 0x39, 0xda, 0xdf, 0x90, 0x5d, 0xc7, + 0x95, 0xeb, 0xc9, 0x52, 0xe1, 0x12, 0x29, 0xb9, 0x98, 0x6b, 0xe9, 0x1e, 0xd7, 0xca, 0x4b, 0x51, + 0xad, 0x4b, 0xa3, 0x61, 0x5a, 0x97, 0xea, 0xad, 0x3d, 0x97, 0x74, 0x9c, 0x56, 0x6e, 0xc4, 0x37, + 0xd9, 0x51, 0x3c, 0xb3, 0x7c, 0x12, 0xce, 0xd6, 0x9f, 0x8d, 0x87, 0x06, 0x54, 0x5e, 0x8e, 0x5d, + 0x52, 0x47, 0xb0, 0xcc, 0xbe, 0x8d, 0x85, 0x12, 0xfc, 0x6c, 0x3c, 0x9a, 0x9e, 0xf2, 0x4a, 0x3a, + 0x87, 0x40, 0x57, 0xe2, 0xd1, 0xf7, 0x3e, 0x1b, 0x0f, 0x40, 0xa7, 0xbc, 0x9a, 0xce, 0x21, 0x90, + 0x6e, 0x3c, 0x60, 0xdd, 0x8b, 0x52, 0x48, 0x7c, 0xe5, 0xd3, 0x51, 0xd3, 0x31, 0x40, 0x30, 0xd3, + 0x31, 0x0c, 0x9c, 0xff, 0xa2, 0x14, 0x4a, 0x5e, 0x79, 0x2d, 0x51, 0x24, 0x68, 0xac, 0x14, 0x70, + 0xfe, 0x45, 0x29, 0x04, 0xbb, 0xf2, 0x7a, 0xa2, 0x48, 0xd0, 0x3a, 0x29, 0x50, 0xbb, 0xd1, 0xeb, + 0xb5, 0xad, 0xf2, 0x46, 0xf4, 0xe8, 0x3a, 0x9b, 0x72, 0xbe, 0x4f, 0xeb, 0xf5, 0x6a, 0xf7, 0x4b, + 0xd9, 0x6e, 0xe8, 0xca, 0x9b, 0xd1, 0x21, 0x9c, 0x45, 0xc7, 0x86, 0x70, 0xa6, 0x2b, 0xfb, 0x5b, + 0xb1, 0xc8, 0x1b, 0xca, 0x5b, 0xd1, 0x29, 0x2e, 0x82, 0x64, 0x53, 0x5c, 0x3c, 0x4e, 0x47, 0x24, + 0xa4, 0x84, 0xf2, 0x99, 0xe8, 0x14, 0x27, 0xe3, 0xd8, 0x14, 0x17, 0x09, 0x3f, 0x31, 0x93, 0x88, + 0x74, 0xa0, 0xbc, 0x1d, 0x9d, 0xe2, 0x62, 0x68, 0x36, 0xc5, 0xc5, 0x63, 0x23, 0xbc, 0x15, 0x7b, + 0xf0, 0xaf, 0x7c, 0x36, 0xbd, 0xfd, 0x88, 0x94, 0xdb, 0xcf, 0xc3, 0x03, 0x68, 0xe9, 0x2f, 0xd7, + 0x95, 0x72, 0x74, 0xfc, 0xa6, 0xd1, 0xb0, 0xf1, 0x9b, 0xfa, 0xea, 0x3d, 0xbe, 0x71, 0x10, 0x5a, + 0x35, 0xdd, 0x63, 0xe3, 0x10, 0x9a, 0x22, 0x29, 0xe0, 0xc8, 0x1e, 0x99, 0x6f, 0x84, 0x66, 0x32, + 0xf6, 0xc8, 0xfe, 0x36, 0x28, 0x46, 0xcf, 0x66, 0xd7, 0x84, 0x57, 0xb4, 0x52, 0x89, 0xce, 0xae, + 0x09, 0x02, 0x36, 0xbb, 0x26, 0x7d, 0xa9, 0xe7, 0x60, 0x42, 0x68, 0x11, 0x77, 0xf6, 0x36, 0xad, + 0x35, 0x65, 0x36, 0xf6, 0x3a, 0x34, 0x86, 0x67, 0xb3, 0x53, 0x1c, 0x86, 0xeb, 0x35, 0x87, 0xcd, + 0xb4, 0xcc, 0xce, 0xaa, 0xad, 0x3b, 0x46, 0x9d, 0x5a, 0x86, 0x32, 0x17, 0x5b, 0xaf, 0x53, 0x68, + 0x70, 0xbd, 0x4e, 0x81, 0x63, 0x40, 0xbb, 0x18, 0x5c, 0xa3, 0x4d, 0x6a, 0x3e, 0xa4, 0xca, 0x4d, + 0x64, 0x3b, 0x99, 0xc5, 0x56, 0x90, 0xcd, 0xf7, 0x69, 0x59, 0x1c, 0x98, 0xad, 0xbe, 0xb8, 0x59, + 0x7f, 0x67, 0x21, 0x08, 0x96, 0x50, 0x73, 0x68, 0x47, 0x77, 0xa8, 0x32, 0x1f, 0xb5, 0xd5, 0x53, + 0x89, 0x98, 0xad, 0x9e, 0x8a, 0x48, 0xb2, 0xf5, 0xc7, 0x42, 0xb5, 0x17, 0xdb, 0x70, 0x44, 0xa4, + 0x97, 0x66, 0xb3, 0x53, 0x14, 0xc1, 0x04, 0xb4, 0x60, 0x5b, 0x6b, 0x78, 0x52, 0x71, 0x2b, 0x3a, + 0x3b, 0x65, 0x53, 0xb2, 0xd9, 0x29, 0x1b, 0xcb, 0x54, 0x3d, 0x8a, 0xe5, 0x63, 0xf0, 0x76, 0x54, + 0xd5, 0x53, 0x48, 0x98, 0xaa, 0xa7, 0x80, 0x93, 0x0c, 0x35, 0xea, 0x52, 0x4f, 0x59, 0xe8, 0xc5, + 0x10, 0x49, 0x92, 0x0c, 0x11, 0x9c, 0x64, 0x38, 0x47, 0xbd, 0xe6, 0xba, 0xb2, 0xd8, 0x8b, 0x21, + 0x92, 0x24, 0x19, 0x22, 0x98, 0x6d, 0x36, 0xa3, 0xe0, 0xe9, 0x6e, 0xeb, 0x81, 0xdf, 0x67, 0x4b, + 0xd1, 0xcd, 0x66, 0x26, 0x21, 0xdb, 0x6c, 0x66, 0x22, 0xc9, 0x8f, 0xed, 0xda, 0x6b, 0x5f, 0x59, + 0xc6, 0x0a, 0xa7, 0x42, 0xbb, 0x60, 0x37, 0xa5, 0xe6, 0xfb, 0xb4, 0xdd, 0xbe, 0x0a, 0xf8, 0x64, + 0xe0, 0xe2, 0xaa, 0xd4, 0xb0, 0xaa, 0xf1, 0xe0, 0xac, 0x82, 0x83, 0xe7, 0xfb, 0xb4, 0xc0, 0x09, + 0xf6, 0x55, 0x18, 0xc6, 0x8f, 0xaa, 0x5a, 0xa6, 0x57, 0x99, 0x56, 0xde, 0x89, 0x6e, 0x99, 0x24, + 0x14, 0xdb, 0x32, 0x49, 0x3f, 0xd9, 0x24, 0x8e, 0x3f, 0xf9, 0x14, 0x53, 0x99, 0x56, 0xb4, 0xe8, + 0x24, 0x1e, 0x41, 0xb2, 0x49, 0x3c, 0x02, 0x08, 0xea, 0xad, 0x38, 0x76, 0xa7, 0x32, 0xad, 0xd4, + 0x53, 0xea, 0xe5, 0xa8, 0xa0, 0x5e, 0xfe, 0x33, 0xa8, 0xb7, 0xbe, 0xde, 0xf5, 0x2a, 0xec, 0x1b, + 0x57, 0x52, 0xea, 0xf5, 0x91, 0x41, 0xbd, 0x3e, 0x80, 0x4d, 0x85, 0x08, 0xa8, 0x39, 0x36, 0x9b, + 0xb4, 0x6f, 0x9b, 0xad, 0x96, 0x72, 0x27, 0x3a, 0x15, 0xc6, 0xf1, 0x6c, 0x2a, 0x8c, 0xc3, 0x98, + 0xe9, 0xc9, 0x5b, 0x45, 0x57, 0xbb, 0x6b, 0xca, 0xdd, 0xa8, 0xe9, 0x19, 0x62, 0x98, 0xe9, 0x19, + 0xfe, 0xc2, 0xdd, 0x05, 0xfb, 0xa5, 0xd1, 0xfb, 0x0e, 0x75, 0xd7, 0x95, 0x7b, 0xb1, 0xdd, 0x85, + 0x84, 0xc3, 0xdd, 0x85, 0xf4, 0x9b, 0xac, 0xc1, 0x13, 0x91, 0x85, 0xc6, 0xbf, 0xb4, 0xa9, 0x53, + 0xdd, 0x69, 0xae, 0x2b, 0x9f, 0x43, 0x56, 0xcf, 0xa6, 0x2e, 0x55, 0x51, 0xd2, 0xf9, 0x3e, 0xad, + 0x17, 0x27, 0xdc, 0x96, 0xbf, 0xb3, 0xc0, 0xe3, 0xd6, 0x6a, 0xb5, 0x19, 0x7f, 0x13, 0xfa, 0x6e, + 0x6c, 0x5b, 0x9e, 0x24, 0xc1, 0x6d, 0x79, 0x12, 0x4c, 0x3a, 0xf0, 0x54, 0x6c, 0xab, 0xb6, 0xa8, + 0xb7, 0xd8, 0xbe, 0x84, 0x1a, 0x35, 0xbd, 0xf9, 0x80, 0x7a, 0xca, 0xe7, 0x91, 0xf7, 0xe5, 0x8c, + 0x0d, 0x5f, 0x8c, 0x7a, 0xbe, 0x4f, 0xdb, 0x81, 0x1f, 0x51, 0xa1, 0x58, 0x9f, 0x5b, 0xa9, 0x29, + 0x5f, 0x88, 0x9e, 0x6f, 0x32, 0xd8, 0x7c, 0x9f, 0x86, 0x38, 0x66, 0xa5, 0xdd, 0xe9, 0xac, 0x39, + 0xba, 0x41, 0xb9, 0xa1, 0x85, 0xb6, 0x9b, 0x30, 0x40, 0x7f, 0x20, 0x6a, 0xa5, 0x65, 0xd1, 0x31, + 0x2b, 0x2d, 0x0b, 0xc7, 0x14, 0x35, 0x92, 0xa2, 0x45, 0xf9, 0x62, 0x54, 0x51, 0x23, 0x48, 0xa6, + 0xa8, 0xd1, 0x84, 0x2e, 0x9f, 0x83, 0x73, 0xc1, 0x7e, 0x5e, 0xac, 0xbf, 0xbc, 0xd3, 0x94, 0x2f, + 0x21, 0x9f, 0xa7, 0x12, 0x97, 0x01, 0x11, 0xaa, 0xf9, 0x3e, 0x2d, 0xa3, 0x3c, 0x5b, 0x71, 0x13, 0x29, 0xcc, 0x84, 0x79, 0xf1, 0x83, 0xd1, 0x15, 0x37, 0x83, 0x8c, 0xad, 0xb8, 0x19, 0xa8, 0x54, 0xe6, 0x42, 0xa8, 0xfa, 0x0e, 0xcc, 0x03, 0x99, 0x66, 0x71, 0x48, 0x65, 0x2e, 0x2c, 0xb5, 0xd5, - 0x1d, 0x98, 0x07, 0xd6, 0x5a, 0x16, 0x07, 0x72, 0x15, 0x4a, 0xf5, 0xfa, 0xa2, 0xd6, 0xb5, 0x94, + 0x1d, 0x98, 0x07, 0xd6, 0x5a, 0x16, 0x07, 0x72, 0x05, 0x4a, 0xf5, 0xfa, 0xa2, 0xd6, 0xb5, 0x94, 0x66, 0xcc, 0xb7, 0x17, 0xa1, 0xf3, 0x7d, 0x9a, 0xc0, 0x33, 0x33, 0x68, 0xb6, 0xa5, 0xbb, 0x9e, 0xd9, 0x74, 0x71, 0xc4, 0xf8, 0x23, 0xc4, 0x88, 0x9a, 0x41, 0x69, 0x34, 0xcc, 0x0c, 0x4a, 0x83, 0x33, 0x7b, 0x71, 0x46, 0x77, 0x5d, 0xdd, 0x32, 0x1c, 0x7d, 0x1a, 0x97, 0x09, 0x1a, 0x7b, 0x3b, - 0x16, 0xc1, 0x32, 0x7b, 0x31, 0x0a, 0xc1, 0xc3, 0x77, 0x1f, 0xe2, 0x9b, 0x39, 0x0f, 0x62, 0x87, + 0x16, 0xc1, 0x32, 0x7b, 0x31, 0x0a, 0xc1, 0xc3, 0x77, 0x1f, 0xe2, 0x9b, 0x39, 0xf7, 0x63, 0x87, 0xef, 0x31, 0x3c, 0x1e, 0xbe, 0xc7, 0x60, 0x68, 0x77, 0xfa, 0x30, 0x8d, 0xae, 0x99, 0x4c, 0x44, 0xca, 0x5a, 0xcc, 0xee, 0x8c, 0x13, 0xa0, 0xdd, 0x19, 0x07, 0x46, 0x9a, 0xe4, 0x2f, 0xb7, 0xeb, 0x19, 0x4d, 0x0a, 0x57, 0xd9, 0x44, 0x19, 0xb6, 0x7e, 0x87, 0x83, 0xa3, 0xb2, 0x69, 0xe9, 0x6d, 0xbb, 0x32, 0xed, 0x4b, 0xdd, 0x8c, 0xae, 0xdf, 0x99, 0x84, 0x6c, 0xfd, 0xce, 0x44, 0xb2, 0xd9, 0xd5, 0xdf, 0x68, 0xad, 0xeb, 0x0e, 0x35, 0x2a, 0xa6, 0x83, 0x27, 0x8b, 0x9b, 0x7c, 0x6b, 0xf8, - 0x7e, 0x74, 0x76, 0xed, 0x41, 0xca, 0x66, 0xd7, 0x1e, 0x68, 0x66, 0xe4, 0xa5, 0xa3, 0x35, 0xaa, - 0x1b, 0xca, 0xc3, 0xa8, 0x91, 0x97, 0x4d, 0xc9, 0x8c, 0xbc, 0x6c, 0x6c, 0xf6, 0xe7, 0xdc, 0x77, + 0x5e, 0x74, 0x76, 0xed, 0x41, 0xca, 0x66, 0xd7, 0x1e, 0x68, 0x66, 0xe4, 0xa5, 0xa3, 0x35, 0xaa, + 0x1b, 0xca, 0x83, 0xa8, 0x91, 0x97, 0x4d, 0xc9, 0x8c, 0xbc, 0x6c, 0x6c, 0xf6, 0xe7, 0xdc, 0x73, 0x4c, 0x8f, 0x2a, 0xad, 0xdd, 0x7c, 0x0e, 0x92, 0x66, 0x7f, 0x0e, 0xa2, 0xd9, 0x86, 0x30, 0xde, 0x21, 0xed, 0xe8, 0x86, 0x30, 0xd9, 0x0d, 0xf1, 0x12, 0xcc, 0x62, 0x11, 0x4f, 0x08, 0x15, 0x2b, 0x6a, 0xb1, 0x08, 0x30, 0xb3, 0x58, 0xc2, 0x47, 0x86, 0x91, 0x87, 0x63, 0x8a, 0x1d, 0x5d, 0x43, - 0x65, 0x1c, 0x5b, 0x43, 0x23, 0x8f, 0xcc, 0x5e, 0x8b, 0xbc, 0x8a, 0x50, 0x3a, 0x51, 0xab, 0x43, + 0x65, 0x1c, 0x5b, 0x43, 0x23, 0x8f, 0xcc, 0x5e, 0x8d, 0xbc, 0x8a, 0x50, 0x3a, 0x51, 0xab, 0x43, 0x42, 0x31, 0xab, 0x43, 0x7e, 0x3f, 0x31, 0x03, 0xe3, 0x78, 0x0b, 0xae, 0x75, 0x83, 0x7b, 0x9c, - 0x1f, 0x8a, 0x7e, 0x66, 0x0c, 0xcd, 0x3e, 0x33, 0x06, 0x8a, 0x30, 0x11, 0xd3, 0x96, 0x93, 0xc1, - 0x24, 0x3c, 0x1f, 0x8c, 0x81, 0xc8, 0x02, 0x90, 0x7a, 0x79, 0x71, 0xa1, 0x6a, 0xd4, 0xe4, 0x2b, - 0x32, 0x37, 0x7a, 0x02, 0x9b, 0xa4, 0x98, 0xef, 0xd3, 0x52, 0xca, 0x91, 0xf7, 0xe1, 0x92, 0x80, - 0x8a, 0xf7, 0xe1, 0x35, 0xc7, 0x7e, 0x64, 0x1a, 0xc1, 0x82, 0xe0, 0x45, 0xbd, 0xee, 0x7a, 0xd1, - 0xce, 0xf7, 0x69, 0x3d, 0x79, 0x65, 0xd7, 0x25, 0xd6, 0x87, 0xee, 0x6e, 0xea, 0x0a, 0x16, 0x89, - 0x9e, 0xbc, 0xb2, 0xeb, 0x12, 0x72, 0x7f, 0xb4, 0x9b, 0xba, 0x82, 0x4e, 0xe8, 0xc9, 0x8b, 0xb8, - 0x30, 0xd9, 0x0b, 0x5f, 0x6e, 0xb5, 0x94, 0x0d, 0xac, 0xee, 0x13, 0xbb, 0xa9, 0xae, 0x8c, 0x06, - 0xe7, 0x4e, 0x1c, 0xd9, 0x2c, 0xbd, 0xdc, 0xa1, 0x56, 0x3d, 0xb2, 0x00, 0x3d, 0x8e, 0xce, 0xd2, - 0x09, 0x02, 0x36, 0x4b, 0x27, 0x80, 0x6c, 0x40, 0xc9, 0x8f, 0x6b, 0x94, 0xcd, 0xe8, 0x80, 0x92, - 0x71, 0x6c, 0x40, 0x45, 0x1e, 0xe2, 0x2c, 0xc3, 0xe9, 0xe5, 0x87, 0x9e, 0xee, 0x5b, 0x90, 0xae, - 0xe8, 0xca, 0x0f, 0x62, 0x97, 0x4c, 0x49, 0x12, 0xbc, 0x64, 0x4a, 0x82, 0xd9, 0x18, 0x61, 0xe0, - 0xfa, 0xa6, 0xd5, 0x9c, 0xd3, 0xcd, 0x56, 0xd7, 0xa1, 0xca, 0xbf, 0x16, 0x1d, 0x23, 0x31, 0x34, - 0x1b, 0x23, 0x31, 0x10, 0x5b, 0xa0, 0x19, 0xa8, 0xec, 0xba, 0xe6, 0x9a, 0x25, 0xf6, 0x95, 0xdd, - 0x96, 0xa7, 0xfc, 0xeb, 0xd1, 0x05, 0x3a, 0x8d, 0x86, 0x2d, 0xd0, 0x69, 0x70, 0x3c, 0x75, 0x62, - 0xbd, 0xc0, 0x16, 0x0f, 0xf9, 0xae, 0xf2, 0xdf, 0x88, 0x9d, 0x3a, 0xa5, 0xd0, 0xe0, 0xa9, 0x53, - 0x0a, 0x9c, 0xad, 0x8f, 0xdc, 0x26, 0x5b, 0x30, 0x83, 0xbb, 0xea, 0x7f, 0x33, 0xba, 0x3e, 0xc6, - 0xf1, 0x6c, 0x7d, 0x8c, 0xc3, 0xa2, 0x7c, 0x44, 0x17, 0xfc, 0x5b, 0x59, 0x7c, 0x02, 0xf9, 0x27, - 0xca, 0x90, 0x5b, 0x32, 0x1f, 0x31, 0x52, 0x7e, 0x38, 0x97, 0xc5, 0x28, 0x18, 0x1e, 0x89, 0x42, - 0x51, 0x46, 0x1a, 0x7d, 0x64, 0xd2, 0x0d, 0xe5, 0xcb, 0x99, 0x8c, 0x38, 0x41, 0x94, 0x11, 0x87, - 0x91, 0xf7, 0xe0, 0x5c, 0x08, 0x5b, 0xa4, 0xed, 0xd5, 0x60, 0x66, 0xfa, 0x91, 0x5c, 0xd4, 0x0c, - 0x4e, 0x27, 0x63, 0x66, 0x70, 0x3a, 0x26, 0x8d, 0xb5, 0x10, 0xdd, 0xbf, 0xbd, 0x03, 0xeb, 0x40, - 0x82, 0x19, 0x0c, 0xd2, 0x58, 0x0b, 0x69, 0xfe, 0xe8, 0x0e, 0xac, 0x03, 0x99, 0x66, 0x30, 0x20, - 0x3f, 0x91, 0x83, 0x2b, 0xe9, 0xa8, 0x72, 0xab, 0x35, 0x67, 0x3b, 0x21, 0x4e, 0xf9, 0x33, 0xb9, - 0xe8, 0x41, 0xc3, 0xee, 0x8a, 0xcd, 0xf7, 0x69, 0xbb, 0xac, 0x80, 0x7c, 0x06, 0x46, 0xcb, 0x5d, - 0xc3, 0xf4, 0xf0, 0xe2, 0x8d, 0x19, 0xce, 0x3f, 0x96, 0x8b, 0x6d, 0x71, 0x64, 0x2c, 0x6e, 0x71, - 0x64, 0x00, 0xb9, 0x0d, 0xa7, 0xea, 0xb4, 0xd9, 0x75, 0x4c, 0x6f, 0x53, 0xa3, 0x1d, 0xdb, 0xf1, - 0x18, 0x8f, 0x3f, 0x9b, 0x8b, 0x4e, 0x62, 0x09, 0x0a, 0x36, 0x89, 0x25, 0x80, 0xe4, 0x5e, 0xe2, - 0x56, 0x5e, 0x74, 0xe6, 0x8f, 0xe7, 0x7a, 0x5e, 0xcb, 0x07, 0x7d, 0x99, 0x5e, 0x9c, 0xd4, 0x62, - 0xb7, 0xe8, 0x82, 0xeb, 0x4f, 0xe4, 0x7a, 0x5c, 0xa3, 0x4b, 0x33, 0x5c, 0x12, 0xcc, 0x38, 0xa6, - 0x24, 0xbd, 0x57, 0xfe, 0x5c, 0xae, 0xc7, 0xb5, 0x77, 0xc8, 0x31, 0x2d, 0x5f, 0xfe, 0x2b, 0xdc, - 0x53, 0x44, 0x30, 0xfa, 0xc9, 0x5c, 0xd2, 0x55, 0x24, 0x28, 0x2f, 0x11, 0xb2, 0x62, 0x77, 0xdd, - 0x40, 0xe9, 0xbf, 0x92, 0x4b, 0xfa, 0xe6, 0x85, 0xc5, 0xc2, 0x5f, 0x84, 0xc2, 0xc5, 0xd9, 0xc7, - 0x1e, 0x75, 0x2c, 0xbd, 0x85, 0xdd, 0x59, 0xf7, 0x6c, 0x47, 0x5f, 0xa3, 0xb3, 0x96, 0xbe, 0xda, - 0xa2, 0xca, 0x4f, 0xe5, 0xa2, 0x16, 0x6c, 0x36, 0x29, 0xb3, 0x60, 0xb3, 0xb1, 0x64, 0x1d, 0x9e, - 0x4a, 0xc3, 0x56, 0x4c, 0x17, 0xeb, 0xf9, 0x6a, 0x2e, 0x6a, 0xc2, 0xf6, 0xa0, 0x65, 0x26, 0x6c, - 0x0f, 0x34, 0xb9, 0x01, 0x43, 0xd3, 0xb6, 0x3f, 0xfd, 0xfe, 0xf9, 0x98, 0x33, 0x64, 0x80, 0x99, - 0xef, 0xd3, 0x42, 0x32, 0x51, 0x46, 0x0c, 0xea, 0xaf, 0x25, 0xcb, 0x84, 0x97, 0x4f, 0xc1, 0x0f, - 0x51, 0x46, 0x88, 0xfb, 0xdf, 0x49, 0x96, 0x09, 0xef, 0xb8, 0x82, 0x1f, 0x6c, 0x26, 0xe1, 0x35, - 0x2e, 0xce, 0x95, 0x99, 0xdd, 0x36, 0xb3, 0xae, 0xb7, 0x5a, 0xd4, 0x5a, 0xa3, 0xca, 0xd7, 0x63, - 0x33, 0x49, 0x3a, 0x19, 0x9b, 0x49, 0xd2, 0x31, 0xe4, 0x07, 0xe0, 0xfc, 0x3d, 0xbd, 0x65, 0x1a, - 0x21, 0xce, 0x4f, 0x81, 0xae, 0xfc, 0x74, 0x2e, 0xba, 0x9b, 0xce, 0xa0, 0x63, 0xbb, 0xe9, 0x0c, - 0x14, 0x59, 0x04, 0x82, 0xcb, 0x68, 0x30, 0x5b, 0xb0, 0xf5, 0x59, 0xf9, 0x77, 0x73, 0x51, 0x3b, - 0x35, 0x49, 0xc2, 0xec, 0xd4, 0x24, 0x94, 0x34, 0xb2, 0x13, 0x99, 0x28, 0x3f, 0x93, 0x8b, 0x9e, - 0xd6, 0x64, 0x11, 0xce, 0xf7, 0x69, 0xd9, 0xd9, 0x50, 0x6e, 0xc1, 0x44, 0xbd, 0x56, 0x9d, 0x9b, - 0x9b, 0xad, 0xdf, 0xab, 0x56, 0xf0, 0x15, 0x85, 0xa1, 0xfc, 0x6c, 0x6c, 0xc5, 0x8a, 0x13, 0xb0, - 0x15, 0x2b, 0x0e, 0x23, 0x6f, 0xc2, 0x08, 0x6b, 0x3f, 0x1b, 0x30, 0xf8, 0xc9, 0x3f, 0x97, 0x8b, - 0x9a, 0x53, 0x32, 0x92, 0x99, 0x53, 0xf2, 0x6f, 0x52, 0x87, 0x33, 0x4c, 0x8a, 0x35, 0x87, 0x3e, - 0xa0, 0x0e, 0xb5, 0x9a, 0xfe, 0x98, 0xfe, 0xf9, 0x5c, 0xd4, 0xca, 0x48, 0x23, 0x62, 0x56, 0x46, - 0x1a, 0x9c, 0x3c, 0x84, 0x4b, 0xf1, 0x93, 0x20, 0xf9, 0x91, 0xac, 0xf2, 0x17, 0x72, 0x31, 0x63, - 0xb8, 0x07, 0x31, 0x1a, 0xc3, 0x3d, 0xf0, 0xc4, 0x82, 0xa7, 0xc5, 0xb1, 0x8a, 0x70, 0xb8, 0x8c, - 0xd7, 0xf6, 0x17, 0x79, 0x6d, 0x1f, 0x0f, 0x1d, 0x02, 0x7b, 0x50, 0xcf, 0xf7, 0x69, 0xbd, 0xd9, - 0x31, 0x3d, 0x4b, 0xa6, 0xeb, 0x50, 0xfe, 0x52, 0x2e, 0xdd, 0x23, 0x25, 0xe2, 0xa6, 0x9c, 0x96, - 0xe7, 0xe3, 0xbd, 0xac, 0x64, 0x13, 0xca, 0x5f, 0x8e, 0x8d, 0xb7, 0x74, 0x32, 0x36, 0xde, 0x32, - 0xb2, 0x55, 0xdc, 0x86, 0x53, 0x5c, 0xa9, 0x6b, 0x3a, 0x0e, 0x43, 0x6b, 0x8d, 0x1a, 0xca, 0xbf, - 0x17, 0x5b, 0xed, 0x12, 0x14, 0xe8, 0xda, 0x13, 0x07, 0xb2, 0xa9, 0xbb, 0xde, 0xd1, 0x2d, 0x0b, - 0x8f, 0x59, 0x95, 0x7f, 0x3f, 0x36, 0x75, 0x87, 0x28, 0x74, 0xdc, 0x0d, 0x7e, 0x31, 0x4d, 0xe8, - 0x95, 0xa8, 0x49, 0xf9, 0x2b, 0x31, 0x4d, 0xe8, 0x45, 0xcc, 0x34, 0xa1, 0x67, 0xd6, 0xa7, 0x7b, - 0x19, 0x0f, 0xd6, 0x95, 0x6f, 0xc4, 0x56, 0xe4, 0x54, 0x2a, 0xb6, 0x22, 0xa7, 0xbf, 0x77, 0xbf, - 0x97, 0xf1, 0xd8, 0x5b, 0xf9, 0x85, 0xde, 0x7c, 0xc3, 0x95, 0x3e, 0xfd, 0xad, 0xf8, 0xbd, 0x8c, - 0x87, 0xd2, 0xca, 0x5f, 0xed, 0xcd, 0x37, 0x74, 0xec, 0x4b, 0x7f, 0x67, 0xdd, 0xc8, 0x7e, 0x64, - 0xac, 0xfc, 0xb5, 0xf8, 0xd4, 0x95, 0x41, 0x88, 0x53, 0x57, 0xd6, 0x4b, 0xe5, 0x55, 0xb8, 0xc0, - 0x35, 0xe4, 0x96, 0xa3, 0x77, 0xd6, 0xeb, 0xd4, 0xf3, 0x4c, 0x6b, 0xcd, 0xdf, 0x89, 0xfd, 0xf5, - 0x5c, 0xec, 0x78, 0x2c, 0x8b, 0x12, 0x8f, 0xc7, 0xb2, 0x90, 0x4c, 0x79, 0x13, 0xcf, 0x89, 0x95, - 0xbf, 0x11, 0x53, 0xde, 0x04, 0x05, 0x53, 0xde, 0xe4, 0x2b, 0xe4, 0xdb, 0x29, 0xaf, 0x66, 0x95, - 0xff, 0x20, 0x9b, 0x57, 0xd0, 0xbe, 0x94, 0xc7, 0xb6, 0xb7, 0x53, 0x1e, 0x87, 0x2a, 0xff, 0x61, - 0x36, 0xaf, 0xd0, 0x07, 0x29, 0xf9, 0xa6, 0xf4, 0x3d, 0x38, 0xc7, 0x67, 0xf3, 0x39, 0x6a, 0xd0, - 0xc8, 0x87, 0xfe, 0x62, 0x6c, 0xec, 0xa7, 0x93, 0xe1, 0x91, 0x7b, 0x2a, 0x26, 0x8d, 0xb5, 0x68, - 0xeb, 0xdf, 0xdc, 0x81, 0x75, 0xb8, 0x21, 0x48, 0xc7, 0xb0, 0xf5, 0x46, 0x7e, 0xfc, 0xa6, 0xfc, - 0x52, 0x6c, 0xbd, 0x91, 0x91, 0xe8, 0xce, 0x21, 0xbf, 0x94, 0x7b, 0x33, 0xfa, 0xd0, 0x4b, 0xf9, - 0x5b, 0xa9, 0x85, 0x83, 0x0e, 0x88, 0xbe, 0x0a, 0x7b, 0x33, 0xfa, 0xa8, 0x49, 0xf9, 0xe5, 0xd4, - 0xc2, 0xc1, 0x07, 0x44, 0x5f, 0x40, 0xb1, 0x2d, 0x52, 0xd7, 0xb3, 0x39, 0xab, 0xc8, 0xf4, 0xf0, - 0xb7, 0xe3, 0x5b, 0xa4, 0x54, 0x32, 0xdc, 0x22, 0xa5, 0x62, 0xd2, 0x58, 0x8b, 0xcf, 0xfb, 0x95, - 0x1d, 0x58, 0x4b, 0x1b, 0xbb, 0x54, 0x4c, 0x1a, 0x6b, 0xf1, 0xf1, 0xdf, 0xdc, 0x81, 0xb5, 0xb4, - 0xb1, 0x4b, 0xc5, 0x30, 0x73, 0x2c, 0xc4, 0xdc, 0xa3, 0x8e, 0x1b, 0xaa, 0xdf, 0x7f, 0x14, 0x33, - 0xc7, 0x32, 0xe8, 0x98, 0x39, 0x96, 0x81, 0x4a, 0xe5, 0x2e, 0x84, 0xf2, 0xab, 0x3b, 0x71, 0x0f, - 0xef, 0x65, 0x32, 0x50, 0xa9, 0xdc, 0x85, 0x5c, 0xfe, 0xce, 0x4e, 0xdc, 0xc3, 0x8b, 0x99, 0x0c, - 0x14, 0x33, 0x8a, 0xea, 0x9e, 0xee, 0x99, 0xcd, 0x79, 0xdb, 0xf5, 0xa4, 0x45, 0xfe, 0x3f, 0x8e, - 0x19, 0x45, 0x69, 0x44, 0xcc, 0x28, 0x4a, 0x83, 0x27, 0x99, 0x0a, 0x69, 0xfc, 0x5a, 0x4f, 0xa6, - 0xa1, 0xa5, 0x95, 0x06, 0x4f, 0x32, 0x15, 0x42, 0xf8, 0x4f, 0x7a, 0x32, 0x0d, 0x3d, 0xe5, 0xd3, - 0xe0, 0xcc, 0x32, 0x9d, 0x71, 0xec, 0x0d, 0xeb, 0x36, 0xdd, 0xa0, 0x2d, 0xf1, 0xe9, 0xbf, 0x1e, - 0xb3, 0x4c, 0xe3, 0x04, 0x78, 0x8b, 0x12, 0x83, 0x45, 0x19, 0x89, 0xcf, 0xfd, 0x8d, 0x4c, 0x46, - 0xe1, 0x31, 0x51, 0x1c, 0x16, 0x65, 0x24, 0x3e, 0xf1, 0x37, 0x33, 0x19, 0x85, 0xc7, 0x44, 0x71, - 0x18, 0x29, 0xc3, 0x18, 0xbe, 0x95, 0xd0, 0x5d, 0xdf, 0xf3, 0xf3, 0x77, 0x72, 0xd1, 0x5b, 0xaf, - 0x28, 0x7a, 0xbe, 0x4f, 0x8b, 0x15, 0x90, 0x59, 0x88, 0x4f, 0xfa, 0x76, 0x06, 0x8b, 0xd0, 0xdf, - 0x31, 0x0a, 0x91, 0x59, 0x88, 0x8f, 0xf9, 0x4f, 0x33, 0x58, 0x84, 0x0e, 0x8f, 0x51, 0x08, 0xf9, - 0x34, 0x0c, 0xd7, 0xe7, 0x56, 0x6a, 0x7e, 0x32, 0xc1, 0xbf, 0x9b, 0x8b, 0xbd, 0x2a, 0x0a, 0x71, - 0xf8, 0xaa, 0x28, 0xfc, 0x39, 0x3d, 0x00, 0xfd, 0x78, 0x94, 0x7a, 0xbb, 0x34, 0xf8, 0xad, 0xdc, - 0xc4, 0x6f, 0xe5, 0x6e, 0x97, 0x06, 0x7f, 0x2b, 0x37, 0xf1, 0xdb, 0xec, 0xff, 0xdf, 0xce, 0x4d, - 0xfc, 0x4e, 0x4e, 0xbb, 0x10, 0x0e, 0x8b, 0xf2, 0x1a, 0xb5, 0xbc, 0x5a, 0x4b, 0x17, 0x83, 0x3a, - 0x15, 0xc5, 0x7f, 0xa6, 0xa2, 0x44, 0xe2, 0xae, 0x6f, 0xe4, 0x60, 0xa4, 0xee, 0x39, 0x54, 0x6f, - 0x8b, 0x38, 0x78, 0x17, 0x61, 0x90, 0x3b, 0x3f, 0xfb, 0xcf, 0xc0, 0xb5, 0xe0, 0x37, 0xb9, 0x02, - 0x63, 0x0b, 0xba, 0xeb, 0x61, 0x13, 0xab, 0x96, 0x41, 0x1f, 0xe3, 0xc3, 0xbf, 0x82, 0x16, 0x83, - 0x92, 0x05, 0x4e, 0xc7, 0xcb, 0x61, 0xe8, 0xd3, 0xc2, 0x8e, 0xe1, 0xdf, 0x06, 0xbf, 0xb3, 0x35, - 0xd9, 0x87, 0xd1, 0xde, 0x62, 0x65, 0xd5, 0xdf, 0xcf, 0x41, 0xc2, 0x2d, 0x7b, 0xff, 0xf1, 0x1e, - 0x96, 0x61, 0x3c, 0x16, 0x6e, 0x57, 0xbc, 0x5e, 0xdc, 0x65, 0x34, 0xde, 0x78, 0x69, 0xf2, 0x89, - 0xe0, 0xd5, 0xdc, 0x5d, 0x6d, 0x41, 0x84, 0xf6, 0xc3, 0xa4, 0x14, 0x5d, 0xa7, 0xa5, 0x49, 0x28, - 0x11, 0xba, 0xe9, 0x7b, 0x13, 0x61, 0x2c, 0x51, 0x72, 0x45, 0x04, 0x9f, 0xc8, 0x85, 0x01, 0x01, - 0x63, 0x29, 0xf0, 0x79, 0xb0, 0x89, 0xcf, 0xc0, 0x48, 0xb5, 0xdd, 0xa1, 0x8e, 0x6b, 0x5b, 0xba, - 0x67, 0x3b, 0xe2, 0xa9, 0x3d, 0x3e, 0x8a, 0x37, 0x25, 0xb8, 0xfc, 0x28, 0x5e, 0xa6, 0x27, 0xd7, - 0xfc, 0xbc, 0x7a, 0x05, 0x8c, 0xe2, 0x8a, 0x4f, 0x5a, 0xe3, 0x69, 0xd5, 0x39, 0x05, 0x23, 0xbd, - 0xeb, 0xea, 0xf8, 0xbe, 0x32, 0x20, 0xed, 0x32, 0x80, 0x4c, 0x8a, 0x14, 0xe4, 0x05, 0x28, 0xe1, - 0x7d, 0x94, 0x8b, 0xf9, 0x32, 0x45, 0x98, 0xc2, 0x16, 0x42, 0xe4, 0x80, 0x08, 0x9c, 0x86, 0xdc, - 0x81, 0x89, 0xf0, 0xb2, 0xfd, 0x96, 0x63, 0x77, 0x3b, 0x7e, 0x86, 0x1c, 0x4c, 0x47, 0xff, 0x30, - 0xc0, 0x35, 0xd6, 0x10, 0x29, 0xb1, 0x48, 0x14, 0x24, 0xf3, 0x30, 0x1e, 0xc2, 0x98, 0x88, 0xfc, - 0xcc, 0x5c, 0x98, 0x15, 0x55, 0xe2, 0xc5, 0xc4, 0x19, 0xc9, 0x8a, 0x1a, 0x2b, 0x46, 0xaa, 0x30, - 0xe0, 0xc7, 0x28, 0x1c, 0xdc, 0x51, 0x49, 0x4f, 0x8b, 0x18, 0x85, 0x03, 0x72, 0x74, 0x42, 0xbf, - 0x3c, 0x99, 0x83, 0x31, 0xcd, 0xee, 0x7a, 0x74, 0xc5, 0x16, 0xbb, 0x54, 0x11, 0x0b, 0x13, 0xdb, - 0xe4, 0x30, 0x4c, 0xc3, 0xb3, 0xfd, 0x6c, 0xfe, 0x72, 0x56, 0xf9, 0x68, 0x29, 0xb2, 0x04, 0xa7, - 0x12, 0x6e, 0x09, 0x72, 0x8e, 0x7d, 0xe9, 0xf3, 0x92, 0xcc, 0x92, 0x45, 0xc9, 0x8f, 0xe5, 0xa0, - 0xb4, 0xe2, 0xe8, 0xa6, 0xe7, 0x8a, 0xa7, 0x99, 0x67, 0xa7, 0x36, 0x1c, 0xbd, 0xc3, 0xf4, 0x63, - 0x0a, 0xc3, 0xf4, 0xde, 0xd3, 0x5b, 0x5d, 0xea, 0x4e, 0xdf, 0x67, 0x5f, 0xf7, 0xdf, 0x6f, 0x4d, - 0xbe, 0xc9, 0x83, 0x5a, 0x4c, 0x35, 0xed, 0xf6, 0xf5, 0x35, 0x47, 0x7f, 0x64, 0x7a, 0x68, 0x62, - 0xea, 0xad, 0xeb, 0x1e, 0x6d, 0xe1, 0x19, 0xeb, 0x75, 0xbd, 0x63, 0x5e, 0xc7, 0x70, 0xf0, 0xd7, - 0x03, 0x4e, 0xbc, 0x06, 0xa6, 0x02, 0x1e, 0xfe, 0x25, 0xab, 0x00, 0xc7, 0x91, 0x25, 0x00, 0xf1, - 0xa9, 0xe5, 0x4e, 0x47, 0xbc, 0xf3, 0x94, 0x4e, 0x26, 0x7d, 0x0c, 0x57, 0xec, 0x40, 0x60, 0x7a, - 0x47, 0x0a, 0x81, 0xac, 0x49, 0x1c, 0x98, 0x16, 0xac, 0x88, 0x16, 0xf9, 0x62, 0x1a, 0x0d, 0x25, - 0xee, 0x37, 0x36, 0x45, 0x48, 0xf1, 0x62, 0x64, 0x15, 0xc6, 0x05, 0xdf, 0x20, 0x61, 0xca, 0x58, - 0x74, 0x56, 0x88, 0xa1, 0xb9, 0xd2, 0x06, 0x6d, 0x34, 0x04, 0x58, 0xae, 0x23, 0x56, 0x82, 0x4c, - 0x87, 0x09, 0x9e, 0x97, 0xf4, 0x36, 0x75, 0x95, 0x71, 0xd4, 0xd8, 0x4b, 0xdb, 0x5b, 0x93, 0x8a, - 0x5f, 0x1e, 0xc3, 0x75, 0xca, 0xa2, 0x8b, 0x16, 0x91, 0x79, 0x70, 0xad, 0x9f, 0x48, 0xe1, 0x11, - 0xd7, 0xf9, 0x68, 0x11, 0x32, 0x03, 0xa3, 0xc1, 0x33, 0x93, 0xbb, 0x77, 0xab, 0x15, 0x7c, 0x48, - 0x2a, 0x22, 0xb6, 0xc6, 0x52, 0x9a, 0xc8, 0x4c, 0x22, 0x65, 0xa4, 0xc0, 0x1f, 0xfc, 0x65, 0x69, - 0x2c, 0xf0, 0x47, 0x27, 0x25, 0xf0, 0x47, 0x8d, 0xbc, 0x0d, 0xc3, 0xe5, 0xfb, 0x75, 0x11, 0xd0, - 0xc4, 0x55, 0x4e, 0x87, 0xf9, 0xb1, 0xf4, 0x0d, 0xb7, 0xe1, 0x07, 0x3f, 0x91, 0x9b, 0x2e, 0xd3, - 0x93, 0x59, 0x18, 0x8b, 0x78, 0xaa, 0xb9, 0xca, 0x19, 0xe4, 0x80, 0x2d, 0xd7, 0x11, 0xd3, 0x70, - 0x04, 0x4a, 0x1e, 0x5e, 0xd1, 0x42, 0x4c, 0x6b, 0x2a, 0xa6, 0x8b, 0xb9, 0x86, 0x34, 0x8a, 0xb1, - 0x53, 0xf0, 0x59, 0xea, 0x20, 0xd7, 0x1a, 0x43, 0xa0, 0x1a, 0x0e, 0xc7, 0xc9, 0x3d, 0x1a, 0x2b, - 0x46, 0xde, 0x07, 0x82, 0xd9, 0x89, 0xa8, 0xe1, 0x5f, 0x5c, 0x56, 0x2b, 0xae, 0x72, 0x0e, 0xc3, - 0x95, 0x93, 0x78, 0x38, 0x85, 0x6a, 0x65, 0xfa, 0x8a, 0x98, 0x3e, 0x2e, 0xeb, 0xbc, 0x54, 0xc3, - 0x0f, 0xa5, 0xd0, 0x30, 0x23, 0xa9, 0x9b, 0x53, 0xb8, 0x92, 0x0d, 0x38, 0x5f, 0x73, 0xe8, 0x23, - 0xd3, 0xee, 0xba, 0xfe, 0xf2, 0xe1, 0xcf, 0x5b, 0xe7, 0x77, 0x9c, 0xb7, 0x9e, 0x15, 0x15, 0x9f, - 0xed, 0x38, 0xf4, 0x51, 0xc3, 0x0f, 0x52, 0x1d, 0x89, 0xb1, 0x9a, 0xc5, 0x1d, 0x13, 0x50, 0x7f, - 0xd0, 0x75, 0xa8, 0x80, 0x9b, 0xd4, 0x55, 0x94, 0x70, 0xaa, 0xe5, 0x71, 0x75, 0xcc, 0x00, 0x17, - 0x49, 0x40, 0x1d, 0x2d, 0x46, 0x34, 0x20, 0xb7, 0x66, 0xfc, 0x4b, 0xec, 0x72, 0x93, 0xa7, 0xe9, - 0x55, 0x2e, 0x20, 0x33, 0x95, 0x89, 0x65, 0xad, 0x19, 0x04, 0xac, 0x6f, 0xe8, 0x02, 0x2f, 0x8b, - 0x25, 0x59, 0x9a, 0x2c, 0xc0, 0x44, 0xcd, 0xc1, 0x23, 0xb5, 0x3b, 0x74, 0xb3, 0x66, 0xb7, 0xcc, - 0xe6, 0x26, 0xbe, 0x8e, 0x15, 0x53, 0x65, 0x87, 0xe3, 0x1a, 0x0f, 0xe9, 0x66, 0xa3, 0x83, 0x58, - 0x79, 0x59, 0x89, 0x97, 0x94, 0x03, 0x48, 0x3f, 0xb5, 0xbb, 0x00, 0xd2, 0x14, 0x26, 0xc4, 0x15, - 0xf8, 0x63, 0x8f, 0x5a, 0x6c, 0xa9, 0x77, 0xc5, 0x4b, 0x58, 0x25, 0x76, 0x65, 0x1e, 0xe0, 0xf9, - 0xd4, 0x21, 0x46, 0x19, 0x0d, 0xc0, 0x72, 0xc3, 0xe2, 0x45, 0x92, 0x51, 0x96, 0x9f, 0xde, 0x47, - 0x94, 0xe5, 0xff, 0xbd, 0x20, 0xcf, 0xbf, 0xe4, 0x12, 0x14, 0xa5, 0x24, 0x48, 0x18, 0x42, 0x16, - 0x03, 0xc6, 0x17, 0x45, 0x64, 0xec, 0x21, 0x61, 0xbb, 0x04, 0xa1, 0x7d, 0x30, 0xeb, 0x65, 0x18, - 0x56, 0x54, 0x0b, 0x09, 0x30, 0xe3, 0x60, 0x77, 0xb5, 0x65, 0x36, 0x31, 0x8d, 0x40, 0x41, 0x0a, - 0xb7, 0x81, 0x50, 0x9e, 0x45, 0x40, 0x22, 0x21, 0x37, 0x60, 0xd8, 0x3f, 0xca, 0x0d, 0x43, 0x28, - 0x63, 0x74, 0x79, 0x31, 0x5b, 0x8b, 0xe0, 0xf5, 0x12, 0x11, 0x79, 0x03, 0x20, 0x9c, 0x0e, 0x84, - 0xa5, 0x85, 0x4b, 0x85, 0x3c, 0x7b, 0xc8, 0x4b, 0x45, 0x48, 0xcd, 0x26, 0x4e, 0x59, 0x1d, 0xfd, - 0x1c, 0xab, 0x38, 0x71, 0x46, 0x74, 0x58, 0x56, 0x90, 0x68, 0x11, 0xb2, 0x0c, 0xa7, 0x12, 0x1a, - 0x28, 0x02, 0x2e, 0x63, 0x9e, 0xfd, 0x14, 0xf5, 0x95, 0x17, 0xe6, 0x44, 0x59, 0xf2, 0x1c, 0x14, - 0xee, 0x6a, 0x55, 0x11, 0xf4, 0x95, 0xc7, 0x0b, 0x8e, 0x04, 0x70, 0x62, 0x58, 0xf2, 0x3a, 0x00, - 0x4f, 0xaa, 0x52, 0xb3, 0x1d, 0x0f, 0x2d, 0x8a, 0xd1, 0xe9, 0x0b, 0x6c, 0x2c, 0xf3, 0xa4, 0x2b, - 0x0d, 0xb6, 0x8c, 0xc9, 0x1f, 0x1d, 0x12, 0xab, 0x3f, 0x92, 0x4f, 0x2c, 0x6b, 0x4c, 0xf0, 0xa2, - 0x15, 0x52, 0xe7, 0xa3, 0xe0, 0xfd, 0xa6, 0x73, 0xc1, 0x4b, 0x44, 0xe4, 0x2a, 0x0c, 0xd6, 0xd8, - 0xa4, 0xd2, 0xb4, 0x5b, 0x42, 0x15, 0x30, 0xf2, 0x57, 0x47, 0xc0, 0xb4, 0x00, 0x4b, 0x6e, 0x48, - 0x59, 0x85, 0xa5, 0x10, 0xec, 0x7e, 0x56, 0xe1, 0x78, 0x2c, 0x72, 0xcc, 0x2f, 0x7c, 0x23, 0x96, - 0xa5, 0x4c, 0x94, 0x49, 0x59, 0x52, 0xc3, 0xac, 0x64, 0x81, 0x41, 0xdb, 0xbf, 0x93, 0x41, 0xab, - 0xfe, 0xbd, 0x5c, 0x72, 0x88, 0x92, 0x9b, 0xc9, 0x68, 0xc8, 0xb8, 0x7e, 0x05, 0x40, 0xb9, 0xd6, - 0x20, 0x2e, 0x72, 0x24, 0xae, 0x71, 0x7e, 0xdf, 0x71, 0x8d, 0x0b, 0x7b, 0x8c, 0x6b, 0xac, 0xfe, - 0x3f, 0xc5, 0x9e, 0xde, 0xde, 0x47, 0x12, 0xff, 0xee, 0x75, 0xb6, 0x29, 0x63, 0xb5, 0x97, 0xdd, - 0xc4, 0xd6, 0x82, 0x3b, 0xb3, 0x36, 0x74, 0x3e, 0x2a, 0x5d, 0x2d, 0x4a, 0x49, 0xde, 0x81, 0x11, - 0xff, 0x03, 0x30, 0x5e, 0xb6, 0x14, 0xe7, 0x39, 0x58, 0x10, 0x63, 0x91, 0xa5, 0x23, 0x05, 0xc8, - 0x2b, 0x30, 0x84, 0xe6, 0x50, 0x47, 0x6f, 0xfa, 0xc1, 0xd4, 0x79, 0xf4, 0x75, 0x1f, 0x28, 0xc7, - 0x78, 0x0b, 0x28, 0xc9, 0x17, 0xa1, 0x24, 0x32, 0x8a, 0xf0, 0x84, 0xfb, 0xd7, 0x77, 0xe1, 0x1e, - 0x3f, 0x25, 0x67, 0x13, 0xe1, 0x1b, 0x1c, 0x04, 0x44, 0x36, 0x38, 0x3c, 0x91, 0xc8, 0x0a, 0x9c, - 0xae, 0x39, 0xd4, 0xc0, 0x87, 0x18, 0xb3, 0x8f, 0x3b, 0x8e, 0xc8, 0xf5, 0xc2, 0x27, 0x08, 0x5c, - 0xdf, 0x3a, 0x3e, 0x9a, 0xad, 0xbc, 0x02, 0x2f, 0x47, 0x74, 0x4e, 0x29, 0xce, 0x8c, 0x1e, 0xde, - 0x92, 0x3b, 0x74, 0x73, 0xc3, 0x76, 0x0c, 0x9e, 0x0e, 0x45, 0x4c, 0xfd, 0x42, 0xd0, 0x0f, 0x05, - 0x4a, 0x36, 0x7a, 0xa2, 0x85, 0x2e, 0xbe, 0x0e, 0xc3, 0xfb, 0xcd, 0xc8, 0xf1, 0xab, 0xf9, 0x8c, - 0x77, 0x53, 0x4f, 0x6e, 0x52, 0xc4, 0x20, 0x53, 0x77, 0x7f, 0x46, 0xa6, 0xee, 0x3f, 0xc9, 0x67, - 0x3c, 0x0a, 0x7b, 0xa2, 0x33, 0xea, 0x06, 0xc2, 0x88, 0x66, 0xd4, 0x0d, 0x93, 0x19, 0x9b, 0x86, - 0x26, 0x13, 0xc5, 0x72, 0x6f, 0x97, 0x76, 0xcc, 0xbd, 0xfd, 0x8b, 0x85, 0x5e, 0x8f, 0xe6, 0x4e, - 0x64, 0xbf, 0x17, 0xd9, 0xdf, 0x80, 0xe1, 0x40, 0xb2, 0xd5, 0x0a, 0xda, 0x4b, 0xa3, 0x41, 0xfe, - 0x1f, 0x0e, 0xc6, 0x32, 0x12, 0x11, 0xb9, 0xc6, 0xdb, 0x5a, 0x37, 0x3f, 0xe0, 0x99, 0x28, 0x46, - 0x45, 0x8e, 0x01, 0xdd, 0xd3, 0x1b, 0xae, 0xf9, 0x01, 0xd5, 0x02, 0x34, 0x06, 0x19, 0x4d, 0x7b, - 0x3f, 0x78, 0xd2, 0x47, 0xbb, 0xef, 0xa3, 0x14, 0x21, 0xf2, 0x37, 0x93, 0x27, 0x42, 0xdc, 0x83, - 0x10, 0xff, 0x38, 0x9f, 0xfa, 0xc2, 0xf4, 0x44, 0x88, 0x7b, 0x99, 0x2d, 0x5e, 0x80, 0x21, 0xcd, - 0xde, 0x70, 0x67, 0x70, 0x4f, 0xc4, 0xe7, 0x0a, 0x9c, 0xa8, 0x1d, 0x7b, 0xc3, 0x6d, 0xe0, 0x6e, - 0x47, 0x0b, 0x09, 0xd4, 0xef, 0xe5, 0x7b, 0xbc, 0xc1, 0x3d, 0x11, 0xfc, 0x87, 0xb9, 0x44, 0xfe, - 0x46, 0x3e, 0xf2, 0xc6, 0xf7, 0xc9, 0x15, 0xf6, 0x75, 0x80, 0x7a, 0x73, 0x9d, 0xb6, 0x75, 0x29, - 0x9b, 0x17, 0x1e, 0x59, 0xb8, 0x08, 0x15, 0x59, 0xa0, 0x43, 0x12, 0xf5, 0x5b, 0xf9, 0xd8, 0x23, - 0xe7, 0x13, 0xd9, 0xed, 0x5a, 0x76, 0x81, 0xd6, 0x89, 0x77, 0xdb, 0x27, 0x92, 0xdb, 0xad, 0xe4, - 0x7e, 0x3c, 0x1f, 0x7b, 0xe2, 0xfe, 0xc4, 0xca, 0x8e, 0x0d, 0xc0, 0xe4, 0xd3, 0xfb, 0x27, 0x56, - 0x93, 0x5e, 0x80, 0x21, 0x21, 0x87, 0x60, 0xa9, 0xe0, 0xf3, 0x3e, 0x07, 0xe2, 0x01, 0x6d, 0x40, - 0xa0, 0xfe, 0x99, 0x3c, 0x44, 0x43, 0x0f, 0x3c, 0xa1, 0x3a, 0xf4, 0x1b, 0xf9, 0x68, 0xd0, 0x85, - 0x27, 0x57, 0x7f, 0xa6, 0x00, 0xea, 0xdd, 0xd5, 0xa6, 0x88, 0xd9, 0xdb, 0x2f, 0x9d, 0xf0, 0x07, - 0x50, 0x4d, 0xa2, 0x50, 0xff, 0xdf, 0x7c, 0x6a, 0x24, 0x88, 0x27, 0x57, 0x80, 0x2f, 0xe3, 0xa9, - 0x78, 0xd3, 0x0a, 0x27, 0x72, 0x3c, 0x84, 0x64, 0xe3, 0x2f, 0x91, 0x02, 0xd2, 0x27, 0x24, 0x9f, - 0x4e, 0x31, 0xd7, 0x30, 0x41, 0x45, 0x68, 0xae, 0xc9, 0x87, 0xf9, 0x92, 0xe1, 0xf6, 0x7b, 0xf9, - 0x9d, 0x02, 0x67, 0x3c, 0xc9, 0xab, 0xea, 0x40, 0x4d, 0xdf, 0xc4, 0x00, 0x8f, 0xac, 0x27, 0x46, - 0x78, 0x82, 0xc2, 0x0e, 0x07, 0xc9, 0xd7, 0x76, 0x82, 0x4a, 0xfd, 0xe7, 0xfd, 0xe9, 0x51, 0x1b, - 0x9e, 0x5c, 0x11, 0x5e, 0x82, 0x62, 0x4d, 0xf7, 0xd6, 0x85, 0x26, 0xe3, 0x6d, 0x60, 0x47, 0xf7, - 0xd6, 0x35, 0x84, 0x92, 0x6b, 0x30, 0xa8, 0xe9, 0x1b, 0xfc, 0xcc, 0xb3, 0x14, 0x26, 0x8f, 0x74, - 0xf4, 0x8d, 0x06, 0x3f, 0xf7, 0x0c, 0xd0, 0x44, 0x0d, 0x92, 0x97, 0xf2, 0x93, 0x6f, 0xcc, 0x9c, - 0xc7, 0x93, 0x97, 0x06, 0x29, 0x4b, 0x2f, 0x41, 0x71, 0xda, 0x36, 0x36, 0xf1, 0xe6, 0x6b, 0x84, - 0x57, 0xb6, 0x6a, 0x1b, 0x9b, 0x1a, 0x42, 0xc9, 0x4f, 0xe4, 0x60, 0x60, 0x9e, 0xea, 0x06, 0x1b, - 0x21, 0x43, 0xbd, 0x1c, 0x56, 0x3e, 0x77, 0x38, 0x0e, 0x2b, 0xa7, 0xd6, 0x79, 0x65, 0xb2, 0xa2, - 0x88, 0xfa, 0xc9, 0x2d, 0x18, 0x9c, 0xd1, 0x3d, 0xba, 0x66, 0x3b, 0x9b, 0xe8, 0x82, 0x33, 0x16, - 0x7a, 0xfe, 0x47, 0xf4, 0xc7, 0x27, 0xe2, 0x37, 0x63, 0x4d, 0xf1, 0x4b, 0x0b, 0x0a, 0x33, 0xb1, - 0xf0, 0x9b, 0x39, 0x91, 0xa8, 0x1b, 0xc5, 0xc2, 0xaf, 0xf0, 0x34, 0x81, 0x09, 0x8f, 0x95, 0x47, - 0xd2, 0x8f, 0x95, 0xd1, 0x7a, 0x44, 0x37, 0x3d, 0x4c, 0x19, 0x3a, 0x8a, 0x8b, 0x3e, 0xb7, 0x1e, - 0x11, 0x8a, 0x19, 0x43, 0x35, 0x89, 0x44, 0xfd, 0x6e, 0x3f, 0xa4, 0xbe, 0xf1, 0x3e, 0x51, 0xf2, - 0x13, 0x25, 0x0f, 0x95, 0xbc, 0x92, 0x50, 0xf2, 0x8b, 0xc9, 0xa8, 0x01, 0x1f, 0x51, 0x0d, 0xff, - 0xb9, 0x62, 0x22, 0xe6, 0xc8, 0x93, 0xbd, 0xbb, 0x0c, 0xa5, 0xd7, 0xbf, 0xa3, 0xf4, 0x82, 0x01, - 0x51, 0xda, 0x71, 0x40, 0x0c, 0xec, 0x76, 0x40, 0x0c, 0x66, 0x0e, 0x88, 0x50, 0x41, 0x86, 0x32, - 0x15, 0xa4, 0x2a, 0x06, 0x0d, 0xf4, 0x4e, 0x7d, 0x72, 0x69, 0x7b, 0x6b, 0x72, 0x8c, 0x8d, 0xa6, - 0xd4, 0x9c, 0x27, 0xc8, 0x42, 0xfd, 0xfd, 0x62, 0x8f, 0x40, 0x41, 0x47, 0xa2, 0x23, 0x2f, 0x43, - 0xa1, 0xdc, 0xe9, 0x08, 0xfd, 0x38, 0x2d, 0xc5, 0x28, 0xca, 0x28, 0xc5, 0xa8, 0xc9, 0x1b, 0x50, - 0x28, 0xdf, 0xaf, 0xc7, 0xd3, 0x9d, 0x94, 0xef, 0xd7, 0xc5, 0x97, 0x64, 0x96, 0xbd, 0x5f, 0x27, - 0x6f, 0x85, 0x71, 0x47, 0xd7, 0xbb, 0xd6, 0x43, 0xb1, 0x51, 0x14, 0x9e, 0xba, 0xbe, 0x27, 0x4f, - 0x93, 0xa1, 0xd8, 0x76, 0x31, 0x46, 0x1b, 0xd3, 0xa6, 0xd2, 0xee, 0xb5, 0x69, 0x60, 0x47, 0x6d, - 0x1a, 0xdc, 0xad, 0x36, 0x0d, 0xed, 0x42, 0x9b, 0x60, 0x47, 0x6d, 0x1a, 0x3e, 0xb8, 0x36, 0x75, - 0xe0, 0x62, 0x32, 0xb8, 0x5b, 0xa0, 0x11, 0x1a, 0x90, 0x24, 0x56, 0x38, 0x96, 0xe0, 0xd5, 0x7f, - 0x97, 0x63, 0x1b, 0x1b, 0x88, 0x6e, 0xb8, 0x0c, 0x2f, 0xbb, 0xb6, 0x25, 0x4b, 0xab, 0xbf, 0x9a, - 0xcf, 0x8e, 0x49, 0x77, 0x3c, 0xa7, 0xb8, 0x1f, 0x4c, 0x95, 0x52, 0x31, 0x1a, 0x23, 0x20, 0x5b, - 0xca, 0x31, 0xb6, 0x69, 0x32, 0xfb, 0x66, 0x3e, 0x2b, 0x50, 0xde, 0x81, 0x24, 0xf6, 0xf1, 0xa4, - 0x33, 0x1c, 0xba, 0xf8, 0xbb, 0x51, 0x2f, 0xb8, 0x39, 0x18, 0x91, 0x85, 0x28, 0xa4, 0xb4, 0x1b, - 0x01, 0x47, 0xca, 0x91, 0xb7, 0x82, 0xac, 0x34, 0x92, 0x7f, 0x0c, 0x7a, 0xba, 0xf9, 0x63, 0x36, - 0xe6, 0x1e, 0x23, 0x93, 0x93, 0x17, 0xa0, 0x34, 0x87, 0x61, 0xde, 0xe5, 0xc1, 0xce, 0x03, 0xbf, - 0xcb, 0x5e, 0x2b, 0x9c, 0x46, 0xfd, 0x7b, 0x39, 0x38, 0x7d, 0xa7, 0xbb, 0x4a, 0x85, 0xa3, 0x5d, - 0xd0, 0x86, 0xf7, 0x01, 0x18, 0x58, 0x38, 0xcc, 0xe4, 0xd0, 0x61, 0xe6, 0x93, 0x72, 0x40, 0xbd, - 0x58, 0x81, 0xa9, 0x90, 0x9a, 0x3b, 0xcb, 0x3c, 0xed, 0xfb, 0x9c, 0x3e, 0xec, 0xae, 0xd2, 0x46, - 0xc2, 0x6b, 0x46, 0xe2, 0x7e, 0xf1, 0x6d, 0xee, 0xcd, 0xbf, 0x5f, 0x07, 0x95, 0x5f, 0xc9, 0x67, - 0xc6, 0x30, 0x3c, 0xb6, 0xa9, 0x41, 0xbf, 0x90, 0xda, 0x2b, 0xf1, 0x14, 0xa1, 0x29, 0x24, 0x31, - 0x8e, 0x69, 0x5c, 0xd2, 0x05, 0x76, 0xcc, 0x13, 0xd6, 0x7e, 0xa8, 0x02, 0xfb, 0x87, 0xb9, 0xcc, - 0x58, 0x93, 0xc7, 0x55, 0x60, 0xea, 0xff, 0x52, 0xf0, 0x43, 0x5c, 0x1e, 0xe8, 0x13, 0x5e, 0x80, - 0x21, 0xf1, 0xd2, 0x3f, 0xea, 0x27, 0x2c, 0x8e, 0x0d, 0xf1, 0x18, 0x3a, 0x20, 0x60, 0x26, 0x85, - 0xe4, 0xc4, 0x2c, 0xf9, 0x09, 0x4b, 0x0e, 0xcc, 0x9a, 0x44, 0xc2, 0x8c, 0x86, 0xd9, 0xc7, 0xa6, - 0x87, 0x16, 0x08, 0xeb, 0xcb, 0x02, 0x37, 0x1a, 0xe8, 0x63, 0xd3, 0xe3, 0xf6, 0x47, 0x80, 0x66, - 0x06, 0x41, 0x3d, 0x4c, 0xc7, 0x2f, 0x0c, 0x02, 0x6e, 0xaa, 0x68, 0x02, 0xc3, 0x5a, 0x2b, 0x9c, - 0x6f, 0x85, 0x4b, 0x8b, 0x68, 0xad, 0x70, 0xd7, 0xc5, 0xd6, 0x06, 0x04, 0x8c, 0xa3, 0x46, 0xd7, - 0x42, 0x27, 0x3e, 0xe4, 0xe8, 0x20, 0x44, 0x13, 0x18, 0x72, 0x03, 0xc6, 0xea, 0x9e, 0x6e, 0x19, - 0xba, 0x63, 0x2c, 0x77, 0xbd, 0x4e, 0xd7, 0x93, 0x0d, 0x60, 0xd7, 0x33, 0xec, 0xae, 0xa7, 0xc5, - 0x28, 0xc8, 0xa7, 0x60, 0xd4, 0x87, 0xcc, 0x3a, 0x8e, 0xed, 0xc8, 0x56, 0x8e, 0xeb, 0x19, 0xd4, - 0x71, 0xb4, 0x28, 0x01, 0xf9, 0x34, 0x8c, 0x56, 0xad, 0x47, 0x76, 0x93, 0xbf, 0x76, 0xd7, 0x16, - 0x84, 0xcd, 0x83, 0x2f, 0xc6, 0xcc, 0x00, 0xd1, 0xe8, 0x3a, 0x2d, 0x2d, 0x4a, 0xa8, 0x6e, 0xe7, - 0x93, 0x91, 0x40, 0x9f, 0xdc, 0x0d, 0xd2, 0xb5, 0xa8, 0xe3, 0x1e, 0x7a, 0xab, 0xa2, 0xf1, 0x29, - 0xfb, 0x0d, 0x73, 0x1b, 0xf4, 0x06, 0x0c, 0xde, 0xa1, 0x9b, 0xdc, 0xc7, 0xb4, 0x14, 0xba, 0x25, - 0x3f, 0x14, 0x30, 0xf9, 0x74, 0xd7, 0xa7, 0x53, 0xbf, 0x9d, 0x4f, 0xc6, 0x38, 0x7d, 0x72, 0x85, - 0xfd, 0x29, 0x18, 0x40, 0x51, 0x56, 0xfd, 0xeb, 0x05, 0x14, 0x20, 0x8a, 0x3b, 0xea, 0xed, 0xec, - 0x93, 0xa9, 0xbf, 0x50, 0x8a, 0x07, 0xbe, 0x7d, 0x72, 0xa5, 0xf7, 0x26, 0x0c, 0xcf, 0xd8, 0x96, - 0x6b, 0xba, 0x1e, 0xb5, 0x9a, 0xbe, 0xc2, 0xa2, 0xe3, 0x7f, 0x33, 0x04, 0xcb, 0x36, 0xa0, 0x44, - 0xbd, 0x1f, 0xe5, 0x25, 0xaf, 0xc2, 0x10, 0x8a, 0x1c, 0x6d, 0x4e, 0x3e, 0xe1, 0xe1, 0xcd, 0xc4, - 0x2a, 0x03, 0xc6, 0x2d, 0xce, 0x90, 0x94, 0xdc, 0x85, 0xc1, 0x99, 0x75, 0xb3, 0x65, 0x38, 0xd4, - 0x42, 0xdf, 0x64, 0x29, 0xbe, 0x48, 0xb4, 0x2f, 0xa7, 0xf0, 0x5f, 0xa4, 0xe5, 0xcd, 0x69, 0x8a, - 0x62, 0x91, 0xc7, 0x62, 0x02, 0x76, 0xf1, 0x67, 0xf2, 0x00, 0x61, 0x01, 0xf2, 0x0c, 0xe4, 0x83, - 0xc4, 0xd4, 0xe8, 0x12, 0x13, 0xd1, 0xa0, 0x3c, 0x2e, 0x15, 0x62, 0x6c, 0xe7, 0x77, 0x1c, 0xdb, - 0x77, 0xa1, 0xc4, 0x4f, 0xd7, 0xd0, 0x6b, 0x5d, 0x8a, 0xc5, 0x99, 0xd9, 0xe0, 0x29, 0xa4, 0xe7, - 0xb6, 0x34, 0x5a, 0x9e, 0x11, 0x0f, 0x70, 0xce, 0xec, 0x62, 0x13, 0xfa, 0xf1, 0x2f, 0x72, 0x05, - 0x8a, 0x2b, 0x7e, 0xde, 0xd9, 0x51, 0x3e, 0x4b, 0xc7, 0xe4, 0x87, 0x78, 0xd6, 0x4d, 0x33, 0xb6, - 0xe5, 0xb1, 0xaa, 0xb1, 0xd5, 0x23, 0x42, 0x2e, 0x02, 0x16, 0x91, 0x8b, 0x80, 0xa9, 0xff, 0x55, - 0x3e, 0x25, 0x24, 0xf3, 0x93, 0x3b, 0x4c, 0x5e, 0x07, 0xc0, 0x97, 0xe7, 0x4c, 0x9e, 0xfe, 0x73, - 0x10, 0x1c, 0x25, 0xc8, 0x08, 0xd5, 0x36, 0xb2, 0xed, 0x08, 0x89, 0xd5, 0x7f, 0x90, 0x4b, 0xc4, - 0xf1, 0x3d, 0x90, 0x1c, 0x65, 0xab, 0x2c, 0xbf, 0x4f, 0x33, 0xd6, 0xef, 0x8b, 0xc2, 0xde, 0xfa, - 0x22, 0xfa, 0x2d, 0x87, 0x60, 0x99, 0x1e, 0xe5, 0xb7, 0x7c, 0x37, 0x9f, 0x16, 0xd5, 0xf8, 0x78, - 0xaa, 0xf8, 0xcd, 0xc0, 0x28, 0x2d, 0xc6, 0xe2, 0xc8, 0x23, 0x34, 0x9e, 0x1b, 0x5b, 0x98, 0xa9, - 0x5f, 0x82, 0xf1, 0x58, 0xac, 0x5f, 0x91, 0xa6, 0xf8, 0x4a, 0xef, 0xa0, 0xc1, 0xd9, 0x31, 0x0b, - 0x22, 0x64, 0xea, 0xff, 0x97, 0xeb, 0x1d, 0xe9, 0xf9, 0xc8, 0x55, 0x27, 0x45, 0x00, 0x85, 0x3f, - 0x1d, 0x01, 0x1c, 0xc2, 0x36, 0xf8, 0x78, 0x0b, 0xe0, 0x23, 0x32, 0x79, 0x7c, 0xd8, 0x02, 0xf8, - 0x85, 0xdc, 0x8e, 0x81, 0xba, 0x8f, 0x5a, 0x06, 0xea, 0xff, 0x98, 0x4b, 0x0d, 0xa8, 0x7d, 0xa0, - 0x76, 0xbd, 0x05, 0x25, 0xee, 0xc2, 0x23, 0x5a, 0x25, 0xa5, 0x20, 0x63, 0xd0, 0xac, 0xa4, 0xfd, - 0x1c, 0x4b, 0x16, 0x60, 0x80, 0xb7, 0xc1, 0x10, 0xbd, 0xf1, 0xb1, 0x1e, 0x51, 0xbd, 0x8d, 0xac, - 0xc9, 0x51, 0xa0, 0xd5, 0xbf, 0x9f, 0x4b, 0xc4, 0xf7, 0x3e, 0xc2, 0x6f, 0x0b, 0xa7, 0xea, 0xc2, - 0xee, 0xa7, 0x6a, 0xf5, 0x9f, 0xe5, 0xd3, 0xc3, 0x8b, 0x1f, 0xe1, 0x87, 0x1c, 0xc6, 0x71, 0xda, - 0xfe, 0xd6, 0xad, 0x15, 0x18, 0x8b, 0xca, 0x42, 0x2c, 0x5b, 0x97, 0xd3, 0x83, 0xac, 0x67, 0xb4, - 0x22, 0xc6, 0x43, 0xfd, 0x4e, 0x2e, 0x19, 0x19, 0xfd, 0xc8, 0xe7, 0xa7, 0xfd, 0x69, 0x4b, 0xf4, - 0x53, 0x3e, 0x22, 0x6b, 0xcd, 0x61, 0x7c, 0xca, 0x47, 0x64, 0xd5, 0xd8, 0xdf, 0xa7, 0xfc, 0x52, - 0x3e, 0x2b, 0xb0, 0xfc, 0x91, 0x7f, 0xd0, 0xe7, 0x65, 0x21, 0xf3, 0x96, 0x89, 0x4f, 0x7b, 0x26, - 0x2b, 0x92, 0x7b, 0x06, 0xcf, 0x04, 0x9f, 0xfd, 0x8d, 0xf1, 0x54, 0x61, 0x7d, 0x44, 0x14, 0xf9, - 0x78, 0x08, 0xeb, 0x23, 0x32, 0x54, 0x3e, 0x7a, 0xc2, 0xfa, 0xad, 0xfc, 0x6e, 0xb3, 0x19, 0x9c, - 0x08, 0x2f, 0x21, 0xbc, 0xaf, 0xe5, 0x93, 0x59, 0x36, 0x8e, 0x5c, 0x4c, 0x73, 0x50, 0x12, 0xf9, - 0x3e, 0x32, 0x85, 0xc3, 0xf1, 0x59, 0x16, 0x8d, 0xf8, 0x8e, 0x9b, 0x20, 0x2e, 0x72, 0x76, 0x27, - 0x12, 0x4e, 0xab, 0x7e, 0x2f, 0x17, 0x4b, 0x49, 0x71, 0x24, 0x47, 0x08, 0xfb, 0x5a, 0x92, 0xc8, - 0xdb, 0xfe, 0x61, 0x66, 0x31, 0x16, 0x12, 0x3c, 0xf8, 0x9e, 0x0a, 0xf5, 0x74, 0xb3, 0x15, 0x2f, - 0x2f, 0xe2, 0x0f, 0x7c, 0x3b, 0x0f, 0xa7, 0x12, 0xa4, 0xe4, 0x4a, 0x24, 0xe2, 0x0f, 0x1e, 0x4b, - 0xc6, 0x1c, 0xd5, 0x79, 0xec, 0x9f, 0x3d, 0x9c, 0xa4, 0x5e, 0x81, 0x62, 0x45, 0xdf, 0xe4, 0xdf, - 0xd6, 0xcf, 0x59, 0x1a, 0xfa, 0xa6, 0x7c, 0xe2, 0x86, 0x78, 0xb2, 0x0a, 0x67, 0xf9, 0x7d, 0x88, - 0x69, 0x5b, 0x2b, 0x66, 0x9b, 0x56, 0xad, 0x45, 0xb3, 0xd5, 0x32, 0x5d, 0x71, 0xa9, 0xf7, 0xc2, - 0xf6, 0xd6, 0xe4, 0x55, 0xcf, 0xf6, 0xf4, 0x56, 0x83, 0xfa, 0x64, 0x0d, 0xcf, 0x6c, 0xd3, 0x86, - 0x69, 0x35, 0xda, 0x48, 0x29, 0xb1, 0x4c, 0x67, 0x45, 0xaa, 0x3c, 0xfa, 0x7b, 0xbd, 0xa9, 0x5b, - 0x16, 0x35, 0xaa, 0xd6, 0xf4, 0xa6, 0x47, 0xf9, 0x65, 0x60, 0x81, 0x1f, 0x09, 0xf2, 0x77, 0xe8, - 0x1c, 0xcd, 0x18, 0xaf, 0x32, 0x02, 0x2d, 0xa5, 0x90, 0xfa, 0xdb, 0xc5, 0x94, 0x6c, 0x24, 0xc7, - 0x48, 0x7d, 0xfc, 0x9e, 0x2e, 0xee, 0xd0, 0xd3, 0xd7, 0x61, 0x40, 0x84, 0xd7, 0x15, 0x17, 0x0c, - 0xe8, 0x38, 0xff, 0x88, 0x83, 0xe4, 0x1b, 0x1a, 0x41, 0x45, 0x5a, 0x70, 0x71, 0x85, 0x75, 0x53, - 0x7a, 0x67, 0x96, 0xf6, 0xd1, 0x99, 0x3d, 0xf8, 0x91, 0xf7, 0xe0, 0x3c, 0x62, 0x53, 0xba, 0x75, - 0x00, 0xab, 0xc2, 0x50, 0x5a, 0xbc, 0xaa, 0xf4, 0xce, 0xcd, 0x2a, 0x4f, 0x3e, 0x0f, 0x23, 0xc1, - 0x00, 0x31, 0xa9, 0x2b, 0x6e, 0x2e, 0x7a, 0x8c, 0x33, 0x1e, 0xa7, 0x8e, 0x81, 0xd1, 0x5d, 0x2d, - 0x1a, 0xeb, 0x2c, 0xc2, 0x4b, 0xfd, 0x1f, 0x72, 0xbd, 0xb2, 0xa2, 0x1c, 0xf9, 0xac, 0xfc, 0x36, - 0x0c, 0x18, 0xfc, 0xa3, 0x84, 0x4e, 0xf5, 0xce, 0x9b, 0xc2, 0x49, 0x35, 0xbf, 0x8c, 0xfa, 0x4f, - 0x73, 0x3d, 0x93, 0xb1, 0x1c, 0xf7, 0xcf, 0xfb, 0x5a, 0x21, 0xe3, 0xf3, 0xc4, 0x24, 0x7a, 0x0d, - 0x26, 0xcc, 0x30, 0x5a, 0x7c, 0x23, 0x0c, 0x75, 0xa5, 0x8d, 0x4b, 0x70, 0x1c, 0x5d, 0x37, 0x21, - 0x70, 0xd8, 0x72, 0x7c, 0x6f, 0x34, 0xb7, 0xd1, 0x75, 0x4c, 0x3e, 0x2e, 0xb5, 0x33, 0x6e, 0xcc, - 0x55, 0xcd, 0xbd, 0xeb, 0x98, 0xac, 0x02, 0xdd, 0x5b, 0xa7, 0x96, 0xde, 0xd8, 0xb0, 0x9d, 0x87, - 0x18, 0x0c, 0x95, 0x0f, 0x4e, 0x6d, 0x9c, 0xc3, 0xef, 0xfb, 0x60, 0xf2, 0x1c, 0x8c, 0xae, 0xb5, - 0xba, 0x34, 0x08, 0x3f, 0xc9, 0xef, 0xfa, 0xb4, 0x11, 0x06, 0x0c, 0x6e, 0x48, 0x9e, 0x06, 0x40, - 0x22, 0x0f, 0x53, 0xe5, 0xe0, 0xc5, 0x9e, 0x36, 0xc4, 0x20, 0x2b, 0xa2, 0xbb, 0x2e, 0x72, 0xad, - 0xe6, 0x42, 0x6a, 0xb4, 0x6c, 0x6b, 0xad, 0xe1, 0x51, 0xa7, 0x8d, 0x0d, 0x45, 0x67, 0x06, 0xed, - 0x1c, 0x52, 0xe0, 0xd5, 0x89, 0xbb, 0x60, 0x5b, 0x6b, 0x2b, 0xd4, 0x69, 0xb3, 0xa6, 0xbe, 0x00, - 0x44, 0x34, 0xd5, 0xc1, 0x43, 0x0f, 0xfe, 0x71, 0xe8, 0xcd, 0xa0, 0x89, 0x8f, 0xe0, 0xa7, 0x21, - 0xf8, 0x61, 0x93, 0x30, 0xcc, 0x63, 0xf0, 0x71, 0xa1, 0xa1, 0x0b, 0x83, 0x06, 0x1c, 0x84, 0xf2, - 0x3a, 0x07, 0xc2, 0xbb, 0x82, 0x7b, 0x90, 0x6b, 0xe2, 0x97, 0xfa, 0x95, 0x42, 0x5a, 0xfe, 0x98, - 0x03, 0x29, 0x5a, 0x38, 0xad, 0xe6, 0xf7, 0x34, 0xad, 0x8e, 0x5b, 0xdd, 0x76, 0x43, 0xef, 0x74, - 0x1a, 0x0f, 0xcc, 0x16, 0x3e, 0xe1, 0xc2, 0x85, 0x4f, 0x1b, 0xb5, 0xba, 0xed, 0x72, 0xa7, 0x33, - 0xc7, 0x81, 0xe4, 0x79, 0x38, 0xc5, 0xe8, 0xb0, 0x93, 0x02, 0xca, 0x22, 0x52, 0x32, 0x06, 0x18, - 0xc4, 0xd6, 0xa7, 0xbd, 0x00, 0x83, 0x82, 0x27, 0x5f, 0xab, 0xfa, 0xb5, 0x01, 0xce, 0xcc, 0x65, - 0x3d, 0x17, 0xb0, 0xe1, 0x93, 0x6b, 0xbf, 0x36, 0xe4, 0x97, 0xc7, 0x50, 0xcd, 0x56, 0xb7, 0xcd, - 0xa3, 0x6f, 0x0d, 0x20, 0x32, 0xf8, 0x4d, 0xae, 0xc0, 0x18, 0xe3, 0x12, 0x08, 0x8c, 0x47, 0xb7, - 0xed, 0xd7, 0x62, 0x50, 0x72, 0x03, 0xce, 0x44, 0x20, 0xdc, 0x06, 0xe5, 0x4f, 0x12, 0xfa, 0xb5, - 0x54, 0x9c, 0xfa, 0xad, 0x42, 0x34, 0xab, 0xcd, 0x11, 0x74, 0xc4, 0x79, 0x18, 0xb0, 0x9d, 0xb5, - 0x46, 0xd7, 0x69, 0x89, 0xb1, 0x57, 0xb2, 0x9d, 0xb5, 0xbb, 0x4e, 0x8b, 0x9c, 0x85, 0x12, 0xeb, - 0x1d, 0xd3, 0x10, 0x43, 0xac, 0x5f, 0xef, 0x74, 0xaa, 0x06, 0x29, 0xf3, 0x0e, 0xc1, 0xc8, 0xa8, - 0x8d, 0x26, 0x6e, 0xed, 0xb9, 0x53, 0x42, 0x3f, 0x5f, 0xf1, 0x12, 0x48, 0xec, 0x27, 0x8c, 0x97, - 0xca, 0x0f, 0x02, 0x62, 0x2c, 0x0c, 0xdc, 0x96, 0x18, 0xbc, 0x4f, 0xe2, 0x2c, 0x04, 0x32, 0x64, - 0xc1, 0x37, 0x31, 0x06, 0xa9, 0x00, 0x09, 0xa9, 0xda, 0xb6, 0x61, 0x3e, 0x30, 0x29, 0x7f, 0x41, - 0xd2, 0xcf, 0x2f, 0x7e, 0x93, 0x58, 0x6d, 0xc2, 0x67, 0xb2, 0x28, 0x20, 0xe4, 0x4d, 0xae, 0x84, - 0x9c, 0x0e, 0xd7, 0x3e, 0xde, 0xb7, 0xdc, 0x4e, 0x8b, 0xa1, 0x50, 0x33, 0xb1, 0x3c, 0x2e, 0x84, - 0xea, 0x5f, 0x2f, 0x26, 0x53, 0x1b, 0x1d, 0x89, 0x5d, 0x33, 0x0f, 0x20, 0x32, 0x97, 0x85, 0x97, - 0x6b, 0x81, 0x77, 0x7b, 0x88, 0xc9, 0xe0, 0x21, 0x95, 0x25, 0xd7, 0x60, 0x90, 0x7f, 0x51, 0xb5, - 0x22, 0xec, 0x1d, 0x74, 0x11, 0x73, 0x3b, 0xe6, 0x83, 0x07, 0xe8, 0x4f, 0x16, 0xa0, 0xc9, 0x15, - 0x18, 0xa8, 0x2c, 0xd5, 0xeb, 0xe5, 0x25, 0xff, 0xa6, 0x18, 0xdf, 0xb2, 0x18, 0x96, 0xdb, 0x70, - 0x75, 0xcb, 0xd5, 0x7c, 0x24, 0x79, 0x0e, 0x4a, 0xd5, 0x1a, 0x92, 0xf1, 0x17, 0x9a, 0xc3, 0xdb, - 0x5b, 0x93, 0x03, 0x66, 0x87, 0x53, 0x09, 0x14, 0xd6, 0x7b, 0xaf, 0x5a, 0x91, 0xdc, 0x25, 0x78, - 0xbd, 0x8f, 0x4c, 0x03, 0xaf, 0x9d, 0xb5, 0x00, 0x4d, 0x5e, 0x81, 0x91, 0x3a, 0x75, 0x4c, 0xbd, - 0xb5, 0xd4, 0xc5, 0xad, 0xa2, 0x14, 0xf1, 0xd1, 0x45, 0x78, 0xc3, 0x42, 0x84, 0x16, 0x21, 0x23, - 0x97, 0xa0, 0x38, 0x6f, 0x5a, 0xfe, 0x73, 0x09, 0xf4, 0xa7, 0x5f, 0x37, 0x2d, 0x4f, 0x43, 0x28, - 0x79, 0x0e, 0x0a, 0xb7, 0x57, 0xaa, 0xc2, 0x13, 0x0c, 0x79, 0xbd, 0xef, 0x45, 0xa2, 0x47, 0xde, - 0x5e, 0xa9, 0x92, 0x57, 0x60, 0x88, 0x2d, 0x62, 0xd4, 0x6a, 0x52, 0x57, 0x19, 0xc6, 0x8f, 0xe1, - 0x21, 0x0b, 0x7d, 0xa0, 0xec, 0xd3, 0x11, 0x50, 0xaa, 0xff, 0x47, 0x3e, 0x3d, 0xf7, 0xd4, 0x11, - 0x0c, 0xf5, 0x7d, 0xde, 0x22, 0xc7, 0x14, 0xac, 0x78, 0x00, 0x05, 0x7b, 0x00, 0xe3, 0x65, 0xa3, - 0x6d, 0x5a, 0x65, 0xfc, 0xe9, 0x2e, 0xce, 0x95, 0x71, 0xea, 0x90, 0x9e, 0x02, 0xc6, 0xd0, 0xe2, - 0x7b, 0x78, 0x5c, 0x62, 0x86, 0x6a, 0xe8, 0x1c, 0xd7, 0x68, 0x3f, 0xd0, 0x1b, 0x4d, 0x9e, 0xb6, - 0x49, 0x8b, 0x33, 0x55, 0x7f, 0x3a, 0xbf, 0x43, 0xba, 0xac, 0x27, 0x51, 0xfa, 0xea, 0xd7, 0xf3, - 0xbd, 0x33, 0x96, 0x3d, 0x91, 0x42, 0xf9, 0xe3, 0x7c, 0x4a, 0xfe, 0xb0, 0x03, 0x49, 0xe2, 0x1a, - 0x0c, 0x72, 0x36, 0x81, 0x1b, 0x2f, 0xce, 0x66, 0x5c, 0x59, 0x71, 0x16, 0xf5, 0xd1, 0x64, 0x09, - 0xce, 0x94, 0x1f, 0x3c, 0xa0, 0x4d, 0x2f, 0x8c, 0x50, 0xbd, 0x14, 0x06, 0x7c, 0xe5, 0x11, 0x79, - 0x05, 0x3e, 0x8c, 0x70, 0x8d, 0x81, 0x4d, 0x52, 0xcb, 0x91, 0x15, 0x38, 0x17, 0x87, 0xd7, 0xf9, - 0x16, 0xa0, 0x28, 0x05, 0xe9, 0x4d, 0x70, 0xe4, 0xff, 0x69, 0x19, 0x65, 0xd3, 0x5a, 0x89, 0x53, - 0x75, 0x7f, 0xaf, 0x56, 0xe2, 0xbc, 0x9d, 0x5a, 0x4e, 0xfd, 0x76, 0x41, 0x4e, 0xb3, 0xf6, 0xe4, - 0x3a, 0x5c, 0xdd, 0x8c, 0xb8, 0x59, 0xef, 0x76, 0xc8, 0xbc, 0x22, 0xa2, 0x95, 0x18, 0x5d, 0xc7, - 0xf7, 0x48, 0x0c, 0xa2, 0x25, 0x20, 0x50, 0x5e, 0x87, 0x02, 0x4a, 0x52, 0x85, 0x62, 0xd9, 0x59, - 0xe3, 0xe6, 0xed, 0x4e, 0x0f, 0xb8, 0x74, 0x67, 0xcd, 0x4d, 0x7f, 0xc0, 0xc5, 0x58, 0xa8, 0x7f, - 0x3e, 0xdf, 0x23, 0x33, 0xda, 0x13, 0x39, 0x89, 0xfc, 0xc5, 0x7c, 0x56, 0x8e, 0xb3, 0xe3, 0xea, - 0x3a, 0xf6, 0x21, 0x0b, 0xe7, 0x78, 0xfb, 0xd5, 0x1d, 0xa2, 0x70, 0xfe, 0x30, 0x9f, 0x95, 0xb0, - 0xed, 0x44, 0x38, 0xfb, 0x9b, 0x20, 0x53, 0x45, 0xfa, 0x04, 0xdb, 0xdc, 0xb2, 0x2a, 0xf4, 0xef, - 0xd3, 0x7d, 0x2a, 0x4d, 0xa4, 0x27, 0x43, 0xf8, 0x40, 0x5a, 0xfa, 0x0f, 0xf3, 0x99, 0x89, 0x09, - 0x4f, 0x64, 0x7a, 0x98, 0x32, 0x3d, 0x19, 0xfa, 0x07, 0x1a, 0xfa, 0xa9, 0x32, 0x3d, 0x19, 0xfb, - 0x07, 0xd2, 0xd3, 0x3f, 0xc8, 0xa7, 0xa7, 0xde, 0x3c, 0x02, 0x25, 0x3d, 0x0c, 0x0f, 0x47, 0xbf, - 0x1b, 0x8a, 0x07, 0xea, 0x86, 0xfe, 0x03, 0x58, 0x51, 0x49, 0x81, 0x1e, 0xd9, 0xa8, 0xff, 0x7e, - 0x15, 0xe8, 0x21, 0x0c, 0xf9, 0x27, 0x59, 0xa0, 0x3f, 0x59, 0x48, 0xa6, 0x9b, 0x7d, 0x52, 0xd7, - 0x24, 0x67, 0x9f, 0x6b, 0x92, 0x5f, 0x8e, 0xbc, 0x03, 0xe3, 0xa1, 0x2c, 0xe5, 0x28, 0x63, 0x78, - 0x7d, 0xd4, 0x64, 0xa8, 0xc6, 0xfb, 0x0c, 0x27, 0xc2, 0xe1, 0xc4, 0xa9, 0xd5, 0xef, 0x15, 0x92, - 0x39, 0x7b, 0x4f, 0x7a, 0x63, 0x9f, 0xbd, 0x71, 0x17, 0xce, 0xcd, 0x74, 0x1d, 0x87, 0x5a, 0x5e, - 0x7a, 0xa7, 0xe0, 0xe1, 0x7d, 0x93, 0x53, 0x34, 0x92, 0x9d, 0x93, 0x51, 0x98, 0xb1, 0x15, 0xaf, - 0x1b, 0xe2, 0x6c, 0x07, 0x42, 0xb6, 0x5d, 0x4e, 0x91, 0xc6, 0x36, 0xbd, 0xb0, 0xfa, 0x7b, 0xf9, - 0x64, 0x96, 0xe5, 0x93, 0xae, 0xdf, 0x5f, 0xd7, 0xab, 0x5f, 0x29, 0xc4, 0x33, 0x4d, 0x9f, 0x2c, - 0x10, 0xfb, 0xef, 0x0e, 0x5f, 0x92, 0x38, 0x6e, 0xa4, 0xaf, 0xf0, 0xe1, 0x59, 0x5f, 0xe1, 0xe3, - 0xd5, 0x5f, 0x29, 0xc6, 0xb3, 0x76, 0x9f, 0x74, 0xc7, 0xd1, 0x75, 0x07, 0x59, 0x86, 0x33, 0x62, - 0x6e, 0xf3, 0x41, 0x98, 0x6e, 0x42, 0xcc, 0x5f, 0x3c, 0x6b, 0x9d, 0x98, 0x16, 0xbb, 0x2e, 0x75, - 0x1a, 0x9e, 0xee, 0x3e, 0x6c, 0x60, 0x7e, 0x0a, 0x2d, 0xb5, 0x20, 0x63, 0x28, 0x66, 0xb5, 0x28, - 0xc3, 0xc1, 0x90, 0xa1, 0x3f, 0x21, 0x26, 0x18, 0xa6, 0x15, 0x54, 0x7f, 0x23, 0x07, 0x13, 0xf1, - 0xcf, 0x21, 0x53, 0x30, 0xc8, 0x7e, 0x07, 0xcf, 0xee, 0xa5, 0x74, 0xda, 0x9c, 0x23, 0xbf, 0x92, - 0xf7, 0x69, 0xc8, 0xab, 0x30, 0x84, 0xde, 0x0f, 0x58, 0x20, 0x1f, 0x46, 0x3b, 0x08, 0x0b, 0x60, - 0x8e, 0x57, 0x5e, 0x2c, 0x24, 0x25, 0x6f, 0xc2, 0x70, 0x35, 0x74, 0xf3, 0x12, 0x77, 0x5e, 0xe8, - 0x5d, 0x2a, 0x95, 0x0c, 0x09, 0x34, 0x99, 0x5a, 0xfd, 0x4e, 0x3e, 0x9e, 0x5d, 0xfe, 0x44, 0xd5, - 0xf7, 0xa7, 0xea, 0xcf, 0x2f, 0x72, 0x55, 0xbf, 0x63, 0x5a, 0x06, 0xb9, 0x00, 0x67, 0xef, 0xd6, - 0x67, 0xb5, 0xc6, 0x9d, 0xea, 0x52, 0xa5, 0x71, 0x77, 0xa9, 0x5e, 0x9b, 0x9d, 0xa9, 0xce, 0x55, - 0x67, 0x2b, 0x13, 0x7d, 0xe4, 0x34, 0x8c, 0x87, 0xa8, 0xf9, 0xbb, 0x8b, 0xe5, 0xa5, 0x89, 0x1c, - 0x39, 0x05, 0xa3, 0x21, 0x70, 0x7a, 0x79, 0x65, 0x22, 0xff, 0xfc, 0x27, 0x60, 0x18, 0xdd, 0xdb, - 0xf8, 0x75, 0x3c, 0x19, 0x81, 0xc1, 0xe5, 0xe9, 0xfa, 0xac, 0x76, 0x0f, 0x99, 0x00, 0x94, 0x2a, - 0xb3, 0x4b, 0x8c, 0x61, 0xee, 0xf9, 0xff, 0x3b, 0x07, 0x50, 0x9f, 0x5b, 0xa9, 0x09, 0xc2, 0x61, - 0x18, 0xa8, 0x2e, 0xdd, 0x2b, 0x2f, 0x54, 0x19, 0xdd, 0x20, 0x14, 0x97, 0x6b, 0xb3, 0xac, 0x86, - 0x21, 0xe8, 0x9f, 0x59, 0x58, 0xae, 0xcf, 0x4e, 0xe4, 0x19, 0x50, 0x9b, 0x2d, 0x57, 0x26, 0x0a, - 0x0c, 0x78, 0x5f, 0xab, 0xae, 0xcc, 0x4e, 0x14, 0xd9, 0x9f, 0x0b, 0xf5, 0x95, 0xf2, 0xca, 0x44, - 0x3f, 0xfb, 0x73, 0x0e, 0xff, 0x2c, 0x31, 0x66, 0xf5, 0xd9, 0x15, 0xfc, 0x31, 0xc0, 0x9a, 0x30, - 0xe7, 0xff, 0x1a, 0x64, 0x28, 0xc6, 0xba, 0x52, 0xd5, 0x26, 0x86, 0xd8, 0x0f, 0xc6, 0x92, 0xfd, - 0x00, 0xd6, 0x38, 0x6d, 0x76, 0x71, 0xf9, 0xde, 0xec, 0xc4, 0x30, 0xe3, 0xb5, 0x78, 0x87, 0x81, - 0x47, 0xd8, 0x9f, 0xda, 0x22, 0xfb, 0x73, 0x94, 0x71, 0xd2, 0x66, 0xcb, 0x0b, 0xb5, 0xf2, 0xca, - 0xfc, 0xc4, 0x18, 0x6b, 0x0f, 0xf2, 0x1c, 0xe7, 0x25, 0x97, 0xca, 0x8b, 0xb3, 0x13, 0x13, 0x82, - 0xa6, 0xb2, 0x50, 0x5d, 0xba, 0x33, 0x71, 0x0a, 0x1b, 0xf2, 0xde, 0x22, 0xfe, 0x20, 0xac, 0x00, - 0xfe, 0x75, 0xfa, 0xf9, 0x1f, 0x80, 0xd2, 0x72, 0x1d, 0x47, 0xc1, 0x79, 0x38, 0xbd, 0x5c, 0x6f, - 0xac, 0xbc, 0x57, 0x9b, 0x8d, 0xc9, 0xfb, 0x14, 0x8c, 0xfa, 0x88, 0x85, 0xea, 0xd2, 0xdd, 0xcf, - 0x71, 0x69, 0xfb, 0xa0, 0xc5, 0xf2, 0xcc, 0x72, 0x7d, 0x22, 0xcf, 0x7a, 0xc5, 0x07, 0xdd, 0xaf, - 0x2e, 0x55, 0x96, 0xef, 0xd7, 0x27, 0x0a, 0xcf, 0x3f, 0x82, 0x11, 0x9e, 0xa7, 0x73, 0xd9, 0x31, - 0xd7, 0x4c, 0x8b, 0x3c, 0x0d, 0x17, 0x2a, 0xb3, 0xf7, 0xaa, 0x33, 0xb3, 0x8d, 0x65, 0xad, 0x7a, - 0xab, 0xba, 0x14, 0xab, 0xe9, 0x2c, 0x9c, 0x8a, 0xa2, 0xcb, 0xb5, 0xea, 0x44, 0x8e, 0x9c, 0x03, - 0x12, 0x05, 0xdf, 0x2e, 0x2f, 0xce, 0x4d, 0xe4, 0x89, 0x02, 0x67, 0xa2, 0xf0, 0xea, 0xd2, 0xca, - 0xdd, 0xa5, 0xd9, 0x89, 0xc2, 0xf3, 0x7f, 0x2d, 0x07, 0x67, 0x53, 0x63, 0x39, 0x13, 0x15, 0x2e, - 0xcf, 0x2e, 0x94, 0xeb, 0x2b, 0xd5, 0x99, 0xfa, 0x6c, 0x59, 0x9b, 0x99, 0x6f, 0xcc, 0x94, 0x57, - 0x66, 0x6f, 0x2d, 0x6b, 0xef, 0x35, 0x6e, 0xcd, 0x2e, 0xcd, 0x6a, 0xe5, 0x85, 0x89, 0x3e, 0xf2, - 0x1c, 0x4c, 0x66, 0xd0, 0xd4, 0x67, 0x67, 0xee, 0x6a, 0xd5, 0x95, 0xf7, 0x26, 0x72, 0xe4, 0x59, - 0x78, 0x3a, 0x93, 0x88, 0xfd, 0x9e, 0xc8, 0x93, 0xcb, 0x70, 0x31, 0x8b, 0xe4, 0xdd, 0x85, 0x89, - 0xc2, 0xf3, 0x3f, 0x9f, 0x03, 0x92, 0x0c, 0xc6, 0x4b, 0x9e, 0x81, 0x4b, 0x4c, 0x2f, 0x1a, 0xd9, - 0x0d, 0x7c, 0x16, 0x9e, 0x4e, 0xa5, 0x90, 0x9a, 0x37, 0x09, 0x4f, 0x65, 0x90, 0x88, 0xc6, 0x5d, - 0x02, 0x25, 0x9d, 0x00, 0x9b, 0xf6, 0xeb, 0x39, 0x38, 0x9b, 0xea, 0x01, 0x43, 0xae, 0xc2, 0xc7, - 0xca, 0x95, 0x45, 0xd6, 0x37, 0x33, 0x2b, 0xd5, 0xe5, 0xa5, 0x7a, 0x63, 0x71, 0xae, 0xdc, 0x60, - 0xda, 0x77, 0xb7, 0x1e, 0xeb, 0xcd, 0x2b, 0xa0, 0xf6, 0xa0, 0x9c, 0x99, 0x2f, 0x2f, 0xdd, 0x62, - 0xc3, 0x8f, 0x7c, 0x0c, 0x9e, 0xc9, 0xa4, 0x9b, 0x5d, 0x2a, 0x4f, 0x2f, 0xcc, 0x56, 0x26, 0xf2, - 0xe4, 0xe3, 0xf0, 0x6c, 0x26, 0x55, 0xa5, 0x5a, 0xe7, 0x64, 0x85, 0xe9, 0xca, 0x77, 0xfe, 0xa7, - 0xcb, 0x7d, 0xdf, 0xf9, 0xa3, 0xcb, 0xb9, 0x3f, 0xfc, 0xa3, 0xcb, 0xb9, 0x7f, 0xf6, 0x47, 0x97, - 0x73, 0x9f, 0xbf, 0xb1, 0x97, 0x20, 0xcb, 0x7c, 0xda, 0x5a, 0x2d, 0xe1, 0x6d, 0xf4, 0xcb, 0xff, - 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcd, 0xcc, 0xfb, 0x5a, 0x5a, 0x82, 0x01, 0x00, + 0x2f, 0x47, 0x3f, 0x33, 0x86, 0x66, 0x9f, 0x19, 0x03, 0x45, 0x98, 0x88, 0x69, 0xcb, 0xc9, 0x60, + 0x12, 0x9e, 0x0f, 0xc6, 0x40, 0x64, 0x01, 0x48, 0xbd, 0xbc, 0xb8, 0x50, 0x35, 0x6a, 0xf2, 0x15, + 0x99, 0x1b, 0x3d, 0x81, 0x4d, 0x52, 0xcc, 0xf7, 0x69, 0x29, 0xe5, 0xc8, 0x7b, 0x70, 0x49, 0x40, + 0xc5, 0xfb, 0xf0, 0x9a, 0x63, 0x3f, 0x34, 0x8d, 0x60, 0x41, 0xf0, 0xa2, 0x5e, 0x77, 0xbd, 0x68, + 0xe7, 0xfb, 0xb4, 0x9e, 0xbc, 0xb2, 0xeb, 0x12, 0xeb, 0x43, 0x77, 0x37, 0x75, 0x05, 0x8b, 0x44, + 0x4f, 0x5e, 0xd9, 0x75, 0x09, 0xb9, 0x3f, 0xdc, 0x4d, 0x5d, 0x41, 0x27, 0xf4, 0xe4, 0x45, 0x5c, + 0x98, 0xec, 0x85, 0x2f, 0xb7, 0x5a, 0xca, 0x06, 0x56, 0xf7, 0x89, 0xdd, 0x54, 0x57, 0x46, 0x83, + 0x73, 0x27, 0x8e, 0x6c, 0x96, 0x5e, 0xee, 0x50, 0xab, 0x1e, 0x59, 0x80, 0x1e, 0x45, 0x67, 0xe9, + 0x04, 0x01, 0x9b, 0xa5, 0x13, 0x40, 0x36, 0xa0, 0xe4, 0xc7, 0x35, 0xca, 0x66, 0x74, 0x40, 0xc9, + 0x38, 0x36, 0xa0, 0x22, 0x0f, 0x71, 0x96, 0xe1, 0xf4, 0xf2, 0x03, 0x4f, 0xf7, 0x2d, 0x48, 0x57, + 0x74, 0xe5, 0xfb, 0xb1, 0x4b, 0xa6, 0x24, 0x09, 0x5e, 0x32, 0x25, 0xc1, 0x6c, 0x8c, 0x30, 0x70, + 0x7d, 0xd3, 0x6a, 0xce, 0xe9, 0x66, 0xab, 0xeb, 0x50, 0xe5, 0x5f, 0x8b, 0x8e, 0x91, 0x18, 0x9a, + 0x8d, 0x91, 0x18, 0x88, 0x2d, 0xd0, 0x0c, 0x54, 0x76, 0x5d, 0x73, 0xcd, 0x12, 0xfb, 0xca, 0x6e, + 0xcb, 0x53, 0xfe, 0xf5, 0xe8, 0x02, 0x9d, 0x46, 0xc3, 0x16, 0xe8, 0x34, 0x38, 0x9e, 0x3a, 0xb1, + 0x5e, 0x60, 0x8b, 0x87, 0x7c, 0x57, 0xf9, 0x6f, 0xc4, 0x4e, 0x9d, 0x52, 0x68, 0xf0, 0xd4, 0x29, + 0x05, 0xce, 0xd6, 0x47, 0x6e, 0x93, 0x2d, 0x98, 0xc1, 0x5d, 0xf5, 0xbf, 0x19, 0x5d, 0x1f, 0xe3, + 0x78, 0xb6, 0x3e, 0xc6, 0x61, 0x51, 0x3e, 0xa2, 0x0b, 0xfe, 0xad, 0x2c, 0x3e, 0x81, 0xfc, 0x13, + 0x65, 0xc8, 0x4d, 0x99, 0x8f, 0x18, 0x29, 0x3f, 0x94, 0xcb, 0x62, 0x14, 0x0c, 0x8f, 0x44, 0xa1, + 0x28, 0x23, 0x8d, 0x3e, 0x34, 0xe9, 0x86, 0xf2, 0x95, 0x4c, 0x46, 0x9c, 0x20, 0xca, 0x88, 0xc3, + 0xc8, 0xbb, 0x70, 0x2e, 0x84, 0x2d, 0xd2, 0xf6, 0x6a, 0x30, 0x33, 0xfd, 0x70, 0x2e, 0x6a, 0x06, + 0xa7, 0x93, 0x31, 0x33, 0x38, 0x1d, 0x93, 0xc6, 0x5a, 0x88, 0xee, 0xdf, 0xde, 0x81, 0x75, 0x20, + 0xc1, 0x0c, 0x06, 0x69, 0xac, 0x85, 0x34, 0x7f, 0x64, 0x07, 0xd6, 0x81, 0x4c, 0x33, 0x18, 0x90, + 0x1f, 0xcf, 0xc1, 0xe5, 0x74, 0x54, 0xb9, 0xd5, 0x9a, 0xb3, 0x9d, 0x10, 0xa7, 0xfc, 0xb9, 0x5c, + 0xf4, 0xa0, 0x61, 0x77, 0xc5, 0xe6, 0xfb, 0xb4, 0x5d, 0x56, 0x40, 0x3e, 0x03, 0xa3, 0xe5, 0xae, + 0x61, 0x7a, 0x78, 0xf1, 0xc6, 0x0c, 0xe7, 0x1f, 0xcd, 0xc5, 0xb6, 0x38, 0x32, 0x16, 0xb7, 0x38, + 0x32, 0x80, 0xdc, 0x82, 0x53, 0x75, 0xda, 0xec, 0x3a, 0xa6, 0xb7, 0xa9, 0xd1, 0x8e, 0xed, 0x78, + 0x8c, 0xc7, 0x9f, 0xcf, 0x45, 0x27, 0xb1, 0x04, 0x05, 0x9b, 0xc4, 0x12, 0x40, 0x72, 0x37, 0x71, + 0x2b, 0x2f, 0x3a, 0xf3, 0xc7, 0x72, 0x3d, 0xaf, 0xe5, 0x83, 0xbe, 0x4c, 0x2f, 0x4e, 0x6a, 0xb1, + 0x5b, 0x74, 0xc1, 0xf5, 0xc7, 0x73, 0x3d, 0xae, 0xd1, 0xa5, 0x19, 0x2e, 0x09, 0x66, 0x1c, 0x53, + 0x92, 0xde, 0x2b, 0x7f, 0x21, 0xd7, 0xe3, 0xda, 0x3b, 0xe4, 0x98, 0x96, 0x2f, 0xff, 0x65, 0xee, + 0x29, 0x22, 0x18, 0xfd, 0x44, 0x2e, 0xe9, 0x2a, 0x12, 0x94, 0x97, 0x08, 0x59, 0xb1, 0x3b, 0x6e, + 0xa0, 0xf4, 0x5f, 0xcd, 0x25, 0x7d, 0xf3, 0xc2, 0x62, 0xe1, 0x2f, 0x42, 0xe1, 0xe2, 0xec, 0x23, + 0x8f, 0x3a, 0x96, 0xde, 0xc2, 0xee, 0xac, 0x7b, 0xb6, 0xa3, 0xaf, 0xd1, 0x59, 0x4b, 0x5f, 0x6d, + 0x51, 0xe5, 0x27, 0x73, 0x51, 0x0b, 0x36, 0x9b, 0x94, 0x59, 0xb0, 0xd9, 0x58, 0xb2, 0x0e, 0x4f, + 0xa4, 0x61, 0x2b, 0xa6, 0x8b, 0xf5, 0x7c, 0x2d, 0x17, 0x35, 0x61, 0x7b, 0xd0, 0x32, 0x13, 0xb6, + 0x07, 0x9a, 0x5c, 0x87, 0xa1, 0x69, 0xdb, 0x9f, 0x7e, 0xff, 0x62, 0xcc, 0x19, 0x32, 0xc0, 0xcc, + 0xf7, 0x69, 0x21, 0x99, 0x28, 0x23, 0x06, 0xf5, 0xd7, 0x93, 0x65, 0xc2, 0xcb, 0xa7, 0xe0, 0x87, + 0x28, 0x23, 0xc4, 0xfd, 0xef, 0x24, 0xcb, 0x84, 0x77, 0x5c, 0xc1, 0x0f, 0x36, 0x93, 0xf0, 0x1a, + 0x17, 0xe7, 0xca, 0xcc, 0x6e, 0x9b, 0x59, 0xd7, 0x5b, 0x2d, 0x6a, 0xad, 0x51, 0xe5, 0x1b, 0xb1, + 0x99, 0x24, 0x9d, 0x8c, 0xcd, 0x24, 0xe9, 0x18, 0xf2, 0x03, 0x70, 0xfe, 0xae, 0xde, 0x32, 0x8d, + 0x10, 0xe7, 0xa7, 0x40, 0x57, 0x7e, 0x2a, 0x17, 0xdd, 0x4d, 0x67, 0xd0, 0xb1, 0xdd, 0x74, 0x06, + 0x8a, 0x2c, 0x02, 0xc1, 0x65, 0x34, 0x98, 0x2d, 0xd8, 0xfa, 0xac, 0xfc, 0xbb, 0xb9, 0xa8, 0x9d, + 0x9a, 0x24, 0x61, 0x76, 0x6a, 0x12, 0x4a, 0x1a, 0xd9, 0x89, 0x4c, 0x94, 0x9f, 0xce, 0x45, 0x4f, + 0x6b, 0xb2, 0x08, 0xe7, 0xfb, 0xb4, 0xec, 0x6c, 0x28, 0x37, 0x61, 0xa2, 0x5e, 0xab, 0xce, 0xcd, + 0xcd, 0xd6, 0xef, 0x56, 0x2b, 0xf8, 0x8a, 0xc2, 0x50, 0x7e, 0x26, 0xb6, 0x62, 0xc5, 0x09, 0xd8, + 0x8a, 0x15, 0x87, 0x91, 0x37, 0x60, 0x84, 0xb5, 0x9f, 0x0d, 0x18, 0xfc, 0xe4, 0x9f, 0xcd, 0x45, + 0xcd, 0x29, 0x19, 0xc9, 0xcc, 0x29, 0xf9, 0x37, 0xa9, 0xc3, 0x19, 0x26, 0xc5, 0x9a, 0x43, 0xef, + 0x53, 0x87, 0x5a, 0x4d, 0x7f, 0x4c, 0xff, 0x5c, 0x2e, 0x6a, 0x65, 0xa4, 0x11, 0x31, 0x2b, 0x23, + 0x0d, 0x4e, 0x1e, 0xc0, 0xa5, 0xf8, 0x49, 0x90, 0xfc, 0x48, 0x56, 0xf9, 0x4b, 0xb9, 0x98, 0x31, + 0xdc, 0x83, 0x18, 0x8d, 0xe1, 0x1e, 0x78, 0x62, 0xc1, 0x93, 0xe2, 0x58, 0x45, 0x38, 0x5c, 0xc6, + 0x6b, 0xfb, 0xcb, 0xbc, 0xb6, 0x8f, 0x87, 0x0e, 0x81, 0x3d, 0xa8, 0xe7, 0xfb, 0xb4, 0xde, 0xec, + 0x98, 0x9e, 0x25, 0xd3, 0x75, 0x28, 0x7f, 0x25, 0x97, 0xee, 0x91, 0x12, 0x71, 0x53, 0x4e, 0xcb, + 0xf3, 0xf1, 0x6e, 0x56, 0xb2, 0x09, 0xe5, 0xaf, 0xc6, 0xc6, 0x5b, 0x3a, 0x19, 0x1b, 0x6f, 0x19, + 0xd9, 0x2a, 0x6e, 0xc1, 0x29, 0xae, 0xd4, 0x35, 0x1d, 0x87, 0xa1, 0xb5, 0x46, 0x0d, 0xe5, 0xdf, + 0x8b, 0xad, 0x76, 0x09, 0x0a, 0x74, 0xed, 0x89, 0x03, 0xd9, 0xd4, 0x5d, 0xef, 0xe8, 0x96, 0x85, + 0xc7, 0xac, 0xca, 0xbf, 0x1f, 0x9b, 0xba, 0x43, 0x14, 0x3a, 0xee, 0x06, 0xbf, 0x98, 0x26, 0xf4, + 0x4a, 0xd4, 0xa4, 0xfc, 0xb5, 0x98, 0x26, 0xf4, 0x22, 0x66, 0x9a, 0xd0, 0x33, 0xeb, 0xd3, 0xdd, + 0x8c, 0x07, 0xeb, 0xca, 0x37, 0x63, 0x2b, 0x72, 0x2a, 0x15, 0x5b, 0x91, 0xd3, 0xdf, 0xbb, 0xdf, + 0xcd, 0x78, 0xec, 0xad, 0xfc, 0x7c, 0x6f, 0xbe, 0xe1, 0x4a, 0x9f, 0xfe, 0x56, 0xfc, 0x6e, 0xc6, + 0x43, 0x69, 0xe5, 0xaf, 0xf7, 0xe6, 0x1b, 0x3a, 0xf6, 0xa5, 0xbf, 0xb3, 0x6e, 0x64, 0x3f, 0x32, + 0x56, 0xfe, 0x46, 0x7c, 0xea, 0xca, 0x20, 0xc4, 0xa9, 0x2b, 0xeb, 0xa5, 0xf2, 0x2a, 0x5c, 0xe0, + 0x1a, 0x72, 0xd3, 0xd1, 0x3b, 0xeb, 0x75, 0xea, 0x79, 0xa6, 0xb5, 0xe6, 0xef, 0xc4, 0xfe, 0x66, + 0x2e, 0x76, 0x3c, 0x96, 0x45, 0x89, 0xc7, 0x63, 0x59, 0x48, 0xa6, 0xbc, 0x89, 0xe7, 0xc4, 0xca, + 0xdf, 0x8a, 0x29, 0x6f, 0x82, 0x82, 0x29, 0x6f, 0xf2, 0x15, 0xf2, 0xad, 0x94, 0x57, 0xb3, 0xca, + 0x7f, 0x90, 0xcd, 0x2b, 0x68, 0x5f, 0xca, 0x63, 0xdb, 0x5b, 0x29, 0x8f, 0x43, 0x95, 0xff, 0x30, + 0x9b, 0x57, 0xe8, 0x83, 0x94, 0x7c, 0x53, 0xfa, 0x2e, 0x9c, 0xe3, 0xb3, 0xf9, 0x1c, 0x35, 0x68, + 0xe4, 0x43, 0x7f, 0x21, 0x36, 0xf6, 0xd3, 0xc9, 0xf0, 0xc8, 0x3d, 0x15, 0x93, 0xc6, 0x5a, 0xb4, + 0xf5, 0x6f, 0xef, 0xc0, 0x3a, 0xdc, 0x10, 0xa4, 0x63, 0xd8, 0x7a, 0x23, 0x3f, 0x7e, 0x53, 0x7e, + 0x31, 0xb6, 0xde, 0xc8, 0x48, 0x74, 0xe7, 0x90, 0x5f, 0xca, 0xbd, 0x11, 0x7d, 0xe8, 0xa5, 0xfc, + 0x9d, 0xd4, 0xc2, 0x41, 0x07, 0x44, 0x5f, 0x85, 0xbd, 0x11, 0x7d, 0xd4, 0xa4, 0xfc, 0x52, 0x6a, + 0xe1, 0xe0, 0x03, 0xa2, 0x2f, 0xa0, 0xd8, 0x16, 0xa9, 0xeb, 0xd9, 0x9c, 0x55, 0x64, 0x7a, 0xf8, + 0xbb, 0xf1, 0x2d, 0x52, 0x2a, 0x19, 0x6e, 0x91, 0x52, 0x31, 0x69, 0xac, 0xc5, 0xe7, 0xfd, 0xf2, + 0x0e, 0xac, 0xa5, 0x8d, 0x5d, 0x2a, 0x26, 0x8d, 0xb5, 0xf8, 0xf8, 0x6f, 0xed, 0xc0, 0x5a, 0xda, + 0xd8, 0xa5, 0x62, 0x98, 0x39, 0x16, 0x62, 0xee, 0x52, 0xc7, 0x0d, 0xd5, 0xef, 0x3f, 0x8a, 0x99, + 0x63, 0x19, 0x74, 0xcc, 0x1c, 0xcb, 0x40, 0xa5, 0x72, 0x17, 0x42, 0xf9, 0x95, 0x9d, 0xb8, 0x87, + 0xf7, 0x32, 0x19, 0xa8, 0x54, 0xee, 0x42, 0x2e, 0x7f, 0x6f, 0x27, 0xee, 0xe1, 0xc5, 0x4c, 0x06, + 0x8a, 0x19, 0x45, 0x75, 0x4f, 0xf7, 0xcc, 0xe6, 0xbc, 0xed, 0x7a, 0xd2, 0x22, 0xff, 0x1f, 0xc7, + 0x8c, 0xa2, 0x34, 0x22, 0x66, 0x14, 0xa5, 0xc1, 0x93, 0x4c, 0x85, 0x34, 0x7e, 0xb5, 0x27, 0xd3, + 0xd0, 0xd2, 0x4a, 0x83, 0x27, 0x99, 0x0a, 0x21, 0xfc, 0x27, 0x3d, 0x99, 0x86, 0x9e, 0xf2, 0x69, + 0x70, 0x66, 0x99, 0xce, 0x38, 0xf6, 0x86, 0x75, 0x8b, 0x6e, 0xd0, 0x96, 0xf8, 0xf4, 0x5f, 0x8b, + 0x59, 0xa6, 0x71, 0x02, 0xbc, 0x45, 0x89, 0xc1, 0xa2, 0x8c, 0xc4, 0xe7, 0xfe, 0x7a, 0x26, 0xa3, + 0xf0, 0x98, 0x28, 0x0e, 0x8b, 0x32, 0x12, 0x9f, 0xf8, 0x1b, 0x99, 0x8c, 0xc2, 0x63, 0xa2, 0x38, + 0x8c, 0x94, 0x61, 0x0c, 0xdf, 0x4a, 0xe8, 0xae, 0xef, 0xf9, 0xf9, 0xdb, 0xb9, 0xe8, 0xad, 0x57, + 0x14, 0x3d, 0xdf, 0xa7, 0xc5, 0x0a, 0xc8, 0x2c, 0xc4, 0x27, 0x7d, 0x27, 0x83, 0x45, 0xe8, 0xef, + 0x18, 0x85, 0xc8, 0x2c, 0xc4, 0xc7, 0xfc, 0xa7, 0x19, 0x2c, 0x42, 0x87, 0xc7, 0x28, 0x84, 0x7c, + 0x1a, 0x86, 0xeb, 0x73, 0x2b, 0x35, 0x3f, 0x99, 0xe0, 0xdf, 0xcf, 0xc5, 0x5e, 0x15, 0x85, 0x38, + 0x7c, 0x55, 0x14, 0xfe, 0x24, 0x9f, 0x81, 0xd1, 0x19, 0xdb, 0xf2, 0xf4, 0xa6, 0xbf, 0x01, 0xfd, + 0x9d, 0xd8, 0x19, 0x4a, 0x04, 0x3b, 0xdf, 0xa7, 0x45, 0xc9, 0xa5, 0xf2, 0xa2, 0xed, 0xbf, 0x9b, + 0x5e, 0x3e, 0x68, 0x7a, 0x94, 0x7c, 0x7a, 0x00, 0xfa, 0xf1, 0x28, 0xf7, 0x56, 0x69, 0xf0, 0xdb, + 0xb9, 0x89, 0xdf, 0xcc, 0xdd, 0x2a, 0x0d, 0xfe, 0x66, 0x6e, 0xe2, 0xb7, 0xd8, 0xff, 0xbf, 0x95, + 0x9b, 0xf8, 0xed, 0x9c, 0x76, 0x21, 0x1c, 0x96, 0xe5, 0x35, 0x6a, 0x79, 0xb5, 0x96, 0x2e, 0x26, + 0x95, 0x54, 0x14, 0xff, 0x99, 0x8a, 0x12, 0x89, 0xc3, 0xbe, 0x99, 0x83, 0x91, 0xba, 0xe7, 0x50, + 0xbd, 0x2d, 0xe2, 0xf0, 0x5d, 0x84, 0x41, 0xee, 0x7c, 0xed, 0x3f, 0x43, 0xd7, 0x82, 0xdf, 0xe4, + 0x32, 0x8c, 0x2d, 0xe8, 0xae, 0x87, 0x4d, 0xac, 0x5a, 0x06, 0x7d, 0x84, 0x0f, 0x0f, 0x0b, 0x5a, + 0x0c, 0x4a, 0x16, 0x38, 0x1d, 0x2f, 0x87, 0xa1, 0x57, 0x0b, 0x3b, 0x86, 0x9f, 0x1b, 0xfc, 0xee, + 0xd6, 0x64, 0x1f, 0x46, 0x9b, 0x8b, 0x95, 0x55, 0xff, 0x20, 0x07, 0x09, 0xb7, 0xf0, 0xfd, 0xc7, + 0x9b, 0x58, 0x86, 0xf1, 0x58, 0xb8, 0x5f, 0xf1, 0x7a, 0x72, 0x97, 0xd1, 0x80, 0xe3, 0xa5, 0xc9, + 0x27, 0x82, 0x57, 0x7b, 0x77, 0xb4, 0x05, 0x11, 0x5a, 0x10, 0x93, 0x62, 0x74, 0x9d, 0x96, 0x26, + 0xa1, 0x44, 0xe8, 0xa8, 0xef, 0x4f, 0x84, 0xb1, 0x4c, 0xc9, 0x65, 0x11, 0xfc, 0x22, 0x17, 0x06, + 0x24, 0x8c, 0xa5, 0xe0, 0xe7, 0xc1, 0x2e, 0x3e, 0x03, 0x23, 0xd5, 0x76, 0x87, 0x3a, 0xae, 0x6d, + 0xe9, 0x9e, 0xed, 0x88, 0xa7, 0xfe, 0xf8, 0x28, 0xdf, 0x94, 0xe0, 0xf2, 0xa3, 0x7c, 0x99, 0x9e, + 0x5c, 0xf5, 0xf3, 0xfa, 0x15, 0x30, 0x8a, 0x2c, 0x3e, 0xa9, 0x8d, 0xa7, 0x75, 0xe7, 0x14, 0x8c, + 0xf4, 0x8e, 0xab, 0xe3, 0xfb, 0xce, 0x80, 0xb4, 0xcb, 0x00, 0x32, 0x29, 0x52, 0x90, 0xe7, 0xa1, + 0x84, 0xf7, 0x61, 0x2e, 0xe6, 0xeb, 0x14, 0x61, 0x12, 0x5b, 0x08, 0x91, 0x03, 0x32, 0x70, 0x1a, + 0x72, 0x1b, 0x26, 0xc2, 0xcb, 0xfe, 0x9b, 0x8e, 0xdd, 0xed, 0xf8, 0x19, 0x7a, 0x30, 0x1d, 0xfe, + 0x83, 0x00, 0xd7, 0x58, 0x43, 0xa4, 0xc4, 0x22, 0x51, 0x90, 0xcc, 0xc3, 0x78, 0x08, 0x63, 0x22, + 0xf2, 0x33, 0x83, 0x61, 0x56, 0x56, 0x89, 0x17, 0x13, 0x67, 0x24, 0x2b, 0x6b, 0xac, 0x18, 0xa9, + 0xc2, 0x80, 0x1f, 0x23, 0x71, 0x70, 0x47, 0x25, 0x3d, 0x2d, 0x62, 0x24, 0x0e, 0xc8, 0xd1, 0x11, + 0xfd, 0xf2, 0x64, 0x0e, 0xc6, 0x34, 0xbb, 0xeb, 0xd1, 0x15, 0x5b, 0xec, 0x92, 0x45, 0x2c, 0x4e, + 0x6c, 0x93, 0xc3, 0x30, 0x0d, 0xcf, 0x6e, 0x34, 0x39, 0x4e, 0xce, 0x6a, 0x1f, 0x2d, 0x45, 0x96, + 0xe0, 0x54, 0xc2, 0x2d, 0x42, 0xce, 0xf1, 0x2f, 0x7d, 0x5e, 0x92, 0x59, 0xb2, 0x28, 0xf9, 0xd1, + 0x1c, 0x94, 0x56, 0x1c, 0xdd, 0xf4, 0x5c, 0xf1, 0x34, 0xf4, 0xec, 0xd4, 0x86, 0xa3, 0x77, 0x98, + 0x7e, 0x4c, 0x61, 0x98, 0xe0, 0xbb, 0x7a, 0xab, 0x4b, 0xdd, 0xe9, 0x7b, 0xec, 0xeb, 0xfe, 0xfb, + 0xad, 0xc9, 0x37, 0x78, 0x50, 0x8d, 0xa9, 0xa6, 0xdd, 0xbe, 0xb6, 0xe6, 0xe8, 0x0f, 0x4d, 0x0f, + 0x4d, 0x5c, 0xbd, 0x75, 0xcd, 0xa3, 0x2d, 0x3c, 0xe3, 0xbd, 0xa6, 0x77, 0xcc, 0x6b, 0x18, 0x8e, + 0xfe, 0x5a, 0xc0, 0x89, 0xd7, 0xc0, 0x54, 0xc0, 0xc3, 0xbf, 0x64, 0x15, 0xe0, 0x38, 0xb2, 0x04, + 0x20, 0x3e, 0xb5, 0xdc, 0xe9, 0x88, 0x77, 0xa6, 0xd2, 0xc9, 0xa8, 0x8f, 0xe1, 0x8a, 0x1d, 0x08, + 0x4c, 0xef, 0x48, 0x21, 0x98, 0x35, 0x89, 0x03, 0xd3, 0x82, 0x15, 0xd1, 0x22, 0x5f, 0x4c, 0xa3, + 0xa1, 0xc4, 0xfd, 0xc6, 0xa6, 0x08, 0x29, 0x5e, 0x8c, 0xac, 0xc2, 0xb8, 0xe0, 0x1b, 0x24, 0x6c, + 0x19, 0x8b, 0xce, 0x0a, 0x31, 0x34, 0x57, 0xda, 0xa0, 0x8d, 0x86, 0x00, 0xcb, 0x75, 0xc4, 0x4a, + 0x90, 0xe9, 0x30, 0xc1, 0xf4, 0x92, 0xde, 0xa6, 0xae, 0x32, 0x8e, 0x1a, 0x7b, 0x69, 0x7b, 0x6b, + 0x52, 0xf1, 0xcb, 0x63, 0xb8, 0x50, 0x59, 0x74, 0xd1, 0x22, 0x32, 0x0f, 0xae, 0xf5, 0x13, 0x29, + 0x3c, 0xe2, 0x3a, 0x1f, 0x2d, 0x42, 0x66, 0x60, 0x34, 0x78, 0xe6, 0x72, 0xe7, 0x4e, 0xb5, 0x82, + 0x0f, 0x59, 0x45, 0xc4, 0xd8, 0x58, 0x4a, 0x15, 0x99, 0x49, 0xa4, 0x8c, 0x14, 0x78, 0x84, 0xbf, + 0x6c, 0x8d, 0x05, 0x1e, 0xe9, 0xa4, 0x04, 0x1e, 0xa9, 0x91, 0xb7, 0x60, 0xb8, 0x7c, 0xaf, 0x2e, + 0x02, 0xaa, 0xb8, 0xca, 0xe9, 0x30, 0x3f, 0x97, 0xbe, 0xe1, 0x36, 0xfc, 0xe0, 0x2b, 0x72, 0xd3, + 0x65, 0x7a, 0x32, 0x0b, 0x63, 0x11, 0x4f, 0x39, 0x57, 0x39, 0x83, 0x1c, 0xb0, 0xe5, 0x3a, 0x62, + 0x1a, 0x8e, 0x40, 0xc9, 0xc3, 0x2b, 0x5a, 0x88, 0x69, 0x4d, 0xc5, 0x74, 0x31, 0xd7, 0x91, 0x46, + 0x31, 0x76, 0x0b, 0x3e, 0x8b, 0x1d, 0xe4, 0x5a, 0x63, 0x08, 0x54, 0xc3, 0xe1, 0x38, 0xb9, 0x47, + 0x63, 0xc5, 0xc8, 0x7b, 0x40, 0x30, 0x3b, 0x12, 0x35, 0xfc, 0x8b, 0xd3, 0x6a, 0xc5, 0x55, 0xce, + 0x61, 0xb8, 0x74, 0x12, 0x0f, 0xe7, 0x50, 0xad, 0x4c, 0x5f, 0x16, 0xd3, 0xc7, 0x53, 0x3a, 0x2f, + 0xd5, 0xf0, 0x43, 0x39, 0x34, 0xcc, 0x48, 0xea, 0xe8, 0x14, 0xae, 0x64, 0x03, 0xce, 0xd7, 0x1c, + 0xfa, 0xd0, 0xb4, 0xbb, 0xae, 0xbf, 0x7c, 0xf8, 0xf3, 0xd6, 0xf9, 0x1d, 0xe7, 0xad, 0x67, 0x44, + 0xc5, 0x67, 0x3b, 0x0e, 0x7d, 0xd8, 0xf0, 0x83, 0x64, 0x47, 0x62, 0xbc, 0x66, 0x71, 0xc7, 0x04, + 0xd8, 0xef, 0x77, 0x1d, 0x2a, 0xe0, 0x26, 0x75, 0x15, 0x25, 0x9c, 0x6a, 0x79, 0x5c, 0x1f, 0x33, + 0xc0, 0x45, 0x12, 0x60, 0x47, 0x8b, 0x11, 0x0d, 0xc8, 0xcd, 0x19, 0xff, 0x12, 0xbd, 0xdc, 0xe4, + 0x69, 0x82, 0x95, 0x0b, 0xc8, 0x4c, 0x65, 0x62, 0x59, 0x6b, 0x06, 0x01, 0xf3, 0x1b, 0xba, 0xc0, + 0xcb, 0x62, 0x49, 0x96, 0x26, 0x0b, 0x30, 0x51, 0x73, 0xf0, 0x48, 0xef, 0x36, 0xdd, 0xac, 0xd9, + 0x2d, 0xb3, 0xb9, 0x89, 0xaf, 0x73, 0xc5, 0x54, 0xd9, 0xe1, 0xb8, 0xc6, 0x03, 0xba, 0xd9, 0xe8, + 0x20, 0x56, 0x5e, 0x56, 0xe2, 0x25, 0xe5, 0x00, 0xd6, 0x4f, 0xec, 0x2e, 0x80, 0x35, 0x85, 0x09, + 0x71, 0x05, 0xff, 0xc8, 0xa3, 0x16, 0x5b, 0xea, 0x5d, 0xf1, 0x12, 0x57, 0x89, 0x5d, 0xd9, 0x07, + 0x78, 0x3e, 0x75, 0x88, 0x51, 0x46, 0x03, 0xb0, 0xdc, 0xb0, 0x78, 0x91, 0x64, 0x94, 0xe7, 0x27, + 0xf7, 0x11, 0xe5, 0xf9, 0x7f, 0x2f, 0xc8, 0xf3, 0x2f, 0xb9, 0x04, 0x45, 0x29, 0x09, 0x13, 0x86, + 0xb0, 0xc5, 0x80, 0xf5, 0x45, 0x11, 0x99, 0x7b, 0x48, 0xd8, 0x2e, 0x41, 0x68, 0x21, 0xcc, 0xba, + 0x19, 0x86, 0x35, 0xd5, 0x42, 0x02, 0xcc, 0x78, 0xd8, 0x5d, 0x6d, 0x99, 0x4d, 0x4c, 0x63, 0x50, + 0x90, 0xc2, 0x7d, 0x20, 0x94, 0x67, 0x31, 0x90, 0x48, 0xc8, 0x75, 0x18, 0xf6, 0x8f, 0x92, 0xc3, + 0x10, 0xce, 0x18, 0xdd, 0x5e, 0xcc, 0xd6, 0x22, 0x78, 0xbe, 0x44, 0x44, 0x5e, 0x07, 0x08, 0xa7, + 0x03, 0x61, 0x69, 0xe1, 0x52, 0x21, 0xcf, 0x1e, 0xf2, 0x52, 0x11, 0x52, 0xb3, 0x89, 0x53, 0x56, + 0x47, 0x3f, 0xc7, 0x2b, 0x4e, 0x9c, 0x11, 0x1d, 0x96, 0x15, 0x24, 0x5a, 0x84, 0x2c, 0xc3, 0xa9, + 0x84, 0x06, 0x8a, 0x80, 0xcf, 0x98, 0xe7, 0x3f, 0x45, 0x7d, 0xe5, 0x85, 0x39, 0x51, 0x96, 0x3c, + 0x0b, 0x85, 0x3b, 0x5a, 0x55, 0x04, 0x9d, 0xe5, 0xf1, 0x8a, 0x23, 0x01, 0xa4, 0x18, 0x96, 0xbc, + 0x06, 0xc0, 0x93, 0xba, 0xd4, 0x6c, 0xc7, 0x43, 0x8b, 0x62, 0x74, 0xfa, 0x02, 0x1b, 0xcb, 0x3c, + 0xe9, 0x4b, 0x83, 0x2d, 0x63, 0xf2, 0x47, 0x87, 0xc4, 0xea, 0x0f, 0xe7, 0x13, 0xcb, 0x1a, 0x13, + 0xbc, 0x68, 0x85, 0xd4, 0xf9, 0x28, 0x78, 0xbf, 0xe9, 0x5c, 0xf0, 0x12, 0x11, 0xb9, 0x02, 0x83, + 0x35, 0x36, 0xa9, 0x34, 0xed, 0x96, 0x50, 0x05, 0x8c, 0x3c, 0xd6, 0x11, 0x30, 0x2d, 0xc0, 0x92, + 0xeb, 0x52, 0x56, 0x63, 0x29, 0x04, 0xbc, 0x9f, 0xd5, 0x38, 0x1e, 0x0b, 0x1d, 0xf3, 0x1b, 0x5f, + 0x8f, 0x65, 0x49, 0x13, 0x65, 0x52, 0x96, 0xd4, 0x30, 0x2b, 0x5a, 0x60, 0xd0, 0xf6, 0xef, 0x64, + 0xd0, 0xaa, 0xbf, 0x93, 0x4b, 0x0e, 0x51, 0x72, 0x23, 0x19, 0x8d, 0x19, 0xd7, 0xaf, 0x00, 0x28, + 0xd7, 0x1a, 0xc4, 0x65, 0x8e, 0xc4, 0x55, 0xce, 0xef, 0x3b, 0xae, 0x72, 0x61, 0x8f, 0x71, 0x95, + 0xd5, 0xff, 0xa7, 0xd8, 0xd3, 0xdb, 0xfc, 0x48, 0xe2, 0xef, 0xbd, 0xc6, 0x36, 0x65, 0xac, 0xf6, + 0xb2, 0x9b, 0xd8, 0x5a, 0x70, 0x67, 0xda, 0x86, 0xce, 0x47, 0xa5, 0xab, 0x45, 0x29, 0xc9, 0xdb, + 0x30, 0xe2, 0x7f, 0x00, 0xc6, 0xeb, 0x96, 0xe2, 0x4c, 0x07, 0x0b, 0x62, 0x2c, 0xb2, 0x75, 0xa4, + 0x00, 0x79, 0x19, 0x86, 0xd0, 0x1c, 0xea, 0xe8, 0x4d, 0x3f, 0x98, 0x3b, 0x8f, 0xfe, 0xee, 0x03, + 0xe5, 0x18, 0x73, 0x01, 0x25, 0xf9, 0x22, 0x94, 0x44, 0x46, 0x13, 0x9e, 0xf0, 0xff, 0xda, 0x2e, + 0xdc, 0xf3, 0xa7, 0xe4, 0x6c, 0x26, 0x7c, 0x83, 0x83, 0x80, 0xc8, 0x06, 0x87, 0x27, 0x32, 0x59, + 0x81, 0xd3, 0x35, 0x87, 0x1a, 0xf8, 0x10, 0x64, 0xf6, 0x51, 0xc7, 0x11, 0xb9, 0x66, 0xf8, 0x04, + 0x81, 0xeb, 0x5b, 0xc7, 0x47, 0xb3, 0x95, 0x57, 0xe0, 0xe5, 0x88, 0xd2, 0x29, 0xc5, 0x99, 0xd1, + 0xc3, 0x5b, 0x72, 0x9b, 0x6e, 0x6e, 0xd8, 0x8e, 0xc1, 0xd3, 0xb1, 0x88, 0xa9, 0x5f, 0x08, 0xfa, + 0x81, 0x40, 0xc9, 0x46, 0x4f, 0xb4, 0xd0, 0xc5, 0xd7, 0x60, 0x78, 0xbf, 0x19, 0x41, 0x7e, 0x25, + 0x9f, 0xf1, 0x6e, 0xeb, 0xf1, 0x4d, 0xca, 0x18, 0x64, 0x0a, 0xef, 0xcf, 0xc8, 0x14, 0xfe, 0xa7, + 0xf9, 0x8c, 0x47, 0x69, 0x8f, 0x75, 0x46, 0xdf, 0x40, 0x18, 0xd1, 0x8c, 0xbe, 0x61, 0x32, 0x65, + 0xd3, 0xd0, 0x64, 0xa2, 0x58, 0xee, 0xef, 0xd2, 0x8e, 0xb9, 0xbf, 0x7f, 0xa1, 0xd0, 0xeb, 0xd1, + 0xde, 0x89, 0xec, 0xf7, 0x22, 0xfb, 0xeb, 0x30, 0x1c, 0x48, 0xb6, 0x5a, 0x41, 0x7b, 0x69, 0x34, + 0xc8, 0x3f, 0xc4, 0xc1, 0x58, 0x46, 0x22, 0x22, 0x57, 0x79, 0x5b, 0xeb, 0xe6, 0xfb, 0x3c, 0x13, + 0xc6, 0xa8, 0xc8, 0x71, 0xa0, 0x7b, 0x7a, 0xc3, 0x35, 0xdf, 0xa7, 0x5a, 0x80, 0xc6, 0x20, 0xa7, + 0x69, 0xef, 0x17, 0x4f, 0xfa, 0x68, 0xf7, 0x7d, 0x94, 0x22, 0x44, 0xfe, 0x66, 0xf3, 0x44, 0x88, + 0x7b, 0x10, 0xe2, 0x9f, 0xe4, 0x53, 0x5f, 0xb8, 0x9e, 0x08, 0x71, 0x2f, 0xb3, 0xc5, 0xf3, 0x30, + 0xa4, 0xd9, 0x1b, 0xee, 0x0c, 0xee, 0x89, 0xf8, 0x5c, 0x81, 0x13, 0xb5, 0x63, 0x6f, 0xb8, 0x0d, + 0xdc, 0xed, 0x68, 0x21, 0x81, 0xfa, 0xfd, 0x7c, 0x8f, 0x37, 0xc0, 0x27, 0x82, 0xff, 0x20, 0x97, + 0xc8, 0x5f, 0xcf, 0x47, 0xde, 0x18, 0x3f, 0xbe, 0xc2, 0xbe, 0x06, 0x50, 0x6f, 0xae, 0xd3, 0xb6, + 0x2e, 0x65, 0x13, 0xc3, 0x23, 0x0b, 0x17, 0xa1, 0x22, 0x0b, 0x75, 0x48, 0xa2, 0x7e, 0x3b, 0x1f, + 0x7b, 0x64, 0x7d, 0x22, 0xbb, 0x5d, 0xcb, 0x2e, 0xd0, 0x3a, 0xf1, 0x6e, 0xfc, 0x44, 0x72, 0xbb, + 0x95, 0xdc, 0x8f, 0xe5, 0x63, 0x4f, 0xec, 0x1f, 0x5b, 0xd9, 0xb1, 0x01, 0x98, 0x7c, 0xfa, 0xff, + 0xd8, 0x6a, 0xd2, 0xf3, 0x30, 0x24, 0xe4, 0x10, 0x2c, 0x15, 0x7c, 0xde, 0xe7, 0x40, 0x3c, 0xa0, + 0x0d, 0x08, 0xd4, 0x3f, 0x97, 0x87, 0x68, 0xe8, 0x83, 0xc7, 0x54, 0x87, 0x7e, 0x3d, 0x1f, 0x0d, + 0xfa, 0xf0, 0xf8, 0xea, 0xcf, 0x14, 0x40, 0xbd, 0xbb, 0xda, 0x14, 0x31, 0x83, 0xfb, 0xa5, 0x13, + 0xfe, 0x00, 0xaa, 0x49, 0x14, 0xea, 0xff, 0x9b, 0x4f, 0x8d, 0x44, 0xf1, 0xf8, 0x0a, 0xf0, 0x25, + 0x3c, 0x15, 0x6f, 0x5a, 0xe1, 0x44, 0x8e, 0x87, 0x90, 0x6c, 0xfc, 0x25, 0x52, 0x50, 0xfa, 0x84, + 0xe4, 0xd3, 0x29, 0xe6, 0x1a, 0x26, 0xc8, 0x08, 0xcd, 0x35, 0xf9, 0x30, 0x5f, 0x32, 0xdc, 0x7e, + 0x3f, 0xbf, 0x53, 0xe0, 0x8e, 0xc7, 0x79, 0x55, 0x1d, 0xa8, 0xe9, 0x9b, 0x18, 0x60, 0x92, 0xf5, + 0xc4, 0x08, 0x4f, 0x90, 0xd8, 0xe1, 0x20, 0xf9, 0xda, 0x4e, 0x50, 0xa9, 0xff, 0xbc, 0x3f, 0x3d, + 0x6a, 0xc4, 0xe3, 0x2b, 0xc2, 0x4b, 0x50, 0xac, 0xe9, 0xde, 0xba, 0xd0, 0x64, 0xbc, 0x0d, 0xec, + 0xe8, 0xde, 0xba, 0x86, 0x50, 0x72, 0x15, 0x06, 0x35, 0x7d, 0x83, 0x9f, 0x79, 0x96, 0xc2, 0xe4, + 0x95, 0x8e, 0xbe, 0xd1, 0xe0, 0xe7, 0x9e, 0x01, 0x9a, 0xa8, 0x41, 0xf2, 0x54, 0x7e, 0xf2, 0x8d, + 0x99, 0xfb, 0x78, 0xf2, 0xd4, 0x20, 0x65, 0xea, 0x25, 0x28, 0x4e, 0xdb, 0xc6, 0x26, 0xde, 0x7c, + 0x8d, 0xf0, 0xca, 0x56, 0x6d, 0x63, 0x53, 0x43, 0x28, 0xf9, 0xf1, 0x1c, 0x0c, 0xcc, 0x53, 0xdd, + 0x60, 0x23, 0x64, 0xa8, 0x97, 0xc3, 0xca, 0xe7, 0x0e, 0xc7, 0x61, 0xe5, 0xd4, 0x3a, 0xaf, 0x4c, + 0x56, 0x14, 0x51, 0x3f, 0xb9, 0x09, 0x83, 0x33, 0xba, 0x47, 0xd7, 0x6c, 0x67, 0x13, 0x5d, 0x70, + 0xc6, 0xc2, 0x97, 0x07, 0x11, 0xfd, 0xf1, 0x89, 0xf8, 0xcd, 0x58, 0x53, 0xfc, 0xd2, 0x82, 0xc2, + 0x4c, 0x2c, 0xfc, 0x66, 0x4e, 0x24, 0x0a, 0x47, 0xb1, 0xf0, 0x2b, 0x3c, 0x4d, 0x60, 0xc2, 0x63, + 0xe5, 0x91, 0xf4, 0x63, 0x65, 0xb4, 0x1e, 0xd1, 0x4d, 0x0f, 0x53, 0x96, 0x8e, 0xe2, 0xa2, 0xcf, + 0xad, 0x47, 0x84, 0x62, 0xc6, 0x52, 0x4d, 0x22, 0x51, 0xbf, 0xd7, 0x0f, 0xa9, 0x6f, 0xcc, 0x4f, + 0x94, 0xfc, 0x44, 0xc9, 0x43, 0x25, 0xaf, 0x24, 0x94, 0xfc, 0x62, 0x32, 0x6a, 0xc1, 0x87, 0x54, + 0xc3, 0x7f, 0xb6, 0x98, 0x88, 0x79, 0xf2, 0x78, 0xef, 0x2e, 0x43, 0xe9, 0xf5, 0xef, 0x28, 0xbd, + 0x60, 0x40, 0x94, 0x76, 0x1c, 0x10, 0x03, 0xbb, 0x1d, 0x10, 0x83, 0x99, 0x03, 0x22, 0x54, 0x90, + 0xa1, 0x4c, 0x05, 0xa9, 0x8a, 0x41, 0x03, 0xbd, 0x53, 0xaf, 0x5c, 0xda, 0xde, 0x9a, 0x1c, 0x63, + 0xa3, 0x29, 0x35, 0xe7, 0x0a, 0xb2, 0x50, 0xff, 0xa0, 0xd8, 0x23, 0x50, 0xd1, 0x91, 0xe8, 0xc8, + 0x4b, 0x50, 0x28, 0x77, 0x3a, 0x42, 0x3f, 0x4e, 0x4b, 0x31, 0x92, 0x32, 0x4a, 0x31, 0x6a, 0xf2, + 0x3a, 0x14, 0xca, 0xf7, 0xea, 0xf1, 0x74, 0x2b, 0xe5, 0x7b, 0x75, 0xf1, 0x25, 0x99, 0x65, 0xef, + 0xd5, 0xc9, 0x9b, 0x61, 0xdc, 0xd3, 0xf5, 0xae, 0xf5, 0x40, 0x6c, 0x14, 0x85, 0xa7, 0xae, 0xef, + 0xc9, 0xd3, 0x64, 0x28, 0xb6, 0x5d, 0x8c, 0xd1, 0xc6, 0xb4, 0xa9, 0xb4, 0x7b, 0x6d, 0x1a, 0xd8, + 0x51, 0x9b, 0x06, 0x77, 0xab, 0x4d, 0x43, 0xbb, 0xd0, 0x26, 0xd8, 0x51, 0x9b, 0x86, 0x0f, 0xae, + 0x4d, 0x1d, 0xb8, 0x98, 0x0c, 0x2e, 0x17, 0x68, 0x84, 0x06, 0x24, 0x89, 0x15, 0x8e, 0x25, 0x78, + 0xf5, 0xdf, 0xe5, 0xd8, 0xc6, 0x06, 0xa2, 0x1b, 0x2e, 0xc3, 0xcb, 0xae, 0x6d, 0xc9, 0xd2, 0xea, + 0xaf, 0xe4, 0xb3, 0x63, 0xe2, 0x1d, 0xcf, 0x29, 0xee, 0x07, 0x53, 0xa5, 0x54, 0x8c, 0xc6, 0x28, + 0xc8, 0x96, 0x72, 0x8c, 0x6d, 0x9a, 0xcc, 0xbe, 0x95, 0xcf, 0x0a, 0xd4, 0x77, 0x20, 0x89, 0x7d, + 0x3c, 0xe9, 0x0c, 0x87, 0x2e, 0xfe, 0x6e, 0xd4, 0x0b, 0x6e, 0x0e, 0x46, 0x64, 0x21, 0x0a, 0x29, + 0xed, 0x46, 0xc0, 0x91, 0x72, 0xe4, 0xcd, 0x20, 0x2b, 0x8e, 0xe4, 0x1f, 0x83, 0x9e, 0x6e, 0xfe, + 0x98, 0x8d, 0xb9, 0xc7, 0xc8, 0xe4, 0xe4, 0x79, 0x28, 0xcd, 0x61, 0x98, 0x79, 0x79, 0xb0, 0xf3, + 0xc0, 0xf3, 0xb2, 0xd7, 0x0a, 0xa7, 0x51, 0x7f, 0x27, 0x07, 0xa7, 0x6f, 0x77, 0x57, 0xa9, 0x70, + 0xb4, 0x0b, 0xda, 0xf0, 0x1e, 0x00, 0x03, 0x0b, 0x87, 0x99, 0x1c, 0x3a, 0xcc, 0x7c, 0x52, 0x0e, + 0xe8, 0x17, 0x2b, 0x30, 0x15, 0x52, 0x73, 0x67, 0x99, 0x27, 0x7d, 0x9f, 0xd3, 0x07, 0xdd, 0x55, + 0xda, 0x48, 0x78, 0xcd, 0x48, 0xdc, 0x2f, 0xbe, 0xc5, 0xbd, 0xf9, 0xf7, 0xeb, 0xa0, 0xf2, 0xcb, + 0xf9, 0xcc, 0x18, 0x8a, 0xc7, 0x36, 0x35, 0xe9, 0x17, 0x52, 0x7b, 0x25, 0x9e, 0xa2, 0x34, 0x85, + 0x24, 0xc6, 0x31, 0x8d, 0x4b, 0xba, 0xc0, 0x8e, 0x79, 0xc2, 0xdc, 0x0f, 0x54, 0x60, 0xff, 0x30, + 0x97, 0x19, 0xeb, 0xf2, 0xb8, 0x0a, 0x4c, 0xfd, 0x5f, 0x0a, 0x7e, 0x88, 0xcd, 0x03, 0x7d, 0xc2, + 0xf3, 0x30, 0x24, 0x22, 0x0d, 0x44, 0xfd, 0x84, 0xc5, 0xb1, 0x21, 0x1e, 0x43, 0x07, 0x04, 0xcc, + 0xa4, 0x90, 0x9c, 0x98, 0x25, 0x3f, 0x61, 0xc9, 0x81, 0x59, 0x93, 0x48, 0x98, 0xd1, 0x30, 0xfb, + 0xc8, 0xf4, 0xd0, 0x02, 0x61, 0x7d, 0x59, 0xe0, 0x46, 0x03, 0x7d, 0x64, 0x7a, 0xdc, 0xfe, 0x08, + 0xd0, 0xcc, 0x20, 0xe0, 0xb6, 0x88, 0x98, 0xf7, 0xd0, 0x20, 0xe0, 0xa6, 0x8a, 0x26, 0x30, 0xac, + 0xb5, 0xc2, 0xf9, 0x56, 0xb8, 0xb4, 0x88, 0xd6, 0x0a, 0x77, 0x5d, 0x6c, 0x6d, 0x40, 0xc0, 0x38, + 0x6a, 0x74, 0x2d, 0x74, 0xe2, 0x43, 0x8e, 0x0e, 0x42, 0x34, 0x81, 0x21, 0xd7, 0x61, 0xac, 0xee, + 0xe9, 0x96, 0xa1, 0x3b, 0xc6, 0x72, 0xd7, 0xeb, 0x74, 0x3d, 0xd9, 0x00, 0x76, 0x3d, 0xc3, 0xee, + 0x7a, 0x5a, 0x8c, 0x82, 0x7c, 0x0a, 0x46, 0x7d, 0xc8, 0xac, 0xe3, 0xd8, 0x8e, 0x6c, 0xe5, 0xb8, + 0x9e, 0x41, 0x1d, 0x47, 0x8b, 0x12, 0x90, 0x4f, 0xc3, 0x68, 0xd5, 0x7a, 0x68, 0x37, 0xf9, 0x6b, + 0x7b, 0x6d, 0x41, 0xd8, 0x3c, 0xf8, 0x62, 0xcc, 0x0c, 0x10, 0x8d, 0xae, 0xd3, 0xd2, 0xa2, 0x84, + 0xea, 0x76, 0x3e, 0x19, 0x89, 0xf4, 0xf1, 0xdd, 0x20, 0x5d, 0x8d, 0x3a, 0xee, 0xa1, 0xb7, 0x2a, + 0x1a, 0x9f, 0xb2, 0xdf, 0x30, 0xb7, 0x41, 0xaf, 0xc3, 0xe0, 0x6d, 0xba, 0xc9, 0x7d, 0x4c, 0x4b, + 0xa1, 0x5b, 0xf2, 0x03, 0x01, 0x93, 0x4f, 0x77, 0x7d, 0x3a, 0xf5, 0x3b, 0xf9, 0x64, 0x8c, 0xd5, + 0xc7, 0x57, 0xd8, 0x9f, 0x82, 0x01, 0x14, 0x65, 0xd5, 0xbf, 0x5e, 0x40, 0x01, 0xa2, 0xb8, 0xa3, + 0xde, 0xce, 0x3e, 0x99, 0xfa, 0xf3, 0xa5, 0x78, 0xe0, 0xdd, 0xc7, 0x57, 0x7a, 0x6f, 0xc0, 0xf0, + 0x8c, 0x6d, 0xb9, 0xa6, 0xeb, 0x51, 0xab, 0xe9, 0x2b, 0x2c, 0x3a, 0xfe, 0x37, 0x43, 0xb0, 0x6c, + 0x03, 0x4a, 0xd4, 0xfb, 0x51, 0x5e, 0xf2, 0x0a, 0x0c, 0xa1, 0xc8, 0xd1, 0xe6, 0xe4, 0x13, 0x1e, + 0xde, 0x4c, 0xac, 0x32, 0x60, 0xdc, 0xe2, 0x0c, 0x49, 0xc9, 0x1d, 0x18, 0x9c, 0x59, 0x37, 0x5b, + 0x86, 0x43, 0x2d, 0xf4, 0x4d, 0x96, 0xe2, 0x9b, 0x44, 0xfb, 0x72, 0x0a, 0xff, 0x45, 0x5a, 0xde, + 0x9c, 0xa6, 0x28, 0x16, 0x79, 0x2c, 0x26, 0x60, 0x17, 0x7f, 0x3a, 0x0f, 0x10, 0x16, 0x20, 0x4f, + 0x43, 0x3e, 0x48, 0x8c, 0x8d, 0x2e, 0x31, 0x11, 0x0d, 0xca, 0xe3, 0x52, 0x21, 0xc6, 0x76, 0x7e, + 0xc7, 0xb1, 0x7d, 0x07, 0x4a, 0xfc, 0x74, 0x0d, 0xbd, 0xd6, 0xa5, 0x58, 0xa0, 0x99, 0x0d, 0x9e, + 0x42, 0x7a, 0x6e, 0x4b, 0xa3, 0xe5, 0x19, 0xf1, 0x00, 0xe7, 0xcc, 0x2e, 0x36, 0xa1, 0x1f, 0xff, + 0x22, 0x97, 0xa1, 0xb8, 0xe2, 0xe7, 0xbd, 0x1d, 0xe5, 0xb3, 0x74, 0x4c, 0x7e, 0x88, 0x67, 0xdd, + 0x34, 0x63, 0x5b, 0x1e, 0xab, 0x1a, 0x5b, 0x3d, 0x22, 0xe4, 0x22, 0x60, 0x11, 0xb9, 0x08, 0x98, + 0xfa, 0x5f, 0xe5, 0x53, 0x42, 0x42, 0x3f, 0xbe, 0xc3, 0xe4, 0x35, 0x00, 0x7c, 0x79, 0xce, 0xe4, + 0xe9, 0x3f, 0x07, 0xc1, 0x51, 0x82, 0x8c, 0x50, 0x6d, 0x23, 0xdb, 0x8e, 0x90, 0x58, 0xfd, 0x07, + 0xb9, 0x44, 0x1c, 0xe1, 0x03, 0xc9, 0x51, 0xb6, 0xca, 0xf2, 0xfb, 0x34, 0x63, 0xfd, 0xbe, 0x28, + 0xec, 0xad, 0x2f, 0xa2, 0xdf, 0x72, 0x08, 0x96, 0xe9, 0x51, 0x7e, 0xcb, 0xf7, 0xf2, 0x69, 0x51, + 0x95, 0x8f, 0xa7, 0x8a, 0xdf, 0x08, 0x8c, 0xd2, 0x62, 0x2c, 0x8e, 0x3d, 0x42, 0xe3, 0xb9, 0xb9, + 0x85, 0x99, 0xfa, 0x25, 0x18, 0x8f, 0xc5, 0x1a, 0x16, 0x69, 0x92, 0x2f, 0xf7, 0x0e, 0x5a, 0x9c, + 0x1d, 0xb3, 0x20, 0x42, 0xa6, 0xfe, 0x7f, 0xb9, 0xde, 0x91, 0xa6, 0x8f, 0x5c, 0x75, 0x52, 0x04, + 0x50, 0xf8, 0xb3, 0x11, 0xc0, 0x21, 0x6c, 0x83, 0x8f, 0xb7, 0x00, 0x3e, 0x24, 0x93, 0xc7, 0x07, + 0x2d, 0x80, 0x9f, 0xcf, 0xed, 0x18, 0x28, 0xfc, 0xa8, 0x65, 0xa0, 0xfe, 0x8f, 0xb9, 0xd4, 0x80, + 0xde, 0x07, 0x6a, 0xd7, 0x9b, 0x50, 0xe2, 0x2e, 0x3c, 0xa2, 0x55, 0x52, 0x0a, 0x34, 0x06, 0xcd, + 0x28, 0x2f, 0xca, 0x90, 0x05, 0x18, 0xe0, 0x6d, 0x30, 0x44, 0x6f, 0x7c, 0xac, 0x47, 0x54, 0x71, + 0x23, 0x6b, 0x72, 0x14, 0x68, 0xf5, 0x77, 0x73, 0x89, 0xf8, 0xe2, 0x47, 0xf8, 0x6d, 0xe1, 0x54, + 0x5d, 0xd8, 0xfd, 0x54, 0xad, 0xfe, 0xb3, 0x7c, 0x7a, 0x78, 0xf3, 0x23, 0xfc, 0x90, 0xc3, 0x38, + 0x4e, 0xdb, 0xdf, 0xba, 0xb5, 0x02, 0x63, 0x51, 0x59, 0x88, 0x65, 0xeb, 0xa9, 0xf4, 0x20, 0xef, + 0x19, 0xad, 0x88, 0xf1, 0x50, 0xbf, 0x9b, 0x4b, 0x46, 0x66, 0x3f, 0xf2, 0xf9, 0x69, 0x7f, 0xda, + 0x12, 0xfd, 0x94, 0x0f, 0xc9, 0x5a, 0x73, 0x18, 0x9f, 0xf2, 0x21, 0x59, 0x35, 0xf6, 0xf7, 0x29, + 0xbf, 0x98, 0xcf, 0x0a, 0x6c, 0x7f, 0xe4, 0x1f, 0xf4, 0x79, 0x59, 0xc8, 0xbc, 0x65, 0xe2, 0xd3, + 0x9e, 0xce, 0x8a, 0x24, 0x9f, 0xc1, 0x33, 0xc1, 0x67, 0x7f, 0x63, 0x3c, 0x55, 0x58, 0x1f, 0x12, + 0x45, 0x3e, 0x1e, 0xc2, 0xfa, 0x90, 0x0c, 0x95, 0x0f, 0x9f, 0xb0, 0x7e, 0x33, 0xbf, 0xdb, 0x6c, + 0x0a, 0x27, 0xc2, 0x4b, 0x08, 0xef, 0xeb, 0xf9, 0x64, 0x96, 0x8f, 0x23, 0x17, 0xd3, 0x1c, 0x94, + 0x44, 0xbe, 0x91, 0x4c, 0xe1, 0x70, 0x7c, 0x96, 0x45, 0x23, 0xbe, 0xe3, 0x06, 0x88, 0x8b, 0x9c, + 0xdd, 0x89, 0x84, 0xd3, 0xaa, 0xdf, 0xcf, 0xc5, 0x52, 0x62, 0x1c, 0xc9, 0x11, 0xc2, 0xbe, 0x96, + 0x24, 0xf2, 0x96, 0x7f, 0x98, 0x59, 0x8c, 0x85, 0x24, 0x0f, 0xbe, 0xa7, 0x42, 0x3d, 0xdd, 0x6c, + 0xc5, 0xcb, 0x8b, 0xf8, 0x03, 0xdf, 0xc9, 0xc3, 0xa9, 0x04, 0x29, 0xb9, 0x1c, 0x89, 0xf8, 0x83, + 0xc7, 0x92, 0x31, 0x47, 0x75, 0x1e, 0xfb, 0x67, 0x0f, 0x27, 0xa9, 0x97, 0xa1, 0x58, 0xd1, 0x37, + 0xf9, 0xb7, 0xf5, 0x73, 0x96, 0x86, 0xbe, 0x29, 0x9f, 0xb8, 0x21, 0x9e, 0xac, 0xc2, 0x59, 0x7e, + 0x1f, 0x62, 0xda, 0xd6, 0x8a, 0xd9, 0xa6, 0x55, 0x6b, 0xd1, 0x6c, 0xb5, 0x4c, 0x57, 0x5c, 0xea, + 0x3d, 0xbf, 0xbd, 0x35, 0x79, 0xc5, 0xb3, 0x3d, 0xbd, 0xd5, 0xa0, 0x3e, 0x59, 0xc3, 0x33, 0xdb, + 0xb4, 0x61, 0x5a, 0x8d, 0x36, 0x52, 0x4a, 0x2c, 0xd3, 0x59, 0x91, 0x2a, 0x8f, 0x3e, 0x5f, 0x6f, + 0xea, 0x96, 0x45, 0x8d, 0xaa, 0x35, 0xbd, 0xe9, 0x51, 0x7e, 0x19, 0x58, 0xe0, 0x47, 0x82, 0xfc, + 0x1d, 0x3a, 0x47, 0x33, 0xc6, 0xab, 0x8c, 0x40, 0x4b, 0x29, 0xa4, 0xfe, 0x56, 0x31, 0x25, 0x1b, + 0xca, 0x31, 0x52, 0x1f, 0xbf, 0xa7, 0x8b, 0x3b, 0xf4, 0xf4, 0x35, 0x18, 0x10, 0xe1, 0x7d, 0xc5, + 0x05, 0x03, 0x3a, 0xce, 0x3f, 0xe4, 0x20, 0xf9, 0x86, 0x46, 0x50, 0x91, 0x16, 0x5c, 0x5c, 0x61, + 0xdd, 0x94, 0xde, 0x99, 0xa5, 0x7d, 0x74, 0x66, 0x0f, 0x7e, 0xe4, 0x5d, 0x38, 0x8f, 0xd8, 0x94, + 0x6e, 0x1d, 0xc0, 0xaa, 0x30, 0x94, 0x16, 0xaf, 0x2a, 0xbd, 0x73, 0xb3, 0xca, 0x93, 0xcf, 0xc3, + 0x48, 0x30, 0x40, 0x4c, 0xea, 0x8a, 0x9b, 0x8b, 0x1e, 0xe3, 0x8c, 0xc7, 0xa9, 0x63, 0x60, 0x74, + 0x57, 0x8b, 0xc6, 0x3a, 0x8b, 0xf0, 0x52, 0xff, 0x87, 0x5c, 0xaf, 0xac, 0x2c, 0x47, 0x3e, 0x2b, + 0xbf, 0x05, 0x03, 0x06, 0xff, 0x28, 0xa1, 0x53, 0xbd, 0xf3, 0xb6, 0x70, 0x52, 0xcd, 0x2f, 0xa3, + 0xfe, 0xd3, 0x5c, 0xcf, 0x64, 0x30, 0xc7, 0xfd, 0xf3, 0xbe, 0x5e, 0xc8, 0xf8, 0x3c, 0x31, 0x89, + 0x5e, 0x85, 0x09, 0x33, 0x8c, 0x56, 0xdf, 0x08, 0x43, 0x5d, 0x69, 0xe3, 0x12, 0x1c, 0x47, 0xd7, + 0x0d, 0x08, 0x1c, 0xb6, 0x1c, 0xdf, 0x1b, 0xcd, 0x6d, 0x74, 0x1d, 0x93, 0x8f, 0x4b, 0xed, 0x8c, + 0x1b, 0x73, 0x55, 0x73, 0xef, 0x38, 0x26, 0xab, 0x40, 0xf7, 0xd6, 0xa9, 0xa5, 0x37, 0x36, 0x6c, + 0xe7, 0x01, 0x06, 0x43, 0xe5, 0x83, 0x53, 0x1b, 0xe7, 0xf0, 0x7b, 0x3e, 0x98, 0x3c, 0x0b, 0xa3, + 0x6b, 0xad, 0x2e, 0x0d, 0xc2, 0x4f, 0xf2, 0xbb, 0x3e, 0x6d, 0x84, 0x01, 0x83, 0x1b, 0x92, 0x27, + 0x01, 0x90, 0xc8, 0xc3, 0x54, 0x3d, 0x78, 0xb1, 0xa7, 0x0d, 0x31, 0xc8, 0x8a, 0xe8, 0xae, 0x8b, + 0x5c, 0xab, 0xb9, 0x90, 0x1a, 0x2d, 0xdb, 0x5a, 0x6b, 0x78, 0xd4, 0x69, 0x63, 0x43, 0xd1, 0x99, + 0x41, 0x3b, 0x87, 0x14, 0x78, 0x75, 0xe2, 0x2e, 0xd8, 0xd6, 0xda, 0x0a, 0x75, 0xda, 0xac, 0xa9, + 0xcf, 0x03, 0x11, 0x4d, 0x75, 0xf0, 0xd0, 0x83, 0x7f, 0x1c, 0x7a, 0x33, 0x68, 0xe2, 0x23, 0xf8, + 0x69, 0x08, 0x7e, 0xd8, 0x24, 0x0c, 0xf3, 0x18, 0x7c, 0x5c, 0x68, 0xe8, 0xc2, 0xa0, 0x01, 0x07, + 0xa1, 0xbc, 0xce, 0x81, 0xf0, 0xae, 0xe0, 0x1e, 0xe4, 0x9a, 0xf8, 0xa5, 0x7e, 0xb5, 0x90, 0x96, + 0xbf, 0xe6, 0x40, 0x8a, 0x16, 0x4e, 0xab, 0xf9, 0x3d, 0x4d, 0xab, 0xe3, 0x56, 0xb7, 0xdd, 0xd0, + 0x3b, 0x9d, 0xc6, 0x7d, 0xb3, 0x85, 0x4f, 0xb8, 0x70, 0xe1, 0xd3, 0x46, 0xad, 0x6e, 0xbb, 0xdc, + 0xe9, 0xcc, 0x71, 0x20, 0x79, 0x0e, 0x4e, 0x31, 0x3a, 0xec, 0xa4, 0x80, 0xb2, 0x88, 0x94, 0x8c, + 0x01, 0x06, 0xb1, 0xf5, 0x69, 0x2f, 0xc0, 0xa0, 0xe0, 0xc9, 0xd7, 0xaa, 0x7e, 0x6d, 0x80, 0x33, + 0x73, 0x59, 0xcf, 0x05, 0x6c, 0xf8, 0xe4, 0xda, 0xaf, 0x0d, 0xf9, 0xe5, 0x31, 0x54, 0xb3, 0xd5, + 0x6d, 0xf3, 0xe8, 0x5b, 0x03, 0x88, 0x0c, 0x7e, 0x93, 0xcb, 0x30, 0xc6, 0xb8, 0x04, 0x02, 0xe3, + 0xd1, 0x6d, 0xfb, 0xb5, 0x18, 0x94, 0x5c, 0x87, 0x33, 0x11, 0x08, 0xb7, 0x41, 0xf9, 0x93, 0x84, + 0x7e, 0x2d, 0x15, 0xa7, 0x7e, 0xbb, 0x10, 0xcd, 0xaa, 0x73, 0x04, 0x1d, 0x71, 0x1e, 0x06, 0x6c, + 0x67, 0xad, 0xd1, 0x75, 0x5a, 0x62, 0xec, 0x95, 0x6c, 0x67, 0xed, 0x8e, 0xd3, 0x22, 0x67, 0xa1, + 0xc4, 0x7a, 0xc7, 0x34, 0xc4, 0x10, 0xeb, 0xd7, 0x3b, 0x9d, 0xaa, 0x41, 0xca, 0xbc, 0x43, 0x30, + 0x32, 0x6a, 0xa3, 0x89, 0x5b, 0x7b, 0xee, 0x94, 0xd0, 0xcf, 0x57, 0xbc, 0x04, 0x12, 0xfb, 0x09, + 0xe3, 0xa5, 0xf2, 0x83, 0x80, 0x18, 0x0b, 0x03, 0xb7, 0x25, 0x06, 0xef, 0x93, 0x38, 0x0b, 0x81, + 0x0c, 0x59, 0xf0, 0x4d, 0x8c, 0x41, 0x2a, 0x40, 0x42, 0xaa, 0xb6, 0x6d, 0x98, 0xf7, 0x4d, 0xca, + 0x5f, 0x90, 0xf4, 0xf3, 0x8b, 0xdf, 0x24, 0x56, 0x9b, 0xf0, 0x99, 0x2c, 0x0a, 0x08, 0x79, 0x83, + 0x2b, 0x21, 0xa7, 0xc3, 0xb5, 0x8f, 0xf7, 0x2d, 0xb7, 0xd3, 0x62, 0x28, 0xd4, 0x4c, 0x2c, 0x8f, + 0x0b, 0xa1, 0xfa, 0x37, 0x8b, 0xc9, 0xd4, 0x4a, 0x47, 0x62, 0xd7, 0xcc, 0x03, 0x88, 0xcc, 0x69, + 0xe1, 0xe5, 0xda, 0x45, 0x29, 0x4c, 0xba, 0xc0, 0x64, 0xf0, 0x90, 0xca, 0x92, 0xab, 0x30, 0xc8, + 0xbf, 0xa8, 0x5a, 0x11, 0xf6, 0x0e, 0xba, 0x88, 0xb9, 0x1d, 0xf3, 0xfe, 0x7d, 0xf4, 0x27, 0x0b, + 0xd0, 0xe4, 0x32, 0x0c, 0x54, 0x96, 0xea, 0xf5, 0xf2, 0x92, 0x7f, 0x53, 0x8c, 0x6f, 0x59, 0x0c, + 0xcb, 0x6d, 0xb8, 0xba, 0xe5, 0x6a, 0x3e, 0x92, 0x3c, 0x0b, 0xa5, 0x6a, 0x0d, 0xc9, 0xf8, 0x0b, + 0xcd, 0xe1, 0xed, 0xad, 0xc9, 0x01, 0xb3, 0xc3, 0xa9, 0x04, 0x0a, 0xeb, 0xbd, 0x5b, 0xad, 0x48, + 0xee, 0x12, 0xbc, 0xde, 0x87, 0xa6, 0x81, 0xd7, 0xce, 0x5a, 0x80, 0x26, 0x2f, 0xc3, 0x48, 0x9d, + 0x3a, 0xa6, 0xde, 0x5a, 0xea, 0xe2, 0x56, 0x51, 0x8a, 0xf8, 0xe8, 0x22, 0xbc, 0x61, 0x21, 0x42, + 0x8b, 0x90, 0x91, 0x4b, 0x50, 0x9c, 0x37, 0x2d, 0xff, 0xb9, 0x04, 0xfa, 0xd3, 0xaf, 0x9b, 0x96, + 0xa7, 0x21, 0x94, 0x3c, 0x0b, 0x85, 0x5b, 0x2b, 0x55, 0xe1, 0x09, 0x86, 0xbc, 0xde, 0xf3, 0x22, + 0xd1, 0x23, 0x6f, 0xad, 0x54, 0xc9, 0xcb, 0x30, 0xc4, 0x16, 0x31, 0x6a, 0x35, 0xa9, 0xab, 0x0c, + 0xe3, 0xc7, 0xf0, 0x90, 0x85, 0x3e, 0x50, 0xf6, 0xe9, 0x08, 0x28, 0xd5, 0xff, 0x23, 0x9f, 0x9e, + 0xfb, 0xea, 0x08, 0x86, 0xfa, 0x3e, 0x6f, 0x91, 0x63, 0x0a, 0x56, 0x3c, 0x80, 0x82, 0xdd, 0x87, + 0xf1, 0xb2, 0xd1, 0x36, 0xad, 0x32, 0xfe, 0x74, 0x17, 0xe7, 0xca, 0x38, 0x75, 0x48, 0x4f, 0x01, + 0x63, 0x68, 0xf1, 0x3d, 0x3c, 0x2e, 0x31, 0x43, 0x35, 0x74, 0x8e, 0x6b, 0xb4, 0xef, 0xeb, 0x8d, + 0x26, 0x4f, 0x1b, 0xa5, 0xc5, 0x99, 0xaa, 0x3f, 0x95, 0xdf, 0x21, 0x5d, 0xd7, 0xe3, 0x28, 0x7d, + 0xf5, 0x1b, 0xf9, 0xde, 0x19, 0xd3, 0x1e, 0x4b, 0xa1, 0xfc, 0x49, 0x3e, 0x25, 0x7f, 0xd9, 0x81, + 0x24, 0x71, 0x15, 0x06, 0x39, 0x9b, 0xc0, 0x8d, 0x17, 0x67, 0x33, 0xae, 0xac, 0x38, 0x8b, 0xfa, + 0x68, 0xb2, 0x04, 0x67, 0xca, 0xf7, 0xef, 0xd3, 0xa6, 0x17, 0x46, 0xa8, 0x5e, 0x0a, 0x03, 0xbe, + 0xf2, 0x88, 0xbc, 0x02, 0x1f, 0x46, 0xb8, 0xc6, 0xc0, 0x26, 0xa9, 0xe5, 0xc8, 0x0a, 0x9c, 0x8b, + 0xc3, 0xeb, 0x7c, 0x0b, 0x50, 0x94, 0x82, 0xf4, 0x26, 0x38, 0xf2, 0xff, 0xb4, 0x8c, 0xb2, 0x69, + 0xad, 0xc4, 0xa9, 0xba, 0xbf, 0x57, 0x2b, 0x71, 0xde, 0x4e, 0x2d, 0xa7, 0x7e, 0xa7, 0x20, 0xa7, + 0x79, 0x7b, 0x7c, 0x1d, 0xae, 0x6e, 0x44, 0xdc, 0xac, 0x77, 0x3b, 0x64, 0x5e, 0x16, 0xd1, 0x4a, + 0x8c, 0xae, 0xe3, 0x7b, 0x24, 0x06, 0xd1, 0x12, 0x10, 0x28, 0xaf, 0x43, 0x01, 0x25, 0xa9, 0x42, + 0xb1, 0xec, 0xac, 0x71, 0xf3, 0x76, 0xa7, 0x07, 0x5c, 0xba, 0xb3, 0xe6, 0xa6, 0x3f, 0xe0, 0x62, + 0x2c, 0xd4, 0xbf, 0x98, 0xef, 0x91, 0x99, 0xed, 0xb1, 0x9c, 0x44, 0xfe, 0x72, 0x3e, 0x2b, 0xc7, + 0xda, 0x71, 0x75, 0x1d, 0xfb, 0x80, 0x85, 0x73, 0xbc, 0xfd, 0xea, 0x0e, 0x51, 0x38, 0x7f, 0x94, + 0xcf, 0x4a, 0x18, 0x77, 0x22, 0x9c, 0xfd, 0x4d, 0x90, 0xa9, 0x22, 0x7d, 0x8c, 0x6d, 0x6e, 0x59, + 0x15, 0xfa, 0xf7, 0xe9, 0x3e, 0x95, 0x26, 0xd2, 0x93, 0x21, 0x7c, 0x20, 0x2d, 0xfd, 0x87, 0xf9, + 0xcc, 0xc4, 0x88, 0x27, 0x32, 0x3d, 0x4c, 0x99, 0x9e, 0x0c, 0xfd, 0x03, 0x0d, 0xfd, 0x54, 0x99, + 0x9e, 0x8c, 0xfd, 0x03, 0xe9, 0xe9, 0x1f, 0xe6, 0xd3, 0x53, 0x7f, 0x1e, 0x81, 0x92, 0x1e, 0x86, + 0x87, 0xa3, 0xdf, 0x0d, 0xc5, 0x03, 0x75, 0x43, 0xff, 0x01, 0xac, 0xa8, 0xa4, 0x40, 0x8f, 0x6c, + 0xd4, 0x7f, 0x54, 0x05, 0x7a, 0x08, 0x43, 0xfe, 0x71, 0x16, 0xe8, 0x4f, 0x14, 0x92, 0xe9, 0x6e, + 0x1f, 0xd7, 0x35, 0xc9, 0xd9, 0xe7, 0x9a, 0xe4, 0x97, 0x23, 0x6f, 0xc3, 0x78, 0x28, 0x4b, 0x39, + 0xca, 0x18, 0x5e, 0x1f, 0x35, 0x19, 0xaa, 0xf1, 0x1e, 0xc3, 0x89, 0x70, 0x38, 0x71, 0x6a, 0xf5, + 0xfb, 0x85, 0x64, 0xce, 0xe0, 0x93, 0xde, 0xd8, 0x67, 0x6f, 0xdc, 0x81, 0x73, 0x33, 0x5d, 0xc7, + 0xa1, 0x96, 0x97, 0xde, 0x29, 0x78, 0x78, 0xdf, 0xe4, 0x14, 0x8d, 0x64, 0xe7, 0x64, 0x14, 0x66, + 0x6c, 0xc5, 0xeb, 0x86, 0x38, 0xdb, 0x81, 0x90, 0x6d, 0x97, 0x53, 0xa4, 0xb1, 0x4d, 0x2f, 0xac, + 0xfe, 0x7e, 0x3e, 0x99, 0xe5, 0xf9, 0xa4, 0xeb, 0xf7, 0xd7, 0xf5, 0xea, 0x57, 0x0b, 0xf1, 0x4c, + 0xd7, 0x27, 0x0b, 0xc4, 0xfe, 0xbb, 0xc3, 0x97, 0x24, 0x8e, 0x1b, 0xe9, 0x2b, 0x7c, 0x78, 0xd6, + 0x57, 0xf8, 0x78, 0xf5, 0x97, 0x8b, 0xf1, 0xac, 0xe1, 0x27, 0xdd, 0x71, 0x74, 0xdd, 0x41, 0x96, + 0xe1, 0x8c, 0x98, 0xdb, 0x7c, 0x10, 0xa6, 0x9b, 0x10, 0xf3, 0x17, 0xcf, 0x5a, 0x27, 0xa6, 0xc5, + 0xae, 0x4b, 0x9d, 0x86, 0xa7, 0xbb, 0x0f, 0x1a, 0x98, 0x9f, 0x42, 0x4b, 0x2d, 0xc8, 0x18, 0x8a, + 0x59, 0x2d, 0xca, 0x70, 0x30, 0x64, 0xe8, 0x4f, 0x88, 0x09, 0x86, 0x69, 0x05, 0xd5, 0x5f, 0xcf, + 0xc1, 0x44, 0xfc, 0x73, 0xc8, 0x14, 0x0c, 0xb2, 0xdf, 0xc1, 0xb3, 0x7b, 0x29, 0x9d, 0x36, 0xe7, + 0xc8, 0xaf, 0xe4, 0x7d, 0x1a, 0xf2, 0x0a, 0x0c, 0xa1, 0xf7, 0x03, 0x16, 0xc8, 0x87, 0xd1, 0x0e, + 0xc2, 0x02, 0x98, 0xe3, 0x95, 0x17, 0x0b, 0x49, 0xc9, 0x1b, 0x30, 0x5c, 0x0d, 0xdd, 0xbc, 0xc4, + 0x9d, 0x17, 0x7a, 0x97, 0x4a, 0x25, 0x43, 0x02, 0x4d, 0xa6, 0x56, 0xbf, 0x9b, 0x8f, 0x67, 0xb7, + 0x3f, 0x51, 0xf5, 0x7d, 0x9a, 0xa6, 0xbf, 0x52, 0x88, 0xe5, 0xea, 0x3f, 0xd9, 0xd7, 0xef, 0xf3, + 0x6a, 0x6e, 0x12, 0xfa, 0x67, 0xdb, 0xba, 0xd9, 0x12, 0x86, 0x0f, 0xc6, 0x64, 0xa5, 0x0c, 0xa0, + 0x71, 0x38, 0xb9, 0x89, 0x91, 0x48, 0x98, 0xa4, 0x03, 0x5f, 0x97, 0xb1, 0x30, 0x7c, 0xa5, 0x84, + 0x12, 0x09, 0x5c, 0x39, 0x80, 0x8f, 0x1c, 0xb9, 0xa4, 0xdc, 0x67, 0x27, 0x67, 0x31, 0xc7, 0xa3, + 0xcf, 0x9e, 0x5b, 0xe4, 0x4b, 0xca, 0x6d, 0xd3, 0x32, 0xc8, 0x05, 0x38, 0x7b, 0xa7, 0x3e, 0xab, + 0x35, 0x6e, 0x57, 0x97, 0x2a, 0x8d, 0x3b, 0x4b, 0xf5, 0xda, 0xec, 0x4c, 0x75, 0xae, 0x3a, 0x5b, + 0x99, 0xe8, 0x23, 0xa7, 0x61, 0x3c, 0x44, 0xcd, 0xdf, 0x59, 0x2c, 0x2f, 0x4d, 0xe4, 0xc8, 0x29, + 0x18, 0x0d, 0x81, 0xd3, 0xcb, 0x2b, 0x13, 0xf9, 0xe7, 0x3e, 0x01, 0xc3, 0xe8, 0x46, 0xca, 0xdd, + 0x5e, 0xc8, 0x08, 0x0c, 0x2e, 0x4f, 0xd7, 0x67, 0xb5, 0xbb, 0xc8, 0x04, 0xa0, 0x54, 0x99, 0x5d, + 0x62, 0x0c, 0x73, 0xcf, 0xfd, 0xdf, 0x39, 0x80, 0xfa, 0xdc, 0x4a, 0x4d, 0x10, 0x0e, 0xc3, 0x40, + 0x75, 0xe9, 0x6e, 0x79, 0xa1, 0xca, 0xe8, 0x06, 0xa1, 0xb8, 0x5c, 0x9b, 0x65, 0x35, 0x0c, 0x41, + 0xff, 0xcc, 0xc2, 0x72, 0x7d, 0x76, 0x22, 0xcf, 0x80, 0xda, 0x6c, 0xb9, 0x32, 0x51, 0x60, 0xc0, + 0x7b, 0x5a, 0x75, 0x65, 0x76, 0xa2, 0xc8, 0xfe, 0x5c, 0xa8, 0xaf, 0x94, 0x57, 0x26, 0xfa, 0xd9, + 0x9f, 0x73, 0xf8, 0x67, 0x89, 0x31, 0xab, 0xcf, 0xae, 0xe0, 0x8f, 0x01, 0xd6, 0x84, 0x39, 0xff, + 0xd7, 0x20, 0x43, 0x31, 0xd6, 0x95, 0xaa, 0x36, 0x31, 0xc4, 0x7e, 0x30, 0x96, 0xec, 0x07, 0xb0, + 0xc6, 0x69, 0xb3, 0x8b, 0xcb, 0x77, 0x67, 0x27, 0x86, 0x19, 0xaf, 0xc5, 0xdb, 0x0c, 0x3c, 0xc2, + 0xfe, 0xd4, 0x16, 0xd9, 0x9f, 0xa3, 0x8c, 0x93, 0x36, 0x5b, 0x5e, 0xa8, 0x95, 0x57, 0xe6, 0x27, + 0xc6, 0x58, 0x7b, 0x90, 0xe7, 0x38, 0x2f, 0xb9, 0x54, 0x5e, 0x9c, 0x9d, 0x98, 0x10, 0x34, 0x95, + 0x85, 0xea, 0xd2, 0xed, 0x89, 0x53, 0xd8, 0x90, 0x77, 0x17, 0xf1, 0x07, 0x61, 0x05, 0xf0, 0xaf, + 0xd3, 0xcf, 0xfd, 0x00, 0x94, 0x96, 0xeb, 0xb8, 0xda, 0x9c, 0x87, 0xd3, 0xcb, 0xf5, 0xc6, 0xca, + 0xbb, 0xb5, 0xd9, 0x98, 0xbc, 0x4f, 0xc1, 0xa8, 0x8f, 0x58, 0xa8, 0x2e, 0xdd, 0xf9, 0x1c, 0x97, + 0xb6, 0x0f, 0x5a, 0x2c, 0xcf, 0x2c, 0xd7, 0x27, 0xf2, 0xac, 0x57, 0x7c, 0xd0, 0xbd, 0xea, 0x52, + 0x65, 0xf9, 0x5e, 0x7d, 0xa2, 0xf0, 0xdc, 0x43, 0x18, 0xe1, 0xf9, 0x70, 0x97, 0x1d, 0x73, 0xcd, + 0xb4, 0xc8, 0x93, 0x70, 0xa1, 0x32, 0x7b, 0xb7, 0x3a, 0x33, 0xdb, 0x58, 0xd6, 0xaa, 0x37, 0xab, + 0x4b, 0xb1, 0x9a, 0xce, 0xc2, 0xa9, 0x28, 0xba, 0x5c, 0xab, 0x4e, 0xe4, 0xc8, 0x39, 0x20, 0x51, + 0xf0, 0xad, 0xf2, 0xe2, 0xdc, 0x44, 0x9e, 0x28, 0x70, 0x26, 0x0a, 0xaf, 0x2e, 0xad, 0xdc, 0x59, + 0x9a, 0x9d, 0x28, 0x3c, 0xf7, 0x37, 0x72, 0x70, 0x36, 0x35, 0x66, 0x3a, 0x51, 0xe1, 0xa9, 0xd9, + 0x85, 0x72, 0x7d, 0xa5, 0x3a, 0x53, 0x9f, 0x2d, 0x6b, 0x33, 0xf3, 0x8d, 0x99, 0xf2, 0xca, 0xec, + 0xcd, 0x65, 0xed, 0xdd, 0xc6, 0xcd, 0xd9, 0xa5, 0x59, 0xad, 0xbc, 0x30, 0xd1, 0x47, 0x9e, 0x85, + 0xc9, 0x0c, 0x9a, 0xfa, 0xec, 0xcc, 0x1d, 0xad, 0xba, 0xf2, 0xee, 0x44, 0x8e, 0x3c, 0x03, 0x4f, + 0x66, 0x12, 0xb1, 0xdf, 0x13, 0x79, 0xf2, 0x14, 0x5c, 0xcc, 0x22, 0x79, 0x67, 0x61, 0xa2, 0xf0, + 0xdc, 0xcf, 0xe5, 0x80, 0x24, 0x83, 0x5e, 0x93, 0xa7, 0xe1, 0x12, 0xd3, 0x8b, 0x46, 0x76, 0x03, + 0x9f, 0x81, 0x27, 0x53, 0x29, 0xa4, 0xe6, 0x4d, 0xc2, 0x13, 0x19, 0x24, 0xa2, 0x71, 0x97, 0x40, + 0x49, 0x27, 0xc0, 0xa6, 0xfd, 0x5a, 0x0e, 0xce, 0xa6, 0x7a, 0x9a, 0x91, 0x2b, 0xf0, 0xb1, 0x72, + 0x65, 0x91, 0xf5, 0xcd, 0xcc, 0x4a, 0x75, 0x79, 0xa9, 0xde, 0x58, 0x9c, 0x2b, 0x37, 0x98, 0xf6, + 0xdd, 0xa9, 0xc7, 0x7a, 0xf3, 0x32, 0xa8, 0x3d, 0x28, 0x67, 0xe6, 0xcb, 0x4b, 0x37, 0xd9, 0xf0, + 0x23, 0x1f, 0x83, 0xa7, 0x33, 0xe9, 0x66, 0x97, 0xca, 0xd3, 0x0b, 0xb3, 0x95, 0x89, 0x3c, 0xf9, + 0x38, 0x3c, 0x93, 0x49, 0x55, 0xa9, 0xd6, 0x39, 0x59, 0xe1, 0x39, 0x3d, 0x32, 0x19, 0xb1, 0xaf, + 0x9c, 0x59, 0x5e, 0x5a, 0x29, 0xcf, 0xac, 0xa4, 0x69, 0xf6, 0x05, 0x38, 0x1b, 0xc1, 0x4e, 0xdf, + 0xa9, 0x57, 0x97, 0x66, 0xeb, 0xf5, 0x89, 0x5c, 0x02, 0x15, 0x88, 0x36, 0x3f, 0x5d, 0xf9, 0xee, + 0xff, 0xf4, 0x54, 0xdf, 0x77, 0xff, 0xf8, 0xa9, 0xdc, 0x1f, 0xfd, 0xf1, 0x53, 0xb9, 0x7f, 0xf6, + 0xc7, 0x4f, 0xe5, 0x3e, 0x7f, 0x7d, 0x2f, 0xf1, 0xd2, 0xf9, 0xbc, 0xb8, 0x5a, 0x42, 0xc7, 0x92, + 0x97, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x14, 0xa0, 0x6d, 0x05, 0xa5, 0x86, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -31272,6 +31446,52 @@ func (m *OneOf_SFTPSummary) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } +func (m *OneOf_ContactCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_ContactCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ContactCreate != nil { + { + size, err := m.ContactCreate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0x82 + } + return len(dAtA) - i, nil +} +func (m *OneOf_ContactDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_ContactDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ContactDelete != nil { + { + size, err := m.ContactDelete.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0x8a + } + return len(dAtA) - i, nil +} func (m *StreamStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -31296,12 +31516,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n656, err656 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err656 != nil { - return 0, err656 + n658, err658 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err658 != nil { + return 0, err658 } - i -= n656 - i = encodeVarintEvents(dAtA, i, uint64(n656)) + i -= n658 + i = encodeVarintEvents(dAtA, i, uint64(n658)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -31460,12 +31680,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n660, err660 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err660 != nil { - return 0, err660 + n662, err662 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err662 != nil { + return 0, err662 } - i -= n660 - i = encodeVarintEvents(dAtA, i, uint64(n660)) + i -= n662 + i = encodeVarintEvents(dAtA, i, uint64(n662)) i-- dAtA[i] = 0x1 i-- @@ -31613,12 +31833,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n664, err664 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err664 != nil { - return 0, err664 + n666, err666 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err666 != nil { + return 0, err666 } - i -= n664 - i = encodeVarintEvents(dAtA, i, uint64(n664)) + i -= n666 + i = encodeVarintEvents(dAtA, i, uint64(n666)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -38246,6 +38466,184 @@ func (m *UserTaskDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ContactCreate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContactCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContactCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.ContactType != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.ContactType)) + i-- + dAtA[i] = 0x38 + } + if len(m.Email) > 0 { + i -= len(m.Email) + copy(dAtA[i:], m.Email) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Email))) + i-- + dAtA[i] = 0x32 + } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ContactDelete) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContactDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContactDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.ContactType != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.ContactType)) + i-- + dAtA[i] = 0x38 + } + if len(m.Email) > 0 { + i -= len(m.Email) + copy(dAtA[i:], m.Email) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Email))) + i-- + dAtA[i] = 0x32 + } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -44400,6 +44798,30 @@ func (m *OneOf_SFTPSummary) Size() (n int) { } return n } +func (m *OneOf_ContactCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ContactCreate != nil { + l = m.ContactCreate.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_ContactDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ContactDelete != nil { + l = m.ContactDelete.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *StreamStatus) Size() (n int) { if m == nil { return 0 @@ -46886,6 +47308,64 @@ func (m *UserTaskDelete) Size() (n int) { return n } +func (m *ContactCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.Email) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.ContactType != 0 { + n += 1 + sovEvents(uint64(m.ContactType)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ContactDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.Email) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.ContactType != 0 { + n += 1 + sovEvents(uint64(m.ContactType)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -85603,62 +86083,11 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { } m.Event = &OneOf_SFTPSummary{v} iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StreamStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StreamStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StreamStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 192: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContactCreate", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85668,46 +86097,30 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UploadID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastEventIndex", wireType) - } - m.LastEventIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastEventIndex |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + v := &ContactCreate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - case 3: + m.Event = &OneOf_ContactCreate{v} + iNdEx = postIndex + case 193: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContactDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -85734,9 +86147,11 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastUploadTime, dAtA[iNdEx:postIndex]); err != nil { + v := &ContactDelete{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Event = &OneOf_ContactDelete{v} iNdEx = postIndex default: iNdEx = preIndex @@ -85760,7 +86175,7 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { } return nil } -func (m *SessionUpload) Unmarshal(dAtA []byte) error { +func (m *StreamStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -85783,17 +86198,17 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SessionUpload: wiretype end group for non-group") + return fmt.Errorf("proto: StreamStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StreamStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85803,30 +86218,29 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.UploadID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LastEventIndex", wireType) } - var msglen int + m.LastEventIndex = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85836,30 +86250,16 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.LastEventIndex |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85869,23 +86269,24 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.SessionURL = string(dAtA[iNdEx:postIndex]) + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastUploadTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -85909,7 +86310,7 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } return nil } -func (m *Identity) Unmarshal(dAtA []byte) error { +func (m *SessionUpload) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -85932,17 +86333,17 @@ func (m *Identity) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Identity: wiretype end group for non-group") + return fmt.Errorf("proto: SessionUpload: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85952,29 +86353,30 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.User = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Impersonator", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85984,27 +86386,28 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Impersonator = string(dAtA[iNdEx:postIndex]) + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionURL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86032,11 +86435,62 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + m.SessionURL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Identity) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Identity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86064,11 +86518,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Usage = append(m.Usage, string(dAtA[iNdEx:postIndex])) + m.User = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Impersonator", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86096,11 +86550,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) + m.Impersonator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesGroups", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86128,11 +86582,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesGroups = append(m.KubernetesGroups, string(dAtA[iNdEx:postIndex])) + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 7: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUsers", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86160,13 +86614,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesUsers = append(m.KubernetesUsers, string(dAtA[iNdEx:postIndex])) + m.Usage = append(m.Usage, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 8: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Expires", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86176,28 +86630,27 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expires, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 9: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesGroups", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86225,11 +86678,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.RouteToCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesGroups = append(m.KubernetesGroups, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 10: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86257,11 +86710,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesUsers = append(m.KubernetesUsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 11: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Expires", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -86288,15 +86741,15 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expires, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 12: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToApp", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RouteToCluster", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86306,31 +86759,27 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if m.RouteToApp == nil { - m.RouteToApp = &RouteToApp{} - } - if err := m.RouteToApp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.RouteToCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 13: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TeleportCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesCluster", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86358,11 +86807,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TeleportCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 14: + case 11: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToDatabase", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -86389,18 +86838,15 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.RouteToDatabase == nil { - m.RouteToDatabase = &RouteToDatabase{} - } - if err := m.RouteToDatabase.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 15: + case 12: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseNames", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RouteToApp", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86410,27 +86856,31 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabaseNames = append(m.DatabaseNames, string(dAtA[iNdEx:postIndex])) + if m.RouteToApp == nil { + m.RouteToApp = &RouteToApp{} + } + if err := m.RouteToApp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 16: + case 13: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseUsers", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TeleportCluster", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86458,13 +86908,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabaseUsers = append(m.DatabaseUsers, string(dAtA[iNdEx:postIndex])) + m.TeleportCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 17: + case 14: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MFADeviceUUID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RouteToDatabase", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86474,27 +86924,31 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.MFADeviceUUID = string(dAtA[iNdEx:postIndex]) + if m.RouteToDatabase == nil { + m.RouteToDatabase = &RouteToDatabase{} + } + if err := m.RouteToDatabase.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 18: + case 15: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientIP", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseNames", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86522,11 +86976,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientIP = string(dAtA[iNdEx:postIndex]) + m.DatabaseNames = append(m.DatabaseNames, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 19: + case 16: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AWSRoleARNs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86554,11 +87008,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AWSRoleARNs = append(m.AWSRoleARNs, string(dAtA[iNdEx:postIndex])) + m.DatabaseUsers = append(m.DatabaseUsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 20: + case 17: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessRequests", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MFADeviceUUID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86586,67 +87040,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AccessRequests = append(m.AccessRequests, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 21: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisallowReissue", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DisallowReissue = bool(v != 0) - case 22: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowedResourceIDs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AllowedResourceIDs = append(m.AllowedResourceIDs, ResourceID{}) - if err := m.AllowedResourceIDs[len(m.AllowedResourceIDs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.MFADeviceUUID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 23: + case 18: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PreviousIdentityExpires", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClientIP", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86656,28 +87056,178 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.PreviousIdentityExpires, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClientIP = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 24: + case 19: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AzureIdentities", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AWSRoleARNs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AWSRoleARNs = append(m.AWSRoleARNs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 20: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessRequests", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccessRequests = append(m.AccessRequests, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 21: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisallowReissue", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.DisallowReissue = bool(v != 0) + case 22: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedResourceIDs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AllowedResourceIDs = append(m.AllowedResourceIDs, ResourceID{}) + if err := m.AllowedResourceIDs[len(m.AllowedResourceIDs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 23: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreviousIdentityExpires", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.PreviousIdentityExpires, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 24: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AzureIdentities", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -101587,7 +102137,503 @@ func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { +func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPathChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPathChanged: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChangeID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChangeID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AffectedResourceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceSource", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AffectedResourceSource = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AffectedResourceType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SpannerRPC) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SpannerRPC: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SpannerRPC: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DatabaseMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Procedure", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Procedure = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Args == nil { + m.Args = &Struct{} + } + if err := m.Args.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101610,10 +102656,10 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessPathChanged: wiretype end group for non-group") + return fmt.Errorf("proto: AccessGraphSettingsUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessPathChanged: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AccessGraphSettingsUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101651,9 +102697,9 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChangeID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101663,29 +102709,30 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.ChangeID = string(dAtA[iNdEx:postIndex]) + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101695,29 +102742,30 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.AffectedResourceName = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceSource", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101727,55 +102775,24 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.AffectedResourceSource = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.AffectedResourceType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -101799,7 +102816,7 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } return nil } -func (m *SpannerRPC) Unmarshal(dAtA []byte) error { +func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101822,10 +102839,10 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SpannerRPC: wiretype end group for non-group") + return fmt.Errorf("proto: SPIFFEFederationCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SpannerRPC: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101863,7 +102880,7 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101890,13 +102907,13 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101923,13 +102940,13 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101956,13 +102973,64 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.DatabaseMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101989,15 +103057,15 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Procedure", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -102007,27 +103075,28 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Procedure = string(dAtA[iNdEx:postIndex]) + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 7: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102054,10 +103123,40 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Args == nil { - m.Args = &Struct{} + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if err := m.Args.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102083,7 +103182,7 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102106,10 +103205,10 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessGraphSettingsUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessGraphSettingsUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102147,7 +103246,7 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102174,7 +103273,7 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102244,6 +103343,39 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -102266,7 +103398,7 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102289,10 +103421,10 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SPIFFEFederationCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102330,7 +103462,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102357,7 +103489,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102427,91 +103559,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } @@ -102544,72 +103592,6 @@ func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -102632,7 +103614,7 @@ func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102655,10 +103637,10 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102848,7 +103830,7 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102871,10 +103853,10 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102912,7 +103894,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102939,7 +103921,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103011,7 +103993,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103038,7 +104020,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103064,7 +104046,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103087,10 +104069,10 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103128,7 +104110,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103155,7 +104137,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103227,7 +104209,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103254,7 +104236,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103280,7 +104262,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103303,10 +104285,10 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103496,7 +104478,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103519,10 +104501,10 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103593,7 +104575,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103620,13 +104602,13 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103653,13 +104635,13 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103686,7 +104668,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103712,7 +104694,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103735,10 +104717,10 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionDelete: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103775,6 +104757,39 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } @@ -103807,7 +104822,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } @@ -103840,7 +104855,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -103873,39 +104888,6 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -103928,7 +104910,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103951,10 +104933,10 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserCreate: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104144,7 +105126,7 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104167,10 +105149,10 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104241,7 +105223,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104268,13 +105250,13 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104301,13 +105283,13 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104334,10 +105316,42 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -104360,7 +105374,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { +func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104383,10 +105397,10 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserDelete: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104457,7 +105471,7 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104484,13 +105498,13 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104517,13 +105531,13 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104550,10 +105564,74 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -104576,7 +105654,7 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104599,10 +105677,10 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelCreate: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104770,38 +105848,6 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -104824,7 +105870,7 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { +func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104847,10 +105893,10 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104921,7 +105967,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104948,46 +105994,13 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105014,15 +106027,15 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105032,29 +106045,30 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 7: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105064,23 +106078,24 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -105104,7 +106119,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { +func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105127,10 +106142,10 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelDelete: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105201,7 +106216,7 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105228,13 +106243,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105261,13 +106276,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105294,64 +106309,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: UserTaskCreate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskCreate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105378,15 +106342,15 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CurrentUserTaskState", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105396,30 +106360,29 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.CurrentUserTaskState = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UpdatedUserTaskState", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105429,30 +106392,80 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.UpdatedUserTaskState = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { return err } - iNdEx = postIndex - case 4: + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UserTaskMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserTaskMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TaskType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105462,30 +106475,29 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.TaskType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IssueType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105495,30 +106507,29 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.IssueType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105528,24 +106539,23 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Integration = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -105569,7 +106579,7 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { +func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105592,10 +106602,10 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105693,13 +106703,46 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105726,13 +106769,64 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContactCreate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContactCreate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContactCreate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105759,13 +106853,13 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105792,15 +106886,15 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 7: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentUserTaskState", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105810,29 +106904,30 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.CurrentUserTaskState = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 8: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedUserTaskState", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105842,80 +106937,30 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UpdatedUserTaskState = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: UserTaskMetadata: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskMetadata: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105925,27 +106970,28 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.TaskType = string(dAtA[iNdEx:postIndex]) + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IssueType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -105973,13 +107019,13 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.IssueType = string(dAtA[iNdEx:postIndex]) + m.Email = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContactType", wireType) } - var stringLen uint64 + m.ContactType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105989,24 +107035,11 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.ContactType |= ContactType(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Integration = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -106029,7 +107062,7 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { +func (m *ContactDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -106052,10 +107085,10 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskDelete: wiretype end group for non-group") + return fmt.Errorf("proto: ContactDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContactDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -106093,7 +107126,7 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106120,13 +107153,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106153,13 +107186,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106186,13 +107219,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106219,10 +107252,61 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Email = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContactType", wireType) + } + m.ContactType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ContactType |= ContactType(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index 6e856b3c5f2b2..f111605ce20be 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -790,6 +790,14 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_AutoUpdateVersionDelete{ AutoUpdateVersionDelete: e, } + case *ContactCreate: + out.Event = &OneOf_ContactCreate{ + ContactCreate: e, + } + case *ContactDelete: + out.Event = &OneOf_ContactDelete{ + ContactDelete: e, + } default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", in.GetType()) unknown := &Unknown{} diff --git a/lib/events/api.go b/lib/events/api.go index 20b72ddd2e5f9..f186dc8646e89 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -838,6 +838,11 @@ const ( AutoUpdateVersionUpdateEvent = "auto_update_version.update" // AutoUpdateVersionDeleteEvent is emitted when a AutoUpdateVersion resource is deleted. AutoUpdateVersionDeleteEvent = "auto_update_version.delete" + + // ContactCreateEvent is emitted when a Contact resource is created. + ContactCreateEvent = "contact.create" + // ContactDeleteEvent is emitted when a Contact resource is deleted. + ContactDeleteEvent = "contact.delete" ) // Add an entry to eventsMap in lib/events/events_test.go when you add diff --git a/lib/events/codes.go b/lib/events/codes.go index fa8c284fe925b..6a9cd1aa85db4 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -669,6 +669,11 @@ const ( // AutoUpdateVersionDeleteCode is the auto update version delete event code. AutoUpdateVersionDeleteCode = "AUV003I" + // ContactCreateCode is the auto update version create event code. + ContactCreateCode = "TCTC001I" + // ContactDeleteCode is the auto update version delete event code. + ContactDeleteCode = "TCTC002I" + // UnknownCode is used when an event of unknown type is encountered. UnknownCode = apievents.UnknownCode ) diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index 476528255e5ba..ca1c79987739f 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -462,6 +462,11 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { e = &events.AutoUpdateVersionUpdate{} case AutoUpdateVersionDeleteEvent: e = &events.AutoUpdateVersionDelete{} + + case ContactCreateEvent: + e = &events.ContactCreate{} + case ContactDeleteEvent: + e = &events.ContactDelete{} default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", eventType) unknown := &events.Unknown{} diff --git a/lib/events/events_test.go b/lib/events/events_test.go index d304a65ddd4bc..5c1a69d4d9f99 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -242,6 +242,8 @@ var eventsMap = map[string]apievents.AuditEvent{ AutoUpdateVersionCreateEvent: &apievents.AutoUpdateVersionCreate{}, AutoUpdateVersionUpdateEvent: &apievents.AutoUpdateVersionUpdate{}, AutoUpdateVersionDeleteEvent: &apievents.AutoUpdateVersionDelete{}, + ContactCreateEvent: &apievents.ContactCreate{}, + ContactDeleteEvent: &apievents.ContactDelete{}, } // TestJSON tests JSON marshal events diff --git a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx index d403cb036f23d..52a46e7a2644a 100644 --- a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx +++ b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx @@ -283,6 +283,8 @@ const EventIconMap: Record = { [eventCodes.PLUGIN_CREATE]: Icons.Info, [eventCodes.PLUGIN_UPDATE]: Icons.Info, [eventCodes.PLUGIN_DELETE]: Icons.Info, + [eventCodes.CONTACT_CREATE]: Icons.Info, + [eventCodes.CONTACT_DELETE]: Icons.Info, [eventCodes.UNKNOWN]: Icons.Question, }; diff --git a/web/packages/teleport/src/services/audit/makeEvent.ts b/web/packages/teleport/src/services/audit/makeEvent.ts index d1ef126aba40e..6f2affbeded7b 100644 --- a/web/packages/teleport/src/services/audit/makeEvent.ts +++ b/web/packages/teleport/src/services/audit/makeEvent.ts @@ -1855,6 +1855,20 @@ export const formatters: Formatters = { return `User [${user}] deleted a plugin [${name}]`; }, }, + [eventCodes.CONTACT_CREATE]: { + type: 'contact.create', + desc: 'Contact Created', + format: ({ user, email, contact_type }) => { + return `User [${user}] created a [${contactTypeStr(contact_type)}] contact [${email}]`; + }, + }, + [eventCodes.CONTACT_DELETE]: { + type: 'contact.delete', + desc: 'Contact Deleted', + format: ({ user, email, contact_type }) => { + return `User [${user}] deleted a [${contactTypeStr(contact_type)}] contact [${email}]`; + }, + }, [eventCodes.UNKNOWN]: { type: 'unknown', desc: 'Unknown Event', @@ -1906,3 +1920,14 @@ function formatMembers(members: { member_name: string }[]) { return `${pluralize(memberNames.length, 'member')} [${memberNamesJoined}]`; } + +function contactTypeStr(type: number): string { + switch (type) { + case 1: + return 'Business'; + case 2: + return 'Security'; + default: + return `Unknown type: ${type}`; + } +} diff --git a/web/packages/teleport/src/services/audit/types.ts b/web/packages/teleport/src/services/audit/types.ts index fbcbf635b2bd9..bd78e5fab51f2 100644 --- a/web/packages/teleport/src/services/audit/types.ts +++ b/web/packages/teleport/src/services/audit/types.ts @@ -303,6 +303,8 @@ export const eventCodes = { PLUGIN_CREATE: 'PG001I', PLUGIN_UPDATE: 'PG002I', PLUGIN_DELETE: 'PG003I', + CONTACT_CREATE: 'TCTC001I', + CONTACT_DELETE: 'TCTC002I', } as const; /** @@ -1715,6 +1717,20 @@ export type RawEvents = { server_hostname: string; } >; + [eventCodes.CONTACT_CREATE]: RawEvent< + typeof eventCodes.CONTACT_CREATE, + { + email: string; + contact_type: number; + } + >; + [eventCodes.CONTACT_DELETE]: RawEvent< + typeof eventCodes.CONTACT_DELETE, + { + email: string; + contact_type: number; + } + >; }; /** From 56697392c7b31ff2729244ea384faa3f044c48c7 Mon Sep 17 00:00:00 2001 From: Andrew Burke <31974658+atburke@users.noreply.github.com> Date: Wed, 4 Dec 2024 09:18:35 -0800 Subject: [PATCH 10/15] Fix asserts in utmp tests (#49738) --- integration/utmp_integration_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/integration/utmp_integration_test.go b/integration/utmp_integration_test.go index 6d00c0c91dad2..12cabe63a279e 100644 --- a/integration/utmp_integration_test.go +++ b/integration/utmp_integration_test.go @@ -118,10 +118,10 @@ func TestRootUTMPEntryExists(t *testing.T) { require.NoError(t, err) require.EventuallyWithTf(t, func(collect *assert.CollectT) { - require.NoError(collect, uacc.UserWithPtyInDatabase(s.utmpPath, teleportTestUser)) - require.NoError(collect, uacc.UserWithPtyInDatabase(s.wtmpPath, teleportTestUser)) + assert.NoError(collect, uacc.UserWithPtyInDatabase(s.utmpPath, teleportTestUser)) + assert.NoError(collect, uacc.UserWithPtyInDatabase(s.wtmpPath, teleportTestUser)) // Ensure than an entry was not written to btmp. - require.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.btmpPath, teleportTestUser)), "unexpected error: %v", err) + assert.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.btmpPath, teleportTestUser)), "unexpected error: %v", err) }, 5*time.Minute, time.Second, "did not detect utmp entry within 5 minutes") }) @@ -154,10 +154,10 @@ func TestRootUTMPEntryExists(t *testing.T) { require.NoError(t, err) require.EventuallyWithT(t, func(collect *assert.CollectT) { - require.NoError(collect, uacc.UserWithPtyInDatabase(s.btmpPath, teleportFakeUser)) + assert.NoError(collect, uacc.UserWithPtyInDatabase(s.btmpPath, teleportFakeUser)) // Ensure that entries were not written to utmp and wtmp - require.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.utmpPath, teleportFakeUser)), "unexpected error: %v", err) - require.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.wtmpPath, teleportFakeUser)), "unexpected error: %v", err) + assert.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.utmpPath, teleportFakeUser)), "unexpected error: %v", err) + assert.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.wtmpPath, teleportFakeUser)), "unexpected error: %v", err) }, 5*time.Minute, time.Second, "did not detect btmp entry within 5 minutes") }) From db9505d16913aa851ab90a93593f0aee016316a4 Mon Sep 17 00:00:00 2001 From: Bartosz Leper Date: Wed, 4 Dec 2024 18:59:25 +0100 Subject: [PATCH 11/15] Move tooltips to the design package (#49544) * Validation Adds a model-level validation capability to our validation library. * Move tooltips to the design package They will be later required in the SlideTabs component * Review * Also, rename the tooltip directory * Also, rename the tooltip component * review * Never return undefined from useValidation() --- .../src/Tooltip}/HoverTooltip.tsx | 4 ++- .../src/Tooltip/IconTooltip.story.tsx} | 35 +++++++++++-------- .../src/Tooltip/IconTooltip.tsx} | 10 +++--- web/packages/design/src/Tooltip/index.ts | 20 +++++++++++ .../ToolTip => design/src/Tooltip}/shared.tsx | 0 .../AccessDuration/AccessDurationRequest.tsx | 7 ++-- .../AccessDuration/AccessDurationReview.tsx | 6 ++-- .../RequestCheckout/AdditionalOptions.tsx | 11 +++--- .../RequestCheckout/RequestCheckout.tsx | 3 +- .../RequestReview/RequestReview.tsx | 3 +- .../RequestView/RequestView.tsx | 3 +- .../AccessRequests/Shared/Shared.tsx | 3 +- .../AdvancedSearchToggle.tsx | 6 ++-- .../ClusterDropdown/ClusterDropdown.tsx | 2 +- .../components/Controls/MultiselectMenu.tsx | 2 +- .../shared/components/Controls/SortMenu.tsx | 2 +- .../components/Controls/ViewModeSwitch.tsx | 2 +- .../components/FieldInput/FieldInput.tsx | 5 +-- .../shared/components/FieldSelect/shared.tsx | 5 +-- .../FieldTextArea/FieldTextArea.tsx | 5 +-- .../shared/components/ToolTip/index.ts | 9 +++-- .../CardsView/ResourceCard.tsx | 2 +- .../UnifiedResources/FilterPanel.tsx | 3 +- .../ListView/ResourceListItem.tsx | 2 +- .../UnifiedResources/ResourceTab.tsx | 2 +- .../UnifiedResources/UnifiedResources.tsx | 3 +- .../UnifiedResources/shared/CopyButton.tsx | 2 +- .../UnifiedResources/shared/PinButton.tsx | 2 +- web/packages/teleport/src/Bots/List/Bots.tsx | 2 +- .../DocumentKubeExec/KubeExecDataDialog.tsx | 6 ++-- .../teleport/src/DesktopSession/TopBar.tsx | 2 +- .../CreateAppAccess/CreateAppAccess.tsx | 6 ++-- .../AutoDeploy/SelectSecurityGroups.tsx | 6 ++-- .../AutoDeploy/SelectSubnetIds.tsx | 6 ++-- .../EnrollRdsDatabase/AutoDiscoverToggle.tsx | 6 ++-- .../EnrollEKSCluster/EnrollEksCluster.tsx | 10 +++--- .../DiscoveryConfigSsm/DiscoveryConfigSsm.tsx | 6 ++-- .../EnrollEc2Instance/EnrollEc2Instance.tsx | 6 ++-- .../Discover/Shared/Aws/ConfigureIamPerms.tsx | 6 ++-- .../ConfigureDiscoveryServiceDirections.tsx | 6 ++-- .../SecurityGroupPicker.tsx | 6 ++-- .../AwsOidc/ConfigureAwsOidcSummary.tsx | 6 ++-- .../Enroll/AwsOidc/S3BucketConfiguration.tsx | 6 ++-- .../src/Integrations/IntegrationList.tsx | 4 +-- .../status/AwsOidc/AwsOidcHeader.tsx | 2 +- .../teleport/src/JoinTokens/JoinTokens.tsx | 2 +- .../src/JoinTokens/UpsertJoinTokenDialog.tsx | 2 +- .../teleport/src/Navigation/Navigation.tsx | 6 ++-- .../src/Navigation/SideNavigation/Section.tsx | 6 ++-- .../src/Notifications/Notifications.tsx | 2 +- .../src/Roles/RoleEditor/EditorHeader.tsx | 2 +- .../teleport/src/Roles/RoleEditor/Shared.tsx | 2 +- .../src/Roles/RoleEditor/StandardEditor.tsx | 4 +-- web/packages/teleport/src/TopBar/TopBar.tsx | 2 +- .../teleport/src/TopBar/TopBarSideNav.tsx | 2 +- .../ExternalAuditStorageCta.tsx | 2 +- 56 files changed, 163 insertions(+), 120 deletions(-) rename web/packages/{shared/components/ToolTip => design/src/Tooltip}/HoverTooltip.tsx (98%) rename web/packages/{shared/components/ToolTip/ToolTip.story.tsx => design/src/Tooltip/IconTooltip.story.tsx} (82%) rename web/packages/{shared/components/ToolTip/ToolTip.tsx => design/src/Tooltip/IconTooltip.tsx} (95%) create mode 100644 web/packages/design/src/Tooltip/index.ts rename web/packages/{shared/components/ToolTip => design/src/Tooltip}/shared.tsx (100%) diff --git a/web/packages/shared/components/ToolTip/HoverTooltip.tsx b/web/packages/design/src/Tooltip/HoverTooltip.tsx similarity index 98% rename from web/packages/shared/components/ToolTip/HoverTooltip.tsx rename to web/packages/design/src/Tooltip/HoverTooltip.tsx index e9e16bba58359..6dbaab58bdf0a 100644 --- a/web/packages/shared/components/ToolTip/HoverTooltip.tsx +++ b/web/packages/design/src/Tooltip/HoverTooltip.tsx @@ -18,6 +18,7 @@ import React, { PropsWithChildren, useState } from 'react'; import styled, { useTheme } from 'styled-components'; + import { Popover, Flex, Text } from 'design'; import { JustifyContentProps, FlexBasisProps } from 'design/system'; @@ -64,6 +65,7 @@ export const HoverTooltip: React.FC< // whether we want to show the tooltip. if ( target instanceof Element && + target.parentElement && target.scrollWidth > target.parentElement.offsetWidth ) { setAnchorEl(event.currentTarget); @@ -75,7 +77,7 @@ export const HoverTooltip: React.FC< } function handlePopoverClose() { - setAnchorEl(null); + setAnchorEl(undefined); } // Don't render the tooltip if the content is undefined. diff --git a/web/packages/shared/components/ToolTip/ToolTip.story.tsx b/web/packages/design/src/Tooltip/IconTooltip.story.tsx similarity index 82% rename from web/packages/shared/components/ToolTip/ToolTip.story.tsx rename to web/packages/design/src/Tooltip/IconTooltip.story.tsx index 1830fc4902e12..8062ae357752a 100644 --- a/web/packages/shared/components/ToolTip/ToolTip.story.tsx +++ b/web/packages/design/src/Tooltip/IconTooltip.story.tsx @@ -17,17 +17,19 @@ */ import React from 'react'; -import { Text, Flex, ButtonPrimary } from 'design'; import styled, { useTheme } from 'styled-components'; + +import { Text, Flex, ButtonPrimary } from 'design'; import { P } from 'design/Text/Text'; -import { logos } from 'teleport/components/LogoHero/LogoHero'; +import AGPLLogoLight from 'design/assets/images/agpl-light.svg'; +import AGPLLogoDark from 'design/assets/images/agpl-dark.svg'; -import { ToolTipInfo } from './ToolTip'; +import { IconTooltip } from './IconTooltip'; import { HoverTooltip } from './HoverTooltip'; export default { - title: 'Shared/ToolTip', + title: 'Design/Tooltip', }; export const ShortContent = () => ( @@ -36,25 +38,25 @@ export const ShortContent = () => ( Hover the icon - "some popover content" + "some popover content"
Hover the icon - "some popover content" + "some popover content"
Hover the icon - "some popover content" + "some popover content"
Hover the icon - "some popover content" + "some popover content"
); @@ -65,13 +67,18 @@ const Grid = styled.div` grid-template-rows: repeat(3, 100px); `; +const logos = { + light: AGPLLogoLight, + dark: AGPLLogoDark, +}; + export const LongContent = () => { const theme = useTheme(); return ( <> Hover the icon - +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim @@ -84,7 +91,7 @@ export const LongContent = () => { cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

-
+

Here's some content that shouldn't interfere with the semi-transparent @@ -92,7 +99,7 @@ export const LongContent = () => {

- +
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim @@ -113,7 +120,7 @@ export const WithMutedIconColor = () => ( Hover the icon - "some popover content" + "some popover content" ); @@ -122,7 +129,7 @@ export const WithKindWarning = () => ( Hover the icon - "some popover content" + "some popover content" ); @@ -131,7 +138,7 @@ export const WithKindError = () => ( Hover the icon - "some popover content" + "some popover content" ); diff --git a/web/packages/shared/components/ToolTip/ToolTip.tsx b/web/packages/design/src/Tooltip/IconTooltip.tsx similarity index 95% rename from web/packages/shared/components/ToolTip/ToolTip.tsx rename to web/packages/design/src/Tooltip/IconTooltip.tsx index f80a3a6342b91..e7434272fe6f3 100644 --- a/web/packages/shared/components/ToolTip/ToolTip.tsx +++ b/web/packages/design/src/Tooltip/IconTooltip.tsx @@ -27,7 +27,7 @@ import { anchorOriginForPosition, transformOriginForPosition } from './shared'; type ToolTipKind = 'info' | 'warning' | 'error'; -export const ToolTipInfo: React.FC< +export const IconTooltip: React.FC< PropsWithChildren<{ trigger?: 'click' | 'hover'; position?: Position; @@ -46,15 +46,15 @@ export const ToolTipInfo: React.FC< kind = 'info', }) => { const theme = useTheme(); - const [anchorEl, setAnchorEl] = useState(); + const [anchorEl, setAnchorEl] = useState(); const open = Boolean(anchorEl); - function handlePopoverOpen(event) { + function handlePopoverOpen(event: React.MouseEvent) { setAnchorEl(event.currentTarget); } function handlePopoverClose() { - setAnchorEl(null); + setAnchorEl(undefined); } const triggerOnHoverProps = { @@ -121,8 +121,6 @@ const ToolTipIcon = ({ return ; case 'error': return ; - default: - kind satisfies never; } }; diff --git a/web/packages/design/src/Tooltip/index.ts b/web/packages/design/src/Tooltip/index.ts new file mode 100644 index 0000000000000..1be43077b8952 --- /dev/null +++ b/web/packages/design/src/Tooltip/index.ts @@ -0,0 +1,20 @@ +/** + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +export { IconTooltip } from './IconTooltip'; +export { HoverTooltip } from './HoverTooltip'; diff --git a/web/packages/shared/components/ToolTip/shared.tsx b/web/packages/design/src/Tooltip/shared.tsx similarity index 100% rename from web/packages/shared/components/ToolTip/shared.tsx rename to web/packages/design/src/Tooltip/shared.tsx diff --git a/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx b/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx index 998245bbc58da..35cfac569c462 100644 --- a/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx +++ b/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx @@ -19,8 +19,9 @@ import React from 'react'; import { Flex, LabelInput, Text } from 'design'; +import { IconTooltip } from 'design/Tooltip'; + import Select, { Option } from 'shared/components/Select'; -import { ToolTipInfo } from 'shared/components/ToolTip'; export function AccessDurationRequest({ maxDuration, @@ -35,11 +36,11 @@ export function AccessDurationRequest({ Access Duration - + How long you would be given elevated privileges. Note that the time it takes to approve this request will be subtracted from the duration you requested. - + Access Request Lifetime - + The max duration of an access request, starting from its creation, until it expires. - + {getFormattedDurationTxt({ diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx index 775c10f356267..fd4bc1578869d 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx @@ -39,6 +39,8 @@ import { ArrowBack, ChevronDown, ChevronRight, Warning } from 'design/Icon'; import Table, { Cell } from 'design/DataTable'; import { Danger } from 'design/Alert'; +import { HoverTooltip } from 'design/Tooltip'; + import Validation, { useRule, Validator } from 'shared/components/Validation'; import { Attempt } from 'shared/hooks/useAttemptNext'; import { pluralize } from 'shared/utils/text'; @@ -47,7 +49,6 @@ import { FieldCheckbox } from 'shared/components/FieldCheckbox'; import { mergeRefs } from 'shared/libs/mergeRefs'; import { TextSelectCopyMulti } from 'shared/components/TextSelectCopy'; import { RequestableResourceKind } from 'shared/components/AccessRequests/NewRequest/resource'; -import { HoverTooltip } from 'shared/components/ToolTip'; import { CreateRequest } from '../../Shared/types'; import { AssumeStartTime } from '../../AssumeStartTime/AssumeStartTime'; diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.tsx index 6a93e92656ac0..c21e4295c3afc 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.tsx @@ -22,12 +22,13 @@ import { ButtonPrimary, Text, Box, Alert, Flex, Label, H3 } from 'design'; import { Warning } from 'design/Icon'; import { Radio } from 'design/RadioGroup'; +import { HoverTooltip } from 'design/Tooltip'; + import Validation, { Validator } from 'shared/components/Validation'; import { FieldSelect } from 'shared/components/FieldSelect'; import { Option } from 'shared/components/Select'; import { Attempt } from 'shared/hooks/useAsync'; import { requiredField } from 'shared/components/Validation/rules'; -import { HoverTooltip } from 'shared/components/ToolTip'; import { FieldTextArea } from 'shared/components/FieldTextArea'; import { AccessRequest, RequestState } from 'shared/services/accessRequests'; diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx index 3bebbf52fc0b4..9a3e424787378 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx @@ -42,7 +42,8 @@ import { displayDateWithPrefixedTime } from 'design/datetime'; import { LabelKind } from 'design/LabelState/LabelState'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; + import { hasFinished, Attempt } from 'shared/hooks/useAsync'; import { diff --git a/web/packages/shared/components/AccessRequests/Shared/Shared.tsx b/web/packages/shared/components/AccessRequests/Shared/Shared.tsx index 97bf6987b2d6e..2159f6309c95e 100644 --- a/web/packages/shared/components/AccessRequests/Shared/Shared.tsx +++ b/web/packages/shared/components/AccessRequests/Shared/Shared.tsx @@ -21,7 +21,8 @@ import { ButtonPrimary, Text, Box, ButtonIcon, Menu } from 'design'; import { Info } from 'design/Icon'; import { displayDateWithPrefixedTime } from 'design/datetime'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; + import { AccessRequest } from 'shared/services/accessRequests'; export function PromotedMessage({ diff --git a/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx b/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx index 6800783daba6a..ea37fe2de003d 100644 --- a/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx +++ b/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx @@ -22,7 +22,7 @@ import { Text, Toggle, Link, Flex, H2 } from 'design'; import { P } from 'design/Text/Text'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; const GUIDE_URL = 'https://goteleport.com/docs/reference/predicate-language/#resource-filtering'; @@ -44,9 +44,9 @@ export function AdvancedSearchToggle(props: { > Advanced - + - +
); } diff --git a/web/packages/shared/components/ClusterDropdown/ClusterDropdown.tsx b/web/packages/shared/components/ClusterDropdown/ClusterDropdown.tsx index eb9babb16f43c..60846510fe90d 100644 --- a/web/packages/shared/components/ClusterDropdown/ClusterDropdown.tsx +++ b/web/packages/shared/components/ClusterDropdown/ClusterDropdown.tsx @@ -24,7 +24,7 @@ import { ChevronDown } from 'design/Icon'; import cfg from 'teleport/config'; import { Cluster } from 'teleport/services/clusters'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; export interface ClusterDropdownProps { clusterLoader: ClusterLoader; diff --git a/web/packages/shared/components/Controls/MultiselectMenu.tsx b/web/packages/shared/components/Controls/MultiselectMenu.tsx index f252cf7aa21be..98acea2a75d28 100644 --- a/web/packages/shared/components/Controls/MultiselectMenu.tsx +++ b/web/packages/shared/components/Controls/MultiselectMenu.tsx @@ -29,7 +29,7 @@ import { import { ChevronDown } from 'design/Icon'; import { CheckboxInput } from 'design/Checkbox'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; type MultiselectMenuProps = { options: { diff --git a/web/packages/shared/components/Controls/SortMenu.tsx b/web/packages/shared/components/Controls/SortMenu.tsx index d6bbc5cdf0d2d..a55dabad7929c 100644 --- a/web/packages/shared/components/Controls/SortMenu.tsx +++ b/web/packages/shared/components/Controls/SortMenu.tsx @@ -20,7 +20,7 @@ import React, { useState } from 'react'; import { ButtonBorder, Flex, Menu, MenuItem } from 'design'; import { ArrowDown, ArrowUp } from 'design/Icon'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; type SortMenuSort = { fieldName: Exclude; diff --git a/web/packages/shared/components/Controls/ViewModeSwitch.tsx b/web/packages/shared/components/Controls/ViewModeSwitch.tsx index 7997f2de29f66..62e5f94b36a3a 100644 --- a/web/packages/shared/components/Controls/ViewModeSwitch.tsx +++ b/web/packages/shared/components/Controls/ViewModeSwitch.tsx @@ -22,7 +22,7 @@ import { Rows, SquaresFour } from 'design/Icon'; import { ViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; export const ViewModeSwitch = ({ currentViewMode, diff --git a/web/packages/shared/components/FieldInput/FieldInput.tsx b/web/packages/shared/components/FieldInput/FieldInput.tsx index e8fceadf12214..1ea08bf39ed8f 100644 --- a/web/packages/shared/components/FieldInput/FieldInput.tsx +++ b/web/packages/shared/components/FieldInput/FieldInput.tsx @@ -28,8 +28,9 @@ import styled, { useTheme } from 'styled-components'; import { IconProps } from 'design/Icon/Icon'; import { InputMode, InputSize, InputType } from 'design/Input'; +import { IconTooltip } from 'design/Tooltip'; + import { useRule } from 'shared/components/Validation'; -import { ToolTipInfo } from 'shared/components/ToolTip'; const FieldInput = forwardRef( ( @@ -113,7 +114,7 @@ const FieldInput = forwardRef( > {label} - + ) : ( <>{label} diff --git a/web/packages/shared/components/FieldSelect/shared.tsx b/web/packages/shared/components/FieldSelect/shared.tsx index 72a43e14920c8..35086cc5c3842 100644 --- a/web/packages/shared/components/FieldSelect/shared.tsx +++ b/web/packages/shared/components/FieldSelect/shared.tsx @@ -25,13 +25,14 @@ import LabelInput from 'design/LabelInput'; import Flex from 'design/Flex'; +import { IconTooltip } from 'design/Tooltip'; + import { HelperTextLine } from '../FieldInput/FieldInput'; import { useRule } from '../Validation'; import { AsyncProps as AsyncSelectProps, Props as SelectProps, } from '../Select'; -import { ToolTipInfo } from '../ToolTip'; export const defaultRule = () => () => ({ valid: true }); @@ -95,7 +96,7 @@ export const FieldSelectWrapper = ({ {toolTipContent ? ( {label} - + ) : ( label diff --git a/web/packages/shared/components/FieldTextArea/FieldTextArea.tsx b/web/packages/shared/components/FieldTextArea/FieldTextArea.tsx index 545ef4d56ce17..c8bd7a1e0439d 100644 --- a/web/packages/shared/components/FieldTextArea/FieldTextArea.tsx +++ b/web/packages/shared/components/FieldTextArea/FieldTextArea.tsx @@ -27,9 +27,10 @@ import { TextAreaSize } from 'design/TextArea'; import { BoxProps } from 'design/Box'; +import { IconTooltip } from 'design/Tooltip'; + import { useRule } from 'shared/components/Validation'; -import { ToolTipInfo } from '../ToolTip'; import { HelperTextLine } from '../FieldInput/FieldInput'; export type FieldTextAreaProps = BoxProps & { @@ -140,7 +141,7 @@ export const FieldTextArea = forwardRef< > {label} - + ) : ( <>{label} diff --git a/web/packages/shared/components/ToolTip/index.ts b/web/packages/shared/components/ToolTip/index.ts index c6518cad9b297..f1be185cb4ae6 100644 --- a/web/packages/shared/components/ToolTip/index.ts +++ b/web/packages/shared/components/ToolTip/index.ts @@ -16,5 +16,10 @@ * along with this program. If not, see . */ -export { ToolTipInfo } from './ToolTip'; -export { HoverTooltip } from './HoverTooltip'; +export { + /** @deprecated Use `TooltipInfo` from `design/Tooltip` */ + IconTooltip as ToolTipInfo, + + /** @deprecated Use `HoverTooltip` from `design/Tooltip` */ + HoverTooltip, +} from 'design/Tooltip'; diff --git a/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.tsx b/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.tsx index 8268c8b71d599..b592e0acddca0 100644 --- a/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.tsx +++ b/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.tsx @@ -26,7 +26,7 @@ import { ResourceIcon } from 'design/ResourceIcon'; import { makeLabelTag } from 'teleport/components/formatters'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { ResourceItemProps } from '../types'; import { PinButton } from '../shared/PinButton'; diff --git a/web/packages/shared/components/UnifiedResources/FilterPanel.tsx b/web/packages/shared/components/UnifiedResources/FilterPanel.tsx index 6e62a50a3d4c9..d470abe9a9e9e 100644 --- a/web/packages/shared/components/UnifiedResources/FilterPanel.tsx +++ b/web/packages/shared/components/UnifiedResources/FilterPanel.tsx @@ -26,7 +26,8 @@ import { ChevronDown, ArrowsIn, ArrowsOut, Refresh } from 'design/Icon'; import { ViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; + import { SortMenu } from 'shared/components/Controls/SortMenu'; import { ViewModeSwitch } from 'shared/components/Controls/ViewModeSwitch'; diff --git a/web/packages/shared/components/UnifiedResources/ListView/ResourceListItem.tsx b/web/packages/shared/components/UnifiedResources/ListView/ResourceListItem.tsx index 0f2a34024536a..582a7c5ece831 100644 --- a/web/packages/shared/components/UnifiedResources/ListView/ResourceListItem.tsx +++ b/web/packages/shared/components/UnifiedResources/ListView/ResourceListItem.tsx @@ -26,7 +26,7 @@ import { ResourceIcon } from 'design/ResourceIcon'; import { makeLabelTag } from 'teleport/components/formatters'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { ResourceItemProps } from '../types'; import { PinButton } from '../shared/PinButton'; diff --git a/web/packages/shared/components/UnifiedResources/ResourceTab.tsx b/web/packages/shared/components/UnifiedResources/ResourceTab.tsx index 2533e2a203165..2deb131ffcde9 100644 --- a/web/packages/shared/components/UnifiedResources/ResourceTab.tsx +++ b/web/packages/shared/components/UnifiedResources/ResourceTab.tsx @@ -20,7 +20,7 @@ import React from 'react'; import styled from 'styled-components'; import { Box, Text } from 'design'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { PINNING_NOT_SUPPORTED_MESSAGE } from './UnifiedResources'; diff --git a/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx b/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx index 5426b0d908a74..a9f0699018d42 100644 --- a/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx +++ b/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx @@ -43,7 +43,8 @@ import { AvailableResourceMode, } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; + import { makeEmptyAttempt, makeSuccessAttempt, diff --git a/web/packages/shared/components/UnifiedResources/shared/CopyButton.tsx b/web/packages/shared/components/UnifiedResources/shared/CopyButton.tsx index a3a1a4ad12be6..43b9cb2217165 100644 --- a/web/packages/shared/components/UnifiedResources/shared/CopyButton.tsx +++ b/web/packages/shared/components/UnifiedResources/shared/CopyButton.tsx @@ -22,7 +22,7 @@ import ButtonIcon from 'design/ButtonIcon'; import { Check, Copy } from 'design/Icon'; import { copyToClipboard } from 'design/utils/copyToClipboard'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; export function CopyButton({ name, diff --git a/web/packages/shared/components/UnifiedResources/shared/PinButton.tsx b/web/packages/shared/components/UnifiedResources/shared/PinButton.tsx index 1eedee2db68a2..cde3b87142c04 100644 --- a/web/packages/shared/components/UnifiedResources/shared/PinButton.tsx +++ b/web/packages/shared/components/UnifiedResources/shared/PinButton.tsx @@ -21,7 +21,7 @@ import React, { useRef } from 'react'; import { PushPinFilled, PushPin } from 'design/Icon'; import ButtonIcon from 'design/ButtonIcon'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { PinningSupport } from '../types'; diff --git a/web/packages/teleport/src/Bots/List/Bots.tsx b/web/packages/teleport/src/Bots/List/Bots.tsx index be383fbd32997..594a1840d7c52 100644 --- a/web/packages/teleport/src/Bots/List/Bots.tsx +++ b/web/packages/teleport/src/Bots/List/Bots.tsx @@ -19,7 +19,7 @@ import React, { useEffect, useState } from 'react'; import { useAttemptNext } from 'shared/hooks'; import { Link } from 'react-router-dom'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { Alert, Box, Button, Indicator } from 'design'; import { diff --git a/web/packages/teleport/src/Console/DocumentKubeExec/KubeExecDataDialog.tsx b/web/packages/teleport/src/Console/DocumentKubeExec/KubeExecDataDialog.tsx index 36b8b7a505820..e8261cdf026c3 100644 --- a/web/packages/teleport/src/Console/DocumentKubeExec/KubeExecDataDialog.tsx +++ b/web/packages/teleport/src/Console/DocumentKubeExec/KubeExecDataDialog.tsx @@ -35,7 +35,7 @@ import { import Validation from 'shared/components/Validation'; import FieldInput from 'shared/components/FieldInput'; import { requiredField } from 'shared/components/Validation/rules'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; type Props = { onClose(): void; @@ -123,11 +123,11 @@ function KubeExecDataDialog({ onClose, onExec }: Props) { Interactive shell - + You can start an interactive shell and have a bidirectional communication with the target pod, or you can run one-off command and see its output. - +
diff --git a/web/packages/teleport/src/DesktopSession/TopBar.tsx b/web/packages/teleport/src/DesktopSession/TopBar.tsx index 9ab12b523067d..dcd5beaec4881 100644 --- a/web/packages/teleport/src/DesktopSession/TopBar.tsx +++ b/web/packages/teleport/src/DesktopSession/TopBar.tsx @@ -21,7 +21,7 @@ import { useTheme } from 'styled-components'; import { Text, TopNav, Flex } from 'design'; import { Clipboard, FolderShared } from 'design/Icon'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import ActionMenu from './ActionMenu'; import { AlertDropdown } from './AlertDropdown'; diff --git a/web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx b/web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx index 4f0b1ea32146c..2c357df859a58 100644 --- a/web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx +++ b/web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx @@ -21,7 +21,7 @@ import styled from 'styled-components'; import { Box, Flex, Link, Mark, H3 } from 'design'; import TextEditor from 'shared/components/TextEditor'; import { Danger } from 'design/Alert'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import { useAsync } from 'shared/hooks/useAsync'; import { P } from 'design/Text/Text'; @@ -81,7 +81,7 @@ export function CreateAppAccess() {

First configure your AWS IAM permissions

- + The following IAM permissions will be added as an inline policy named {IAM_POLICY_NAME} to IAM role{' '} {iamRoleName} @@ -94,7 +94,7 @@ export function CreateAppAccess() { /> - +

Run the command below on your{' '} diff --git a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx index cc5ed4bb590b4..1717a082208ba 100644 --- a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx +++ b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx @@ -21,7 +21,7 @@ import React, { useState, useEffect } from 'react'; import { Text, Flex, Box, Indicator, ButtonSecondary, Subtitle3 } from 'design'; import * as Icons from 'design/Icon'; import { FetchStatus } from 'design/DataTable/types'; -import { HoverTooltip, ToolTipInfo } from 'shared/components/ToolTip'; +import { HoverTooltip, IconTooltip } from 'design/Tooltip'; import useAttempt from 'shared/hooks/useAttemptNext'; import { getErrMessage } from 'shared/utils/errorType'; import { pluralize } from 'shared/utils/text'; @@ -126,7 +126,7 @@ export const SelectSecurityGroups = ({ <> Select ECS Security Groups - + Select ECS security group(s) based on the following requirements:

    @@ -141,7 +141,7 @@ export const SelectSecurityGroups = ({
- +

diff --git a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx index 785ec15fbda9e..8a6e93a0491b1 100644 --- a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx +++ b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx @@ -29,7 +29,7 @@ import { } from 'design'; import * as Icons from 'design/Icon'; import { FetchStatus } from 'design/DataTable/types'; -import { HoverTooltip, ToolTipInfo } from 'shared/components/ToolTip'; +import { HoverTooltip, IconTooltip } from 'design/Tooltip'; import { pluralize } from 'shared/utils/text'; import useAttempt from 'shared/hooks/useAttemptNext'; import { getErrMessage } from 'shared/utils/errorType'; @@ -121,12 +121,12 @@ export function SelectSubnetIds({ <> Select ECS Subnets - + A subnet has an outbound internet route if it has a route to an internet gateway or a NAT gateway in a public subnet. - + diff --git a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx index 204e30b3e79d1..617d10ba79790 100644 --- a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx +++ b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { Box, Toggle } from 'design'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; export function AutoDiscoverToggle({ wantAutoDiscover, @@ -40,11 +40,11 @@ export function AutoDiscoverToggle({ Auto-enroll all databases for the selected VPC - + Auto-enroll will automatically identify all RDS databases (e.g. PostgreSQL, MySQL, Aurora) from the selected VPC and register them as database resources in your infrastructure. - + ); diff --git a/web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx b/web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx index e73fc6dfc3e15..2505da7275658 100644 --- a/web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx +++ b/web/packages/teleport/src/Discover/Kubernetes/EnrollEKSCluster/EnrollEksCluster.tsx @@ -31,7 +31,7 @@ import { FetchStatus } from 'design/DataTable/types'; import { Danger } from 'design/Alert'; import useAttempt from 'shared/hooks/useAttemptNext'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import { getErrMessage } from 'shared/utils/errorType'; import { EksMeta, useDiscover } from 'teleport/Discover/useDiscover'; @@ -435,11 +435,11 @@ export function EnrollEksCluster(props: AgentStepProps) { Enable Kubernetes App Discovery - + Teleport's Kubernetes App Discovery will automatically identify and enroll to Teleport HTTP applications running inside a Kubernetes cluster. - + Auto-enroll all EKS clusters for selected region - + Auto-enroll will automatically identify all EKS clusters from the selected region and register them as Kubernetes resources in your infrastructure. - + {showTable && ( diff --git a/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx b/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx index 6a7245bacf798..6846a09779e53 100644 --- a/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx +++ b/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx @@ -30,7 +30,7 @@ import { import styled from 'styled-components'; import { Danger, Info } from 'design/Alert'; import TextEditor from 'shared/components/TextEditor'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import FieldInput from 'shared/components/FieldInput'; import { Rule } from 'shared/components/Validation/rules'; import Validation, { Validator } from 'shared/components/Validation'; @@ -317,7 +317,7 @@ export function DiscoveryConfigSsm() { {' '} to configure your IAM permissions.

- + The following IAM permissions will be added as an inline policy named {IAM_POLICY_NAME} to IAM role{' '} {arnResourceName} @@ -330,7 +330,7 @@ export function DiscoveryConfigSsm() { /> - + Auto-enroll all EC2 instances for selected region - + Auto-enroll will automatically identify all EC2 instances from the selected region and register them as node resources in your infrastructure. - + {wantAutoDiscover && ( diff --git a/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx b/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx index 4c491191152b8..0c244462b7507 100644 --- a/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx +++ b/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx @@ -21,7 +21,7 @@ import styled from 'styled-components'; import { Flex, Link, Box, H3 } from 'design'; import { assertUnreachable } from 'shared/utils/assertUnreachable'; import TextEditor from 'shared/components/TextEditor'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import { P } from 'design/Text/Text'; @@ -179,11 +179,11 @@ export function ConfigureIamPerms({ <>

Configure your AWS IAM permissions

- + The following IAM permissions will be added as an inline policy named {iamPolicyName} to IAM role {iamRoleName} {editor} - +

{msg} Run the command below on your{' '} diff --git a/web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryServiceDirections.tsx b/web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryServiceDirections.tsx index 9017c990205f4..1b56b2d69e270 100644 --- a/web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryServiceDirections.tsx +++ b/web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryServiceDirections.tsx @@ -18,7 +18,7 @@ import { Box, Flex, Input, Text, Mark, H3, Subtitle3 } from 'design'; import styled from 'styled-components'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import React from 'react'; @@ -71,7 +71,7 @@ discovery_service: Auto-enrolling requires you to configure a{' '} Discovery Service - +
@@ -100,7 +100,7 @@ discovery_service:

Step 2

Define a Discovery Group name{' '} - + diff --git a/web/packages/teleport/src/Discover/Shared/SecurityGroupPicker/SecurityGroupPicker.tsx b/web/packages/teleport/src/Discover/Shared/SecurityGroupPicker/SecurityGroupPicker.tsx index 7b66604e54a51..890eeee6cc60a 100644 --- a/web/packages/teleport/src/Discover/Shared/SecurityGroupPicker/SecurityGroupPicker.tsx +++ b/web/packages/teleport/src/Discover/Shared/SecurityGroupPicker/SecurityGroupPicker.tsx @@ -23,7 +23,7 @@ import Table, { Cell } from 'design/DataTable'; import { Danger } from 'design/Alert'; import { CheckboxInput } from 'design/Checkbox'; import { FetchStatus } from 'design/DataTable/types'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import { Attempt } from 'shared/hooks/useAttemptNext'; @@ -163,13 +163,13 @@ export const SecurityGroupPicker = ({ if (sg.recommended && sg.tips?.length) { return ( - +
    {sg.tips.map((tip, index) => (
  • {tip}
  • ))}
-
+
); } diff --git a/web/packages/teleport/src/Integrations/Enroll/AwsOidc/ConfigureAwsOidcSummary.tsx b/web/packages/teleport/src/Integrations/Enroll/AwsOidc/ConfigureAwsOidcSummary.tsx index aecd67c00d114..b99521e8719ae 100644 --- a/web/packages/teleport/src/Integrations/Enroll/AwsOidc/ConfigureAwsOidcSummary.tsx +++ b/web/packages/teleport/src/Integrations/Enroll/AwsOidc/ConfigureAwsOidcSummary.tsx @@ -20,7 +20,7 @@ import React from 'react'; import styled from 'styled-components'; import { Flex, Box, H3, Text } from 'design'; import TextEditor from 'shared/components/TextEditor'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import useStickyClusterId from 'teleport/useStickyClusterId'; @@ -61,7 +61,7 @@ export function ConfigureAwsOidcSummary({ }`; return ( - +

Running the command in AWS CloudShell does the following:

1. Configures an AWS IAM OIDC Identity Provider (IdP) @@ -76,7 +76,7 @@ export function ConfigureAwsOidcSummary({ /> -
+ ); } diff --git a/web/packages/teleport/src/Integrations/Enroll/AwsOidc/S3BucketConfiguration.tsx b/web/packages/teleport/src/Integrations/Enroll/AwsOidc/S3BucketConfiguration.tsx index a225196d65dfc..47452f3aa720e 100644 --- a/web/packages/teleport/src/Integrations/Enroll/AwsOidc/S3BucketConfiguration.tsx +++ b/web/packages/teleport/src/Integrations/Enroll/AwsOidc/S3BucketConfiguration.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { Text, Flex } from 'design'; import FieldInput from 'shared/components/FieldInput'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; export function S3BucketConfiguration({ s3Bucket, @@ -32,11 +32,11 @@ export function S3BucketConfiguration({ <> Amazon S3 Location - + Deprecated. Amazon is now validating the IdP certificate against a list of root CAs. Storing the OpenID Configuration in S3 is no longer required, and should be removed to improve security. - + { {getStatusCodeTitle(item.statusCode)} {statusDescription && ( - {statusDescription} + {statusDescription} )} diff --git a/web/packages/teleport/src/Integrations/status/AwsOidc/AwsOidcHeader.tsx b/web/packages/teleport/src/Integrations/status/AwsOidc/AwsOidcHeader.tsx index 8d95d16a691c4..773efe7beb610 100644 --- a/web/packages/teleport/src/Integrations/status/AwsOidc/AwsOidcHeader.tsx +++ b/web/packages/teleport/src/Integrations/status/AwsOidc/AwsOidcHeader.tsx @@ -21,7 +21,7 @@ import { Link as InternalLink } from 'react-router-dom'; import { ButtonIcon, Flex, Label, Text } from 'design'; import { ArrowLeft } from 'design/Icon'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import cfg from 'teleport/config'; import { getStatusAndLabel } from 'teleport/Integrations/helpers'; diff --git a/web/packages/teleport/src/JoinTokens/JoinTokens.tsx b/web/packages/teleport/src/JoinTokens/JoinTokens.tsx index 46e9100feab8b..862085cfd0157 100644 --- a/web/packages/teleport/src/JoinTokens/JoinTokens.tsx +++ b/web/packages/teleport/src/JoinTokens/JoinTokens.tsx @@ -42,7 +42,7 @@ import Dialog, { } from 'design/Dialog'; import { MenuButton } from 'shared/components/MenuAction'; import { Attempt, useAsync } from 'shared/hooks/useAsync'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { CopyButton } from 'shared/components/UnifiedResources/shared/CopyButton'; import { useTeleport } from 'teleport'; diff --git a/web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx b/web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx index 6daef672649c6..357c6a3d59471 100644 --- a/web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx +++ b/web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx @@ -29,7 +29,7 @@ import { Alert, } from 'design'; import styled from 'styled-components'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { Cross } from 'design/Icon'; import Validation from 'shared/components/Validation'; import FieldInput from 'shared/components/FieldInput'; diff --git a/web/packages/teleport/src/Navigation/Navigation.tsx b/web/packages/teleport/src/Navigation/Navigation.tsx index 6450c575114bf..e50295ea5a1f9 100644 --- a/web/packages/teleport/src/Navigation/Navigation.tsx +++ b/web/packages/teleport/src/Navigation/Navigation.tsx @@ -21,7 +21,7 @@ import styled, { useTheme } from 'styled-components'; import { matchPath, useLocation, useHistory } from 'react-router'; import { Box, Text, Flex } from 'design'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import cfg from 'teleport/config'; import { @@ -195,9 +195,9 @@ function LicenseFooter({ {title} - + {infoContent} - + {subText} diff --git a/web/packages/teleport/src/Navigation/SideNavigation/Section.tsx b/web/packages/teleport/src/Navigation/SideNavigation/Section.tsx index 8217106d5fd20..eb9d10c111b82 100644 --- a/web/packages/teleport/src/Navigation/SideNavigation/Section.tsx +++ b/web/packages/teleport/src/Navigation/SideNavigation/Section.tsx @@ -23,7 +23,7 @@ import styled, { css, useTheme } from 'styled-components'; import { Box, ButtonIcon, Flex, P2, Text } from 'design'; import { Theme } from 'design/theme'; import { ArrowLineLeft } from 'design/Icon'; -import { HoverTooltip, ToolTipInfo } from 'shared/components/ToolTip'; +import { HoverTooltip, IconTooltip } from 'design/Tooltip'; import cfg from 'teleport/config'; @@ -470,9 +470,9 @@ function LicenseFooter({ {title} - + {infoContent} - + {subText} diff --git a/web/packages/teleport/src/Notifications/Notifications.tsx b/web/packages/teleport/src/Notifications/Notifications.tsx index ada3dd3761af1..b64d1460e8041 100644 --- a/web/packages/teleport/src/Notifications/Notifications.tsx +++ b/web/packages/teleport/src/Notifications/Notifications.tsx @@ -24,7 +24,7 @@ import { Alert, Box, Flex, Indicator, Text } from 'design'; import { Notification as NotificationIcon, BellRinging } from 'design/Icon'; import Logger from 'shared/libs/logger'; import { useRefClickOutside } from 'shared/hooks/useRefClickOutside'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { useInfiniteScroll, diff --git a/web/packages/teleport/src/Roles/RoleEditor/EditorHeader.tsx b/web/packages/teleport/src/Roles/RoleEditor/EditorHeader.tsx index 37059aee38594..541e6f08bfefa 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/EditorHeader.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/EditorHeader.tsx @@ -18,7 +18,7 @@ import React from 'react'; import { Flex, ButtonText, H2 } from 'design'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { Trash } from 'design/Icon'; import useTeleport from 'teleport/useTeleport'; diff --git a/web/packages/teleport/src/Roles/RoleEditor/Shared.tsx b/web/packages/teleport/src/Roles/RoleEditor/Shared.tsx index e6cece6752920..3652e87a537ca 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/Shared.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/Shared.tsx @@ -17,7 +17,7 @@ */ import { Box, ButtonPrimary, ButtonSecondary, Flex } from 'design'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import useTeleport from 'teleport/useTeleport'; diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx index 01789e1f2f837..9eefd10718705 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx @@ -31,7 +31,7 @@ import FieldInput from 'shared/components/FieldInput'; import Validation, { Validator } from 'shared/components/Validation'; import { requiredField } from 'shared/components/Validation/rules'; import * as Icon from 'design/Icon'; -import { HoverTooltip, ToolTipInfo } from 'shared/components/ToolTip'; +import { HoverTooltip, IconTooltip } from 'design/Tooltip'; import styled, { useTheme } from 'styled-components'; import { MenuButton, MenuItem } from 'shared/components/MenuAction'; @@ -326,7 +326,7 @@ const Section = ({ {/* TODO(bl-nero): Show validation result in the summary. */}

{title}

- {tooltip && {tooltip}} + {tooltip && {tooltip}}
{removable && ( Date: Wed, 4 Dec 2024 10:57:15 -0800 Subject: [PATCH 12/15] Port ssm client to v2 sdk (#49733) --- lib/cloud/clients.go | 23 -- lib/srv/discovery/discovery.go | 77 ++++--- lib/srv/discovery/discovery_test.go | 89 ++++---- lib/srv/server/ssm_install.go | 108 +++++---- lib/srv/server/ssm_install_test.go | 325 ++++++++++++++-------------- 5 files changed, 315 insertions(+), 307 deletions(-) diff --git a/lib/cloud/clients.go b/lib/cloud/clients.go index 328ee76bcee0e..3cce15285593a 100644 --- a/lib/cloud/clients.go +++ b/lib/cloud/clients.go @@ -60,8 +60,6 @@ import ( "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/aws/aws-sdk-go/service/secretsmanager" "github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/ssm/ssmiface" "github.com/aws/aws-sdk-go/service/sts" "github.com/aws/aws-sdk-go/service/sts/stsiface" "github.com/gravitational/trace" @@ -133,8 +131,6 @@ type AWSClients interface { GetAWSIAMClient(ctx context.Context, region string, opts ...AWSOptionsFn) (iamiface.IAMAPI, error) // GetAWSSTSClient returns AWS STS client for the specified region. GetAWSSTSClient(ctx context.Context, region string, opts ...AWSOptionsFn) (stsiface.STSAPI, error) - // GetAWSSSMClient returns AWS SSM client for the specified region. - GetAWSSSMClient(ctx context.Context, region string, opts ...AWSOptionsFn) (ssmiface.SSMAPI, error) // GetAWSEKSClient returns AWS EKS client for the specified region. GetAWSEKSClient(ctx context.Context, region string, opts ...AWSOptionsFn) (eksiface.EKSAPI, error) // GetAWSKMSClient returns AWS KMS client for the specified region. @@ -592,15 +588,6 @@ func (c *cloudClients) GetAWSSTSClient(ctx context.Context, region string, opts return sts.New(session), nil } -// GetAWSSSMClient returns AWS SSM client for the specified region. -func (c *cloudClients) GetAWSSSMClient(ctx context.Context, region string, opts ...AWSOptionsFn) (ssmiface.SSMAPI, error) { - session, err := c.GetAWSSession(ctx, region, opts...) - if err != nil { - return nil, trace.Wrap(err) - } - return ssm.New(session), nil -} - // GetAWSEKSClient returns AWS EKS client for the specified region. func (c *cloudClients) GetAWSEKSClient(ctx context.Context, region string, opts ...AWSOptionsFn) (eksiface.EKSAPI, error) { session, err := c.GetAWSSession(ctx, region, opts...) @@ -1021,7 +1008,6 @@ type TestCloudClients struct { GCPGKE gcp.GKEClient GCPProjects gcp.ProjectsClient GCPInstances gcp.InstancesClient - SSM ssmiface.SSMAPI InstanceMetadata imds.Client EKS eksiface.EKSAPI KMS kmsiface.KMSAPI @@ -1191,15 +1177,6 @@ func (c *TestCloudClients) GetAWSKMSClient(ctx context.Context, region string, o return c.KMS, nil } -// GetAWSSSMClient returns an AWS SSM client -func (c *TestCloudClients) GetAWSSSMClient(ctx context.Context, region string, opts ...AWSOptionsFn) (ssmiface.SSMAPI, error) { - _, err := c.GetAWSSession(ctx, region, opts...) - if err != nil { - return nil, trace.Wrap(err) - } - return c.SSM, nil -} - // GetGCPIAMClient returns GCP IAM client. func (c *TestCloudClients) GetGCPIAMClient(ctx context.Context) (*gcpcredentials.IamCredentialsClient, error) { return gcpcredentials.NewIamCredentialsClient(ctx, diff --git a/lib/srv/discovery/discovery.go b/lib/srv/discovery/discovery.go index 2f8c4d097b845..3138ccc052f52 100644 --- a/lib/srv/discovery/discovery.go +++ b/lib/srv/discovery/discovery.go @@ -30,12 +30,11 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3" - awsv2 "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/ec2" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/ssm" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/sirupsen/logrus" @@ -116,6 +115,8 @@ type Config struct { CloudClients cloud.Clients // GetEC2Client gets an AWS EC2 client for the given region. GetEC2Client server.EC2ClientGetter + // GetSSMClient gets an AWS SSM client for the given region. + GetSSMClient func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (server.SSMClient, error) // IntegrationOnlyCredentials discards any Matcher that don't have an Integration. // When true, ambient credentials (used by the Cloud SDKs) are not used. IntegrationOnlyCredentials bool @@ -221,32 +222,22 @@ kubernetes matchers are present.`) } if c.GetEC2Client == nil { c.GetEC2Client = func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (ec2.DescribeInstancesAPIClient, error) { - opts = append(opts, config.WithAWSIntegrationCredentialProvider(func(ctx context.Context, region, integrationName string) (awsv2.CredentialsProvider, error) { - integration, err := c.AccessPoint.GetIntegration(ctx, integrationName) - if err != nil { - return nil, trace.Wrap(err) - } - if integration.GetAWSOIDCIntegrationSpec() == nil { - return nil, trace.BadParameter("integration does not have aws oidc spec fields %q", integrationName) - } - token, err := c.AccessPoint.GenerateAWSOIDCToken(ctx, integrationName) - if err != nil { - return nil, trace.Wrap(err) - } - cred, err := awsoidc.NewAWSCredentialsProvider(ctx, &awsoidc.AWSClientRequest{ - Token: token, - RoleARN: integration.GetAWSOIDCIntegrationSpec().RoleARN, - Region: region, - }) - return cred, trace.Wrap(err) - })) - cfg, err := config.GetAWSConfig(ctx, region, opts...) + cfg, err := c.getAWSConfig(ctx, region, opts...) if err != nil { return nil, trace.Wrap(err) } return ec2.NewFromConfig(cfg), nil } } + if c.GetSSMClient == nil { + c.GetSSMClient = func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (server.SSMClient, error) { + cfg, err := c.getAWSConfig(ctx, region, opts...) + if err != nil { + return nil, trace.Wrap(err) + } + return ssm.NewFromConfig(cfg), nil + } + } if c.KubernetesClient == nil && len(c.Matchers.Kubernetes) > 0 { cfg, err := rest.InClusterConfig() if err != nil { @@ -302,6 +293,30 @@ kubernetes matchers are present.`) return nil } +func (c *Config) getAWSConfig(ctx context.Context, region string, opts ...config.AWSOptionsFn) (aws.Config, error) { + opts = append(opts, config.WithAWSIntegrationCredentialProvider(func(ctx context.Context, region, integrationName string) (aws.CredentialsProvider, error) { + integration, err := c.AccessPoint.GetIntegration(ctx, integrationName) + if err != nil { + return nil, trace.Wrap(err) + } + if integration.GetAWSOIDCIntegrationSpec() == nil { + return nil, trace.BadParameter("integration does not have aws oidc spec fields %q", integrationName) + } + token, err := c.AccessPoint.GenerateAWSOIDCToken(ctx, integrationName) + if err != nil { + return nil, trace.Wrap(err) + } + cred, err := awsoidc.NewAWSCredentialsProvider(ctx, &awsoidc.AWSClientRequest{ + Token: token, + RoleARN: integration.GetAWSOIDCIntegrationSpec().RoleARN, + Region: region, + }) + return cred, trace.Wrap(err) + })) + cfg, err := config.GetAWSConfig(ctx, region, opts...) + return cfg, trace.Wrap(err) +} + // Server is a discovery server, used to discover cloud resources for // inclusion in Teleport type Server struct { @@ -863,7 +878,7 @@ func genEC2InstancesLogStr(instances []server.EC2Instance) string { func genAzureInstancesLogStr(instances []*armcompute.VirtualMachine) string { return genInstancesLogStr(instances, func(i *armcompute.VirtualMachine) string { - return aws.StringValue(i.Name) + return aws.ToString(i.Name) }) } @@ -1019,9 +1034,9 @@ func (s *Server) heartbeatEICEInstance(instances *server.EC2Instances) { func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) error { // TODO(gavin): support assume_role_arn for ec2. - ec2Client, err := s.CloudClients.GetAWSSSMClient(s.ctx, + ssmClient, err := s.GetSSMClient(s.ctx, instances.Region, - cloud.WithCredentialsMaybeIntegration(instances.Integration), + config.WithCredentialsMaybeIntegration(instances.Integration), ) if err != nil { return trace.Wrap(err) @@ -1031,7 +1046,7 @@ func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) err req := server.SSMRunRequest{ DocumentName: instances.DocumentName, - SSM: ec2Client, + SSM: ssmClient, Instances: instances.Instances, Params: instances.Parameters, Region: instances.Region, @@ -1070,8 +1085,8 @@ func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) err } func (s *Server) logHandleInstancesErr(err error) { - var aErr awserr.Error - if errors.As(err, &aErr) && aErr.Code() == ssm.ErrCodeInvalidInstanceId { + var instanceIDErr *ssmtypes.InvalidInstanceId + if errors.As(err, &instanceIDErr) { const errorMessage = "SSM SendCommand failed with ErrCodeInvalidInstanceId. " + "Make sure that the instances have AmazonSSMManagedInstanceCore policy assigned. " + "Also check that SSM agent is running and registered with the SSM endpoint on that instance and try restarting or reinstalling it in case of issues. " + @@ -1210,7 +1225,7 @@ outer: for _, node := range nodes { var vmID string if inst.Properties != nil { - vmID = aws.StringValue(inst.Properties.VMID) + vmID = aws.ToString(inst.Properties.VMID) } match := types.MatchLabels(node, map[string]string{ types.SubscriptionIDLabel: instances.SubscriptionID, diff --git a/lib/srv/discovery/discovery_test.go b/lib/srv/discovery/discovery_test.go index 8c9c08b0aff95..7f569caee654b 100644 --- a/lib/srv/discovery/discovery_test.go +++ b/lib/srv/discovery/discovery_test.go @@ -39,15 +39,14 @@ import ( awsv2 "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/ec2" ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/service/eks" "github.com/aws/aws-sdk-go/service/eks/eksiface" "github.com/aws/aws-sdk-go/service/rds" "github.com/aws/aws-sdk-go/service/redshift" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/ssm/ssmiface" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -98,26 +97,19 @@ func TestMain(m *testing.M) { } type mockSSMClient struct { - ssmiface.SSMAPI + server.SSMClient commandOutput *ssm.SendCommandOutput invokeOutput *ssm.GetCommandInvocationOutput } -func (sm *mockSSMClient) SendCommandWithContext(_ context.Context, input *ssm.SendCommandInput, _ ...request.Option) (*ssm.SendCommandOutput, error) { +func (sm *mockSSMClient) SendCommand(_ context.Context, input *ssm.SendCommandInput, _ ...func(*ssm.Options)) (*ssm.SendCommandOutput, error) { return sm.commandOutput, nil } -func (sm *mockSSMClient) GetCommandInvocationWithContext(_ context.Context, input *ssm.GetCommandInvocationInput, _ ...request.Option) (*ssm.GetCommandInvocationOutput, error) { +func (sm *mockSSMClient) GetCommandInvocation(_ context.Context, input *ssm.GetCommandInvocationInput, _ ...func(*ssm.Options)) (*ssm.GetCommandInvocationOutput, error) { return sm.invokeOutput, nil } -func (sm *mockSSMClient) WaitUntilCommandExecutedWithContext(aws.Context, *ssm.GetCommandInvocationInput, ...request.WaiterOption) error { - if aws.StringValue(sm.commandOutput.Command.Status) == ssm.CommandStatusFailed { - return awserr.New(request.WaiterResourceNotReadyErrorCode, "err", nil) - } - return nil -} - type mockEmitter struct { eventHandler func(*testing.T, events.AuditEvent, *Server) server *Server @@ -325,13 +317,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{ @@ -347,7 +339,7 @@ func TestDiscoveryServer(t *testing.T) { InstanceID: "instance-id-1", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), }, ae) }, }, @@ -383,13 +375,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, staticMatchers: defaultStaticMatcher, @@ -424,13 +416,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{}, @@ -443,13 +435,13 @@ func TestDiscoveryServer(t *testing.T) { foundEC2Instances: genEC2Instances(58), ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{}, @@ -473,13 +465,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{ @@ -495,7 +487,7 @@ func TestDiscoveryServer(t *testing.T) { InstanceID: "instance-id-1", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), }, ae) }, }, @@ -520,13 +512,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{ @@ -542,7 +534,7 @@ func TestDiscoveryServer(t *testing.T) { InstanceID: "instance-id-1", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), }, ae) }, }, @@ -582,13 +574,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, ssmRunError: trace.BadParameter("ssm run failed"), @@ -605,7 +597,7 @@ func TestDiscoveryServer(t *testing.T) { InstanceID: "instance-id-1", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), }, ae) }, }, @@ -640,9 +632,6 @@ func TestDiscoveryServer(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Parallel() - testCloudClients := &cloud.TestCloudClients{ - SSM: tc.ssm, - } ec2Client := &mockEC2Client{output: &ec2.DescribeInstancesOutput{ Reservations: []ec2types.Reservation{ { @@ -691,10 +680,12 @@ func TestDiscoveryServer(t *testing.T) { } server, err := New(authz.ContextWithUser(context.Background(), identity.I), &Config{ - CloudClients: testCloudClients, GetEC2Client: func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (ec2.DescribeInstancesAPIClient, error) { return ec2Client, nil }, + GetSSMClient: func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (server.SSMClient, error) { + return tc.ssm, nil + }, ClusterFeatures: func() proto.Features { return proto.Features{} }, KubernetesClient: fake.NewSimpleClientset(), AccessPoint: getDiscoveryAccessPoint(tlsServer.Auth(), authClient), diff --git a/lib/srv/server/ssm_install.go b/lib/srv/server/ssm_install.go index 3c23f672884a3..51943f4400058 100644 --- a/lib/srv/server/ssm_install.go +++ b/lib/srv/server/ssm_install.go @@ -26,12 +26,11 @@ import ( "maps" "slices" "strings" + "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/ssm/ssmiface" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" "github.com/gravitational/trace" "golang.org/x/sync/errgroup" @@ -42,6 +41,23 @@ import ( libevents "github.com/gravitational/teleport/lib/events" ) +// waiterTimedOutErrorMessage is the error message returned by the AWS SDK command +// executed waiter when it times out. +const waiterTimedOutErrorMessage = "exceeded max wait time for CommandExecuted waiter" + +// SSMClient is the subset of the AWS SSM API required for EC2 discovery. +type SSMClient interface { + ssm.DescribeInstanceInformationAPIClient + ssm.GetCommandInvocationAPIClient + ssm.ListCommandInvocationsAPIClient + // SendCommand runs commands on one or more managed nodes. + SendCommand(ctx context.Context, params *ssm.SendCommandInput, optFns ...func(*ssm.Options)) (*ssm.SendCommandOutput, error) +} + +type commandWaiter interface { + Wait(ctx context.Context, params *ssm.GetCommandInvocationInput, maxWaitDur time.Duration, optFns ...func(*ssm.CommandExecutedWaiterOptions)) error +} + // SSMInstallerConfig represents configuration for an SSM install // script executor. type SSMInstallerConfig struct { @@ -50,6 +66,9 @@ type SSMInstallerConfig struct { // Logger is used to log messages. // Optional. A logger is created if one not supplied. Logger *slog.Logger + // getWaiter replaces the default command waiter for a given SSM client. + // Used in tests. + getWaiter func(SSMClient) commandWaiter } // SSMInstallationResult contains the result of trying to install teleport @@ -84,7 +103,7 @@ type SSMRunRequest struct { // DocumentName is the name of the SSM document to run. DocumentName string // SSM is an SSM API client. - SSM ssmiface.SSMAPI + SSM SSMClient // Instances is the list of instances that will have the SSM // document executed on them. Instances []EC2Instance @@ -124,6 +143,12 @@ func (c *SSMInstallerConfig) checkAndSetDefaults() error { c.Logger = slog.Default().With(teleport.ComponentKey, "ssminstaller") } + if c.getWaiter == nil { + c.getWaiter = func(s SSMClient) commandWaiter { + return ssm.NewCommandExecutedWaiter(s) + } + } + return nil } @@ -144,9 +169,9 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { instances[inst.InstanceID] = inst.InstanceName } - params := make(map[string][]*string) + params := make(map[string][]string) for k, v := range req.Params { - params[k] = []*string{aws.String(v)} + params[k] = []string{v} } validInstances := instances @@ -175,9 +200,9 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { } validInstanceIDs := instanceIDsFrom(validInstances) - output, err := req.SSM.SendCommandWithContext(ctx, &ssm.SendCommandInput{ + output, err := req.SSM.SendCommand(ctx, &ssm.SendCommandInput{ DocumentName: aws.String(req.DocumentName), - InstanceIds: aws.StringSlice(validInstanceIDs), + InstanceIds: validInstanceIDs, Parameters: params, }) if err != nil { @@ -194,9 +219,9 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { // As a best effort, we try to call ssm.SendCommand again but this time without the "sshdConfigPath" param // We must not remove the Param "sshdConfigPath" beforehand because customers might be using custom SSM Documents for ec2 auto discovery. delete(params, ParamSSHDConfigPath) - output, err = req.SSM.SendCommandWithContext(ctx, &ssm.SendCommandInput{ + output, err = req.SSM.SendCommand(ctx, &ssm.SendCommandInput{ DocumentName: aws.String(req.DocumentName), - InstanceIds: aws.StringSlice(validInstanceIDs), + InstanceIds: validInstanceIDs, Parameters: params, }) if err != nil { @@ -296,20 +321,20 @@ func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunReq } instanceIDs := instanceIDsFrom(allInstances) - ssmInstancesInfo, err := req.SSM.DescribeInstanceInformationWithContext(ctx, &ssm.DescribeInstanceInformationInput{ - Filters: []*ssm.InstanceInformationStringFilter{ - {Key: aws.String(ssm.InstanceInformationFilterKeyInstanceIds), Values: aws.StringSlice(instanceIDs)}, + ssmInstancesInfo, err := req.SSM.DescribeInstanceInformation(ctx, &ssm.DescribeInstanceInformationInput{ + Filters: []ssmtypes.InstanceInformationStringFilter{ + {Key: aws.String(string(ssmtypes.InstanceInformationFilterKeyInstanceIds)), Values: instanceIDs}, }, - MaxResults: aws.Int64(awsEC2APIChunkSize), + MaxResults: aws.Int32(awsEC2APIChunkSize), }) if err != nil { return nil, trace.Wrap(awslib.ConvertRequestFailureError(err)) } - instanceStateByInstanceID := make(map[string]*ssm.InstanceInformation, len(ssmInstancesInfo.InstanceInformationList)) + instanceStateByInstanceID := make(map[string]ssmtypes.InstanceInformation, len(ssmInstancesInfo.InstanceInformationList)) for _, instanceState := range ssmInstancesInfo.InstanceInformationList { // instanceState.InstanceId always has the InstanceID value according to AWS Docs. - instanceStateByInstanceID[aws.StringValue(instanceState.InstanceId)] = instanceState + instanceStateByInstanceID[aws.ToString(instanceState.InstanceId)] = instanceState } for instanceID, instanceName := range allInstances { @@ -319,12 +344,12 @@ func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunReq continue } - if aws.StringValue(instanceState.PingStatus) == ssm.PingStatusConnectionLost { + if instanceState.PingStatus == ssmtypes.PingStatusConnectionLost { ret.connectionLost[instanceID] = instanceName continue } - if aws.StringValue(instanceState.PlatformType) != ssm.PlatformTypeLinux { + if instanceState.PlatformType != ssmtypes.PlatformTypeLinux { ret.unsupportedOS[instanceID] = instanceName continue } @@ -336,23 +361,22 @@ func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunReq } // skipAWSWaitErr is used to ignore the error returned from -// WaitUntilCommandExecutedWithContext if it is a resource not ready -// code as this can represent one of several different errors which +// Wait if it times out, as this can represent one of several different errors which // are handled by checking the command invocation after calling this // to get more information about the error. func skipAWSWaitErr(err error) error { - var aErr awserr.Error - if errors.As(err, &aErr) && aErr.Code() == request.WaiterResourceNotReadyErrorCode { + if err != nil && err.Error() == waiterTimedOutErrorMessage { return nil } return trace.Wrap(err) } func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, commandID, instanceID *string, instanceName string) error { - err := req.SSM.WaitUntilCommandExecutedWithContext(ctx, &ssm.GetCommandInvocationInput{ + err := si.getWaiter(req.SSM).Wait(ctx, &ssm.GetCommandInvocationInput{ CommandId: commandID, InstanceId: instanceID, - }) + // 100 seconds to match v1 sdk waiter default. + }, 100*time.Second) if err := skipAWSWaitErr(err); err != nil { return trace.Wrap(err) @@ -378,7 +402,7 @@ func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, com for i, step := range invocationSteps { stepResultEvent, err := si.getCommandStepStatusEvent(ctx, step, req, commandID, instanceID) if err != nil { - var invalidPluginNameErr *ssm.InvalidPluginName + var invalidPluginNameErr *ssmtypes.InvalidPluginName if errors.As(err, &invalidPluginNameErr) { // If using a custom SSM Document and the client does not have access to ssm:ListCommandInvocations // the list of invocationSteps (ie plugin name) might be wrong. @@ -422,10 +446,10 @@ func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, com func (si *SSMInstaller) getInvocationSteps(ctx context.Context, req SSMRunRequest, commandID, instanceID *string) ([]string, error) { // ssm:ListCommandInvocations is used to list the actual steps because users might be using a custom SSM Document. - listCommandInvocationResp, err := req.SSM.ListCommandInvocationsWithContext(ctx, &ssm.ListCommandInvocationsInput{ + listCommandInvocationResp, err := req.SSM.ListCommandInvocations(ctx, &ssm.ListCommandInvocationsInput{ CommandId: commandID, InstanceId: instanceID, - Details: aws.Bool(true), + Details: true, }) if err != nil { return nil, trace.Wrap(awslib.ConvertRequestFailureError(err)) @@ -436,8 +460,8 @@ func (si *SSMInstaller) getInvocationSteps(ctx context.Context, req SSMRunReques if len(listCommandInvocationResp.CommandInvocations) == 0 { si.Logger.WarnContext(ctx, "No command invocation was found.", - "command_id", aws.StringValue(commandID), - "instance_id", aws.StringValue(instanceID), + "command_id", aws.ToString(commandID), + "instance_id", aws.ToString(instanceID), ) return nil, trace.BadParameter("no command invocation was found") } @@ -445,7 +469,7 @@ func (si *SSMInstaller) getInvocationSteps(ctx context.Context, req SSMRunReques documentSteps := make([]string, 0, len(commandInvocation.CommandPlugins)) for _, step := range commandInvocation.CommandPlugins { - documentSteps = append(documentSteps, aws.StringValue(step.Name)) + documentSteps = append(documentSteps, aws.ToString(step.Name)) } return documentSteps, nil } @@ -458,16 +482,16 @@ func (si *SSMInstaller) getCommandStepStatusEvent(ctx context.Context, step stri if step != "" { getCommandInvocationReq.PluginName = aws.String(step) } - stepResult, err := req.SSM.GetCommandInvocationWithContext(ctx, getCommandInvocationReq) + stepResult, err := req.SSM.GetCommandInvocation(ctx, getCommandInvocationReq) if err != nil { return nil, trace.Wrap(err) } - status := aws.StringValue(stepResult.Status) - exitCode := aws.Int64Value(stepResult.ResponseCode) + status := stepResult.Status + exitCode := int64(stepResult.ResponseCode) eventCode := libevents.SSMRunSuccessCode - if status != ssm.CommandStatusSuccess { + if status != ssmtypes.CommandInvocationStatusSuccess { eventCode = libevents.SSMRunFailCode if exitCode == 0 { exitCode = -1 @@ -479,7 +503,7 @@ func (si *SSMInstaller) getCommandStepStatusEvent(ctx context.Context, step stri // Example: // https://eu-west-2.console.aws.amazon.com/systems-manager/run-command/3cb11aaa-11aa-1111-aaaa-2188108225de/i-0775091aa11111111 invocationURL := fmt.Sprintf("https://%s.console.aws.amazon.com/systems-manager/run-command/%s/%s", - req.Region, aws.StringValue(commandID), aws.StringValue(instanceID), + req.Region, aws.ToString(commandID), aws.ToString(instanceID), ) return &apievents.SSMRun{ @@ -487,14 +511,14 @@ func (si *SSMInstaller) getCommandStepStatusEvent(ctx context.Context, step stri Type: libevents.SSMRunEvent, Code: eventCode, }, - CommandID: aws.StringValue(commandID), - InstanceID: aws.StringValue(instanceID), + CommandID: aws.ToString(commandID), + InstanceID: aws.ToString(instanceID), AccountID: req.AccountID, Region: req.Region, ExitCode: exitCode, - Status: status, - StandardOutput: aws.StringValue(stepResult.StandardOutputContent), - StandardError: aws.StringValue(stepResult.StandardErrorContent), + Status: string(status), + StandardOutput: aws.ToString(stepResult.StandardOutputContent), + StandardError: aws.ToString(stepResult.StandardErrorContent), InvocationURL: invocationURL, }, nil } diff --git a/lib/srv/server/ssm_install_test.go b/lib/srv/server/ssm_install_test.go index c56b286258527..102bcbf5a4475 100644 --- a/lib/srv/server/ssm_install_test.go +++ b/lib/srv/server/ssm_install_test.go @@ -21,15 +21,13 @@ package server import ( "context" "fmt" - "net/http" "testing" + "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/ssm/ssmiface" - "github.com/google/uuid" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" + "github.com/gravitational/trace" "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types/events" @@ -37,7 +35,7 @@ import ( ) type mockSSMClient struct { - ssmiface.SSMAPI + SSMClient commandOutput *ssm.SendCommandOutput commandInvokeOutput map[string]*ssm.GetCommandInvocationOutput describeOutput *ssm.DescribeInstanceInformationOutput @@ -46,37 +44,37 @@ type mockSSMClient struct { const docWithoutSSHDConfigPathParam = "ssmdocument-without-sshdConfigPath-param" -func (sm *mockSSMClient) SendCommandWithContext(_ context.Context, input *ssm.SendCommandInput, _ ...request.Option) (*ssm.SendCommandOutput, error) { - if _, hasExtraParam := input.Parameters["sshdConfigPath"]; hasExtraParam && aws.StringValue(input.DocumentName) == docWithoutSSHDConfigPathParam { +func (sm *mockSSMClient) SendCommand(_ context.Context, input *ssm.SendCommandInput, _ ...func(*ssm.Options)) (*ssm.SendCommandOutput, error) { + if _, hasExtraParam := input.Parameters["sshdConfigPath"]; hasExtraParam && aws.ToString(input.DocumentName) == docWithoutSSHDConfigPathParam { return nil, fmt.Errorf("InvalidParameters: document %s does not support parameters", docWithoutSSHDConfigPathParam) } return sm.commandOutput, nil } -func (sm *mockSSMClient) GetCommandInvocationWithContext(_ context.Context, input *ssm.GetCommandInvocationInput, _ ...request.Option) (*ssm.GetCommandInvocationOutput, error) { - if stepResult, found := sm.commandInvokeOutput[aws.StringValue(input.PluginName)]; found { +func (sm *mockSSMClient) GetCommandInvocation(_ context.Context, input *ssm.GetCommandInvocationInput, _ ...func(*ssm.Options)) (*ssm.GetCommandInvocationOutput, error) { + if stepResult, found := sm.commandInvokeOutput[aws.ToString(input.PluginName)]; found { return stepResult, nil } - return nil, &ssm.InvalidPluginName{} + return nil, &ssmtypes.InvalidPluginName{} } -func (sm *mockSSMClient) DescribeInstanceInformationWithContext(_ context.Context, input *ssm.DescribeInstanceInformationInput, _ ...request.Option) (*ssm.DescribeInstanceInformationOutput, error) { +func (sm *mockSSMClient) DescribeInstanceInformation(_ context.Context, input *ssm.DescribeInstanceInformationInput, _ ...func(*ssm.Options)) (*ssm.DescribeInstanceInformationOutput, error) { if sm.describeOutput == nil { - return nil, awserr.NewRequestFailure(awserr.New("AccessDeniedException", "message", nil), http.StatusBadRequest, uuid.NewString()) + return nil, trace.AccessDenied("") } return sm.describeOutput, nil } -func (sm *mockSSMClient) ListCommandInvocationsWithContext(aws.Context, *ssm.ListCommandInvocationsInput, ...request.Option) (*ssm.ListCommandInvocationsOutput, error) { +func (sm *mockSSMClient) ListCommandInvocations(_ context.Context, input *ssm.ListCommandInvocationsInput, _ ...func(*ssm.Options)) (*ssm.ListCommandInvocationsOutput, error) { if sm.listCommandInvocations == nil { - return nil, awserr.NewRequestFailure(awserr.New("AccessDeniedException", "message", nil), http.StatusBadRequest, uuid.NewString()) + return nil, trace.AccessDenied("") } return sm.listCommandInvocations, nil } -func (sm *mockSSMClient) WaitUntilCommandExecutedWithContext(aws.Context, *ssm.GetCommandInvocationInput, ...request.WaiterOption) error { - if aws.StringValue(sm.commandOutput.Command.Status) == ssm.CommandStatusFailed { - return awserr.New(request.WaiterResourceNotReadyErrorCode, "err", nil) +func (sm *mockSSMClient) Wait(ctx context.Context, params *ssm.GetCommandInvocationInput, maxWaitDur time.Duration, optFns ...func(*ssm.CommandExecutedWaiterOptions)) error { + if sm.commandOutput.Command.Status == ssmtypes.CommandStatusFailed { + return trace.Errorf(waiterTimedOutErrorMessage) } return nil } @@ -94,6 +92,7 @@ func TestSSMInstaller(t *testing.T) { document := "ssmdocument" for _, tc := range []struct { + client *mockSSMClient req SSMRunRequest expectedInstallations []*SSMInstallationResult name string @@ -108,25 +107,25 @@ func TestSSMInstaller(t *testing.T) { Params: map[string]string{"token": "abcdefg"}, IntegrationName: "aws-integration", DiscoveryConfig: "dc001", - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, - "runShellScript": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + }, + "runShellScript": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ IntegrationName: "aws-integration", @@ -141,7 +140,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, IssueType: "ec2-ssm-script-failure", @@ -157,25 +156,25 @@ func TestSSMInstaller(t *testing.T) { }, DocumentName: docWithoutSSHDConfigPathParam, Params: map[string]string{"sshdConfigPath": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, - "runShellScript": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + }, + "runShellScript": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ SSMRunEvent: &events.SSMRun{ @@ -188,7 +187,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, IssueType: "ec2-ssm-script-failure", @@ -204,23 +203,23 @@ func TestSSMInstaller(t *testing.T) { }, IntegrationName: "aws-1", Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusFailed), - ResponseCode: aws.Int64(1), - StandardErrorContent: aws.String("timeout error"), - StandardOutputContent: aws.String(""), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusFailed, + ResponseCode: 1, + StandardErrorContent: aws.String("timeout error"), + StandardOutputContent: aws.String(""), }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ IntegrationName: "aws-1", @@ -234,7 +233,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 1, - Status: ssm.CommandStatusFailed, + Status: string(ssmtypes.CommandInvocationStatusFailed), StandardOutput: "", StandardError: "timeout error", InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", @@ -250,30 +249,30 @@ func TestSSMInstaller(t *testing.T) { Instances: []EC2Instance{ {InstanceID: "instance-id-1"}, }, - Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Params: map[string]string{"token": "abcdefg"}, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - StandardErrorContent: aws.String("no error"), - StandardOutputContent: aws.String(""), - }, - "runShellScript": { - Status: aws.String(ssm.CommandStatusFailed), - ResponseCode: aws.Int64(1), - StandardErrorContent: aws.String("timeout error"), - StandardOutputContent: aws.String(""), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + StandardErrorContent: aws.String("no error"), + StandardOutputContent: aws.String(""), + }, + "runShellScript": { + Status: ssmtypes.CommandInvocationStatusFailed, + ResponseCode: 1, + StandardErrorContent: aws.String("timeout error"), + StandardOutputContent: aws.String(""), }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ SSMRunEvent: &events.SSMRun{ @@ -286,7 +285,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 1, - Status: ssm.CommandStatusFailed, + Status: string(ssmtypes.CommandInvocationStatusFailed), StandardOutput: "", StandardError: "timeout error", InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", @@ -306,44 +305,44 @@ func TestSSMInstaller(t *testing.T) { }, DocumentName: document, Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), + }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + }, + "runShellScript": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + }, + describeOutput: &ssm.DescribeInstanceInformationOutput{ + InstanceInformationList: []ssmtypes.InstanceInformation{ + { + InstanceId: aws.String("instance-id-1"), + PingStatus: ssmtypes.PingStatusOnline, + PlatformType: ssmtypes.PlatformTypeLinux, }, - "runShellScript": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + { + InstanceId: aws.String("instance-id-2"), + PingStatus: ssmtypes.PingStatusConnectionLost, + PlatformType: ssmtypes.PlatformTypeLinux, }, - }, - describeOutput: &ssm.DescribeInstanceInformationOutput{ - InstanceInformationList: []*ssm.InstanceInformation{ - { - InstanceId: aws.String("instance-id-1"), - PingStatus: aws.String("Online"), - PlatformType: aws.String("Linux"), - }, - { - InstanceId: aws.String("instance-id-2"), - PingStatus: aws.String("ConnectionLost"), - PlatformType: aws.String("Linux"), - }, - { - InstanceId: aws.String("instance-id-3"), - PingStatus: aws.String("Online"), - PlatformType: aws.String("Windows"), - }, + { + InstanceId: aws.String("instance-id-3"), + PingStatus: ssmtypes.PingStatusOnline, + PlatformType: ssmtypes.PlatformTypeWindows, }, }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{ { @@ -357,7 +356,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, IssueType: "ec2-ssm-script-failure", @@ -421,34 +420,34 @@ func TestSSMInstaller(t *testing.T) { }, DocumentName: document, Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContentCustom": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, - "runShellScriptCustom": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - StandardOutputContent: aws.String("custom output"), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContentCustom": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, - listCommandInvocations: &ssm.ListCommandInvocationsOutput{ - CommandInvocations: []*ssm.CommandInvocation{{ - CommandPlugins: []*ssm.CommandPlugin{ - {Name: aws.String("downloadContentCustom")}, - {Name: aws.String("runShellScriptCustom")}, - }, - }}, + "runShellScriptCustom": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + StandardOutputContent: aws.String("custom output"), }, }, - Region: "eu-central-1", - AccountID: "account-id", + listCommandInvocations: &ssm.ListCommandInvocationsOutput{ + CommandInvocations: []ssmtypes.CommandInvocation{{ + CommandPlugins: []ssmtypes.CommandPlugin{ + {Name: aws.String("downloadContentCustom")}, + {Name: aws.String("runShellScriptCustom")}, + }, + }}, + }, }, expectedInstallations: []*SSMInstallationResult{{ SSMRunEvent: &events.SSMRun{ @@ -461,7 +460,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), StandardOutput: "custom output", InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, @@ -477,21 +476,21 @@ func TestSSMInstaller(t *testing.T) { }, DocumentName: document, Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ SSMRunEvent: &events.SSMRun{ @@ -504,7 +503,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, IssueType: "ec2-ssm-script-failure", @@ -516,9 +515,11 @@ func TestSSMInstaller(t *testing.T) { } { t.Run(tc.name, func(t *testing.T) { ctx := context.Background() + tc.req.SSM = tc.client installationResultsCollector := &mockInstallationResults{} inst, err := NewSSMInstaller(SSMInstallerConfig{ ReportSSMInstallationResultFunc: installationResultsCollector.ReportInstallationResult, + getWaiter: func(s SSMClient) commandWaiter { return tc.client }, }) require.NoError(t, err) From 6a83f9e75e1af245e40dd147592808a6d7734adc Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Wed, 4 Dec 2024 14:05:25 -0500 Subject: [PATCH 13/15] docs: update macos uninstall (#49238) * docs: update macos uninstall * docs: update verbiage for macos uninstall Apply review suggestions Co-authored-by: Zac Bergquist * docs: update verbiage on removing --------- Co-authored-by: Zac Bergquist --- .../management/admin/uninstall-teleport.mdx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/pages/admin-guides/management/admin/uninstall-teleport.mdx b/docs/pages/admin-guides/management/admin/uninstall-teleport.mdx index c1675c103443e..873458083c86b 100644 --- a/docs/pages/admin-guides/management/admin/uninstall-teleport.mdx +++ b/docs/pages/admin-guides/management/admin/uninstall-teleport.mdx @@ -160,7 +160,7 @@ Follow the instructions for your Linux distribution: You can use `dirname $(which teleport)` to look this up automatically. - Remove the Teleport binaries from the machine: + Remove the Teleport binaries and links to Teleport software from the machine: ```code $ sudo rm -f /usr/local/bin/tbot @@ -171,10 +171,17 @@ Follow the instructions for your Linux distribution: ``` - If you installed the macOS `tsh` client-only package and/or Teleport Connect for macOS, you can optionally remove those too: + + You may have Teleport software in the `/Applications` folder if you: + - Installed from a macOS tarball for v17+ that includes `tsh.app` and `tctl.app` + - Installed the macOS `tsh` client-only package for v16 or older versions. + - Installed Teleport Connect for macOS + + You can remove those with these commands: ```code $ sudo rm -rf /Applications/tsh.app + $ sudo rm -rf /Applications/tctl.app $ sudo rm -rf /Applications/Teleport\ Connect.app ``` From ad5afda6880fda3b9a7f90d1948a0e448df5b9e6 Mon Sep 17 00:00:00 2001 From: Russell Jones Date: Wed, 4 Dec 2024 11:29:58 -0800 Subject: [PATCH 14/15] Added actionable errors for network issues. (#49246) Added actionable errors for common network issues. Updated Application Access to use actionable errors. --- lib/srv/app/transport.go | 62 +++++++++++++++++++++++++++++++++++-- lib/utils/errors.go | 66 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 3 deletions(-) diff --git a/lib/srv/app/transport.go b/lib/srv/app/transport.go index d019af70dbe9f..262ce70626825 100644 --- a/lib/srv/app/transport.go +++ b/lib/srv/app/transport.go @@ -21,12 +21,15 @@ package app import ( "context" "crypto/tls" + "io" "log/slog" "net" "net/http" "net/url" "path" "slices" + "strings" + "time" "github.com/gravitational/trace" @@ -97,6 +100,12 @@ func newTransport(ctx context.Context, c *transportConfig) (*transport, error) { if err != nil { return nil, trace.Wrap(err) } + + // Add a timeout to control how long it takes to (start) getting a response + // from the target server. This allows Teleport to show the user a helpful + // error message when the target service is slow in responding. + tr.ResponseHeaderTimeout = requestTimeout + tr.TLSClientConfig, err = configureTLS(c) if err != nil { return nil, trace.Wrap(err) @@ -143,15 +152,35 @@ func (t *transport) RoundTrip(r *http.Request) (*http.Response, error) { return nil, trace.Wrap(err) } - // Forward the request to the target application and emit an audit event. + // Forward the request to the target application. + // + // If a network error occurred when connecting to the target application, + // log and return a helpful error message to the user and Teleport + // administrator. resp, err := t.tr.RoundTrip(r) + if message, ok := utils.CanExplainNetworkError(err); ok { + if t.log.Enabled(r.Context(), slog.LevelDebug) { + t.log.DebugContext(r.Context(), "application request failed with a network error", + "raw_error", err, "human_error", strings.Join(strings.Fields(message), " ")) + } + + code := trace.ErrorToCode(err) + return &http.Response{ + StatusCode: code, + Status: http.StatusText(code), + Proto: r.Proto, + ProtoMajor: r.ProtoMajor, + ProtoMinor: r.ProtoMinor, + Body: io.NopCloser(strings.NewReader(charWrap(message))), + TLS: r.TLS, + }, nil + } if err != nil { return nil, trace.Wrap(err) } - status := uint32(resp.StatusCode) // Emit the event to the audit log. - if err := sessCtx.Audit.OnRequest(t.closeContext, sessCtx, r, status, nil /*aws endpoint*/); err != nil { + if err := sessCtx.Audit.OnRequest(t.closeContext, sessCtx, r, uint32(resp.StatusCode), nil /*aws endpoint*/); err != nil { return nil, trace.Wrap(err) } @@ -293,3 +322,30 @@ func host(addr string) string { } return host } + +// charWrap wraps a line to about 80 characters to make it easier to read. +func charWrap(message string) string { + var sb strings.Builder + for _, line := range strings.Split(message, "\n") { + var n int + for _, word := range strings.Fields(line) { + sb.WriteString(word) + sb.WriteString(" ") + + n += len(word) + 1 + if n > 80 { + sb.WriteString("\n") + n = 0 + } + } + sb.WriteString("\n") + } + return sb.String() +} + +const ( + // requestTimeout is the timeout to receive a response from the upstream + // server. Start it out large (not to break things) and slowly decrease it + // over time. + requestTimeout = 5 * time.Minute +) diff --git a/lib/utils/errors.go b/lib/utils/errors.go index ed557b2168b76..14e56b188c418 100644 --- a/lib/utils/errors.go +++ b/lib/utils/errors.go @@ -19,6 +19,7 @@ package utils import ( + "context" "errors" "io" "net" @@ -86,6 +87,71 @@ func IsUntrustedCertErr(err error) bool { strings.Contains(errMsg, "certificate is not trusted") } +// CanExplainNetworkError returns a simple to understand error message that can +// be used to debug common network and/or protocol errors. +func CanExplainNetworkError(err error) (string, bool) { + var derr *net.DNSError + + switch { + // Connection refused errors can be reproduced by attempting to connect to a + // host:port that no process is listening on. The raw error typically looks + // like the following: + // + // dial tcp 127.0.0.1:8000: connect: connection refused + case errors.Is(err, syscall.ECONNREFUSED): + return `Connection Refused + +Teleport was unable to connect to the requested host, possibly because the server is not running. Ensure the server is running and listening on the correct port. + +Use "nc -vz HOST PORT" to help debug this issue.`, true + // Host unreachable errors can be reproduced by running + // "ip route add unreachable HOST" to update the routing table to make + // the host unreachable. Packets will be discarded and an ICMP message + // will be returned. The raw error typically looks like the following: + // + // dial tcp 10.10.10.10:8000: connect: no route to host + case errors.Is(err, syscall.EHOSTUNREACH): + return `No Route to Host + +Teleport could not connect to the requested host, likely because there is no valid network path to reach it. Check the network routing table to ensure a valid path to the host exists. + +Use "ping HOST" and "ip route get HOST" to help debug this issue.`, true + // Connection reset errors can be reproduced by creating a HTTP server that + // accepts requests but closes the connection before writing a response. The + // raw error typically looks like the following: + // + // read tcp 127.0.0.1:49764->127.0.0.1:8000: read: connection reset by peer + case errors.Is(err, syscall.ECONNRESET): + return `Connection Reset by Peer + +Teleport could not complete the request because the server abruptly closed the connection before the response was received. To resolve this issue, ensure the server (or load balancer) does not have a timeout terminating the connection early and verify that the server is not crash looping. + +Use protocol-specific tools (e.g., curl, psql) to help debug this issue.`, true + // Slow responses can be reprodued by creating a HTTP server that does a + // time.Sleep before responding. The raw error typically looks like the following: + // + // context deadline exceeded + case errors.Is(err, context.DeadlineExceeded): + return `Context Deadline Exceeded + +Teleport did not receive a response within the timeout period, likely due to the system being overloaded, network congestion, or a firewall blocking traffic. To resolve this issue, connect to the host directly and ensure it is responding promptly. + +Use protocol-specific tools (e.g., curl, psql) to assist in debugging this issue.`, true + // No such host errors can be reproduced by attempting to resolve a invalid + // domain name. The raw error typically looks like the following: + // + // dial tcp: lookup qweqweqwe.com: no such host + case errors.As(err, &derr) && derr.IsNotFound: + return `No Such Host + +Teleport was unable to resolve the provided domain name, likely because the domain does not exist. To resolve this issue, verify the domain is correct and ensure the DNS resolver is properly resolving it. + +Use "dig +short HOST" to help debug this issue.`, true + } + + return "", false +} + const ( // SelfSignedCertsMsg is a helper message to point users towards helpful documentation. SelfSignedCertsMsg = "Your proxy certificate is not trusted or expired. " + From 2967e4ebd7f2955f2cc5cdfc3e64d548b7fd944a Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Wed, 4 Dec 2024 14:33:48 -0500 Subject: [PATCH 15/15] kube-agent-updater: add RFD-184 trigger and version getter (#49297) * add proxy version getter and maintenance trigger * add failover trigger and versionGetter * lint * Apply suggestions from code review Co-authored-by: Marco Dinis * address marco's feedback * licensing --------- Co-authored-by: Marco Dinis --- lib/automaticupgrades/maintenance/mock.go | 3 +- lib/automaticupgrades/maintenance/proxy.go | 85 +++++++++ lib/automaticupgrades/maintenance/trigger.go | 52 +++++- .../maintenance/trigger_test.go | 169 ++++++++++++++++++ lib/automaticupgrades/version/proxy.go | 75 ++++++++ lib/automaticupgrades/version/versionget.go | 33 +++- .../version/versionget_test.go | 98 +++++++++- 7 files changed, 508 insertions(+), 7 deletions(-) create mode 100644 lib/automaticupgrades/maintenance/proxy.go create mode 100644 lib/automaticupgrades/maintenance/trigger_test.go create mode 100644 lib/automaticupgrades/version/proxy.go diff --git a/lib/automaticupgrades/maintenance/mock.go b/lib/automaticupgrades/maintenance/mock.go index f46b990ee7930..f705bcee71f8b 100644 --- a/lib/automaticupgrades/maintenance/mock.go +++ b/lib/automaticupgrades/maintenance/mock.go @@ -29,6 +29,7 @@ import ( type StaticTrigger struct { name string canStart bool + err error } // Name returns the StaticTrigger name. @@ -38,7 +39,7 @@ func (m StaticTrigger) Name() string { // CanStart returns the statically defined maintenance approval result. func (m StaticTrigger) CanStart(_ context.Context, _ client.Object) (bool, error) { - return m.canStart, nil + return m.canStart, m.err } // Default returns the default behavior if the trigger fails. This cannot diff --git a/lib/automaticupgrades/maintenance/proxy.go b/lib/automaticupgrades/maintenance/proxy.go new file mode 100644 index 0000000000000..ceb2495e5c17a --- /dev/null +++ b/lib/automaticupgrades/maintenance/proxy.go @@ -0,0 +1,85 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package maintenance + +import ( + "context" + + "github.com/gravitational/trace" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/gravitational/teleport/api/client/webclient" + "github.com/gravitational/teleport/lib/automaticupgrades/cache" + "github.com/gravitational/teleport/lib/automaticupgrades/constants" +) + +type proxyMaintenanceClient struct { + client *webclient.ReusableClient +} + +// Get does the HTTPS call to the Teleport Proxy sevrice to check if the update should happen now. +// If the proxy response does not contain the auto_update.agent_version field, +// this means the proxy does not support autoupdates. In this case we return trace.NotImplementedErr. +func (b *proxyMaintenanceClient) Get(ctx context.Context) (bool, error) { + resp, err := b.client.Find() + if err != nil { + return false, trace.Wrap(err) + } + // We check if a version is advertised to know if the proxy implements RFD-184 or not. + if resp.AutoUpdate.AgentVersion == "" { + return false, trace.NotImplemented("proxy does not seem to implement RFD-184") + } + return resp.AutoUpdate.AgentAutoUpdate, nil +} + +// ProxyMaintenanceTrigger checks if the maintenance should be triggered from the Teleport Proxy service /find endpoint, +// as specified in the RFD-184: https://github.com/gravitational/teleport/blob/master/rfd/0184-agent-auto-updates.md +// The Trigger returns trace.NotImplementedErr when running against a proxy that does not seem to +// expose automatic update instructions over the /find endpoint (proxy too old). +type ProxyMaintenanceTrigger struct { + name string + cachedGetter func(context.Context) (bool, error) +} + +// Name implements maintenance.Trigger returns the trigger name for logging +// and debugging purposes. +func (g ProxyMaintenanceTrigger) Name() string { + return g.name +} + +// Default implements maintenance.Trigger and returns what to do if the trigger can't be evaluated. +// ProxyMaintenanceTrigger should fail open, so the function returns true. +func (g ProxyMaintenanceTrigger) Default() bool { + return false +} + +// CanStart implements maintenance.Trigger. +func (g ProxyMaintenanceTrigger) CanStart(ctx context.Context, _ client.Object) (bool, error) { + result, err := g.cachedGetter(ctx) + return result, trace.Wrap(err) +} + +// NewProxyMaintenanceTrigger builds and return a Trigger checking a public HTTP endpoint. +func NewProxyMaintenanceTrigger(name string, clt *webclient.ReusableClient) Trigger { + maintenanceClient := &proxyMaintenanceClient{ + client: clt, + } + + return ProxyMaintenanceTrigger{name, cache.NewTimedMemoize[bool](maintenanceClient.Get, constants.CacheDuration).Get} +} diff --git a/lib/automaticupgrades/maintenance/trigger.go b/lib/automaticupgrades/maintenance/trigger.go index 53e12b26cdd4a..5d9449d7ad864 100644 --- a/lib/automaticupgrades/maintenance/trigger.go +++ b/lib/automaticupgrades/maintenance/trigger.go @@ -20,7 +20,9 @@ package maintenance import ( "context" + "strings" + "github.com/gravitational/trace" "sigs.k8s.io/controller-runtime/pkg/client" ctrllog "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -51,7 +53,10 @@ func (t Triggers) CanStart(ctx context.Context, object client.Object) bool { start, err := trigger.CanStart(ctx, object) if err != nil { start = trigger.Default() - log.Error(err, "trigger failed to evaluate, using its default value", "trigger", trigger.Name(), "defaultValue", start) + log.Error( + err, "trigger failed to evaluate, using its default value", "trigger", trigger.Name(), "defaultValue", + start, + ) } else { log.Info("trigger evaluated", "trigger", trigger.Name(), "result", start) } @@ -62,3 +67,48 @@ func (t Triggers) CanStart(ctx context.Context, object client.Object) bool { } return false } + +// FailoverTrigger wraps multiple Triggers and tries them sequentially. +// Any error is considered fatal, except for the trace.NotImplementedErr +// which indicates the trigger is not supported yet and we should +// failover to the next trigger. +type FailoverTrigger []Trigger + +// Name implements Trigger +func (f FailoverTrigger) Name() string { + names := make([]string, len(f)) + for i, t := range f { + names[i] = t.Name() + } + + return strings.Join(names, ", failover ") +} + +// CanStart implements Trigger +// Triggers are evaluated sequentially, the result of the first trigger not returning +// trace.NotImplementedErr is used. +func (f FailoverTrigger) CanStart(ctx context.Context, object client.Object) (bool, error) { + for _, trigger := range f { + canStart, err := trigger.CanStart(ctx, object) + switch { + case err == nil: + return canStart, nil + case trace.IsNotImplemented(err): + continue + default: + return false, trace.Wrap(err) + } + } + return false, trace.NotFound("every trigger returned NotImplemented") +} + +// Default implements Trigger. +// The default is the logical OR of every Trigger.Default. +func (f FailoverTrigger) Default() bool { + for _, trigger := range f { + if trigger.Default() { + return true + } + } + return false +} diff --git a/lib/automaticupgrades/maintenance/trigger_test.go b/lib/automaticupgrades/maintenance/trigger_test.go new file mode 100644 index 0000000000000..435b73f0f9bc4 --- /dev/null +++ b/lib/automaticupgrades/maintenance/trigger_test.go @@ -0,0 +1,169 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package maintenance + +import ( + "context" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +// checkTraceError is a test helper that converts trace.IsXXXError into a require.ErrorAssertionFunc +func checkTraceError(check func(error) bool) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, i ...interface{}) { + require.True(t, check(err), i...) + } +} + +func TestFailoverTrigger_CanStart(t *testing.T) { + t.Parallel() + + // Test setup + ctx := context.Background() + tests := []struct { + name string + triggers []Trigger + expectResult bool + expectErr require.ErrorAssertionFunc + }{ + { + name: "nil", + triggers: nil, + expectResult: false, + expectErr: checkTraceError(trace.IsNotFound), + }, + { + name: "empty", + triggers: []Trigger{}, + expectResult: false, + expectErr: checkTraceError(trace.IsNotFound), + }, + { + name: "first trigger success firing", + triggers: []Trigger{ + StaticTrigger{canStart: true}, + StaticTrigger{canStart: false}, + }, + expectResult: true, + expectErr: require.NoError, + }, + { + name: "first trigger success not firing", + triggers: []Trigger{ + StaticTrigger{canStart: false}, + StaticTrigger{canStart: true}, + }, + expectResult: false, + expectErr: require.NoError, + }, + { + name: "first trigger failure", + triggers: []Trigger{ + StaticTrigger{err: trace.LimitExceeded("got rate-limited")}, + StaticTrigger{canStart: true}, + }, + expectResult: false, + expectErr: checkTraceError(trace.IsLimitExceeded), + }, + { + name: "first trigger skipped, second getter success", + triggers: []Trigger{ + StaticTrigger{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticTrigger{canStart: true}, + }, + expectResult: true, + expectErr: require.NoError, + }, + { + name: "first trigger skipped, second getter failure", + triggers: []Trigger{ + StaticTrigger{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticTrigger{err: trace.LimitExceeded("got rate-limited")}, + }, + expectResult: false, + expectErr: checkTraceError(trace.IsLimitExceeded), + }, + { + name: "first trigger skipped, second getter skipped", + triggers: []Trigger{ + StaticTrigger{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticTrigger{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + }, + expectResult: false, + expectErr: checkTraceError(trace.IsNotFound), + }, + } + for _, tt := range tests { + t.Run( + tt.name, func(t *testing.T) { + // Test execution + trigger := FailoverTrigger(tt.triggers) + result, err := trigger.CanStart(ctx, nil) + require.Equal(t, tt.expectResult, result) + tt.expectErr(t, err) + }, + ) + } +} + +func TestFailoverTrigger_Name(t *testing.T) { + tests := []struct { + name string + triggers []Trigger + expectResult string + }{ + { + name: "nil", + triggers: nil, + expectResult: "", + }, + { + name: "empty", + triggers: []Trigger{}, + expectResult: "", + }, + { + name: "one trigger", + triggers: []Trigger{ + StaticTrigger{name: "proxy"}, + }, + expectResult: "proxy", + }, + { + name: "two triggers", + triggers: []Trigger{ + StaticTrigger{name: "proxy"}, + StaticTrigger{name: "version-server"}, + }, + expectResult: "proxy, failover version-server", + }, + } + for _, tt := range tests { + t.Run( + tt.name, func(t *testing.T) { + // Test execution + trigger := FailoverTrigger(tt.triggers) + result := trigger.Name() + require.Equal(t, tt.expectResult, result) + }, + ) + } +} diff --git a/lib/automaticupgrades/version/proxy.go b/lib/automaticupgrades/version/proxy.go new file mode 100644 index 0000000000000..db55123dd529e --- /dev/null +++ b/lib/automaticupgrades/version/proxy.go @@ -0,0 +1,75 @@ +/* + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package version + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/client/webclient" + "github.com/gravitational/teleport/lib/automaticupgrades/cache" + "github.com/gravitational/teleport/lib/automaticupgrades/constants" +) + +type proxyVersionClient struct { + client *webclient.ReusableClient +} + +func (b *proxyVersionClient) Get(ctx context.Context) (string, error) { + resp, err := b.client.Find() + if err != nil { + return "", trace.Wrap(err) + } + // We check if a version is advertised to know if the proxy implements RFD-184 or not. + if resp.AutoUpdate.AgentVersion == "" { + return "", trace.NotImplemented("proxy does not seem to implement RFD-184") + } + return resp.AutoUpdate.AgentVersion, nil +} + +// ProxyVersionGetter gets the target version from the Teleport Proxy Service /find endpoint, as +// specified in the RFD-184: https://github.com/gravitational/teleport/blob/master/rfd/0184-agent-auto-updates.md +// The Getter returns trace.NotImplementedErr when running against a proxy that does not seem to +// expose automatic update instructions over the /find endpoint (proxy too old). +type ProxyVersionGetter struct { + name string + cachedGetter func(context.Context) (string, error) +} + +// Name implements Getter +func (g ProxyVersionGetter) Name() string { + return g.name +} + +// GetVersion implements Getter +func (g ProxyVersionGetter) GetVersion(ctx context.Context) (string, error) { + result, err := g.cachedGetter(ctx) + return result, trace.Wrap(err) +} + +// NewProxyVersionGetter creates a ProxyVersionGetter from a webclient. +// The answer is cached for a minute. +func NewProxyVersionGetter(name string, clt *webclient.ReusableClient) Getter { + versionClient := &proxyVersionClient{ + client: clt, + } + + return ProxyVersionGetter{name, cache.NewTimedMemoize[string](versionClient.Get, constants.CacheDuration).Get} +} diff --git a/lib/automaticupgrades/version/versionget.go b/lib/automaticupgrades/version/versionget.go index f1e7723a9a320..e2a1a893e5270 100644 --- a/lib/automaticupgrades/version/versionget.go +++ b/lib/automaticupgrades/version/versionget.go @@ -1,6 +1,6 @@ /* * Teleport - * Copyright (C) 2023 Gravitational, Inc. + * Copyright (C) 2024 Gravitational, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -36,13 +36,42 @@ type Getter interface { GetVersion(context.Context) (string, error) } +// FailoverGetter wraps multiple Getters and tries them sequentially. +// Any error is considered fatal, except for the trace.NotImplementedErr +// which indicates the version getter is not supported yet and we should +// failover to the next version getter. +type FailoverGetter []Getter + +// GetVersion implements Getter +// Getters are evaluated sequentially, the result of the first getter not returning +// trace.NotImplementedErr is used. +func (f FailoverGetter) GetVersion(ctx context.Context) (string, error) { + for _, getter := range f { + version, err := getter.GetVersion(ctx) + switch { + case err == nil: + return version, nil + case trace.IsNotImplemented(err): + continue + default: + return "", trace.Wrap(err) + } + } + return "", trace.NotFound("every versionGetter returned NotImplemented") +} + // ValidVersionChange receives the current version and the candidate next version // and evaluates if the version transition is valid. func ValidVersionChange(ctx context.Context, current, next string) bool { log := ctrllog.FromContext(ctx).V(1) // Cannot upgrade to a non-valid version if !semver.IsValid(next) { - log.Error(trace.BadParameter("next version is not following semver"), "version change is invalid", "nextVersion", next) + log.Error( + trace.BadParameter("next version is not following semver"), + "version change is invalid", + "current_version", current, + "next_version", next, + ) return false } switch semver.Compare(next, current) { diff --git a/lib/automaticupgrades/version/versionget_test.go b/lib/automaticupgrades/version/versionget_test.go index 80c2ec767b8fb..78f4940db229a 100644 --- a/lib/automaticupgrades/version/versionget_test.go +++ b/lib/automaticupgrades/version/versionget_test.go @@ -22,6 +22,7 @@ import ( "context" "testing" + "github.com/gravitational/trace" "github.com/stretchr/testify/require" ) @@ -66,8 +67,99 @@ func TestValidVersionChange(t *testing.T) { }, } for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - require.Equal(t, tt.want, ValidVersionChange(ctx, tt.current, tt.next)) - }) + t.Run( + tt.name, func(t *testing.T) { + require.Equal(t, tt.want, ValidVersionChange(ctx, tt.current, tt.next)) + }, + ) + } +} + +// checkTraceError is a test helper that converts trace.IsXXXError into a require.ErrorAssertionFunc +func checkTraceError(check func(error) bool) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, i ...interface{}) { + require.True(t, check(err), i...) + } +} + +func TestFailoverGetter_GetVersion(t *testing.T) { + t.Parallel() + + // Test setup + ctx := context.Background() + tests := []struct { + name string + getters []Getter + expectResult string + expectErr require.ErrorAssertionFunc + }{ + { + name: "nil", + getters: nil, + expectResult: "", + expectErr: checkTraceError(trace.IsNotFound), + }, + { + name: "empty", + getters: []Getter{}, + expectResult: "", + expectErr: checkTraceError(trace.IsNotFound), + }, + { + name: "first getter success", + getters: []Getter{ + StaticGetter{version: semverMid}, + StaticGetter{version: semverHigh}, + }, + expectResult: semverMid, + expectErr: require.NoError, + }, + { + name: "first getter failure", + getters: []Getter{ + StaticGetter{err: trace.LimitExceeded("got rate-limited")}, + StaticGetter{version: semverHigh}, + }, + expectResult: "", + expectErr: checkTraceError(trace.IsLimitExceeded), + }, + { + name: "first getter skipped, second getter success", + getters: []Getter{ + StaticGetter{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticGetter{version: semverHigh}, + }, + expectResult: semverHigh, + expectErr: require.NoError, + }, + { + name: "first getter skipped, second getter failure", + getters: []Getter{ + StaticGetter{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticGetter{err: trace.LimitExceeded("got rate-limited")}, + }, + expectResult: "", + expectErr: checkTraceError(trace.IsLimitExceeded), + }, + { + name: "first getter skipped, second getter skipped", + getters: []Getter{ + StaticGetter{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticGetter{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + }, + expectResult: "", + expectErr: checkTraceError(trace.IsNotFound), + }, + } + for _, tt := range tests { + t.Run( + tt.name, func(t *testing.T) { + // Test execution + getter := FailoverGetter(tt.getters) + result, err := getter.GetVersion(ctx) + require.Equal(t, tt.expectResult, result) + tt.expectErr(t, err) + }, + ) } }