diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index b3aeda73c39..8e3ac81abe9 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -47259,6 +47259,11 @@ "type": "integer", "format": "int32" }, + "collisionCount": { + "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", + "type": "integer", + "format": "int64" + }, "conditions": { "description": "Represents the latest available observations of a deployment's current state.", "type": "array", @@ -49477,6 +49482,11 @@ "type": "integer", "format": "int32" }, + "collisionCount": { + "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", + "type": "integer", + "format": "int64" + }, "conditions": { "description": "Represents the latest available observations of a deployment's current state.", "type": "array", diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 34636f0e6ab..3110d33c32a 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -4706,6 +4706,11 @@ "$ref": "v1beta1.DeploymentCondition" }, "description": "Represents the latest available observations of a deployment's current state." + }, + "collisionCount": { + "type": "integer", + "format": "int64", + "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet." } } }, diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 96aa3b435b1..22473d5265e 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -9408,6 +9408,11 @@ "$ref": "v1beta1.DeploymentCondition" }, "description": "Represents the latest available observations of a deployment's current state." + }, + "collisionCount": { + "type": "integer", + "format": "int64", + "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet." } } }, diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index 41557e7d96c..eb12ea5f5d4 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -466,6 +466,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

v1beta1.DeploymentCondition array

+ +

collisionCount

+

Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.

+

false

+

integer (int64)

+ + @@ -6470,7 +6477,7 @@ Examples:
diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index 3c202598444..36d660a86b1 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -496,6 +496,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

v1beta1.DeploymentCondition array

+ +

collisionCount

+

Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.

+

false

+

integer (int64)

+ + @@ -8110,7 +8117,7 @@ Both these may change in the future. Incoming requests are matched against the h diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index eb37710dd70..4d7bf450db1 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -13315,6 +13315,11 @@ "type": "integer", "format": "int32" }, + "collisionCount": { + "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", + "type": "integer", + "format": "int64" + }, "conditions": { "description": "Represents the latest available observations of a deployment's current state.", "type": "array", diff --git a/federation/apis/swagger-spec/extensions_v1beta1.json b/federation/apis/swagger-spec/extensions_v1beta1.json index db43660abe1..d7ea4a687d1 100644 --- a/federation/apis/swagger-spec/extensions_v1beta1.json +++ b/federation/apis/swagger-spec/extensions_v1beta1.json @@ -7152,6 +7152,11 @@ "$ref": "v1beta1.DeploymentCondition" }, "description": "Represents the latest available observations of a deployment's current state." + }, + "collisionCount": { + "type": "integer", + "format": "int64", + "description": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet." } } }, diff --git a/federation/docs/api-reference/extensions/v1beta1/definitions.html b/federation/docs/api-reference/extensions/v1beta1/definitions.html index 1b17a0792f5..4201aa6580c 100755 --- a/federation/docs/api-reference/extensions/v1beta1/definitions.html +++ b/federation/docs/api-reference/extensions/v1beta1/definitions.html @@ -478,6 +478,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

v1beta1.DeploymentCondition array

+ +

collisionCount

+

Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.

+

false

+

integer (int64)

+ + @@ -7190,7 +7197,7 @@ Both these may change in the future. Incoming requests are matched against the h diff --git a/pkg/apis/apps/v1beta1/generated.pb.go b/pkg/apis/apps/v1beta1/generated.pb.go index 16fe69f1ebf..cc4cde6a858 100644 --- a/pkg/apis/apps/v1beta1/generated.pb.go +++ b/pkg/apis/apps/v1beta1/generated.pb.go @@ -455,6 +455,11 @@ func (m *DeploymentStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x38 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ReadyReplicas)) + if m.CollisionCount != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.CollisionCount)) + } return i, nil } @@ -954,6 +959,9 @@ func (m *DeploymentStatus) Size() (n int) { } } n += 1 + sovGenerated(uint64(m.ReadyReplicas)) + if m.CollisionCount != nil { + n += 1 + sovGenerated(uint64(*m.CollisionCount)) + } return n } @@ -1190,6 +1198,7 @@ func (this *DeploymentStatus) String() string { `UnavailableReplicas:` + fmt.Sprintf("%v", this.UnavailableReplicas) + `,`, `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "DeploymentCondition", "DeploymentCondition", 1), `&`, ``, 1) + `,`, `ReadyReplicas:` + fmt.Sprintf("%v", this.ReadyReplicas) + `,`, + `CollisionCount:` + valueToStringGenerated(this.CollisionCount) + `,`, `}`, }, "") return s @@ -2478,6 +2487,26 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { break } } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CollisionCount = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3891,103 +3920,105 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1561 bytes of a gzipped FileDescriptorProto + // 1585 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0xcd, 0x6f, 0x1b, 0xb7, 0x12, 0xf7, 0xda, 0x92, 0x2d, 0xd3, 0xb1, 0x1c, 0xd3, 0x7e, 0xb1, 0x9e, 0xf3, 0x20, 0x07, 0x3a, - 0xe4, 0xe3, 0x21, 0x59, 0xbd, 0x38, 0x79, 0xf9, 0x72, 0x11, 0xd4, 0x4a, 0xd2, 0x34, 0x85, 0xdd, - 0x18, 0x94, 0x1d, 0x34, 0x69, 0x0a, 0x94, 0x5a, 0x31, 0x6b, 0xc6, 0xfb, 0x85, 0x25, 0x25, 0x44, - 0xb7, 0x5e, 0x7a, 0x28, 0xd0, 0x43, 0x4f, 0xbd, 0x15, 0xed, 0xb9, 0x28, 0xd0, 0x7f, 0xc3, 0x68, - 0x2f, 0x39, 0x16, 0x3d, 0x18, 0xb5, 0xf3, 0x5f, 0xe4, 0x54, 0x90, 0xcb, 0xfd, 0xd2, 0xae, 0xfc, - 0xa1, 0xa2, 0xb9, 0xf4, 0xa6, 0xe5, 0xcc, 0xef, 0x37, 0x43, 0x72, 0x66, 0x38, 0x23, 0x70, 0x73, - 0xe7, 0x16, 0xd3, 0xa9, 0x5b, 0xdf, 0xe9, 0xb4, 0x88, 0xef, 0x10, 0x4e, 0x58, 0xdd, 0xdb, 0x31, - 0xeb, 0xd8, 0xa3, 0xac, 0x8e, 0x3d, 0x8f, 0xd5, 0xbb, 0x57, 0x5b, 0x84, 0xe3, 0xab, 0x75, 0x93, - 0x38, 0xc4, 0xc7, 0x9c, 0xb4, 0x75, 0xcf, 0x77, 0xb9, 0x0b, 0x2f, 0x04, 0x40, 0x3d, 0x06, 0xea, - 0xde, 0x8e, 0xa9, 0x0b, 0xa0, 0x2e, 0x80, 0xba, 0x02, 0x2e, 0x5e, 0x31, 0x29, 0xdf, 0xee, 0xb4, - 0x74, 0xc3, 0xb5, 0xeb, 0xa6, 0x6b, 0xba, 0x75, 0x89, 0x6f, 0x75, 0x5e, 0xc8, 0x2f, 0xf9, 0x21, - 0x7f, 0x05, 0xbc, 0x8b, 0xd7, 0x95, 0x43, 0xd8, 0xa3, 0x36, 0x36, 0xb6, 0xa9, 0x43, 0xfc, 0x5e, - 0xec, 0x92, 0x4d, 0x38, 0xae, 0x77, 0x33, 0xde, 0x2c, 0xd6, 0x07, 0xa1, 0xfc, 0x8e, 0xc3, 0xa9, - 0x4d, 0x32, 0x80, 0x1b, 0x47, 0x01, 0x98, 0xb1, 0x4d, 0x6c, 0x9c, 0xc1, 0x5d, 0x1b, 0x84, 0xeb, - 0x70, 0x6a, 0xd5, 0xa9, 0xc3, 0x19, 0xf7, 0x33, 0xa0, 0xc4, 0x9e, 0x18, 0xf1, 0xbb, 0xc4, 0x8f, - 0x37, 0x44, 0x5e, 0x61, 0xdb, 0xb3, 0x48, 0xde, 0x9e, 0x2e, 0x0f, 0xbc, 0x9a, 0x3c, 0xed, 0xdb, - 0x87, 0x5c, 0xa4, 0xe7, 0x5a, 0xd4, 0xe8, 0x0d, 0xba, 0xca, 0xda, 0x4f, 0xa3, 0x00, 0xdc, 0x27, - 0x9e, 0xe5, 0xf6, 0x6c, 0xe2, 0x70, 0xf8, 0x39, 0x28, 0x89, 0x63, 0x6e, 0x63, 0x8e, 0x2b, 0xda, - 0x39, 0xed, 0xe2, 0xd4, 0xf2, 0xff, 0x74, 0x75, 0xd9, 0xc9, 0x5d, 0xc7, 0xd7, 0x2d, 0xb4, 0xf5, - 0xee, 0x55, 0xfd, 0x71, 0xeb, 0x25, 0x31, 0xf8, 0x3a, 0xe1, 0xb8, 0x01, 0x77, 0xf7, 0x96, 0x46, - 0x0e, 0xf6, 0x96, 0x40, 0xbc, 0x86, 0x22, 0x56, 0xf8, 0x14, 0x14, 0x98, 0x47, 0x8c, 0xca, 0xa8, - 0x64, 0xbf, 0xa9, 0x1f, 0x33, 0x94, 0xf4, 0xd8, 0xc9, 0xa6, 0x47, 0x8c, 0xc6, 0x29, 0x65, 0xa4, - 0x20, 0xbe, 0x90, 0xa4, 0x84, 0x18, 0x8c, 0x33, 0x8e, 0x79, 0x87, 0x55, 0xc6, 0x24, 0xf9, 0xed, - 0x61, 0xc8, 0x25, 0x41, 0xa3, 0xac, 0xe8, 0xc7, 0x83, 0x6f, 0xa4, 0x88, 0x6b, 0xfb, 0x63, 0x60, - 0x2e, 0x56, 0xbe, 0xe7, 0x3a, 0x6d, 0xca, 0xa9, 0xeb, 0xc0, 0x15, 0x50, 0xe0, 0x3d, 0x8f, 0xc8, - 0x33, 0x9b, 0x6c, 0x5c, 0x08, 0x9d, 0xdb, 0xec, 0x79, 0xe4, 0xed, 0xde, 0xd2, 0x42, 0x0e, 0x44, - 0x88, 0x90, 0x04, 0xc1, 0x27, 0x91, 0xdf, 0xa3, 0x12, 0x7e, 0x37, 0x6d, 0xfc, 0xed, 0xde, 0xd2, - 0xa1, 0xe1, 0xa0, 0x47, 0x9c, 0x69, 0x67, 0xe1, 0x79, 0x30, 0xee, 0x13, 0xcc, 0x5c, 0xa7, 0x52, - 0x90, 0xbc, 0xd1, 0xa6, 0x90, 0x5c, 0x45, 0x4a, 0x0a, 0x2f, 0x81, 0x09, 0x9b, 0x30, 0x86, 0x4d, - 0x52, 0x29, 0x4a, 0xc5, 0x19, 0xa5, 0x38, 0xb1, 0x1e, 0x2c, 0xa3, 0x50, 0x0e, 0x5f, 0x82, 0xb2, - 0x85, 0x19, 0xdf, 0xf2, 0xda, 0x98, 0x93, 0x4d, 0x6a, 0x93, 0xca, 0xb8, 0x3c, 0xea, 0xff, 0x1e, - 0x2f, 0x4a, 0x04, 0xa2, 0x71, 0x46, 0xb1, 0x97, 0xd7, 0x52, 0x4c, 0xa8, 0x8f, 0x19, 0x76, 0x01, - 0x14, 0x2b, 0x9b, 0x3e, 0x76, 0x58, 0x70, 0x64, 0xc2, 0xde, 0xc4, 0x89, 0xed, 0x2d, 0x2a, 0x7b, - 0x70, 0x2d, 0xc3, 0x86, 0x72, 0x2c, 0xd4, 0x76, 0x35, 0x50, 0x8e, 0x2f, 0x6c, 0x8d, 0x32, 0x0e, - 0x9f, 0x67, 0xd2, 0x42, 0x3f, 0x9e, 0x03, 0x02, 0x2d, 0x93, 0xe2, 0xb4, 0x72, 0xa2, 0x14, 0xae, - 0x24, 0x52, 0xe2, 0x13, 0x50, 0xa4, 0x9c, 0xd8, 0xe2, 0xfa, 0xc7, 0x2e, 0x4e, 0x2d, 0x5f, 0x1b, - 0x22, 0x6c, 0x1b, 0xd3, 0x8a, 0xbf, 0xf8, 0x48, 0x30, 0xa1, 0x80, 0xb0, 0xf6, 0xf5, 0x18, 0x80, - 0xb1, 0x12, 0x72, 0x2d, 0xab, 0x85, 0x8d, 0x1d, 0x78, 0x0e, 0x14, 0x1c, 0x6c, 0x87, 0xd1, 0x1a, - 0xa5, 0xd2, 0xc7, 0xd8, 0x26, 0x48, 0x4a, 0xe0, 0xf7, 0x1a, 0x80, 0x1d, 0x79, 0x15, 0xed, 0x55, - 0xc7, 0x71, 0x39, 0x16, 0xa7, 0x13, 0x3a, 0xd8, 0x1c, 0xc2, 0xc1, 0xd0, 0xb6, 0xbe, 0x95, 0x61, - 0x7d, 0xe0, 0x70, 0xbf, 0x17, 0xdf, 0x52, 0x56, 0x01, 0xe5, 0xb8, 0x02, 0x77, 0x00, 0xf0, 0x15, - 0xe7, 0xa6, 0xab, 0x12, 0xfe, 0xf8, 0xd5, 0x24, 0x74, 0xe7, 0x9e, 0xeb, 0xbc, 0xa0, 0x66, 0x5c, - 0xb2, 0x50, 0x44, 0x89, 0x12, 0xf4, 0x8b, 0x0f, 0xc0, 0xc2, 0x00, 0xbf, 0xe1, 0x69, 0x30, 0xb6, - 0x43, 0x7a, 0xc1, 0x51, 0x22, 0xf1, 0x13, 0xce, 0x83, 0x62, 0x17, 0x5b, 0x1d, 0x12, 0x64, 0x33, - 0x0a, 0x3e, 0xee, 0x8c, 0xde, 0xd2, 0x6a, 0xbf, 0x17, 0x93, 0x91, 0x25, 0x2a, 0x17, 0xbc, 0x08, - 0x4a, 0x3e, 0xf1, 0x2c, 0x6a, 0x60, 0x26, 0x39, 0x8a, 0x8d, 0x53, 0x22, 0x4a, 0x90, 0x5a, 0x43, - 0x91, 0x14, 0x7e, 0x06, 0x4a, 0x8c, 0x58, 0xc4, 0xe0, 0xae, 0xaf, 0x8a, 0xe7, 0xb5, 0x63, 0xc6, - 0x20, 0x6e, 0x11, 0xab, 0xa9, 0xa0, 0x01, 0x7d, 0xf8, 0x85, 0x22, 0x4a, 0xf8, 0x29, 0x28, 0x71, - 0x62, 0x7b, 0x16, 0xe6, 0x44, 0x9d, 0xe6, 0x95, 0xc1, 0xa7, 0x29, 0x68, 0x37, 0xdc, 0xf6, 0xa6, - 0x02, 0xc8, 0x8a, 0x1c, 0x45, 0x78, 0xb8, 0x8a, 0x22, 0x42, 0x48, 0x41, 0x89, 0x71, 0xf1, 0xec, - 0x98, 0x3d, 0x59, 0x8b, 0xa6, 0x96, 0x57, 0x86, 0xaa, 0xcd, 0x01, 0x45, 0x6c, 0x2a, 0x5c, 0x41, - 0x11, 0x3d, 0x5c, 0x05, 0x33, 0x36, 0x75, 0x10, 0xc1, 0xed, 0x5e, 0x93, 0x18, 0xae, 0xd3, 0x66, - 0xb2, 0xa8, 0x15, 0x1b, 0x0b, 0x0a, 0x34, 0xb3, 0x9e, 0x16, 0xa3, 0x7e, 0x7d, 0xb8, 0x06, 0xe6, - 0x7d, 0xd2, 0xa5, 0x8c, 0xba, 0xce, 0x87, 0x94, 0x71, 0xd7, 0xef, 0xad, 0x51, 0x9b, 0x72, 0x59, - 0xea, 0x8a, 0x8d, 0xca, 0xc1, 0xde, 0xd2, 0x3c, 0xca, 0x91, 0xa3, 0x5c, 0x94, 0xa8, 0xc2, 0x1e, - 0xee, 0x30, 0xd2, 0x96, 0xa5, 0xab, 0x14, 0x57, 0xe1, 0x0d, 0xb9, 0x8a, 0x94, 0x14, 0x9a, 0xa9, - 0x80, 0x2e, 0xfd, 0xb5, 0x80, 0x2e, 0x0f, 0x0e, 0x66, 0xb8, 0x05, 0x16, 0x3c, 0xdf, 0x35, 0x7d, - 0xc2, 0xd8, 0x7d, 0x82, 0xdb, 0x16, 0x75, 0x48, 0x78, 0x52, 0x93, 0x72, 0x87, 0x67, 0x0f, 0xf6, - 0x96, 0x16, 0x36, 0xf2, 0x55, 0xd0, 0x20, 0x6c, 0xed, 0xdb, 0x02, 0x38, 0xdd, 0xff, 0x8e, 0xc2, - 0x8f, 0x00, 0x74, 0x5b, 0xb2, 0xef, 0x69, 0x3f, 0x0c, 0x3a, 0x0f, 0xea, 0x3a, 0x32, 0xd0, 0xc7, - 0xe2, 0x8c, 0x7f, 0x9c, 0xd1, 0x40, 0x39, 0x28, 0x78, 0x39, 0x91, 0x2a, 0xa3, 0xd2, 0xd1, 0x28, - 0x0e, 0x72, 0xd2, 0x65, 0x15, 0xcc, 0xa8, 0xaa, 0x11, 0x0a, 0x65, 0x58, 0x27, 0xe2, 0x60, 0x2b, - 0x2d, 0x46, 0xfd, 0xfa, 0xf0, 0x21, 0x98, 0xc5, 0x5d, 0x4c, 0x2d, 0xdc, 0xb2, 0x48, 0x44, 0x52, - 0x90, 0x24, 0xff, 0x56, 0x24, 0xb3, 0xab, 0xfd, 0x0a, 0x28, 0x8b, 0x81, 0xeb, 0x60, 0xae, 0xe3, - 0x64, 0xa9, 0x82, 0xb8, 0x3c, 0xab, 0xa8, 0xe6, 0xb6, 0xb2, 0x2a, 0x28, 0x0f, 0x07, 0x3d, 0x00, - 0x8c, 0xf0, 0xc9, 0x67, 0x95, 0x71, 0x59, 0x93, 0xdf, 0x1b, 0x22, 0x9f, 0xa2, 0xbe, 0x21, 0xae, - 0x7f, 0xd1, 0x12, 0x43, 0x09, 0x1b, 0x70, 0x05, 0x4c, 0xfb, 0x22, 0x43, 0x22, 0xd7, 0x27, 0xa4, - 0xeb, 0xff, 0x52, 0xb0, 0x69, 0x94, 0x14, 0xa2, 0xb4, 0x6e, 0xed, 0x57, 0x2d, 0xf9, 0x08, 0x85, - 0x29, 0x0b, 0xef, 0xa4, 0x5a, 0xa6, 0xf3, 0x7d, 0x2d, 0xd3, 0x99, 0x2c, 0x22, 0xd1, 0x31, 0xf5, - 0xc0, 0xb4, 0x08, 0x68, 0xea, 0x98, 0xc1, 0x25, 0xaa, 0x82, 0xf8, 0xfe, 0x89, 0xd2, 0x25, 0x42, - 0x27, 0x9e, 0xd1, 0x59, 0xb9, 0x9b, 0xa4, 0x10, 0xa5, 0x2d, 0xd5, 0xee, 0x82, 0x72, 0x3a, 0xd7, - 0x82, 0xb8, 0x0c, 0x12, 0x5f, 0x45, 0x76, 0x22, 0x2e, 0x83, 0x75, 0x14, 0x69, 0xd4, 0xde, 0x68, - 0x60, 0x61, 0x80, 0x75, 0x68, 0x81, 0xb2, 0x8d, 0x5f, 0x25, 0xe2, 0xe0, 0xc8, 0x1e, 0x5c, 0x4c, - 0x1e, 0x7a, 0x30, 0x79, 0xe8, 0x8f, 0x1c, 0xfe, 0xd8, 0x6f, 0x72, 0x9f, 0x3a, 0x66, 0x03, 0x8a, - 0xfe, 0x6a, 0x3d, 0xc5, 0x85, 0xfa, 0xb8, 0xe1, 0x33, 0x50, 0xb2, 0xf1, 0xab, 0x66, 0xc7, 0x37, - 0xc3, 0xf3, 0x3b, 0xb9, 0x1d, 0xf9, 0x9a, 0xac, 0x2b, 0x16, 0x14, 0xf1, 0xd5, 0xbe, 0x1b, 0x05, - 0xc5, 0xa6, 0x81, 0x2d, 0xf2, 0x0e, 0x26, 0x8a, 0xcd, 0xd4, 0x44, 0xb1, 0x7c, 0xec, 0x18, 0x90, - 0xfe, 0x0d, 0x1c, 0x26, 0x9e, 0xf7, 0x0d, 0x13, 0xd7, 0x4f, 0xc8, 0x7b, 0xf8, 0x1c, 0x71, 0x1b, - 0x4c, 0x46, 0xe6, 0x53, 0x85, 0x4d, 0x3b, 0xaa, 0xb0, 0xd5, 0x7e, 0x1c, 0x05, 0x53, 0x09, 0x13, - 0x27, 0x43, 0x43, 0x2f, 0xd5, 0x45, 0x88, 0xca, 0xd1, 0x18, 0x66, 0x63, 0x7a, 0xd8, 0x41, 0x04, - 0xcd, 0x5b, 0xfc, 0x20, 0x67, 0x1b, 0x8b, 0xbb, 0xa0, 0xcc, 0xb1, 0x6f, 0x12, 0x1e, 0xca, 0xe4, - 0x81, 0x4e, 0xc6, 0x63, 0xc0, 0x66, 0x4a, 0x8a, 0xfa, 0xb4, 0x17, 0x57, 0xc0, 0x74, 0xca, 0xd8, - 0x89, 0x3a, 0xae, 0x9f, 0xc5, 0x61, 0x71, 0xcc, 0xc9, 0x8b, 0x8e, 0xd5, 0x24, 0xef, 0x62, 0xbe, - 0x7d, 0x96, 0x8a, 0xc6, 0x5b, 0xc7, 0x3f, 0xdc, 0xd8, 0xcb, 0x81, 0x31, 0xd9, 0xea, 0x8b, 0xc9, - 0x3b, 0x43, 0xb1, 0x1f, 0x1e, 0x99, 0xbf, 0x68, 0x60, 0x26, 0xa1, 0xfd, 0x0e, 0xc6, 0x9f, 0xa7, - 0xe9, 0xf1, 0xe7, 0xfa, 0x30, 0x9b, 0x1a, 0x30, 0xff, 0xfc, 0x50, 0x48, 0x6d, 0xe6, 0x1f, 0xd4, - 0x71, 0x7f, 0xa9, 0x81, 0xf9, 0xae, 0x6b, 0x75, 0x6c, 0x72, 0xcf, 0xc2, 0xd4, 0x0e, 0x35, 0x44, - 0xff, 0x72, 0xc4, 0x8c, 0x29, 0x2d, 0x11, 0x9f, 0x51, 0xc6, 0x89, 0xc3, 0x9f, 0xc4, 0x1c, 0x8d, - 0xff, 0x28, 0x7b, 0xf3, 0x4f, 0x72, 0x88, 0x51, 0xae, 0x39, 0xf8, 0x7f, 0x30, 0x25, 0x1a, 0x39, - 0x6a, 0x10, 0x31, 0x5d, 0xaa, 0xff, 0x17, 0xe6, 0x14, 0xd1, 0x54, 0x33, 0x16, 0xa1, 0xa4, 0x1e, - 0xdc, 0x06, 0x73, 0x9e, 0xdb, 0x5e, 0xc7, 0x0e, 0x36, 0x89, 0x78, 0x1a, 0x37, 0xe4, 0xbf, 0x58, - 0xb2, 0x03, 0x9f, 0x6c, 0xdc, 0x08, 0x3b, 0xa6, 0x8d, 0xac, 0xca, 0x5b, 0xd1, 0xba, 0x66, 0x97, - 0x65, 0xef, 0x90, 0x47, 0x59, 0xfb, 0x4a, 0x03, 0xb3, 0x99, 0xec, 0x80, 0x1f, 0x1c, 0xd2, 0xb7, - 0x9e, 0xf9, 0xbb, 0x7a, 0xd6, 0xc6, 0xa5, 0xdd, 0xfd, 0xea, 0xc8, 0xeb, 0xfd, 0xea, 0xc8, 0x6f, - 0xfb, 0xd5, 0x91, 0x2f, 0x0e, 0xaa, 0xda, 0xee, 0x41, 0x55, 0x7b, 0x7d, 0x50, 0xd5, 0xfe, 0x38, - 0xa8, 0x6a, 0xdf, 0xbc, 0xa9, 0x8e, 0x3c, 0x9b, 0x50, 0xb1, 0xff, 0x67, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xdb, 0x8b, 0x00, 0x6d, 0xbc, 0x15, 0x00, 0x00, + 0xe4, 0xe3, 0x21, 0x59, 0xbd, 0x38, 0x79, 0xf9, 0xb0, 0x8b, 0xa0, 0x96, 0x93, 0xa6, 0x29, 0xec, + 0xc6, 0xa0, 0xec, 0xa0, 0x49, 0x53, 0xa0, 0xd4, 0x8a, 0x59, 0x33, 0xde, 0x2f, 0x2c, 0x29, 0x21, + 0xba, 0xf5, 0xd2, 0x43, 0x81, 0x1e, 0xfa, 0x0f, 0x14, 0xed, 0xb9, 0x28, 0xd0, 0x7f, 0xc3, 0x68, + 0x2f, 0x41, 0x4f, 0x45, 0x0f, 0x46, 0xed, 0xfc, 0x17, 0x39, 0x15, 0xe4, 0x72, 0xbf, 0xb4, 0x92, + 0x2d, 0xab, 0x68, 0x2e, 0xbd, 0x69, 0x39, 0xf3, 0xfb, 0xcd, 0x90, 0x9c, 0x19, 0xce, 0x08, 0xdc, + 0xde, 0xbb, 0xc3, 0x74, 0xea, 0x56, 0xf7, 0x5a, 0x0d, 0xe2, 0x3b, 0x84, 0x13, 0x56, 0xf5, 0xf6, + 0xcc, 0x2a, 0xf6, 0x28, 0xab, 0x62, 0xcf, 0x63, 0xd5, 0xf6, 0xf5, 0x06, 0xe1, 0xf8, 0x7a, 0xd5, + 0x24, 0x0e, 0xf1, 0x31, 0x27, 0x4d, 0xdd, 0xf3, 0x5d, 0xee, 0xc2, 0x4b, 0x01, 0x50, 0x8f, 0x81, + 0xba, 0xb7, 0x67, 0xea, 0x02, 0xa8, 0x0b, 0xa0, 0xae, 0x80, 0x8b, 0xd7, 0x4c, 0xca, 0x77, 0x5b, + 0x0d, 0xdd, 0x70, 0xed, 0xaa, 0xe9, 0x9a, 0x6e, 0x55, 0xe2, 0x1b, 0xad, 0x17, 0xf2, 0x4b, 0x7e, + 0xc8, 0x5f, 0x01, 0xef, 0xe2, 0x4d, 0xe5, 0x10, 0xf6, 0xa8, 0x8d, 0x8d, 0x5d, 0xea, 0x10, 0xbf, + 0x13, 0xbb, 0x64, 0x13, 0x8e, 0xab, 0xed, 0x8c, 0x37, 0x8b, 0xd5, 0x7e, 0x28, 0xbf, 0xe5, 0x70, + 0x6a, 0x93, 0x0c, 0xe0, 0xd6, 0x49, 0x00, 0x66, 0xec, 0x12, 0x1b, 0x67, 0x70, 0x37, 0xfa, 0xe1, + 0x5a, 0x9c, 0x5a, 0x55, 0xea, 0x70, 0xc6, 0xfd, 0x0c, 0x28, 0xb1, 0x27, 0x46, 0xfc, 0x36, 0xf1, + 0xe3, 0x0d, 0x91, 0x57, 0xd8, 0xf6, 0x2c, 0xd2, 0x6b, 0x4f, 0x57, 0xfb, 0x5e, 0x4d, 0x2f, 0xed, + 0xbb, 0xc7, 0x5c, 0xa4, 0xe7, 0x5a, 0xd4, 0xe8, 0xf4, 0xbb, 0xca, 0xca, 0x8f, 0xa3, 0x00, 0xdc, + 0x27, 0x9e, 0xe5, 0x76, 0x6c, 0xe2, 0x70, 0xf8, 0x39, 0x28, 0x88, 0x63, 0x6e, 0x62, 0x8e, 0x4b, + 0xda, 0x05, 0xed, 0xf2, 0xd4, 0xf2, 0xff, 0x74, 0x75, 0xd9, 0xc9, 0x5d, 0xc7, 0xd7, 0x2d, 0xb4, + 0xf5, 0xf6, 0x75, 0xfd, 0x71, 0xe3, 0x25, 0x31, 0xf8, 0x26, 0xe1, 0xb8, 0x06, 0xf7, 0x0f, 0x96, + 0x46, 0x8e, 0x0e, 0x96, 0x40, 0xbc, 0x86, 0x22, 0x56, 0xf8, 0x14, 0xe4, 0x98, 0x47, 0x8c, 0xd2, + 0xa8, 0x64, 0xbf, 0xad, 0x0f, 0x18, 0x4a, 0x7a, 0xec, 0x64, 0xdd, 0x23, 0x46, 0xed, 0x8c, 0x32, + 0x92, 0x13, 0x5f, 0x48, 0x52, 0x42, 0x0c, 0xc6, 0x19, 0xc7, 0xbc, 0xc5, 0x4a, 0x63, 0x92, 0xfc, + 0xee, 0x30, 0xe4, 0x92, 0xa0, 0x56, 0x54, 0xf4, 0xe3, 0xc1, 0x37, 0x52, 0xc4, 0x95, 0xc3, 0x31, + 0x30, 0x17, 0x2b, 0xaf, 0xbb, 0x4e, 0x93, 0x72, 0xea, 0x3a, 0x70, 0x15, 0xe4, 0x78, 0xc7, 0x23, + 0xf2, 0xcc, 0x26, 0x6b, 0x97, 0x42, 0xe7, 0xb6, 0x3b, 0x1e, 0x79, 0x7b, 0xb0, 0xb4, 0xd0, 0x03, + 0x22, 0x44, 0x48, 0x82, 0xe0, 0x93, 0xc8, 0xef, 0x51, 0x09, 0xbf, 0x97, 0x36, 0xfe, 0xf6, 0x60, + 0xe9, 0xd8, 0x70, 0xd0, 0x23, 0xce, 0xb4, 0xb3, 0xf0, 0x22, 0x18, 0xf7, 0x09, 0x66, 0xae, 0x53, + 0xca, 0x49, 0xde, 0x68, 0x53, 0x48, 0xae, 0x22, 0x25, 0x85, 0x57, 0xc0, 0x84, 0x4d, 0x18, 0xc3, + 0x26, 0x29, 0xe5, 0xa5, 0xe2, 0x8c, 0x52, 0x9c, 0xd8, 0x0c, 0x96, 0x51, 0x28, 0x87, 0x2f, 0x41, + 0xd1, 0xc2, 0x8c, 0xef, 0x78, 0x4d, 0xcc, 0xc9, 0x36, 0xb5, 0x49, 0x69, 0x5c, 0x1e, 0xf5, 0x7f, + 0x07, 0x8b, 0x12, 0x81, 0xa8, 0x9d, 0x53, 0xec, 0xc5, 0x8d, 0x14, 0x13, 0xea, 0x62, 0x86, 0x6d, + 0x00, 0xc5, 0xca, 0xb6, 0x8f, 0x1d, 0x16, 0x1c, 0x99, 0xb0, 0x37, 0x71, 0x6a, 0x7b, 0x8b, 0xca, + 0x1e, 0xdc, 0xc8, 0xb0, 0xa1, 0x1e, 0x16, 0x2a, 0xfb, 0x1a, 0x28, 0xc6, 0x17, 0xb6, 0x41, 0x19, + 0x87, 0xcf, 0x33, 0x69, 0xa1, 0x0f, 0xe6, 0x80, 0x40, 0xcb, 0xa4, 0x38, 0xab, 0x9c, 0x28, 0x84, + 0x2b, 0x89, 0x94, 0xf8, 0x04, 0xe4, 0x29, 0x27, 0xb6, 0xb8, 0xfe, 0xb1, 0xcb, 0x53, 0xcb, 0x37, + 0x86, 0x08, 0xdb, 0xda, 0xb4, 0xe2, 0xcf, 0x3f, 0x12, 0x4c, 0x28, 0x20, 0xac, 0x7c, 0x3d, 0x06, + 0x60, 0xac, 0x84, 0x5c, 0xcb, 0x6a, 0x60, 0x63, 0x0f, 0x5e, 0x00, 0x39, 0x07, 0xdb, 0x61, 0xb4, + 0x46, 0xa9, 0xf4, 0x31, 0xb6, 0x09, 0x92, 0x12, 0xf8, 0x9d, 0x06, 0x60, 0x4b, 0x5e, 0x45, 0x73, + 0xcd, 0x71, 0x5c, 0x8e, 0xc5, 0xe9, 0x84, 0x0e, 0xd6, 0x87, 0x70, 0x30, 0xb4, 0xad, 0xef, 0x64, + 0x58, 0x1f, 0x38, 0xdc, 0xef, 0xc4, 0xb7, 0x94, 0x55, 0x40, 0x3d, 0x5c, 0x81, 0x7b, 0x00, 0xf8, + 0x8a, 0x73, 0xdb, 0x55, 0x09, 0x3f, 0x78, 0x35, 0x09, 0xdd, 0x59, 0x77, 0x9d, 0x17, 0xd4, 0x8c, + 0x4b, 0x16, 0x8a, 0x28, 0x51, 0x82, 0x7e, 0xf1, 0x01, 0x58, 0xe8, 0xe3, 0x37, 0x3c, 0x0b, 0xc6, + 0xf6, 0x48, 0x27, 0x38, 0x4a, 0x24, 0x7e, 0xc2, 0x79, 0x90, 0x6f, 0x63, 0xab, 0x45, 0x82, 0x6c, + 0x46, 0xc1, 0xc7, 0xca, 0xe8, 0x1d, 0xad, 0xf2, 0x7b, 0x3e, 0x19, 0x59, 0xa2, 0x72, 0xc1, 0xcb, + 0xa0, 0xe0, 0x13, 0xcf, 0xa2, 0x06, 0x66, 0x92, 0x23, 0x5f, 0x3b, 0x23, 0xa2, 0x04, 0xa9, 0x35, + 0x14, 0x49, 0xe1, 0x67, 0xa0, 0xc0, 0x88, 0x45, 0x0c, 0xee, 0xfa, 0xaa, 0x78, 0xde, 0x18, 0x30, + 0x06, 0x71, 0x83, 0x58, 0x75, 0x05, 0x0d, 0xe8, 0xc3, 0x2f, 0x14, 0x51, 0xc2, 0x4f, 0x41, 0x81, + 0x13, 0xdb, 0xb3, 0x30, 0x27, 0xea, 0x34, 0xaf, 0xf5, 0x3f, 0x4d, 0x41, 0xbb, 0xe5, 0x36, 0xb7, + 0x15, 0x40, 0x56, 0xe4, 0x28, 0xc2, 0xc3, 0x55, 0x14, 0x11, 0x42, 0x0a, 0x0a, 0x8c, 0x8b, 0x67, + 0xc7, 0xec, 0xc8, 0x5a, 0x34, 0xb5, 0xbc, 0x3a, 0x54, 0x6d, 0x0e, 0x28, 0x62, 0x53, 0xe1, 0x0a, + 0x8a, 0xe8, 0xe1, 0x1a, 0x98, 0xb1, 0xa9, 0x83, 0x08, 0x6e, 0x76, 0xea, 0xc4, 0x70, 0x9d, 0x26, + 0x93, 0x45, 0x2d, 0x5f, 0x5b, 0x50, 0xa0, 0x99, 0xcd, 0xb4, 0x18, 0x75, 0xeb, 0xc3, 0x0d, 0x30, + 0xef, 0x93, 0x36, 0x65, 0xd4, 0x75, 0x3e, 0xa4, 0x8c, 0xbb, 0x7e, 0x67, 0x83, 0xda, 0x94, 0xcb, + 0x52, 0x97, 0xaf, 0x95, 0x8e, 0x0e, 0x96, 0xe6, 0x51, 0x0f, 0x39, 0xea, 0x89, 0x12, 0x55, 0xd8, + 0xc3, 0x2d, 0x46, 0x9a, 0xb2, 0x74, 0x15, 0xe2, 0x2a, 0xbc, 0x25, 0x57, 0x91, 0x92, 0x42, 0x33, + 0x15, 0xd0, 0x85, 0xbf, 0x16, 0xd0, 0xc5, 0xfe, 0xc1, 0x0c, 0x77, 0xc0, 0x82, 0xe7, 0xbb, 0xa6, + 0x4f, 0x18, 0xbb, 0x4f, 0x70, 0xd3, 0xa2, 0x0e, 0x09, 0x4f, 0x6a, 0x52, 0xee, 0xf0, 0xfc, 0xd1, + 0xc1, 0xd2, 0xc2, 0x56, 0x6f, 0x15, 0xd4, 0x0f, 0x5b, 0xf9, 0x35, 0x07, 0xce, 0x76, 0xbf, 0xa3, + 0xf0, 0x23, 0x00, 0xdd, 0x86, 0xec, 0x7b, 0x9a, 0x0f, 0x83, 0xce, 0x83, 0xba, 0x8e, 0x0c, 0xf4, + 0xb1, 0x38, 0xe3, 0x1f, 0x67, 0x34, 0x50, 0x0f, 0x14, 0xbc, 0x9a, 0x48, 0x95, 0x51, 0xe9, 0x68, + 0x14, 0x07, 0x3d, 0xd2, 0x65, 0x0d, 0xcc, 0xa8, 0xaa, 0x11, 0x0a, 0x65, 0x58, 0x27, 0xe2, 0x60, + 0x27, 0x2d, 0x46, 0xdd, 0xfa, 0xf0, 0x21, 0x98, 0xc5, 0x6d, 0x4c, 0x2d, 0xdc, 0xb0, 0x48, 0x44, + 0x92, 0x93, 0x24, 0xff, 0x56, 0x24, 0xb3, 0x6b, 0xdd, 0x0a, 0x28, 0x8b, 0x81, 0x9b, 0x60, 0xae, + 0xe5, 0x64, 0xa9, 0x82, 0xb8, 0x3c, 0xaf, 0xa8, 0xe6, 0x76, 0xb2, 0x2a, 0xa8, 0x17, 0x0e, 0x7a, + 0x00, 0x18, 0xe1, 0x93, 0xcf, 0x4a, 0xe3, 0xb2, 0x26, 0xbf, 0x37, 0x44, 0x3e, 0x45, 0x7d, 0x43, + 0x5c, 0xff, 0xa2, 0x25, 0x86, 0x12, 0x36, 0xe0, 0x2a, 0x98, 0xf6, 0x45, 0x86, 0x44, 0xae, 0x4f, + 0x48, 0xd7, 0xff, 0xa5, 0x60, 0xd3, 0x28, 0x29, 0x44, 0x69, 0x5d, 0xb8, 0x02, 0x8a, 0x86, 0x6b, + 0x59, 0x32, 0x33, 0xd6, 0xdd, 0x96, 0xc3, 0x65, 0x70, 0x8f, 0xd5, 0xa0, 0xe8, 0x01, 0xd6, 0x53, + 0x12, 0xd4, 0xa5, 0x59, 0xf9, 0x45, 0x4b, 0x3e, 0x60, 0x61, 0xba, 0xc3, 0x95, 0x54, 0xbb, 0x75, + 0xb1, 0xab, 0xdd, 0x3a, 0x97, 0x45, 0x24, 0xba, 0xad, 0x0e, 0x98, 0x16, 0xc9, 0x40, 0x1d, 0x33, + 0x08, 0x00, 0x55, 0x4c, 0xdf, 0x3f, 0x55, 0xaa, 0x45, 0xe8, 0xc4, 0x13, 0x3c, 0x2b, 0x4f, 0x22, + 0x29, 0x44, 0x69, 0x4b, 0x95, 0x7b, 0xa0, 0x98, 0xce, 0xd3, 0x20, 0xa6, 0x83, 0xa2, 0xa1, 0xb2, + 0x22, 0x11, 0xd3, 0xc1, 0x3a, 0x8a, 0x34, 0x2a, 0x6f, 0x34, 0xb0, 0xd0, 0xc7, 0x3a, 0xb4, 0x40, + 0xd1, 0xc6, 0xaf, 0x12, 0x31, 0x74, 0x62, 0xff, 0x2e, 0xa6, 0x16, 0x3d, 0x98, 0x5a, 0xf4, 0x47, + 0x0e, 0x7f, 0xec, 0xd7, 0xb9, 0x4f, 0x1d, 0x33, 0xb8, 0x97, 0xcd, 0x14, 0x17, 0xea, 0xe2, 0x86, + 0xcf, 0x40, 0xc1, 0xc6, 0xaf, 0xea, 0x2d, 0xdf, 0x0c, 0xcf, 0xef, 0xf4, 0x76, 0xe4, 0x4b, 0xb4, + 0xa9, 0x58, 0x50, 0xc4, 0x57, 0xf9, 0x76, 0x14, 0xe4, 0xeb, 0x06, 0xb6, 0xc8, 0x3b, 0x98, 0x46, + 0xb6, 0x53, 0xd3, 0xc8, 0xf2, 0xc0, 0x31, 0x20, 0xfd, 0xeb, 0x3b, 0x88, 0x3c, 0xef, 0x1a, 0x44, + 0x6e, 0x9e, 0x92, 0xf7, 0xf8, 0x19, 0xe4, 0x2e, 0x98, 0x8c, 0xcc, 0xa7, 0x8a, 0xa2, 0x76, 0x52, + 0x51, 0xac, 0xfc, 0x30, 0x0a, 0xa6, 0x12, 0x26, 0x4e, 0x87, 0x86, 0x5e, 0xaa, 0x03, 0x11, 0x55, + 0xa7, 0x36, 0xcc, 0xc6, 0xf4, 0xb0, 0xfb, 0x08, 0x1a, 0xbf, 0xf8, 0x31, 0xcf, 0x36, 0x25, 0xf7, + 0x40, 0x91, 0x63, 0xdf, 0x24, 0x3c, 0x94, 0xc9, 0x03, 0x9d, 0x8c, 0x47, 0x88, 0xed, 0x94, 0x14, + 0x75, 0x69, 0x2f, 0xae, 0x82, 0xe9, 0x94, 0xb1, 0x53, 0x75, 0x6b, 0x3f, 0x89, 0xc3, 0xe2, 0x98, + 0x93, 0x17, 0x2d, 0xab, 0x4e, 0xde, 0xc5, 0x6c, 0xfc, 0x2c, 0x15, 0x8d, 0x77, 0x06, 0x3f, 0xdc, + 0xd8, 0xcb, 0xbe, 0x31, 0xd9, 0xe8, 0x8a, 0xc9, 0x95, 0xa1, 0xd8, 0x8f, 0x8f, 0xcc, 0x9f, 0x35, + 0x30, 0x93, 0xd0, 0x7e, 0x07, 0xa3, 0xd3, 0xd3, 0xf4, 0xe8, 0x74, 0x73, 0x98, 0x4d, 0xf5, 0x99, + 0x9d, 0xbe, 0xcf, 0xa5, 0x36, 0xf3, 0x0f, 0xea, 0xd6, 0xbf, 0xd4, 0xc0, 0x7c, 0xdb, 0xb5, 0x5a, + 0x36, 0x59, 0xb7, 0x30, 0xb5, 0x43, 0x0d, 0xd1, 0xfb, 0x9c, 0x30, 0x9f, 0x4a, 0x4b, 0xc4, 0x67, + 0x94, 0x71, 0xe2, 0xf0, 0x27, 0x31, 0x47, 0xed, 0x3f, 0xca, 0xde, 0xfc, 0x93, 0x1e, 0xc4, 0xa8, + 0xa7, 0x39, 0xf8, 0x7f, 0x30, 0x25, 0x9a, 0x40, 0x6a, 0x10, 0x31, 0x99, 0xaa, 0xff, 0x26, 0xe6, + 0x14, 0xd1, 0x54, 0x3d, 0x16, 0xa1, 0xa4, 0x1e, 0xdc, 0x05, 0x73, 0x9e, 0xdb, 0xdc, 0xc4, 0x0e, + 0x36, 0x89, 0x78, 0x1a, 0xb7, 0xe4, 0x3f, 0x60, 0xb2, 0x7b, 0x9f, 0xac, 0xdd, 0x0a, 0xbb, 0xad, + 0xad, 0xac, 0xca, 0x5b, 0xd1, 0xf6, 0x66, 0x97, 0x65, 0xef, 0xd0, 0x8b, 0xb2, 0xf2, 0x95, 0x06, + 0x66, 0x33, 0xd9, 0x01, 0x3f, 0x38, 0xa6, 0xe7, 0x3d, 0xf7, 0x77, 0xf5, 0xbb, 0xb5, 0x2b, 0xfb, + 0x87, 0xe5, 0x91, 0xd7, 0x87, 0xe5, 0x91, 0xdf, 0x0e, 0xcb, 0x23, 0x5f, 0x1c, 0x95, 0xb5, 0xfd, + 0xa3, 0xb2, 0xf6, 0xfa, 0xa8, 0xac, 0xfd, 0x71, 0x54, 0xd6, 0xbe, 0x79, 0x53, 0x1e, 0x79, 0x36, + 0xa1, 0x62, 0xff, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf2, 0xdb, 0x2f, 0x40, 0xf8, 0x15, 0x00, + 0x00, } diff --git a/pkg/apis/apps/v1beta1/generated.proto b/pkg/apis/apps/v1beta1/generated.proto index ad1d271464c..5e3d4b99fe2 100644 --- a/pkg/apis/apps/v1beta1/generated.proto +++ b/pkg/apis/apps/v1beta1/generated.proto @@ -170,6 +170,12 @@ message DeploymentStatus { // +patchMergeKey=type // +patchStrategy=merge repeated DeploymentCondition conditions = 6; + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + optional int64 collisionCount = 8; } // DeploymentStrategy describes how to replace existing pods with new ones. diff --git a/pkg/apis/apps/v1beta1/types.generated.go b/pkg/apis/apps/v1beta1/types.generated.go index db45c0fa258..4ee127c438f 100644 --- a/pkg/apis/apps/v1beta1/types.generated.go +++ b/pkg/apis/apps/v1beta1/types.generated.go @@ -4672,7 +4672,7 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [7]bool + var yyq2 [8]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.ObservedGeneration != 0 @@ -4682,9 +4682,10 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[4] = x.AvailableReplicas != 0 yyq2[5] = x.UnavailableReplicas != 0 yyq2[6] = len(x.Conditions) != 0 + yyq2[7] = x.CollisionCount != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(7) + r.EncodeArrayStart(8) } else { yynn2 = 0 for _, b := range yyq2 { @@ -4878,6 +4879,41 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[7] { + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy25 := *x.CollisionCount + yym26 := z.EncBinary() + _ = yym26 + if false { + } else { + r.EncodeInt(int64(yy25)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[7] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("collisionCount")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy27 := *x.CollisionCount + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeInt(int64(yy27)) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -5023,6 +5059,22 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv16), d) } } + case "collisionCount": + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym19 := z.DecBinary() + _ = yym19 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -5034,16 +5086,16 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj18 int - var yyb18 bool - var yyhl18 bool = l >= 0 - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + var yyj20 int + var yyb20 bool + var yyhl20 bool = l >= 0 + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5051,21 +5103,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.ObservedGeneration = 0 } else { - yyv19 := &x.ObservedGeneration - yym20 := z.DecBinary() - _ = yym20 + yyv21 := &x.ObservedGeneration + yym22 := z.DecBinary() + _ = yym22 if false { } else { - *((*int64)(yyv19)) = int64(r.DecodeInt(64)) + *((*int64)(yyv21)) = int64(r.DecodeInt(64)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5073,29 +5125,7 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.Replicas = 0 } else { - yyv21 := &x.Replicas - yym22 := z.DecBinary() - _ = yym22 - if false { - } else { - *((*int32)(yyv21)) = int32(r.DecodeInt(32)) - } - } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l - } else { - yyb18 = r.CheckBreak() - } - if yyb18 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.UpdatedReplicas = 0 - } else { - yyv23 := &x.UpdatedReplicas + yyv23 := &x.Replicas yym24 := z.DecBinary() _ = yym24 if false { @@ -5103,21 +5133,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv23)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.ReadyReplicas = 0 + x.UpdatedReplicas = 0 } else { - yyv25 := &x.ReadyReplicas + yyv25 := &x.UpdatedReplicas yym26 := z.DecBinary() _ = yym26 if false { @@ -5125,21 +5155,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv25)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.AvailableReplicas = 0 + x.ReadyReplicas = 0 } else { - yyv27 := &x.AvailableReplicas + yyv27 := &x.ReadyReplicas yym28 := z.DecBinary() _ = yym28 if false { @@ -5147,21 +5177,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv27)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.UnavailableReplicas = 0 + x.AvailableReplicas = 0 } else { - yyv29 := &x.UnavailableReplicas + yyv29 := &x.AvailableReplicas yym30 := z.DecBinary() _ = yym30 if false { @@ -5169,13 +5199,35 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv29)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.UnavailableReplicas = 0 + } else { + yyv31 := &x.UnavailableReplicas + yym32 := z.DecBinary() + _ = yym32 + if false { + } else { + *((*int32)(yyv31)) = int32(r.DecodeInt(32)) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5183,26 +5235,52 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.Conditions = nil } else { - yyv31 := &x.Conditions - yym32 := z.DecBinary() - _ = yym32 + yyv33 := &x.Conditions + yym34 := z.DecBinary() + _ = yym34 if false { } else { - h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv31), d) + h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv33), d) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) } } for { - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj18-1, "") + z.DecStructFieldNotFound(yyj20-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -6470,7 +6548,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 960) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 968) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/apis/apps/v1beta1/types.go b/pkg/apis/apps/v1beta1/types.go index e3cb013acda..c9843eed7da 100644 --- a/pkg/apis/apps/v1beta1/types.go +++ b/pkg/apis/apps/v1beta1/types.go @@ -356,6 +356,12 @@ type DeploymentStatus struct { // +patchMergeKey=type // +patchStrategy=merge Conditions []DeploymentCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,6,rep,name=conditions"` + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` } type DeploymentConditionType string diff --git a/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go b/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go index f40254cb749..fffd81c3168 100644 --- a/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go +++ b/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go @@ -99,6 +99,7 @@ var map_DeploymentStatus = map[string]string{ "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.", "unavailableReplicas": "Total number of unavailable pods targeted by this deployment.", "conditions": "Represents the latest available observations of a deployment's current state.", + "collisionCount": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", } func (DeploymentStatus) SwaggerDoc() map[string]string { diff --git a/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go b/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go index f83ca377c94..cc348e2aa77 100644 --- a/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go +++ b/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go @@ -184,6 +184,11 @@ func DeepCopy_v1beta1_DeploymentStatus(in interface{}, out interface{}, c *conve } } } + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + *out = new(int64) + **out = **in + } return nil } } diff --git a/pkg/apis/extensions/types.go b/pkg/apis/extensions/types.go index 71731a41623..7c2c1c2856e 100644 --- a/pkg/apis/extensions/types.go +++ b/pkg/apis/extensions/types.go @@ -327,6 +327,12 @@ type DeploymentStatus struct { // Represents the latest available observations of a deployment's current state. Conditions []DeploymentCondition + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + CollisionCount *int64 } type DeploymentConditionType string diff --git a/pkg/apis/extensions/v1beta1/generated.pb.go b/pkg/apis/extensions/v1beta1/generated.pb.go index 8f2cb49842a..a9cd040c461 100644 --- a/pkg/apis/extensions/v1beta1/generated.pb.go +++ b/pkg/apis/extensions/v1beta1/generated.pb.go @@ -1069,6 +1069,11 @@ func (m *DeploymentStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x38 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ReadyReplicas)) + if m.CollisionCount != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.CollisionCount)) + } return i, nil } @@ -2911,6 +2916,9 @@ func (m *DeploymentStatus) Size() (n int) { } } n += 1 + sovGenerated(uint64(m.ReadyReplicas)) + if m.CollisionCount != nil { + n += 1 + sovGenerated(uint64(*m.CollisionCount)) + } return n } @@ -3699,6 +3707,7 @@ func (this *DeploymentStatus) String() string { `UnavailableReplicas:` + fmt.Sprintf("%v", this.UnavailableReplicas) + `,`, `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "DeploymentCondition", "DeploymentCondition", 1), `&`, ``, 1) + `,`, `ReadyReplicas:` + fmt.Sprintf("%v", this.ReadyReplicas) + `,`, + `CollisionCount:` + valueToStringGenerated(this.CollisionCount) + `,`, `}`, }, "") return s @@ -6558,6 +6567,26 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { break } } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CollisionCount = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -11794,217 +11823,218 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3379 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0xdb, 0x6f, 0x1b, 0xc7, - 0xd5, 0xf7, 0x8a, 0xa4, 0x45, 0x1d, 0x59, 0x92, 0x35, 0x72, 0x64, 0x46, 0x49, 0x44, 0x67, 0x3f, - 0x7c, 0x89, 0xf3, 0x7d, 0x09, 0xf5, 0xc5, 0xf9, 0x9c, 0x26, 0x4e, 0xe2, 0x44, 0x94, 0x7c, 0x51, - 0x21, 0xc9, 0xcc, 0x90, 0x32, 0x1a, 0xe7, 0xd6, 0x15, 0x39, 0xa2, 0xd6, 0xde, 0x5b, 0x76, 0x67, - 0x15, 0x11, 0x41, 0xdb, 0x00, 0x45, 0xf3, 0x58, 0xb4, 0x2f, 0x45, 0x0a, 0xa4, 0x8f, 0x7d, 0xe8, - 0x4b, 0x9b, 0x3c, 0xb4, 0x69, 0xff, 0x82, 0xfa, 0xa1, 0x28, 0x52, 0xa0, 0x05, 0x8a, 0x22, 0x15, - 0x6a, 0x05, 0xcd, 0x3f, 0xd0, 0xe6, 0xc5, 0x4f, 0xc5, 0xcc, 0xce, 0xde, 0x77, 0x65, 0x93, 0xb2, - 0x89, 0x02, 0x7d, 0xe3, 0xce, 0x9c, 0xf3, 0x3b, 0x97, 0x39, 0x73, 0xe6, 0xcc, 0x85, 0xf0, 0xd2, + // 3402 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0x4b, 0x6f, 0x1c, 0xc7, + 0xb5, 0x56, 0xcf, 0x43, 0x1c, 0x1e, 0x8a, 0xa4, 0x58, 0x94, 0xa9, 0x31, 0x6d, 0x93, 0x72, 0x5f, + 0x5c, 0x5b, 0xbe, 0xd7, 0x1e, 0x5e, 0xcb, 0x57, 0x8e, 0x2d, 0xdb, 0xb2, 0x39, 0xa4, 0x1e, 0x0c, + 0x48, 0x6a, 0x5c, 0x33, 0x14, 0x62, 0xf9, 0x95, 0xe6, 0x4c, 0x71, 0xd8, 0x52, 0xbf, 0xdc, 0x5d, + 0x4d, 0x73, 0x60, 0x24, 0x31, 0x10, 0xc4, 0xcb, 0x20, 0xd9, 0x04, 0x0e, 0x90, 0x2c, 0xb3, 0xc8, + 0x26, 0xb1, 0x17, 0x89, 0x93, 0x5f, 0x10, 0x2d, 0x82, 0xc0, 0x01, 0x12, 0xc0, 0x08, 0x1c, 0x22, + 0xa2, 0x11, 0xff, 0x81, 0xc4, 0x1b, 0xad, 0x82, 0xaa, 0xae, 0x7e, 0x77, 0x53, 0x9a, 0xa1, 0x34, + 0x08, 0x90, 0x1d, 0xa7, 0xea, 0x9c, 0xef, 0x3c, 0xea, 0xd4, 0xa9, 0x53, 0x75, 0x9a, 0xf0, 0xd2, 0x8d, 0xe7, 0x9c, 0x9a, 0x6a, 0x2e, 0xdc, 0x70, 0x37, 0x89, 0x6d, 0x10, 0x4a, 0x9c, 0x05, 0xeb, 0x46, 0x77, 0x41, 0xb1, 0x54, 0x67, 0x81, 0xec, 0x52, 0x62, 0x38, 0xaa, 0x69, 0x38, 0x0b, 0x3b, 0x4f, 0x6f, 0x12, 0xaa, 0x3c, 0xbd, 0xd0, 0x25, 0x06, 0xb1, 0x15, 0x4a, 0x3a, 0x35, 0xcb, 0x36, 0xa9, 0x89, 0x9e, 0xf2, 0xd8, 0x6b, 0x21, 0x7b, 0xcd, 0xba, 0xd1, 0xad, 0x31, 0xf6, 0x5a, 0xc8, - 0x5e, 0x13, 0xec, 0x73, 0x4f, 0x75, 0x55, 0xba, 0xed, 0x6e, 0xd6, 0xda, 0xa6, 0xbe, 0xd0, 0x35, - 0xbb, 0xe6, 0x02, 0x47, 0xd9, 0x74, 0xb7, 0xf8, 0x17, 0xff, 0xe0, 0xbf, 0x3c, 0xf4, 0xb9, 0xff, - 0x17, 0xca, 0x29, 0x96, 0xaa, 0x2b, 0xed, 0x6d, 0xd5, 0x20, 0x76, 0xcf, 0x57, 0x6f, 0xc1, 0x26, - 0x8e, 0xe9, 0xda, 0x6d, 0x92, 0xd4, 0xe9, 0x40, 0x2e, 0x67, 0x41, 0x27, 0x54, 0x59, 0xd8, 0x49, - 0x59, 0x32, 0xb7, 0x90, 0xc7, 0x65, 0xbb, 0x06, 0x55, 0xf5, 0xb4, 0x98, 0x67, 0xef, 0xc4, 0xe0, - 0xb4, 0xb7, 0x89, 0xae, 0xa4, 0xf8, 0x9e, 0xc9, 0xe3, 0x73, 0xa9, 0xaa, 0x2d, 0xa8, 0x06, 0x75, - 0xa8, 0x7d, 0x90, 0x4d, 0x0e, 0xb1, 0x77, 0x88, 0x1d, 0x1d, 0x25, 0x45, 0xb7, 0x34, 0x92, 0x65, - 0xd3, 0x93, 0xb9, 0x83, 0x9b, 0x45, 0xfd, 0xfc, 0x01, 0xa1, 0x60, 0x99, 0x9a, 0xda, 0xee, 0xe5, - 0x85, 0x81, 0x5c, 0x03, 0x58, 0x6c, 0xac, 0x5c, 0x25, 0x36, 0x1b, 0x6e, 0x74, 0x0a, 0x8a, 0x86, - 0xa2, 0x93, 0x8a, 0x74, 0x4a, 0x3a, 0x3d, 0x56, 0x3f, 0x76, 0x73, 0xaf, 0x7a, 0x64, 0x7f, 0xaf, - 0x5a, 0x5c, 0x57, 0x74, 0x82, 0x79, 0x8f, 0xfc, 0x63, 0x09, 0x1e, 0x5c, 0x72, 0x1d, 0x6a, 0xea, - 0x6b, 0x84, 0xda, 0x6a, 0x7b, 0xc9, 0xb5, 0x6d, 0x62, 0xd0, 0x26, 0x55, 0xa8, 0xeb, 0xdc, 0x99, - 0x1f, 0x5d, 0x83, 0xd2, 0x8e, 0xa2, 0xb9, 0xa4, 0x32, 0x72, 0x4a, 0x3a, 0x3d, 0x7e, 0xa6, 0x56, - 0x13, 0x61, 0x18, 0xf5, 0xa9, 0x1f, 0x88, 0x35, 0x3f, 0x50, 0x6a, 0xaf, 0xba, 0x8a, 0x41, 0x55, - 0xda, 0xab, 0x9f, 0x10, 0x90, 0xc7, 0x84, 0xdc, 0xab, 0x0c, 0x0b, 0x7b, 0x90, 0xf2, 0xf7, 0x25, - 0x78, 0x24, 0x57, 0xb7, 0x55, 0xd5, 0xa1, 0x48, 0x87, 0x92, 0x4a, 0x89, 0xee, 0x54, 0xa4, 0x53, - 0x85, 0xd3, 0xe3, 0x67, 0x2e, 0xd7, 0xfa, 0x9a, 0x04, 0xb5, 0x5c, 0xf0, 0xfa, 0x84, 0xd0, 0xab, - 0xb4, 0xc2, 0xe0, 0xb1, 0x27, 0x45, 0xfe, 0xa1, 0x04, 0x28, 0xca, 0xd3, 0x52, 0xec, 0x2e, 0xa1, - 0x77, 0xe1, 0xa5, 0xd7, 0x0e, 0xe7, 0xa5, 0x19, 0x01, 0x39, 0xee, 0x09, 0x8c, 0x39, 0xe9, 0x7d, - 0x09, 0x66, 0xd3, 0x3a, 0x71, 0xef, 0x6c, 0xc5, 0xbd, 0xb3, 0x78, 0x08, 0xef, 0x78, 0xa8, 0x39, - 0x6e, 0xf9, 0xe5, 0x08, 0x8c, 0x2d, 0x2b, 0x44, 0x37, 0x8d, 0x26, 0xa1, 0xe8, 0x9b, 0x50, 0x66, - 0x33, 0xbb, 0xa3, 0x50, 0x85, 0x7b, 0x64, 0xfc, 0xcc, 0xff, 0x1d, 0x64, 0xae, 0x53, 0x63, 0xd4, - 0xb5, 0x9d, 0xa7, 0x6b, 0x57, 0x36, 0xaf, 0x93, 0x36, 0x5d, 0x23, 0x54, 0xa9, 0x23, 0x21, 0x07, - 0xc2, 0x36, 0x1c, 0xa0, 0xa2, 0xb7, 0xa0, 0xe8, 0x58, 0xa4, 0x2d, 0x9c, 0xf9, 0x62, 0x9f, 0x66, - 0x05, 0x9a, 0x36, 0x2d, 0xd2, 0x0e, 0x47, 0x8b, 0x7d, 0x61, 0x8e, 0x8b, 0xb6, 0xe0, 0xa8, 0xc3, - 0xc3, 0xa0, 0x52, 0xe0, 0x12, 0xce, 0x0f, 0x2c, 0xc1, 0x0b, 0xa6, 0x49, 0x21, 0xe3, 0xa8, 0xf7, - 0x8d, 0x05, 0xba, 0xfc, 0x3b, 0x09, 0x26, 0x02, 0x5a, 0x3e, 0x62, 0x6f, 0xa4, 0x7c, 0x57, 0xbb, - 0x3b, 0xdf, 0x31, 0x6e, 0xee, 0xb9, 0xe3, 0x42, 0x56, 0xd9, 0x6f, 0x89, 0xf8, 0xed, 0x4d, 0x3f, - 0x1e, 0x46, 0x78, 0x3c, 0x3c, 0x37, 0xa8, 0x59, 0x39, 0x61, 0xf0, 0x45, 0x21, 0x62, 0x0e, 0x73, - 0x27, 0x7a, 0x13, 0xca, 0x0e, 0xd1, 0x48, 0x9b, 0x9a, 0xb6, 0x30, 0xe7, 0x99, 0xbb, 0x34, 0x47, - 0xd9, 0x24, 0x5a, 0x53, 0xb0, 0xd6, 0x8f, 0x31, 0x7b, 0xfc, 0x2f, 0x1c, 0x40, 0xa2, 0xd7, 0xa1, - 0x4c, 0x89, 0x6e, 0x69, 0x0a, 0xf5, 0x27, 0xd6, 0x53, 0xf9, 0x26, 0x31, 0xd8, 0x86, 0xd9, 0x69, - 0x09, 0x06, 0x3e, 0xf8, 0x81, 0xb3, 0xfc, 0x56, 0x1c, 0x00, 0xa2, 0x0f, 0x24, 0x98, 0x74, 0xad, - 0x0e, 0x23, 0xa5, 0x2c, 0xc1, 0x76, 0x7b, 0x22, 0x1a, 0x2e, 0x0e, 0xea, 0xb6, 0x8d, 0x18, 0x5a, - 0x7d, 0x56, 0x08, 0x9f, 0x8c, 0xb7, 0xe3, 0x84, 0x54, 0xb4, 0x08, 0x53, 0xba, 0x6a, 0x60, 0xa2, - 0x74, 0x7a, 0x4d, 0xd2, 0x36, 0x8d, 0x8e, 0x53, 0x29, 0x9e, 0x92, 0x4e, 0x97, 0xea, 0x27, 0x05, - 0xc0, 0xd4, 0x5a, 0xbc, 0x1b, 0x27, 0xe9, 0xd1, 0xd7, 0x01, 0xf9, 0x76, 0x5d, 0xf2, 0xd6, 0x0b, - 0xd5, 0x34, 0x2a, 0xa5, 0x53, 0xd2, 0xe9, 0x42, 0x7d, 0x4e, 0xa0, 0xa0, 0x56, 0x8a, 0x02, 0x67, - 0x70, 0xc9, 0xff, 0x2c, 0xc2, 0x54, 0x22, 0xc0, 0xd1, 0x55, 0x98, 0x6d, 0x7b, 0xe9, 0x73, 0xdd, - 0xd5, 0x37, 0x89, 0xdd, 0x6c, 0x6f, 0x93, 0x8e, 0xab, 0x91, 0x0e, 0x1f, 0xf5, 0x52, 0x7d, 0x5e, - 0xc8, 0x98, 0x5d, 0xca, 0xa4, 0xc2, 0x39, 0xdc, 0x4c, 0x6f, 0x83, 0x37, 0xad, 0xa9, 0x8e, 0x13, - 0x60, 0x8e, 0x70, 0xcc, 0x40, 0xef, 0xf5, 0x14, 0x05, 0xce, 0xe0, 0x62, 0x3a, 0x76, 0x88, 0xa3, - 0xda, 0xa4, 0x93, 0xd4, 0xb1, 0x10, 0xd7, 0x71, 0x39, 0x93, 0x0a, 0xe7, 0x70, 0xa3, 0xb3, 0x30, - 0xee, 0x49, 0xe3, 0x1e, 0x17, 0x43, 0x13, 0x24, 0xec, 0xf5, 0xb0, 0x0b, 0x47, 0xe9, 0x98, 0x69, - 0xe6, 0x26, 0x2f, 0x20, 0x3a, 0xf9, 0x43, 0x72, 0x25, 0x45, 0x81, 0x33, 0xb8, 0x98, 0x69, 0x5e, - 0xcc, 0xa4, 0x4c, 0x3b, 0x1a, 0x37, 0x6d, 0x23, 0x93, 0x0a, 0xe7, 0x70, 0xb3, 0xc8, 0xf3, 0x54, - 0x5e, 0xdc, 0x51, 0x54, 0x4d, 0xd9, 0xd4, 0x48, 0x65, 0x34, 0x1e, 0x79, 0xeb, 0xf1, 0x6e, 0x9c, - 0xa4, 0x47, 0x97, 0x60, 0xda, 0x6b, 0xda, 0x30, 0x94, 0x00, 0xa4, 0xcc, 0x41, 0x1e, 0x14, 0x20, - 0xd3, 0xeb, 0x49, 0x02, 0x9c, 0xe6, 0x91, 0xff, 0x22, 0xc1, 0xc9, 0x9c, 0x99, 0x84, 0x5e, 0x86, - 0x22, 0xed, 0x59, 0xfe, 0xfa, 0xfb, 0xbf, 0x7e, 0x46, 0x6f, 0xf5, 0x2c, 0x72, 0x7b, 0xaf, 0xfa, - 0x50, 0x0e, 0x1b, 0xeb, 0xc6, 0x9c, 0x11, 0x7d, 0x1b, 0x26, 0x6c, 0x53, 0xd3, 0x54, 0xa3, 0xeb, - 0x91, 0x88, 0x6c, 0x72, 0xa1, 0xcf, 0x99, 0x8e, 0xa3, 0x18, 0x61, 0xb6, 0x9c, 0xde, 0xdf, 0xab, - 0x4e, 0xc4, 0xfa, 0x70, 0x5c, 0x9c, 0xfc, 0xeb, 0x11, 0x80, 0x65, 0x62, 0x69, 0x66, 0x4f, 0x27, - 0xc6, 0x30, 0x56, 0xd0, 0xb7, 0x63, 0x2b, 0xe8, 0x4b, 0xfd, 0x66, 0xb4, 0x40, 0xd5, 0xdc, 0x25, - 0xb4, 0x9b, 0x58, 0x42, 0x5f, 0x1e, 0x5c, 0xc4, 0xc1, 0x6b, 0xe8, 0xad, 0x02, 0xcc, 0x84, 0xc4, - 0x4b, 0xa6, 0xd1, 0x51, 0xf9, 0x9c, 0x78, 0x21, 0x16, 0x13, 0x8f, 0x27, 0x62, 0xe2, 0x64, 0x06, - 0x4b, 0x24, 0x1e, 0xae, 0x06, 0xda, 0x8f, 0x70, 0xf6, 0xf3, 0x71, 0xe1, 0xb7, 0xf7, 0xaa, 0x07, - 0xd6, 0xf3, 0xb5, 0x00, 0x33, 0xae, 0x2c, 0x7a, 0x0c, 0x8e, 0xda, 0x44, 0x71, 0x4c, 0x83, 0xa7, - 0x89, 0xb1, 0xd0, 0x28, 0xcc, 0x5b, 0xb1, 0xe8, 0x45, 0x4f, 0xc0, 0xa8, 0x4e, 0x1c, 0x47, 0xe9, - 0x12, 0x9e, 0x11, 0xc6, 0xea, 0x53, 0x82, 0x70, 0x74, 0xcd, 0x6b, 0xc6, 0x7e, 0x3f, 0xba, 0x0e, - 0x93, 0x9a, 0xe2, 0x88, 0xd0, 0x6e, 0xa9, 0x3a, 0xe1, 0x73, 0x7e, 0xfc, 0xcc, 0xff, 0xdc, 0x5d, - 0xc4, 0x30, 0x8e, 0x70, 0x25, 0x5a, 0x8d, 0x21, 0xe1, 0x04, 0x32, 0xda, 0x01, 0xc4, 0x5a, 0x5a, - 0xb6, 0x62, 0x38, 0x9e, 0xcb, 0x98, 0xbc, 0xd1, 0xbe, 0xe5, 0x05, 0xf9, 0x6d, 0x35, 0x85, 0x86, - 0x33, 0x24, 0xc8, 0xbf, 0x97, 0x60, 0x32, 0x1c, 0xb0, 0x21, 0x14, 0x4a, 0x6f, 0xc5, 0x0b, 0xa5, - 0xe7, 0x07, 0x0e, 0xde, 0x9c, 0x4a, 0xe9, 0xc3, 0x02, 0xa0, 0x90, 0x88, 0xa5, 0x86, 0x4d, 0xa5, - 0x7d, 0xe3, 0x2e, 0xf6, 0x11, 0x3f, 0x95, 0x00, 0x89, 0x64, 0xbd, 0x68, 0x18, 0x26, 0xe5, 0xf9, - 0xdf, 0x57, 0xf3, 0xb5, 0x81, 0xd5, 0xf4, 0x35, 0xa8, 0x6d, 0xa4, 0xb0, 0x2f, 0x18, 0xd4, 0xee, - 0x85, 0x23, 0x96, 0x26, 0xc0, 0x19, 0x0a, 0xa1, 0x77, 0x00, 0x6c, 0x81, 0xd9, 0x32, 0x45, 0x0a, - 0x78, 0x69, 0x80, 0x6c, 0xca, 0x00, 0x96, 0x4c, 0x63, 0x4b, 0xed, 0x86, 0x09, 0x0d, 0x07, 0xc0, - 0x38, 0x22, 0x64, 0xee, 0x02, 0x9c, 0xcc, 0xd1, 0x1e, 0x1d, 0x87, 0xc2, 0x0d, 0xd2, 0xf3, 0xdc, - 0x8a, 0xd9, 0x4f, 0x74, 0x22, 0xba, 0x1f, 0x1b, 0x13, 0x5b, 0xa9, 0x73, 0x23, 0xcf, 0x49, 0xf2, - 0x97, 0xa5, 0x68, 0xac, 0xf1, 0x2a, 0xf6, 0x34, 0x94, 0x6d, 0x62, 0x69, 0x6a, 0x5b, 0x71, 0x44, - 0x3d, 0xc3, 0x0b, 0x52, 0x2c, 0xda, 0x70, 0xd0, 0x1b, 0xab, 0x77, 0x47, 0xee, 0x6f, 0xbd, 0x5b, - 0xb8, 0xd7, 0xf5, 0xae, 0x09, 0x65, 0xc7, 0x2f, 0x74, 0x8b, 0x1c, 0x7c, 0xf1, 0x10, 0x39, 0x5b, - 0xd4, 0xb8, 0x81, 0xc0, 0xa0, 0xba, 0x0d, 0x84, 0x64, 0xd5, 0xb5, 0xa5, 0x3e, 0xeb, 0xda, 0x55, - 0x38, 0x61, 0x93, 0x1d, 0x95, 0xa9, 0x71, 0x59, 0x75, 0xa8, 0x69, 0xf7, 0x56, 0x55, 0x5d, 0xa5, - 0xa2, 0xec, 0xa9, 0xec, 0xef, 0x55, 0x4f, 0xe0, 0x8c, 0x7e, 0x9c, 0xc9, 0xc5, 0xb2, 0xb3, 0xa5, - 0xb8, 0x0e, 0xe9, 0xf0, 0x94, 0x56, 0x0e, 0xb3, 0x73, 0x83, 0xb7, 0x62, 0xd1, 0x8b, 0xf4, 0x58, - 0x70, 0x97, 0xef, 0x45, 0x70, 0x4f, 0xe6, 0x07, 0x36, 0xda, 0x80, 0x93, 0x96, 0x6d, 0x76, 0x6d, - 0xe2, 0x38, 0xcb, 0x44, 0xe9, 0x68, 0xaa, 0x41, 0x7c, 0x7f, 0x8d, 0x71, 0x3b, 0x1f, 0xda, 0xdf, - 0xab, 0x9e, 0x6c, 0x64, 0x93, 0xe0, 0x3c, 0x5e, 0xf9, 0xa3, 0x22, 0x1c, 0x4f, 0xae, 0xb2, 0x39, - 0x55, 0xa9, 0x34, 0x50, 0x55, 0xfa, 0x64, 0x64, 0xda, 0x78, 0x25, 0x7b, 0x10, 0x0d, 0x19, 0x53, - 0x67, 0x11, 0xa6, 0x44, 0x1e, 0xf1, 0x3b, 0x45, 0x5d, 0x1e, 0x44, 0xc3, 0x46, 0xbc, 0x1b, 0x27, - 0xe9, 0x59, 0xad, 0x19, 0x96, 0x90, 0x3e, 0x48, 0x31, 0x5e, 0x6b, 0x2e, 0x26, 0x09, 0x70, 0x9a, - 0x07, 0xad, 0xc1, 0x8c, 0x6b, 0xa4, 0xa1, 0xbc, 0xe8, 0x7c, 0x48, 0x40, 0xcd, 0x6c, 0xa4, 0x49, - 0x70, 0x16, 0x1f, 0xda, 0x01, 0x68, 0xfb, 0x05, 0x81, 0x53, 0x39, 0xca, 0x73, 0x75, 0x7d, 0xe0, - 0xb9, 0x15, 0xd4, 0x16, 0x61, 0x46, 0x0c, 0x9a, 0x1c, 0x1c, 0x91, 0x84, 0x5e, 0x80, 0x09, 0x9b, - 0x6f, 0x3c, 0x7c, 0x03, 0xbc, 0xe2, 0xfd, 0x01, 0xc1, 0x36, 0x81, 0xa3, 0x9d, 0x38, 0x4e, 0x2b, - 0xff, 0x41, 0x8a, 0x2e, 0x51, 0x41, 0xa9, 0x7d, 0x2e, 0x56, 0x56, 0x3d, 0x96, 0x28, 0xab, 0x66, - 0xd3, 0x1c, 0x91, 0xaa, 0xea, 0x3b, 0xd9, 0x55, 0xf6, 0xc5, 0x43, 0x55, 0xd9, 0xe1, 0x52, 0x7b, - 0xe7, 0x32, 0xfb, 0x13, 0x09, 0x66, 0x2f, 0x36, 0x2f, 0xd9, 0xa6, 0x6b, 0xf9, 0xea, 0x5d, 0xb1, - 0x3c, 0x5f, 0x7d, 0x0d, 0x8a, 0xb6, 0xab, 0xf9, 0x76, 0xfd, 0x97, 0x6f, 0x17, 0x76, 0x35, 0x66, - 0xd7, 0x4c, 0x82, 0xcb, 0x33, 0x8a, 0x31, 0xa0, 0xb7, 0xe0, 0xa8, 0xad, 0x18, 0x5d, 0xe2, 0x2f, - 0xc2, 0xcf, 0xf6, 0x69, 0xcd, 0xca, 0x32, 0x66, 0xec, 0x91, 0x52, 0x90, 0xa3, 0x61, 0x81, 0x2a, - 0xff, 0x44, 0x82, 0xa9, 0xcb, 0xad, 0x56, 0x63, 0xc5, 0xe0, 0xb3, 0xb8, 0xa1, 0xd0, 0x6d, 0x56, - 0x27, 0x58, 0x0a, 0xdd, 0x4e, 0xd6, 0x09, 0xac, 0x0f, 0xf3, 0x1e, 0xb4, 0x0d, 0xa3, 0x2c, 0x7b, - 0x10, 0xa3, 0x33, 0x60, 0x89, 0x2f, 0xc4, 0xd5, 0x3d, 0x90, 0xb0, 0xfe, 0x14, 0x0d, 0xd8, 0x87, - 0x97, 0xdf, 0x83, 0x13, 0x11, 0xf5, 0x98, 0xbf, 0xf8, 0xe9, 0x24, 0x6a, 0x43, 0x89, 0x69, 0xe2, - 0x9f, 0x3d, 0xf6, 0x7b, 0x84, 0x96, 0x30, 0x39, 0xac, 0xa3, 0xd8, 0x97, 0x83, 0x3d, 0x6c, 0x79, - 0x0d, 0x26, 0x2e, 0x9b, 0x0e, 0x6d, 0x98, 0x36, 0xe5, 0x6e, 0x43, 0x8f, 0x40, 0x41, 0x57, 0x0d, - 0xb1, 0x4a, 0x8f, 0x0b, 0x9e, 0x02, 0x5b, 0x47, 0x58, 0x3b, 0xef, 0x56, 0x76, 0x45, 0x36, 0x0a, - 0xbb, 0x95, 0x5d, 0xcc, 0xda, 0xe5, 0x4b, 0x30, 0x2a, 0x86, 0x23, 0x0a, 0x54, 0x38, 0x18, 0xa8, - 0x90, 0x01, 0xf4, 0x8b, 0x11, 0x18, 0x15, 0xda, 0x0f, 0x61, 0x33, 0xf7, 0x46, 0x6c, 0x33, 0x77, - 0x6e, 0xb0, 0x91, 0xce, 0xdd, 0xc9, 0x75, 0x12, 0x3b, 0xb9, 0x17, 0x07, 0xc4, 0x3f, 0x78, 0x1b, - 0xf7, 0xb1, 0x04, 0x93, 0xf1, 0x98, 0x43, 0x67, 0x61, 0x9c, 0xad, 0x29, 0x6a, 0x9b, 0xac, 0x87, - 0x45, 0x71, 0x70, 0xb0, 0xd2, 0x0c, 0xbb, 0x70, 0x94, 0x0e, 0x75, 0x03, 0x36, 0x16, 0x16, 0xc2, - 0x29, 0xf9, 0x2e, 0x77, 0xa9, 0xaa, 0xd5, 0xbc, 0xab, 0x9e, 0xda, 0x8a, 0x41, 0xaf, 0xd8, 0x4d, - 0x6a, 0xab, 0x46, 0x37, 0x25, 0x88, 0xc7, 0x58, 0x14, 0x59, 0xbe, 0x29, 0xc1, 0xb8, 0x50, 0x79, - 0x08, 0x5b, 0x92, 0xd7, 0xe3, 0x5b, 0x92, 0x67, 0x07, 0x9c, 0xcf, 0xd9, 0xfb, 0x91, 0x4f, 0x43, - 0x53, 0xd8, 0x0c, 0x66, 0x09, 0x66, 0xdb, 0x74, 0x68, 0x32, 0xc1, 0xb0, 0xb9, 0x86, 0x79, 0x0f, - 0xfa, 0x9e, 0x04, 0xc7, 0xd5, 0xc4, 0x9c, 0x17, 0xbe, 0x7e, 0x79, 0x30, 0xd5, 0x02, 0x98, 0x7a, - 0x45, 0xc8, 0x3b, 0x9e, 0xec, 0xc1, 0x29, 0x91, 0xb2, 0x0b, 0x29, 0x2a, 0xa4, 0x40, 0x71, 0x9b, - 0x52, 0x4b, 0x0c, 0xc2, 0xd2, 0xe0, 0x99, 0x27, 0x54, 0xa9, 0xcc, 0xcd, 0x6f, 0xb5, 0x1a, 0x98, - 0x43, 0xcb, 0x3f, 0x1f, 0x09, 0x1c, 0xd6, 0xf4, 0x26, 0x49, 0x90, 0x6f, 0xa5, 0x7b, 0x91, 0x6f, - 0xc7, 0xb3, 0x72, 0x2d, 0xfa, 0x06, 0x14, 0xa8, 0x36, 0xe8, 0xa6, 0x54, 0x48, 0x68, 0xad, 0x36, - 0xc3, 0x84, 0xd5, 0x5a, 0x6d, 0x62, 0x06, 0x89, 0xde, 0x86, 0x12, 0x5b, 0xcd, 0xd8, 0x1c, 0x2f, - 0x0c, 0x9e, 0x43, 0x98, 0xbf, 0xc2, 0x08, 0x63, 0x5f, 0x0e, 0xf6, 0x70, 0xe5, 0xf7, 0x60, 0x22, - 0x96, 0x08, 0xd0, 0x75, 0x38, 0xa6, 0x99, 0x4a, 0xa7, 0xae, 0x68, 0x8a, 0xd1, 0x26, 0x76, 0x32, - 0x35, 0x66, 0xef, 0x67, 0x56, 0x23, 0x1c, 0x22, 0xa1, 0x04, 0x17, 0x88, 0xd1, 0x3e, 0x1c, 0xc3, - 0x96, 0x15, 0x80, 0xd0, 0x7a, 0x54, 0x85, 0x12, 0x0b, 0x61, 0x6f, 0x65, 0x1a, 0xab, 0x8f, 0x31, - 0x5d, 0x59, 0x64, 0x3b, 0xd8, 0x6b, 0x47, 0x67, 0x00, 0x1c, 0xd2, 0xb6, 0x09, 0xe5, 0x79, 0xc7, - 0x3b, 0x01, 0x0a, 0x32, 0x70, 0x33, 0xe8, 0xc1, 0x11, 0x2a, 0xf9, 0x4f, 0x12, 0x4c, 0xac, 0x13, - 0xfa, 0xae, 0x69, 0xdf, 0x68, 0xf0, 0x0b, 0xda, 0x21, 0xe4, 0xfd, 0xcd, 0x58, 0xde, 0x7f, 0xa5, - 0xcf, 0x31, 0x8b, 0x69, 0x9b, 0x97, 0xfd, 0xe5, 0xbf, 0x4b, 0x50, 0x89, 0x51, 0x46, 0xd3, 0x04, - 0x81, 0x92, 0x65, 0xda, 0xd4, 0x5f, 0xe3, 0x0f, 0xa5, 0x01, 0x4b, 0xa9, 0x91, 0x55, 0x9e, 0xc1, - 0x62, 0x0f, 0x9d, 0xd9, 0xb9, 0x65, 0x9b, 0xba, 0x88, 0xfb, 0xc3, 0x49, 0x21, 0xc4, 0x0e, 0xed, - 0xbc, 0x68, 0x9b, 0x3a, 0xe6, 0xd8, 0xf2, 0x1f, 0x25, 0x98, 0x8e, 0x51, 0x0e, 0x21, 0xa5, 0x2b, - 0xf1, 0x94, 0xfe, 0xe2, 0x61, 0x0c, 0xcb, 0x49, 0xec, 0x5f, 0x25, 0xcd, 0x62, 0x0e, 0x40, 0x5b, - 0x30, 0x6e, 0x99, 0x9d, 0xe6, 0x3d, 0xb8, 0x99, 0x9b, 0x62, 0x2b, 0x64, 0x23, 0xc4, 0xc2, 0x51, - 0x60, 0xb4, 0x0b, 0xd3, 0x86, 0xa2, 0x13, 0xc7, 0x52, 0xda, 0xa4, 0x79, 0x0f, 0xce, 0x45, 0x1e, - 0xe0, 0xb7, 0x05, 0x49, 0x44, 0x9c, 0x16, 0x22, 0xff, 0x2a, 0x65, 0xb7, 0x69, 0x53, 0xf4, 0x2a, - 0x94, 0xf9, 0x23, 0x89, 0xb6, 0xa9, 0x89, 0xa5, 0xed, 0x2c, 0x1b, 0x9a, 0x86, 0x68, 0xbb, 0xbd, - 0x57, 0xfd, 0xef, 0x03, 0x8f, 0x75, 0x7d, 0x42, 0x1c, 0xc0, 0xa0, 0x75, 0x28, 0x5a, 0x87, 0x29, - 0x33, 0xf8, 0xc2, 0xc2, 0x6b, 0x0b, 0x8e, 0x23, 0xff, 0x23, 0xa9, 0x38, 0x5f, 0x5e, 0xae, 0xdf, - 0xb3, 0x01, 0x0b, 0xca, 0x9a, 0xdc, 0x41, 0xb3, 0x61, 0x54, 0xac, 0xb2, 0x22, 0x2e, 0x2f, 0x1d, - 0x26, 0x2e, 0xa3, 0x2b, 0x43, 0xb0, 0x89, 0xf0, 0x1b, 0x7d, 0x41, 0xf2, 0x5f, 0x25, 0x98, 0xe6, - 0x0a, 0xb5, 0x5d, 0x5b, 0xa5, 0xbd, 0xa1, 0x65, 0xd0, 0xad, 0x58, 0x06, 0x5d, 0xee, 0xd3, 0xd0, - 0x94, 0xc6, 0xb9, 0x59, 0xf4, 0x73, 0x09, 0x1e, 0x48, 0x51, 0x0f, 0x21, 0xc3, 0x90, 0x78, 0x86, - 0x79, 0xe5, 0xb0, 0x06, 0xe6, 0x64, 0x99, 0x9b, 0x90, 0x61, 0x1e, 0x0f, 0xdc, 0x33, 0x00, 0x96, - 0xad, 0xee, 0xa8, 0x1a, 0xe9, 0x8a, 0xcb, 0xe0, 0x72, 0x38, 0x24, 0x8d, 0xa0, 0x07, 0x47, 0xa8, - 0xd0, 0xb7, 0x60, 0xb6, 0x43, 0xb6, 0x14, 0x57, 0xa3, 0x8b, 0x9d, 0xce, 0x92, 0x62, 0x29, 0x9b, - 0xaa, 0xa6, 0x52, 0x55, 0xec, 0xb0, 0xc7, 0xea, 0x17, 0xbc, 0x4b, 0xda, 0x2c, 0x8a, 0xdb, 0x7b, - 0xd5, 0xc7, 0x0f, 0xbe, 0x98, 0xf1, 0x89, 0x7b, 0x38, 0x47, 0x08, 0xfa, 0xae, 0x04, 0x15, 0x9b, - 0xbc, 0xe3, 0xaa, 0x36, 0xe9, 0x2c, 0xdb, 0xa6, 0x15, 0xd3, 0xa0, 0xc0, 0x35, 0xb8, 0xb4, 0xbf, - 0x57, 0xad, 0xe0, 0x1c, 0x9a, 0x7e, 0x74, 0xc8, 0x15, 0x84, 0x28, 0xcc, 0x28, 0x9a, 0x66, 0xbe, - 0x4b, 0xe2, 0x1e, 0x28, 0x72, 0xf9, 0xf5, 0xfd, 0xbd, 0xea, 0xcc, 0x62, 0xba, 0xbb, 0x1f, 0xd1, - 0x59, 0xf0, 0x68, 0x01, 0x46, 0x77, 0x4c, 0xcd, 0xd5, 0x89, 0x53, 0x29, 0x71, 0x49, 0x2c, 0xe3, - 0x8e, 0x5e, 0xf5, 0x9a, 0x6e, 0xef, 0x55, 0x8f, 0x5e, 0x6c, 0xf2, 0xa3, 0x0f, 0x9f, 0x8a, 0xed, - 0xd1, 0x58, 0xcd, 0x24, 0xa6, 0x3c, 0x3f, 0x77, 0x2d, 0x87, 0x39, 0xe6, 0x72, 0xd8, 0x85, 0xa3, - 0x74, 0x48, 0x87, 0xb1, 0x6d, 0xb1, 0x6f, 0x77, 0x2a, 0xa3, 0x03, 0xad, 0x7e, 0xb1, 0x7d, 0x7f, - 0x7d, 0x5a, 0x88, 0x1c, 0xf3, 0x9b, 0x1d, 0x1c, 0x4a, 0x40, 0x4f, 0xc0, 0x28, 0xff, 0x58, 0x59, - 0xe6, 0xa7, 0xb5, 0xe5, 0x30, 0x13, 0x5d, 0xf6, 0x9a, 0xb1, 0xdf, 0xef, 0x93, 0xae, 0x34, 0x96, - 0xf8, 0xe1, 0x6a, 0x82, 0x74, 0xa5, 0xb1, 0x84, 0xfd, 0x7e, 0x64, 0xc1, 0xa8, 0x43, 0x56, 0x55, - 0xc3, 0xdd, 0xad, 0xc0, 0x40, 0xd7, 0xc5, 0xcd, 0x0b, 0x9c, 0x3b, 0x71, 0x14, 0x15, 0x4a, 0x14, - 0xfd, 0xd8, 0x17, 0x83, 0x76, 0x61, 0xcc, 0x76, 0x8d, 0x45, 0x67, 0xc3, 0x21, 0x76, 0x65, 0x9c, - 0xcb, 0xec, 0x37, 0x39, 0x63, 0x9f, 0x3f, 0x29, 0x35, 0xf0, 0x60, 0x40, 0x81, 0x43, 0x61, 0xe8, - 0x23, 0x09, 0x90, 0xe3, 0x5a, 0x96, 0x46, 0x74, 0x62, 0x50, 0x45, 0xe3, 0xa7, 0x61, 0x4e, 0xe5, - 0x18, 0xd7, 0xa1, 0xd1, 0xaf, 0xdd, 0x29, 0xa0, 0xa4, 0x32, 0xc1, 0x51, 0x73, 0x9a, 0x14, 0x67, - 0xe8, 0xc1, 0x86, 0x62, 0xcb, 0xe1, 0xbf, 0x2b, 0x13, 0x03, 0x0d, 0x45, 0xf6, 0xa9, 0x60, 0x38, - 0x14, 0xa2, 0x1f, 0xfb, 0x62, 0xd0, 0x55, 0x98, 0xb5, 0x89, 0xd2, 0xb9, 0x62, 0x68, 0x3d, 0x6c, - 0x9a, 0xf4, 0xa2, 0xaa, 0x11, 0xa7, 0xe7, 0x50, 0xa2, 0x57, 0x26, 0x79, 0xd8, 0x04, 0x4f, 0x2e, - 0x70, 0x26, 0x15, 0xce, 0xe1, 0xe6, 0x2f, 0x01, 0xc4, 0x19, 0xec, 0x70, 0xde, 0xd2, 0x1d, 0xee, - 0x25, 0x40, 0xa8, 0xea, 0x7d, 0x7b, 0x09, 0x10, 0x11, 0x71, 0xf0, 0x11, 0xd2, 0x57, 0x23, 0x30, - 0x13, 0x12, 0xdf, 0xf5, 0x4b, 0x80, 0x0c, 0x96, 0x21, 0xbc, 0x04, 0xc8, 0xbe, 0x4a, 0x2f, 0xdc, - 0xef, 0xab, 0xf4, 0xfb, 0xf0, 0x02, 0x81, 0xdf, 0xce, 0x87, 0x4e, 0xfc, 0xf7, 0xbf, 0x9d, 0x0f, - 0x75, 0xcd, 0x29, 0x67, 0x7e, 0x33, 0x12, 0x35, 0xe8, 0x3f, 0xe8, 0x0a, 0xf8, 0xf0, 0x2f, 0x0d, - 0xe5, 0xcf, 0x0b, 0x70, 0x3c, 0x39, 0x63, 0x63, 0x37, 0x81, 0xd2, 0x1d, 0x6f, 0x02, 0x1b, 0x70, - 0x62, 0xcb, 0xd5, 0xb4, 0x1e, 0x77, 0x48, 0xe4, 0x3a, 0xd0, 0x3b, 0xb5, 0x7f, 0x58, 0x70, 0x9e, - 0xb8, 0x98, 0x41, 0x83, 0x33, 0x39, 0x73, 0x6e, 0x35, 0x0b, 0x03, 0xdd, 0x6a, 0xa6, 0x2e, 0xd5, - 0x8a, 0x77, 0x7f, 0xa9, 0x96, 0x7d, 0x43, 0x59, 0x1a, 0xe0, 0x86, 0xf2, 0x5e, 0x5c, 0x29, 0x66, - 0x24, 0xbe, 0x3b, 0x5d, 0x29, 0xca, 0x0f, 0xc3, 0x9c, 0x60, 0x63, 0xdf, 0x4b, 0xa6, 0x41, 0x6d, - 0x53, 0xd3, 0x88, 0xbd, 0xec, 0xea, 0x7a, 0x4f, 0x3e, 0x0f, 0x93, 0xf1, 0x7b, 0x6d, 0x6f, 0xe4, - 0xbd, 0xab, 0x76, 0x71, 0x97, 0x12, 0x19, 0x79, 0xaf, 0x1d, 0x07, 0x14, 0xf2, 0x07, 0x12, 0xcc, - 0x66, 0xbf, 0xa1, 0x43, 0x1a, 0x4c, 0xea, 0xca, 0x6e, 0xf4, 0x11, 0xa1, 0x34, 0xe0, 0x8e, 0x1b, - 0xed, 0xef, 0x55, 0x27, 0xd7, 0x62, 0x58, 0x38, 0x81, 0x2d, 0x7f, 0x21, 0xc1, 0xc9, 0x9c, 0x6b, - 0xc6, 0xe1, 0x6a, 0x82, 0xae, 0x41, 0x59, 0x57, 0x76, 0x9b, 0xae, 0xdd, 0x25, 0x03, 0x9f, 0x31, - 0xf0, 0x5c, 0xb2, 0x26, 0x50, 0x70, 0x80, 0x27, 0x7f, 0x22, 0x41, 0x25, 0xaf, 0x1e, 0x44, 0x67, - 0x63, 0x17, 0xa2, 0x8f, 0x26, 0x2e, 0x44, 0xa7, 0x53, 0x7c, 0x43, 0xba, 0x0e, 0xfd, 0x54, 0x82, - 0xd9, 0xec, 0xba, 0x19, 0x3d, 0x13, 0xd3, 0xb8, 0x9a, 0xd0, 0x78, 0x2a, 0xc1, 0x25, 0xf4, 0xdd, - 0x86, 0x49, 0x51, 0x5d, 0x0b, 0x18, 0xe1, 0xe5, 0x27, 0x0f, 0xce, 0xaa, 0x02, 0xcc, 0xaf, 0x13, - 0xf9, 0x48, 0xc6, 0xdb, 0x70, 0x02, 0x57, 0xfe, 0xd9, 0x08, 0x94, 0x9a, 0x6d, 0x45, 0x23, 0x43, - 0x28, 0xea, 0xae, 0xc5, 0x8a, 0xba, 0x7e, 0xdf, 0xf9, 0x73, 0x2d, 0x73, 0xeb, 0xb9, 0xcd, 0x44, - 0x3d, 0x77, 0x6e, 0x20, 0xf4, 0x83, 0x4b, 0xb9, 0xe7, 0x61, 0x2c, 0x50, 0xa2, 0xbf, 0xd5, 0x43, - 0xfe, 0x78, 0x04, 0xc6, 0x23, 0x22, 0xfa, 0x5c, 0x7b, 0x76, 0x62, 0xab, 0xf7, 0x20, 0x7f, 0x29, - 0x8a, 0xc8, 0xae, 0xf9, 0xeb, 0xb7, 0xf7, 0x86, 0x2e, 0x7c, 0x0b, 0x95, 0x5e, 0xd6, 0xcf, 0xc3, - 0x24, 0xe5, 0xff, 0xb0, 0x09, 0xce, 0xf8, 0x0a, 0x3c, 0x8a, 0x83, 0x97, 0x99, 0xad, 0x58, 0x2f, - 0x4e, 0x50, 0xcf, 0xbd, 0x00, 0x13, 0x31, 0x61, 0x7d, 0x3d, 0x79, 0xfb, 0xad, 0x04, 0x8f, 0xde, - 0x71, 0x4f, 0x86, 0xea, 0xb1, 0xe9, 0x55, 0x4b, 0x4c, 0xaf, 0xf9, 0x7c, 0x80, 0x21, 0x3e, 0x96, - 0xf8, 0xd1, 0x08, 0xa0, 0xd6, 0xb6, 0x6a, 0x77, 0x1a, 0x8a, 0x4d, 0x7b, 0x58, 0xfc, 0x8f, 0x6a, - 0x08, 0x13, 0xee, 0x2c, 0x8c, 0x77, 0x88, 0xd3, 0xb6, 0x55, 0xee, 0x2c, 0xb1, 0x57, 0x08, 0xce, - 0x41, 0x96, 0xc3, 0x2e, 0x1c, 0xa5, 0x43, 0x5d, 0x28, 0xef, 0x78, 0xff, 0xd4, 0xf3, 0x6f, 0xde, - 0xfa, 0x2d, 0x66, 0xc3, 0xff, 0xfa, 0x85, 0xf1, 0x25, 0x1a, 0x1c, 0x1c, 0x80, 0xcb, 0x1f, 0x4a, - 0x30, 0x9b, 0x76, 0xcc, 0x32, 0x53, 0xfd, 0xfe, 0x3b, 0xe7, 0x61, 0x28, 0x72, 0x74, 0xe6, 0x95, - 0x63, 0xde, 0x89, 0x37, 0x93, 0x8c, 0x79, 0xab, 0xfc, 0xa5, 0x04, 0x73, 0xd9, 0xaa, 0x0d, 0x61, - 0x2b, 0x71, 0x3d, 0xbe, 0x95, 0xe8, 0xf7, 0xd8, 0x20, 0x5b, 0xef, 0x9c, 0x6d, 0xc5, 0x5e, 0xe6, - 0x18, 0x0c, 0xc1, 0xc8, 0xad, 0xb8, 0x91, 0x8b, 0x87, 0x36, 0x32, 0xdb, 0xc0, 0xfa, 0x13, 0x37, - 0x6f, 0xcd, 0x1f, 0xf9, 0xec, 0xd6, 0xfc, 0x91, 0x3f, 0xdf, 0x9a, 0x3f, 0xf2, 0xfe, 0xfe, 0xbc, - 0x74, 0x73, 0x7f, 0x5e, 0xfa, 0x6c, 0x7f, 0x5e, 0xfa, 0xdb, 0xfe, 0xbc, 0xf4, 0x83, 0x2f, 0xe6, - 0x8f, 0x5c, 0x1b, 0x15, 0x98, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xfb, 0x34, 0x4b, 0xec, - 0x3c, 0x00, 0x00, + 0x5e, 0x13, 0xec, 0xb3, 0x4f, 0x75, 0x55, 0xba, 0xed, 0x6e, 0xd6, 0xda, 0xa6, 0xbe, 0xd0, 0x35, + 0xbb, 0xe6, 0x02, 0x47, 0xd9, 0x74, 0xb7, 0xf8, 0x2f, 0xfe, 0x83, 0xff, 0xe5, 0xa1, 0xcf, 0xfe, + 0xbf, 0x50, 0x4e, 0xb1, 0x54, 0x5d, 0x69, 0x6f, 0xab, 0x06, 0xb1, 0x7b, 0xbe, 0x7a, 0x0b, 0x36, + 0x71, 0x4c, 0xd7, 0x6e, 0x93, 0xa4, 0x4e, 0x07, 0x72, 0x39, 0x0b, 0x3a, 0xa1, 0xca, 0xc2, 0x4e, + 0xca, 0x92, 0xd9, 0x85, 0x3c, 0x2e, 0xdb, 0x35, 0xa8, 0xaa, 0xa7, 0xc5, 0x3c, 0x7b, 0x27, 0x06, + 0xa7, 0xbd, 0x4d, 0x74, 0x25, 0xc5, 0xf7, 0x4c, 0x1e, 0x9f, 0x4b, 0x55, 0x6d, 0x41, 0x35, 0xa8, + 0x43, 0xed, 0x83, 0x6c, 0x72, 0x88, 0xbd, 0x43, 0xec, 0xe8, 0x2a, 0x29, 0xba, 0xa5, 0x91, 0x2c, + 0x9b, 0x9e, 0xcc, 0x5d, 0xdc, 0x2c, 0xea, 0xe7, 0x0f, 0x08, 0x05, 0xcb, 0xd4, 0xd4, 0x76, 0x2f, + 0x2f, 0x0c, 0xe4, 0x1a, 0xc0, 0x62, 0x63, 0xe5, 0x2a, 0xb1, 0xd9, 0x72, 0xa3, 0x53, 0x50, 0x32, + 0x14, 0x9d, 0x54, 0xa5, 0x53, 0xd2, 0xe9, 0xd1, 0xfa, 0xb1, 0x9b, 0x7b, 0xf3, 0x47, 0xf6, 0xf7, + 0xe6, 0x4b, 0xeb, 0x8a, 0x4e, 0x30, 0x9f, 0x91, 0x7f, 0x2c, 0xc1, 0x83, 0x4b, 0xae, 0x43, 0x4d, + 0x7d, 0x8d, 0x50, 0x5b, 0x6d, 0x2f, 0xb9, 0xb6, 0x4d, 0x0c, 0xda, 0xa4, 0x0a, 0x75, 0x9d, 0x3b, + 0xf3, 0xa3, 0x6b, 0x50, 0xde, 0x51, 0x34, 0x97, 0x54, 0x0b, 0xa7, 0xa4, 0xd3, 0x63, 0x67, 0x6a, + 0x35, 0x11, 0x86, 0x51, 0x9f, 0xfa, 0x81, 0x58, 0xf3, 0x03, 0xa5, 0xf6, 0xaa, 0xab, 0x18, 0x54, + 0xa5, 0xbd, 0xfa, 0x09, 0x01, 0x79, 0x4c, 0xc8, 0xbd, 0xca, 0xb0, 0xb0, 0x07, 0x29, 0x7f, 0x5f, + 0x82, 0x47, 0x72, 0x75, 0x5b, 0x55, 0x1d, 0x8a, 0x74, 0x28, 0xab, 0x94, 0xe8, 0x4e, 0x55, 0x3a, + 0x55, 0x3c, 0x3d, 0x76, 0xe6, 0x72, 0xad, 0xaf, 0x4d, 0x50, 0xcb, 0x05, 0xaf, 0x8f, 0x0b, 0xbd, + 0xca, 0x2b, 0x0c, 0x1e, 0x7b, 0x52, 0xe4, 0x1f, 0x4a, 0x80, 0xa2, 0x3c, 0x2d, 0xc5, 0xee, 0x12, + 0x7a, 0x17, 0x5e, 0x7a, 0xed, 0x70, 0x5e, 0x9a, 0x16, 0x90, 0x63, 0x9e, 0xc0, 0x98, 0x93, 0xde, + 0x97, 0x60, 0x26, 0xad, 0x13, 0xf7, 0xce, 0x56, 0xdc, 0x3b, 0x8b, 0x87, 0xf0, 0x8e, 0x87, 0x9a, + 0xe3, 0x96, 0x5f, 0x15, 0x60, 0x74, 0x59, 0x21, 0xba, 0x69, 0x34, 0x09, 0x45, 0xdf, 0x84, 0x0a, + 0xdb, 0xd9, 0x1d, 0x85, 0x2a, 0xdc, 0x23, 0x63, 0x67, 0xfe, 0xef, 0x20, 0x73, 0x9d, 0x1a, 0xa3, + 0xae, 0xed, 0x3c, 0x5d, 0xbb, 0xb2, 0x79, 0x9d, 0xb4, 0xe9, 0x1a, 0xa1, 0x4a, 0x1d, 0x09, 0x39, + 0x10, 0x8e, 0xe1, 0x00, 0x15, 0xbd, 0x05, 0x25, 0xc7, 0x22, 0x6d, 0xe1, 0xcc, 0x17, 0xfb, 0x34, + 0x2b, 0xd0, 0xb4, 0x69, 0x91, 0x76, 0xb8, 0x5a, 0xec, 0x17, 0xe6, 0xb8, 0x68, 0x0b, 0x8e, 0x3a, + 0x3c, 0x0c, 0xaa, 0x45, 0x2e, 0xe1, 0xfc, 0xc0, 0x12, 0xbc, 0x60, 0x9a, 0x10, 0x32, 0x8e, 0x7a, + 0xbf, 0xb1, 0x40, 0x97, 0x7f, 0x2f, 0xc1, 0x78, 0x40, 0xcb, 0x57, 0xec, 0x8d, 0x94, 0xef, 0x6a, + 0x77, 0xe7, 0x3b, 0xc6, 0xcd, 0x3d, 0x77, 0x5c, 0xc8, 0xaa, 0xf8, 0x23, 0x11, 0xbf, 0xbd, 0xe9, + 0xc7, 0x43, 0x81, 0xc7, 0xc3, 0x73, 0x83, 0x9a, 0x95, 0x13, 0x06, 0x5f, 0x14, 0x23, 0xe6, 0x30, + 0x77, 0xa2, 0x37, 0xa1, 0xe2, 0x10, 0x8d, 0xb4, 0xa9, 0x69, 0x0b, 0x73, 0x9e, 0xb9, 0x4b, 0x73, + 0x94, 0x4d, 0xa2, 0x35, 0x05, 0x6b, 0xfd, 0x18, 0xb3, 0xc7, 0xff, 0x85, 0x03, 0x48, 0xf4, 0x3a, + 0x54, 0x28, 0xd1, 0x2d, 0x4d, 0xa1, 0xfe, 0xc6, 0x7a, 0x2a, 0xdf, 0x24, 0x06, 0xdb, 0x30, 0x3b, + 0x2d, 0xc1, 0xc0, 0x17, 0x3f, 0x70, 0x96, 0x3f, 0x8a, 0x03, 0x40, 0xf4, 0x81, 0x04, 0x13, 0xae, + 0xd5, 0x61, 0xa4, 0x94, 0x25, 0xd8, 0x6e, 0x4f, 0x44, 0xc3, 0xc5, 0x41, 0xdd, 0xb6, 0x11, 0x43, + 0xab, 0xcf, 0x08, 0xe1, 0x13, 0xf1, 0x71, 0x9c, 0x90, 0x8a, 0x16, 0x61, 0x52, 0x57, 0x0d, 0x4c, + 0x94, 0x4e, 0xaf, 0x49, 0xda, 0xa6, 0xd1, 0x71, 0xaa, 0xa5, 0x53, 0xd2, 0xe9, 0x72, 0xfd, 0xa4, + 0x00, 0x98, 0x5c, 0x8b, 0x4f, 0xe3, 0x24, 0x3d, 0xfa, 0x3a, 0x20, 0xdf, 0xae, 0x4b, 0xde, 0x79, + 0xa1, 0x9a, 0x46, 0xb5, 0x7c, 0x4a, 0x3a, 0x5d, 0xac, 0xcf, 0x0a, 0x14, 0xd4, 0x4a, 0x51, 0xe0, + 0x0c, 0x2e, 0xf9, 0x9f, 0x25, 0x98, 0x4c, 0x04, 0x38, 0xba, 0x0a, 0x33, 0x6d, 0x2f, 0x7d, 0xae, + 0xbb, 0xfa, 0x26, 0xb1, 0x9b, 0xed, 0x6d, 0xd2, 0x71, 0x35, 0xd2, 0xe1, 0xab, 0x5e, 0xae, 0xcf, + 0x09, 0x19, 0x33, 0x4b, 0x99, 0x54, 0x38, 0x87, 0x9b, 0xe9, 0x6d, 0xf0, 0xa1, 0x35, 0xd5, 0x71, + 0x02, 0xcc, 0x02, 0xc7, 0x0c, 0xf4, 0x5e, 0x4f, 0x51, 0xe0, 0x0c, 0x2e, 0xa6, 0x63, 0x87, 0x38, + 0xaa, 0x4d, 0x3a, 0x49, 0x1d, 0x8b, 0x71, 0x1d, 0x97, 0x33, 0xa9, 0x70, 0x0e, 0x37, 0x3a, 0x0b, + 0x63, 0x9e, 0x34, 0xee, 0x71, 0xb1, 0x34, 0x41, 0xc2, 0x5e, 0x0f, 0xa7, 0x70, 0x94, 0x8e, 0x99, + 0x66, 0x6e, 0xf2, 0x02, 0xa2, 0x93, 0xbf, 0x24, 0x57, 0x52, 0x14, 0x38, 0x83, 0x8b, 0x99, 0xe6, + 0xc5, 0x4c, 0xca, 0xb4, 0xa3, 0x71, 0xd3, 0x36, 0x32, 0xa9, 0x70, 0x0e, 0x37, 0x8b, 0x3c, 0x4f, + 0xe5, 0xc5, 0x1d, 0x45, 0xd5, 0x94, 0x4d, 0x8d, 0x54, 0x47, 0xe2, 0x91, 0xb7, 0x1e, 0x9f, 0xc6, + 0x49, 0x7a, 0x74, 0x09, 0xa6, 0xbc, 0xa1, 0x0d, 0x43, 0x09, 0x40, 0x2a, 0x1c, 0xe4, 0x41, 0x01, + 0x32, 0xb5, 0x9e, 0x24, 0xc0, 0x69, 0x1e, 0xf9, 0x2f, 0x12, 0x9c, 0xcc, 0xd9, 0x49, 0xe8, 0x65, + 0x28, 0xd1, 0x9e, 0xe5, 0x9f, 0xbf, 0xff, 0xeb, 0x67, 0xf4, 0x56, 0xcf, 0x22, 0xb7, 0xf7, 0xe6, + 0x1f, 0xca, 0x61, 0x63, 0xd3, 0x98, 0x33, 0xa2, 0x6f, 0xc3, 0xb8, 0x6d, 0x6a, 0x9a, 0x6a, 0x74, + 0x3d, 0x12, 0x91, 0x4d, 0x2e, 0xf4, 0xb9, 0xd3, 0x71, 0x14, 0x23, 0xcc, 0x96, 0x53, 0xfb, 0x7b, + 0xf3, 0xe3, 0xb1, 0x39, 0x1c, 0x17, 0x27, 0xff, 0xa6, 0x00, 0xb0, 0x4c, 0x2c, 0xcd, 0xec, 0xe9, + 0xc4, 0x18, 0xc6, 0x09, 0xfa, 0x76, 0xec, 0x04, 0x7d, 0xa9, 0xdf, 0x8c, 0x16, 0xa8, 0x9a, 0x7b, + 0x84, 0x76, 0x13, 0x47, 0xe8, 0xcb, 0x83, 0x8b, 0x38, 0xf8, 0x0c, 0xbd, 0x55, 0x84, 0xe9, 0x90, + 0x78, 0xc9, 0x34, 0x3a, 0x2a, 0xdf, 0x13, 0x2f, 0xc4, 0x62, 0xe2, 0xf1, 0x44, 0x4c, 0x9c, 0xcc, + 0x60, 0x89, 0xc4, 0xc3, 0xd5, 0x40, 0xfb, 0x02, 0x67, 0x3f, 0x1f, 0x17, 0x7e, 0x7b, 0x6f, 0xfe, + 0xc0, 0x7a, 0xbe, 0x16, 0x60, 0xc6, 0x95, 0x45, 0x8f, 0xc1, 0x51, 0x9b, 0x28, 0x8e, 0x69, 0xf0, + 0x34, 0x31, 0x1a, 0x1a, 0x85, 0xf9, 0x28, 0x16, 0xb3, 0xe8, 0x09, 0x18, 0xd1, 0x89, 0xe3, 0x28, + 0x5d, 0xc2, 0x33, 0xc2, 0x68, 0x7d, 0x52, 0x10, 0x8e, 0xac, 0x79, 0xc3, 0xd8, 0x9f, 0x47, 0xd7, + 0x61, 0x42, 0x53, 0x1c, 0x11, 0xda, 0x2d, 0x55, 0x27, 0x7c, 0xcf, 0x8f, 0x9d, 0xf9, 0x9f, 0xbb, + 0x8b, 0x18, 0xc6, 0x11, 0x9e, 0x44, 0xab, 0x31, 0x24, 0x9c, 0x40, 0x46, 0x3b, 0x80, 0xd8, 0x48, + 0xcb, 0x56, 0x0c, 0xc7, 0x73, 0x19, 0x93, 0x37, 0xd2, 0xb7, 0xbc, 0x20, 0xbf, 0xad, 0xa6, 0xd0, + 0x70, 0x86, 0x04, 0xf9, 0x0f, 0x12, 0x4c, 0x84, 0x0b, 0x36, 0x84, 0x42, 0xe9, 0xad, 0x78, 0xa1, + 0xf4, 0xfc, 0xc0, 0xc1, 0x9b, 0x53, 0x29, 0x7d, 0x58, 0x04, 0x14, 0x12, 0xb1, 0xd4, 0xb0, 0xa9, + 0xb4, 0x6f, 0xdc, 0xc5, 0x3d, 0xe2, 0x67, 0x12, 0x20, 0x91, 0xac, 0x17, 0x0d, 0xc3, 0xa4, 0x3c, + 0xff, 0xfb, 0x6a, 0xbe, 0x36, 0xb0, 0x9a, 0xbe, 0x06, 0xb5, 0x8d, 0x14, 0xf6, 0x05, 0x83, 0xda, + 0xbd, 0x70, 0xc5, 0xd2, 0x04, 0x38, 0x43, 0x21, 0xf4, 0x0e, 0x80, 0x2d, 0x30, 0x5b, 0xa6, 0x48, + 0x01, 0x2f, 0x0d, 0x90, 0x4d, 0x19, 0xc0, 0x92, 0x69, 0x6c, 0xa9, 0xdd, 0x30, 0xa1, 0xe1, 0x00, + 0x18, 0x47, 0x84, 0xcc, 0x5e, 0x80, 0x93, 0x39, 0xda, 0xa3, 0xe3, 0x50, 0xbc, 0x41, 0x7a, 0x9e, + 0x5b, 0x31, 0xfb, 0x13, 0x9d, 0x88, 0xde, 0xc7, 0x46, 0xc5, 0x55, 0xea, 0x5c, 0xe1, 0x39, 0x49, + 0xfe, 0xb2, 0x1c, 0x8d, 0x35, 0x5e, 0xc5, 0x9e, 0x86, 0x8a, 0x4d, 0x2c, 0x4d, 0x6d, 0x2b, 0x8e, + 0xa8, 0x67, 0x78, 0x41, 0x8a, 0xc5, 0x18, 0x0e, 0x66, 0x63, 0xf5, 0x6e, 0xe1, 0xfe, 0xd6, 0xbb, + 0xc5, 0x7b, 0x5d, 0xef, 0x9a, 0x50, 0x71, 0xfc, 0x42, 0xb7, 0xc4, 0xc1, 0x17, 0x0f, 0x91, 0xb3, + 0x45, 0x8d, 0x1b, 0x08, 0x0c, 0xaa, 0xdb, 0x40, 0x48, 0x56, 0x5d, 0x5b, 0xee, 0xb3, 0xae, 0x5d, + 0x85, 0x13, 0x36, 0xd9, 0x51, 0x99, 0x1a, 0x97, 0x55, 0x87, 0x9a, 0x76, 0x6f, 0x55, 0xd5, 0x55, + 0x2a, 0xca, 0x9e, 0xea, 0xfe, 0xde, 0xfc, 0x09, 0x9c, 0x31, 0x8f, 0x33, 0xb9, 0x58, 0x76, 0xb6, + 0x14, 0xd7, 0x21, 0x1d, 0x9e, 0xd2, 0x2a, 0x61, 0x76, 0x6e, 0xf0, 0x51, 0x2c, 0x66, 0x91, 0x1e, + 0x0b, 0xee, 0xca, 0xbd, 0x08, 0xee, 0x89, 0xfc, 0xc0, 0x46, 0x1b, 0x70, 0xd2, 0xb2, 0xcd, 0xae, + 0x4d, 0x1c, 0x67, 0x99, 0x28, 0x1d, 0x4d, 0x35, 0x88, 0xef, 0xaf, 0x51, 0x6e, 0xe7, 0x43, 0xfb, + 0x7b, 0xf3, 0x27, 0x1b, 0xd9, 0x24, 0x38, 0x8f, 0x57, 0xfe, 0xac, 0x04, 0xc7, 0x93, 0xa7, 0x6c, + 0x4e, 0x55, 0x2a, 0x0d, 0x54, 0x95, 0x3e, 0x19, 0xd9, 0x36, 0x5e, 0xc9, 0x1e, 0x44, 0x43, 0xc6, + 0xd6, 0x59, 0x84, 0x49, 0x91, 0x47, 0xfc, 0x49, 0x51, 0x97, 0x07, 0xd1, 0xb0, 0x11, 0x9f, 0xc6, + 0x49, 0x7a, 0x56, 0x6b, 0x86, 0x25, 0xa4, 0x0f, 0x52, 0x8a, 0xd7, 0x9a, 0x8b, 0x49, 0x02, 0x9c, + 0xe6, 0x41, 0x6b, 0x30, 0xed, 0x1a, 0x69, 0x28, 0x2f, 0x3a, 0x1f, 0x12, 0x50, 0xd3, 0x1b, 0x69, + 0x12, 0x9c, 0xc5, 0x87, 0x76, 0x00, 0xda, 0x7e, 0x41, 0xe0, 0x54, 0x8f, 0xf2, 0x5c, 0x5d, 0x1f, + 0x78, 0x6f, 0x05, 0xb5, 0x45, 0x98, 0x11, 0x83, 0x21, 0x07, 0x47, 0x24, 0xa1, 0x17, 0x60, 0xdc, + 0xe6, 0x17, 0x0f, 0xdf, 0x00, 0xaf, 0x78, 0x7f, 0x40, 0xb0, 0x8d, 0xe3, 0xe8, 0x24, 0x8e, 0xd3, + 0xa2, 0x73, 0x30, 0xd1, 0x66, 0x35, 0x2a, 0x53, 0x63, 0xc9, 0x74, 0x0d, 0xca, 0x03, 0xbd, 0x58, + 0x47, 0xac, 0x4e, 0x58, 0x8a, 0xcd, 0xe0, 0x04, 0xa5, 0xfc, 0x47, 0x29, 0x7a, 0xbc, 0x05, 0x65, + 0xfa, 0xb9, 0x58, 0x49, 0xf6, 0x58, 0xa2, 0x24, 0x9b, 0x49, 0x73, 0x44, 0x2a, 0xb2, 0xef, 0x64, + 0x57, 0xe8, 0x17, 0x0f, 0x55, 0xa1, 0x87, 0xc7, 0xf4, 0x9d, 0x4b, 0xf4, 0x8f, 0x25, 0x98, 0xb9, + 0xd8, 0xbc, 0x64, 0x9b, 0xae, 0xe5, 0xab, 0x77, 0xc5, 0xf2, 0xfc, 0xfc, 0x35, 0x28, 0xd9, 0xae, + 0xe6, 0xdb, 0xf5, 0x5f, 0xbe, 0x5d, 0xd8, 0xd5, 0x98, 0x5d, 0xd3, 0x09, 0x2e, 0xcf, 0x28, 0xc6, + 0x80, 0xde, 0x82, 0xa3, 0xb6, 0x62, 0x74, 0x89, 0x7f, 0x80, 0x3f, 0xdb, 0xa7, 0x35, 0x2b, 0xcb, + 0x98, 0xb1, 0x47, 0xca, 0x48, 0x8e, 0x86, 0x05, 0xaa, 0xfc, 0x53, 0x09, 0x26, 0x2f, 0xb7, 0x5a, + 0x8d, 0x15, 0x83, 0x67, 0x80, 0x86, 0x42, 0xb7, 0x59, 0x8d, 0x61, 0x29, 0x74, 0x3b, 0x59, 0x63, + 0xb0, 0x39, 0xcc, 0x67, 0xd0, 0x36, 0x8c, 0xb0, 0xcc, 0x43, 0x8c, 0xce, 0x80, 0xd7, 0x03, 0x21, + 0xae, 0xee, 0x81, 0x84, 0xb5, 0xab, 0x18, 0xc0, 0x3e, 0xbc, 0xfc, 0x1e, 0x9c, 0x88, 0xa8, 0xc7, + 0xfc, 0xc5, 0x5f, 0x36, 0x51, 0x1b, 0xca, 0x4c, 0x13, 0xff, 0xdd, 0xb2, 0xdf, 0xe7, 0xb7, 0x84, + 0xc9, 0x61, 0x0d, 0xc6, 0x7e, 0x39, 0xd8, 0xc3, 0x96, 0xd7, 0x60, 0xfc, 0xb2, 0xe9, 0xd0, 0x86, + 0x69, 0x53, 0xee, 0x36, 0xf4, 0x08, 0x14, 0x75, 0xd5, 0x10, 0x27, 0xfc, 0x98, 0xe0, 0x29, 0xb2, + 0x33, 0x88, 0x8d, 0xf3, 0x69, 0x65, 0x57, 0x64, 0xb2, 0x70, 0x5a, 0xd9, 0xc5, 0x6c, 0x5c, 0xbe, + 0x04, 0x23, 0x62, 0x39, 0xa2, 0x40, 0xc5, 0x83, 0x81, 0x8a, 0x19, 0x40, 0xbf, 0x2c, 0xc0, 0x88, + 0xd0, 0x7e, 0x08, 0x17, 0xc1, 0x37, 0x62, 0x17, 0xc1, 0x73, 0x83, 0xad, 0x74, 0xee, 0x2d, 0xb0, + 0x93, 0xb8, 0x05, 0xbe, 0x38, 0x20, 0xfe, 0xc1, 0x57, 0xc0, 0x8f, 0x24, 0x98, 0x88, 0xc7, 0x1c, + 0x3a, 0x0b, 0x63, 0xec, 0x3c, 0x52, 0xdb, 0x64, 0x3d, 0x2c, 0xa8, 0x83, 0x47, 0x99, 0x66, 0x38, + 0x85, 0xa3, 0x74, 0xa8, 0x1b, 0xb0, 0xb1, 0xb0, 0x10, 0x4e, 0xc9, 0x77, 0xb9, 0x4b, 0x55, 0xad, + 0xe6, 0xb5, 0x89, 0x6a, 0x2b, 0x06, 0xbd, 0x62, 0x37, 0xa9, 0xad, 0x1a, 0xdd, 0x94, 0x20, 0x1e, + 0x63, 0x51, 0x64, 0xf9, 0xa6, 0x04, 0x63, 0x42, 0xe5, 0x21, 0x5c, 0x67, 0x5e, 0x8f, 0x5f, 0x67, + 0x9e, 0x1d, 0x70, 0x3f, 0x67, 0xdf, 0x65, 0x3e, 0x09, 0x4d, 0x61, 0x3b, 0x98, 0x25, 0x98, 0x6d, + 0xd3, 0xa1, 0xc9, 0x04, 0xc3, 0xf6, 0x1a, 0xe6, 0x33, 0xe8, 0x7b, 0x12, 0x1c, 0x57, 0x13, 0x7b, + 0x5e, 0xf8, 0xfa, 0xe5, 0xc1, 0x54, 0x0b, 0x60, 0xea, 0x55, 0x21, 0xef, 0x78, 0x72, 0x06, 0xa7, + 0x44, 0xca, 0x2e, 0xa4, 0xa8, 0x90, 0x02, 0xa5, 0x6d, 0x4a, 0x2d, 0xb1, 0x08, 0x4b, 0x83, 0x67, + 0x9e, 0x50, 0xa5, 0x0a, 0x37, 0xbf, 0xd5, 0x6a, 0x60, 0x0e, 0x2d, 0xff, 0xa2, 0x10, 0x38, 0xac, + 0xe9, 0x6d, 0x92, 0x20, 0xdf, 0x4a, 0xf7, 0x22, 0xdf, 0x8e, 0x65, 0xe5, 0x5a, 0xf4, 0x0d, 0x28, + 0x52, 0x6d, 0xd0, 0x0b, 0xad, 0x90, 0xd0, 0x5a, 0x6d, 0x86, 0x09, 0xab, 0xb5, 0xda, 0xc4, 0x0c, + 0x12, 0xbd, 0x0d, 0x65, 0x76, 0x9a, 0xb1, 0x3d, 0x5e, 0x1c, 0x3c, 0x87, 0x30, 0x7f, 0x85, 0x11, + 0xc6, 0x7e, 0x39, 0xd8, 0xc3, 0x95, 0xdf, 0x83, 0xf1, 0x58, 0x22, 0x40, 0xd7, 0xe1, 0x98, 0x66, + 0x2a, 0x9d, 0xba, 0xa2, 0x29, 0x46, 0x9b, 0xd8, 0xc9, 0xd4, 0x98, 0x7d, 0x17, 0x5a, 0x8d, 0x70, + 0x88, 0x84, 0x12, 0x34, 0x1f, 0xa3, 0x73, 0x38, 0x86, 0x2d, 0x2b, 0x00, 0xa1, 0xf5, 0x68, 0x1e, + 0xca, 0x2c, 0x84, 0xbd, 0x93, 0x69, 0xb4, 0x3e, 0xca, 0x74, 0x65, 0x91, 0xed, 0x60, 0x6f, 0x1c, + 0x9d, 0x01, 0x70, 0x48, 0xdb, 0x26, 0x94, 0xe7, 0x1d, 0xef, 0xf5, 0x28, 0xc8, 0xc0, 0xcd, 0x60, + 0x06, 0x47, 0xa8, 0xe4, 0x3f, 0x4b, 0x30, 0xbe, 0x4e, 0xe8, 0xbb, 0xa6, 0x7d, 0xa3, 0xc1, 0x9b, + 0xbb, 0x43, 0xc8, 0xfb, 0x9b, 0xb1, 0xbc, 0xff, 0x4a, 0x9f, 0x6b, 0x16, 0xd3, 0x36, 0x2f, 0xfb, + 0xcb, 0x7f, 0x97, 0xa0, 0x1a, 0xa3, 0x8c, 0xa6, 0x09, 0x02, 0x65, 0xcb, 0xb4, 0xa9, 0x7f, 0xc6, + 0x1f, 0x4a, 0x03, 0x96, 0x52, 0x23, 0xa7, 0x3c, 0x83, 0xc5, 0x1e, 0x3a, 0xb3, 0x73, 0xcb, 0x36, + 0x75, 0x11, 0xf7, 0x87, 0x93, 0x42, 0x88, 0x1d, 0xda, 0x79, 0xd1, 0x36, 0x75, 0xcc, 0xb1, 0xe5, + 0x3f, 0x49, 0x30, 0x15, 0xa3, 0x1c, 0x42, 0x4a, 0x57, 0xe2, 0x29, 0xfd, 0xc5, 0xc3, 0x18, 0x96, + 0x93, 0xd8, 0xbf, 0x4a, 0x9a, 0xc5, 0x1c, 0x80, 0xb6, 0x60, 0xcc, 0x32, 0x3b, 0xcd, 0x7b, 0xd0, + 0xd5, 0x9b, 0x64, 0x27, 0x64, 0x23, 0xc4, 0xc2, 0x51, 0x60, 0xb4, 0x0b, 0x53, 0x86, 0xa2, 0x13, + 0xc7, 0x52, 0xda, 0xa4, 0x79, 0x0f, 0xde, 0x54, 0x1e, 0xe0, 0x9d, 0x86, 0x24, 0x22, 0x4e, 0x0b, + 0x91, 0x7f, 0x9d, 0xb2, 0xdb, 0xb4, 0x29, 0x7a, 0x15, 0x2a, 0xfc, 0x03, 0x8b, 0xb6, 0xa9, 0x89, + 0xa3, 0xed, 0x2c, 0x5b, 0x9a, 0x86, 0x18, 0xbb, 0xbd, 0x37, 0xff, 0xdf, 0x07, 0x3e, 0x09, 0xfb, + 0x84, 0x38, 0x80, 0x41, 0xeb, 0x50, 0xb2, 0x0e, 0x53, 0x66, 0xf0, 0x83, 0x85, 0xd7, 0x16, 0x1c, + 0x47, 0xfe, 0x47, 0x52, 0x71, 0x7e, 0xbc, 0x5c, 0xbf, 0x67, 0x0b, 0x16, 0x94, 0x35, 0xb9, 0x8b, + 0x66, 0xc3, 0x88, 0x38, 0x65, 0x45, 0x5c, 0x5e, 0x3a, 0x4c, 0x5c, 0x46, 0x4f, 0x86, 0xe0, 0x12, + 0xe1, 0x0f, 0xfa, 0x82, 0xe4, 0xbf, 0x4a, 0x30, 0xc5, 0x15, 0x6a, 0xbb, 0xb6, 0x4a, 0x7b, 0x43, + 0xcb, 0xa0, 0x5b, 0xb1, 0x0c, 0xba, 0xdc, 0xa7, 0xa1, 0x29, 0x8d, 0x73, 0xb3, 0xe8, 0xe7, 0x12, + 0x3c, 0x90, 0xa2, 0x1e, 0x42, 0x86, 0x21, 0xf1, 0x0c, 0xf3, 0xca, 0x61, 0x0d, 0xcc, 0xc9, 0x32, + 0x37, 0x21, 0xc3, 0x3c, 0x1e, 0xb8, 0x67, 0x00, 0x2c, 0x5b, 0xdd, 0x51, 0x35, 0xd2, 0x15, 0x8d, + 0xe4, 0x4a, 0xb8, 0x24, 0x8d, 0x60, 0x06, 0x47, 0xa8, 0xd0, 0xb7, 0x60, 0xa6, 0x43, 0xb6, 0x14, + 0x57, 0xa3, 0x8b, 0x9d, 0xce, 0x92, 0x62, 0x29, 0x9b, 0xaa, 0xa6, 0x52, 0x55, 0xdc, 0xb0, 0x47, + 0xeb, 0x17, 0xbc, 0x06, 0x6f, 0x16, 0xc5, 0xed, 0xbd, 0xf9, 0xc7, 0x0f, 0x6e, 0xea, 0xf8, 0xc4, + 0x3d, 0x9c, 0x23, 0x04, 0x7d, 0x57, 0x82, 0xaa, 0x4d, 0xde, 0x71, 0x55, 0x9b, 0x74, 0x96, 0x6d, + 0xd3, 0x8a, 0x69, 0x50, 0xe4, 0x1a, 0x5c, 0xda, 0xdf, 0x9b, 0xaf, 0xe2, 0x1c, 0x9a, 0x7e, 0x74, + 0xc8, 0x15, 0x84, 0x28, 0x4c, 0x2b, 0x9a, 0x66, 0xbe, 0x4b, 0xe2, 0x1e, 0x28, 0x71, 0xf9, 0xf5, + 0xfd, 0xbd, 0xf9, 0xe9, 0xc5, 0xf4, 0x74, 0x3f, 0xa2, 0xb3, 0xe0, 0xd1, 0x02, 0x8c, 0xec, 0x98, + 0x9a, 0xab, 0x13, 0xa7, 0x5a, 0xe6, 0x92, 0x58, 0xc6, 0x1d, 0xb9, 0xea, 0x0d, 0xdd, 0xde, 0x9b, + 0x3f, 0x7a, 0xb1, 0xc9, 0x9f, 0x3e, 0x7c, 0x2a, 0x76, 0x47, 0x63, 0x35, 0x93, 0xd8, 0xf2, 0xfc, + 0xcd, 0xb6, 0x12, 0xe6, 0x98, 0xcb, 0xe1, 0x14, 0x8e, 0xd2, 0x21, 0x1d, 0x46, 0xb7, 0xc5, 0xbd, + 0xdd, 0xa9, 0x8e, 0x0c, 0x74, 0xfa, 0xc5, 0xee, 0xfd, 0xf5, 0x29, 0x21, 0x72, 0xd4, 0x1f, 0x76, + 0x70, 0x28, 0x01, 0x3d, 0x01, 0x23, 0xfc, 0xc7, 0xca, 0x32, 0x7f, 0x00, 0xab, 0x84, 0x99, 0xe8, + 0xb2, 0x37, 0x8c, 0xfd, 0x79, 0x9f, 0x74, 0xa5, 0xb1, 0xc4, 0x1f, 0x66, 0x13, 0xa4, 0x2b, 0x8d, + 0x25, 0xec, 0xcf, 0x23, 0x0b, 0x46, 0x1c, 0xb2, 0xaa, 0x1a, 0xee, 0x6e, 0x15, 0x06, 0x6a, 0x35, + 0x37, 0x2f, 0x70, 0xee, 0xc4, 0x53, 0x54, 0x28, 0x51, 0xcc, 0x63, 0x5f, 0x0c, 0xda, 0x85, 0x51, + 0xdb, 0x35, 0x16, 0x9d, 0x0d, 0x87, 0xd8, 0xd5, 0x31, 0x2e, 0xb3, 0xdf, 0xe4, 0x8c, 0x7d, 0xfe, + 0xa4, 0xd4, 0xc0, 0x83, 0x01, 0x05, 0x0e, 0x85, 0xa1, 0x9f, 0x48, 0x80, 0x1c, 0xd7, 0xb2, 0x34, + 0xa2, 0x13, 0x83, 0x2a, 0x1a, 0x7f, 0x0d, 0x73, 0xaa, 0xc7, 0xb8, 0x0e, 0x8d, 0x7e, 0xed, 0x4e, + 0x01, 0x25, 0x95, 0x09, 0x9e, 0xa9, 0xd3, 0xa4, 0x38, 0x43, 0x0f, 0xb6, 0x14, 0x5b, 0x0e, 0xff, + 0xbb, 0x3a, 0x3e, 0xd0, 0x52, 0x64, 0xbf, 0x0a, 0x86, 0x4b, 0x21, 0xe6, 0xb1, 0x2f, 0x06, 0x5d, + 0x85, 0x19, 0x9b, 0x28, 0x9d, 0x2b, 0x86, 0xd6, 0xc3, 0xa6, 0x49, 0x2f, 0xaa, 0x1a, 0x71, 0x7a, + 0x0e, 0x25, 0x7a, 0x75, 0x82, 0x87, 0x4d, 0xf0, 0xb9, 0x06, 0xce, 0xa4, 0xc2, 0x39, 0xdc, 0xfc, + 0x2b, 0x02, 0xf1, 0x7e, 0x3b, 0x9c, 0xef, 0xf0, 0x0e, 0xf7, 0x15, 0x41, 0xa8, 0xea, 0x7d, 0xfb, + 0x8a, 0x20, 0x22, 0xe2, 0xe0, 0x27, 0xa4, 0xaf, 0x0a, 0x30, 0x1d, 0x12, 0xdf, 0xf5, 0x57, 0x04, + 0x19, 0x2c, 0x43, 0xf8, 0x8a, 0x20, 0xbb, 0x0d, 0x5f, 0xbc, 0xdf, 0x6d, 0xf8, 0xfb, 0xf0, 0xf5, + 0x02, 0xef, 0xec, 0x87, 0x4e, 0xfc, 0xf7, 0xef, 0xec, 0x87, 0xba, 0xe6, 0x94, 0x33, 0xbf, 0x2d, + 0x44, 0x0d, 0xfa, 0x0f, 0x6a, 0x1f, 0x1f, 0xfe, 0x2b, 0x45, 0xf9, 0xf3, 0x22, 0x1c, 0x4f, 0xee, + 0xd8, 0x58, 0x17, 0x51, 0xba, 0x63, 0x17, 0xb1, 0x01, 0x27, 0xb6, 0x5c, 0x4d, 0xeb, 0x71, 0x87, + 0x44, 0x5a, 0x89, 0xde, 0xab, 0xfd, 0xc3, 0x82, 0xf3, 0xc4, 0xc5, 0x0c, 0x1a, 0x9c, 0xc9, 0x99, + 0xd3, 0x11, 0x2d, 0x0e, 0xd4, 0x11, 0x4d, 0x35, 0xe4, 0x4a, 0x7d, 0x34, 0xe4, 0x32, 0xbb, 0x9b, + 0xe5, 0x01, 0xba, 0x9b, 0xf7, 0xa2, 0x1d, 0x99, 0x91, 0xf8, 0xee, 0xd4, 0x8e, 0x94, 0x1f, 0x86, + 0x59, 0xc1, 0x46, 0x79, 0xa7, 0xd0, 0xa0, 0xb6, 0xa9, 0x69, 0xc4, 0x5e, 0x76, 0x75, 0xbd, 0x27, + 0x9f, 0x87, 0x89, 0x78, 0x4f, 0xdc, 0x5b, 0x79, 0xaf, 0x4d, 0x2f, 0x7a, 0x29, 0x91, 0x95, 0xf7, + 0xc6, 0x71, 0x40, 0x21, 0x7f, 0x20, 0xc1, 0x4c, 0xf6, 0xf7, 0x77, 0x48, 0x83, 0x09, 0x5d, 0xd9, + 0x8d, 0x7e, 0x80, 0x28, 0x0d, 0x78, 0xe3, 0xe6, 0xcd, 0xcf, 0xb5, 0x18, 0x16, 0x4e, 0x60, 0xcb, + 0x5f, 0x48, 0x70, 0x32, 0xa7, 0xcd, 0x38, 0x5c, 0x4d, 0xd0, 0x35, 0xa8, 0xe8, 0xca, 0x6e, 0xd3, + 0xb5, 0xbb, 0x64, 0xe0, 0x37, 0x06, 0x9e, 0x4b, 0xd6, 0x04, 0x0a, 0x0e, 0xf0, 0xe4, 0x8f, 0x25, + 0xa8, 0xe6, 0xd5, 0x83, 0xe8, 0x6c, 0xac, 0x21, 0xfa, 0x68, 0xa2, 0x21, 0x3a, 0x95, 0xe2, 0x1b, + 0x52, 0x3b, 0xf4, 0x13, 0x09, 0x66, 0xb2, 0xeb, 0x66, 0xf4, 0x4c, 0x4c, 0xe3, 0xf9, 0x84, 0xc6, + 0x93, 0x09, 0x2e, 0xa1, 0xef, 0x36, 0x4c, 0x88, 0xea, 0x5a, 0xc0, 0x08, 0x2f, 0x3f, 0x79, 0x70, + 0x56, 0x15, 0x60, 0x7e, 0x9d, 0xc8, 0x57, 0x32, 0x3e, 0x86, 0x13, 0xb8, 0xf2, 0xcf, 0x0b, 0x50, + 0x6e, 0xb6, 0x15, 0x8d, 0x0c, 0xa1, 0xa8, 0xbb, 0x16, 0x2b, 0xea, 0xfa, 0xfd, 0x1f, 0x01, 0xae, + 0x65, 0x6e, 0x3d, 0xb7, 0x99, 0xa8, 0xe7, 0xce, 0x0d, 0x84, 0x7e, 0x70, 0x29, 0xf7, 0x3c, 0x8c, + 0x06, 0x4a, 0xf4, 0x77, 0x7a, 0xc8, 0x1f, 0x15, 0x60, 0x2c, 0x22, 0xa2, 0xcf, 0xb3, 0x67, 0x27, + 0x76, 0x7a, 0x0f, 0xf2, 0xef, 0x48, 0x11, 0xd9, 0x35, 0xff, 0xfc, 0xf6, 0xbe, 0xbf, 0x0b, 0xbf, + 0xa3, 0x4a, 0x1f, 0xeb, 0xe7, 0x61, 0x82, 0xf2, 0xff, 0xce, 0x09, 0xde, 0xf8, 0x8a, 0x3c, 0x8a, + 0x83, 0xaf, 0x3a, 0x5b, 0xb1, 0x59, 0x9c, 0xa0, 0x9e, 0x7d, 0x01, 0xc6, 0x63, 0xc2, 0xfa, 0xfa, + 0x5c, 0xee, 0x77, 0x12, 0x3c, 0x7a, 0xc7, 0x3b, 0x19, 0xaa, 0xc7, 0xb6, 0x57, 0x2d, 0xb1, 0xbd, + 0xe6, 0xf2, 0x01, 0x86, 0xf8, 0xb1, 0xc4, 0x8f, 0x0a, 0x80, 0x5a, 0xdb, 0xaa, 0xdd, 0x69, 0x28, + 0x36, 0xed, 0x61, 0xf1, 0x3f, 0x58, 0x43, 0xd8, 0x70, 0x67, 0x61, 0xac, 0x43, 0x9c, 0xb6, 0xad, + 0x72, 0x67, 0x89, 0xbb, 0x42, 0xf0, 0x0e, 0xb2, 0x1c, 0x4e, 0xe1, 0x28, 0x1d, 0xea, 0x42, 0x65, + 0xc7, 0xfb, 0x2f, 0x3f, 0xbf, 0xf3, 0xd6, 0x6f, 0x31, 0x1b, 0xfe, 0x9f, 0x60, 0x18, 0x5f, 0x62, + 0xc0, 0xc1, 0x01, 0xb8, 0xfc, 0xa1, 0x04, 0x33, 0x69, 0xc7, 0x2c, 0x33, 0xd5, 0xef, 0xbf, 0x73, + 0x1e, 0x86, 0x12, 0x47, 0x67, 0x5e, 0x39, 0xe6, 0xbd, 0x78, 0x33, 0xc9, 0x98, 0x8f, 0xca, 0x5f, + 0x4a, 0x30, 0x9b, 0xad, 0xda, 0x10, 0xae, 0x12, 0xd7, 0xe3, 0x57, 0x89, 0x7e, 0x9f, 0x0d, 0xb2, + 0xf5, 0xce, 0xb9, 0x56, 0xec, 0x65, 0xae, 0xc1, 0x10, 0x8c, 0xdc, 0x8a, 0x1b, 0xb9, 0x78, 0x68, + 0x23, 0xb3, 0x0d, 0xac, 0x3f, 0x71, 0xf3, 0xd6, 0xdc, 0x91, 0x4f, 0x6f, 0xcd, 0x1d, 0xf9, 0xec, + 0xd6, 0xdc, 0x91, 0xf7, 0xf7, 0xe7, 0xa4, 0x9b, 0xfb, 0x73, 0xd2, 0xa7, 0xfb, 0x73, 0xd2, 0xdf, + 0xf6, 0xe7, 0xa4, 0x1f, 0x7c, 0x31, 0x77, 0xe4, 0xda, 0x88, 0xc0, 0xfc, 0x57, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x5a, 0xe3, 0x5a, 0x1b, 0x28, 0x3d, 0x00, 0x00, } diff --git a/pkg/apis/extensions/v1beta1/generated.proto b/pkg/apis/extensions/v1beta1/generated.proto index a7580703f50..6e12f519eef 100644 --- a/pkg/apis/extensions/v1beta1/generated.proto +++ b/pkg/apis/extensions/v1beta1/generated.proto @@ -325,6 +325,12 @@ message DeploymentStatus { // +patchMergeKey=type // +patchStrategy=merge repeated DeploymentCondition conditions = 6; + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + optional int64 collisionCount = 8; } // DeploymentStrategy describes how to replace existing pods with new ones. diff --git a/pkg/apis/extensions/v1beta1/types.generated.go b/pkg/apis/extensions/v1beta1/types.generated.go index b882c2eb5e7..513737be10c 100644 --- a/pkg/apis/extensions/v1beta1/types.generated.go +++ b/pkg/apis/extensions/v1beta1/types.generated.go @@ -5606,7 +5606,7 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [7]bool + var yyq2 [8]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.ObservedGeneration != 0 @@ -5616,9 +5616,10 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[4] = x.AvailableReplicas != 0 yyq2[5] = x.UnavailableReplicas != 0 yyq2[6] = len(x.Conditions) != 0 + yyq2[7] = x.CollisionCount != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(7) + r.EncodeArrayStart(8) } else { yynn2 = 0 for _, b := range yyq2 { @@ -5812,6 +5813,41 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[7] { + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy25 := *x.CollisionCount + yym26 := z.EncBinary() + _ = yym26 + if false { + } else { + r.EncodeInt(int64(yy25)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[7] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("collisionCount")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy27 := *x.CollisionCount + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeInt(int64(yy27)) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -5957,6 +5993,22 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv16), d) } } + case "collisionCount": + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym19 := z.DecBinary() + _ = yym19 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -5968,16 +6020,16 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj18 int - var yyb18 bool - var yyhl18 bool = l >= 0 - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + var yyj20 int + var yyb20 bool + var yyhl20 bool = l >= 0 + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5985,21 +6037,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.ObservedGeneration = 0 } else { - yyv19 := &x.ObservedGeneration - yym20 := z.DecBinary() - _ = yym20 + yyv21 := &x.ObservedGeneration + yym22 := z.DecBinary() + _ = yym22 if false { } else { - *((*int64)(yyv19)) = int64(r.DecodeInt(64)) + *((*int64)(yyv21)) = int64(r.DecodeInt(64)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6007,29 +6059,7 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.Replicas = 0 } else { - yyv21 := &x.Replicas - yym22 := z.DecBinary() - _ = yym22 - if false { - } else { - *((*int32)(yyv21)) = int32(r.DecodeInt(32)) - } - } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l - } else { - yyb18 = r.CheckBreak() - } - if yyb18 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.UpdatedReplicas = 0 - } else { - yyv23 := &x.UpdatedReplicas + yyv23 := &x.Replicas yym24 := z.DecBinary() _ = yym24 if false { @@ -6037,21 +6067,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv23)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.ReadyReplicas = 0 + x.UpdatedReplicas = 0 } else { - yyv25 := &x.ReadyReplicas + yyv25 := &x.UpdatedReplicas yym26 := z.DecBinary() _ = yym26 if false { @@ -6059,21 +6089,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv25)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.AvailableReplicas = 0 + x.ReadyReplicas = 0 } else { - yyv27 := &x.AvailableReplicas + yyv27 := &x.ReadyReplicas yym28 := z.DecBinary() _ = yym28 if false { @@ -6081,21 +6111,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv27)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.UnavailableReplicas = 0 + x.AvailableReplicas = 0 } else { - yyv29 := &x.UnavailableReplicas + yyv29 := &x.AvailableReplicas yym30 := z.DecBinary() _ = yym30 if false { @@ -6103,13 +6133,35 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv29)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.UnavailableReplicas = 0 + } else { + yyv31 := &x.UnavailableReplicas + yym32 := z.DecBinary() + _ = yym32 + if false { + } else { + *((*int32)(yyv31)) = int32(r.DecodeInt(32)) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6117,26 +6169,52 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.Conditions = nil } else { - yyv31 := &x.Conditions - yym32 := z.DecBinary() - _ = yym32 + yyv33 := &x.Conditions + yym34 := z.DecBinary() + _ = yym34 if false { } else { - h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv31), d) + h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv33), d) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) } } for { - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj18-1, "") + z.DecStructFieldNotFound(yyj20-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -19652,7 +19730,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 960) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 968) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/apis/extensions/v1beta1/types.go b/pkg/apis/extensions/v1beta1/types.go index 17838877c3c..196f3137538 100644 --- a/pkg/apis/extensions/v1beta1/types.go +++ b/pkg/apis/extensions/v1beta1/types.go @@ -325,6 +325,12 @@ type DeploymentStatus struct { // +patchMergeKey=type // +patchStrategy=merge Conditions []DeploymentCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,6,rep,name=conditions"` + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` } type DeploymentConditionType string diff --git a/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go b/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go index 9e9a03ffb14..d94bc009e9d 100644 --- a/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go +++ b/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go @@ -186,6 +186,7 @@ var map_DeploymentStatus = map[string]string{ "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.", "unavailableReplicas": "Total number of unavailable pods targeted by this deployment.", "conditions": "Represents the latest available observations of a deployment's current state.", + "collisionCount": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", } func (DeploymentStatus) SwaggerDoc() map[string]string { diff --git a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go index f2032b2c462..42e080ff131 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.conversion.go @@ -628,6 +628,7 @@ func autoConvert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in *Dep out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -644,6 +645,7 @@ func autoConvert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in *ext out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]DeploymentCondition)(unsafe.Pointer(&in.Conditions)) + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) return nil } diff --git a/pkg/apis/extensions/v1beta1/zz_generated.deepcopy.go b/pkg/apis/extensions/v1beta1/zz_generated.deepcopy.go index a386e3da40b..1228dab37b8 100644 --- a/pkg/apis/extensions/v1beta1/zz_generated.deepcopy.go +++ b/pkg/apis/extensions/v1beta1/zz_generated.deepcopy.go @@ -384,6 +384,11 @@ func DeepCopy_v1beta1_DeploymentStatus(in interface{}, out interface{}, c *conve } } } + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + *out = new(int64) + **out = **in + } return nil } } diff --git a/pkg/apis/extensions/validation/BUILD b/pkg/apis/extensions/validation/BUILD index 56f432d91f3..5291abbf861 100644 --- a/pkg/apis/extensions/validation/BUILD +++ b/pkg/apis/extensions/validation/BUILD @@ -41,6 +41,7 @@ go_test( "//pkg/security/apparmor:go_default_library", "//pkg/security/podsecuritypolicy/seccomp:go_default_library", "//pkg/security/podsecuritypolicy/util:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", diff --git a/pkg/apis/extensions/validation/validation.go b/pkg/apis/extensions/validation/validation.go index fa5cefca5cd..514faa2adbc 100644 --- a/pkg/apis/extensions/validation/validation.go +++ b/pkg/apis/extensions/validation/validation.go @@ -346,6 +346,9 @@ func ValidateDeploymentStatus(status *extensions.DeploymentStatus, fldPath *fiel allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.ReadyReplicas), fldPath.Child("readyReplicas"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.AvailableReplicas), fldPath.Child("availableReplicas"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.UnavailableReplicas), fldPath.Child("unavailableReplicas"))...) + if status.CollisionCount != nil { + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(*status.CollisionCount, fldPath.Child("collisionCount"))...) + } msg := "cannot be greater than status.replicas" if status.UpdatedReplicas > status.Replicas { allErrs = append(allErrs, field.Invalid(fldPath.Child("updatedReplicas"), status.UpdatedReplicas, msg)) @@ -372,10 +375,29 @@ func ValidateDeploymentUpdate(update, old *extensions.Deployment) field.ErrorLis func ValidateDeploymentStatusUpdate(update, old *extensions.Deployment) field.ErrorList { allErrs := apivalidation.ValidateObjectMetaUpdate(&update.ObjectMeta, &old.ObjectMeta, field.NewPath("metadata")) - allErrs = append(allErrs, ValidateDeploymentStatus(&update.Status, field.NewPath("status"))...) + fldPath := field.NewPath("status") + allErrs = append(allErrs, ValidateDeploymentStatus(&update.Status, fldPath)...) + if isDecremented(update.Status.CollisionCount, old.Status.CollisionCount) { + value := int64(0) + if update.Status.CollisionCount != nil { + value = *update.Status.CollisionCount + } + allErrs = append(allErrs, field.Invalid(fldPath.Child("collisionCount"), value, "cannot be decremented")) + } return allErrs } +// TODO: Move in "k8s.io/kubernetes/pkg/api/validation" +func isDecremented(update, old *int64) bool { + if update == nil && old != nil { + return true + } + if update == nil || old == nil { + return false + } + return *update < *old +} + func ValidateDeployment(obj *extensions.Deployment) field.ErrorList { allErrs := apivalidation.ValidateObjectMeta(&obj.ObjectMeta, true, ValidateDeploymentName, field.NewPath("metadata")) allErrs = append(allErrs, ValidateDeploymentSpec(&obj.Spec, field.NewPath("spec"))...) diff --git a/pkg/apis/extensions/validation/validation_test.go b/pkg/apis/extensions/validation/validation_test.go index 8ded02a59ba..1ec5e8b0834 100644 --- a/pkg/apis/extensions/validation/validation_test.go +++ b/pkg/apis/extensions/validation/validation_test.go @@ -21,6 +21,8 @@ import ( "strings" "testing" + "github.com/davecgh/go-spew/spew" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/validation/field" @@ -1230,6 +1232,11 @@ func TestValidateDeployment(t *testing.T) { } } +func int64p(i int) *int64 { + i64 := int64(i) + return &i64 +} + func TestValidateDeploymentStatus(t *testing.T) { tests := []struct { name string @@ -1239,6 +1246,7 @@ func TestValidateDeploymentStatus(t *testing.T) { readyReplicas int32 availableReplicas int32 observedGeneration int64 + collisionCount *int64 expectedErr bool }{ @@ -1335,6 +1343,13 @@ func TestValidateDeploymentStatus(t *testing.T) { observedGeneration: 1, expectedErr: false, }, + { + name: "invalid collisionCount", + replicas: 3, + observedGeneration: 1, + collisionCount: int64p(-3), + expectedErr: true, + }, } for _, test := range tests { @@ -1344,10 +1359,82 @@ func TestValidateDeploymentStatus(t *testing.T) { ReadyReplicas: test.readyReplicas, AvailableReplicas: test.availableReplicas, ObservedGeneration: test.observedGeneration, + CollisionCount: test.collisionCount, } - if hasErr := len(ValidateDeploymentStatus(&status, field.NewPath("status"))) > 0; hasErr != test.expectedErr { - t.Errorf("%s: expected error: %t, got error: %t", test.name, test.expectedErr, hasErr) + errs := ValidateDeploymentStatus(&status, field.NewPath("status")) + if hasErr := len(errs) > 0; hasErr != test.expectedErr { + errString := spew.Sprintf("%#v", errs) + t.Errorf("%s: expected error: %t, got error: %t\nerrors: %s", test.name, test.expectedErr, hasErr, errString) + } + } +} + +func TestValidateDeploymentStatusUpdate(t *testing.T) { + tests := []struct { + name string + + from, to extensions.DeploymentStatus + + expectedErr bool + }{ + { + name: "increase: valid update", + from: extensions.DeploymentStatus{ + CollisionCount: nil, + }, + to: extensions.DeploymentStatus{ + CollisionCount: int64p(1), + }, + expectedErr: false, + }, + { + name: "stable: valid update", + from: extensions.DeploymentStatus{ + CollisionCount: int64p(1), + }, + to: extensions.DeploymentStatus{ + CollisionCount: int64p(1), + }, + expectedErr: false, + }, + { + name: "unset: invalid update", + from: extensions.DeploymentStatus{ + CollisionCount: int64p(1), + }, + to: extensions.DeploymentStatus{ + CollisionCount: nil, + }, + expectedErr: true, + }, + { + name: "decrease: invalid update", + from: extensions.DeploymentStatus{ + CollisionCount: int64p(2), + }, + to: extensions.DeploymentStatus{ + CollisionCount: int64p(1), + }, + expectedErr: true, + }, + } + + for _, test := range tests { + meta := metav1.ObjectMeta{Name: "foo", Namespace: metav1.NamespaceDefault, ResourceVersion: "1"} + from := &extensions.Deployment{ + ObjectMeta: meta, + Status: test.from, + } + to := &extensions.Deployment{ + ObjectMeta: meta, + Status: test.to, + } + + errs := ValidateDeploymentStatusUpdate(to, from) + if hasErr := len(errs) > 0; hasErr != test.expectedErr { + errString := spew.Sprintf("%#v", errs) + t.Errorf("%s: expected error: %t, got error: %t\nerrors: %s", test.name, test.expectedErr, hasErr, errString) } } } diff --git a/pkg/apis/extensions/zz_generated.deepcopy.go b/pkg/apis/extensions/zz_generated.deepcopy.go index 866c908c9df..829367c8e5b 100644 --- a/pkg/apis/extensions/zz_generated.deepcopy.go +++ b/pkg/apis/extensions/zz_generated.deepcopy.go @@ -378,6 +378,11 @@ func DeepCopy_extensions_DeploymentStatus(in interface{}, out interface{}, c *co } } } + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + *out = new(int64) + **out = **in + } return nil } } diff --git a/pkg/controller/deployment/deployment_controller.go b/pkg/controller/deployment/deployment_controller.go index 0064b286fe9..f5963acba3d 100644 --- a/pkg/controller/deployment/deployment_controller.go +++ b/pkg/controller/deployment/deployment_controller.go @@ -574,7 +574,6 @@ func (dc *DeploymentController) syncDeployment(key string) error { return nil } if err != nil { - utilruntime.HandleError(fmt.Errorf("Unable to retrieve deployment %v from store: %v", key, err)) return err } diff --git a/pkg/controller/deployment/rollback.go b/pkg/controller/deployment/rollback.go index 703cf682b19..acc2bc45980 100644 --- a/pkg/controller/deployment/rollback.go +++ b/pkg/controller/deployment/rollback.go @@ -73,7 +73,11 @@ func (dc *DeploymentController) rollback(d *extensions.Deployment, rsList []*ext // cleans up the rollback spec so subsequent requeues of the deployment won't end up in here. func (dc *DeploymentController) rollbackToTemplate(d *extensions.Deployment, rs *extensions.ReplicaSet) (bool, error) { performedRollback := false - if !deploymentutil.EqualIgnoreHash(d.Spec.Template, rs.Spec.Template) { + isEqual, err := deploymentutil.EqualIgnoreHash(&d.Spec.Template, &rs.Spec.Template) + if err != nil { + return false, err + } + if !isEqual { glog.V(4).Infof("Rolling back deployment %q to template spec %+v", d.Name, rs.Spec.Template.Spec) deploymentutil.SetFromReplicaSetTemplate(d, rs.Spec.Template) // set RS (the old RS we'll rolling back to) annotations back to the deployment; diff --git a/pkg/controller/deployment/sync.go b/pkg/controller/deployment/sync.go index 70fa10246cf..0268572fcd8 100644 --- a/pkg/controller/deployment/sync.go +++ b/pkg/controller/deployment/sync.go @@ -140,7 +140,7 @@ func (dc *DeploymentController) rsAndPodsWithHashKeySynced(d *extensions.Deploym // Add pod-template-hash information if it's not in the RS. // Otherwise, new RS produced by Deployment will overlap with pre-existing ones // that aren't constrained by the pod-template-hash. - syncedRS, err := dc.addHashKeyToRSAndPods(rs, podMap[rs.UID]) + syncedRS, err := dc.addHashKeyToRSAndPods(rs, podMap[rs.UID], d.Status.CollisionCount) if err != nil { return nil, err } @@ -153,12 +153,15 @@ func (dc *DeploymentController) rsAndPodsWithHashKeySynced(d *extensions.Deploym // 1. Add hash label to the rs's pod template, and make sure the controller sees this update so that no orphaned pods will be created // 2. Add hash label to all pods this rs owns, wait until replicaset controller reports rs.Status.FullyLabeledReplicas equal to the desired number of replicas // 3. Add hash label to the rs's label and selector -func (dc *DeploymentController) addHashKeyToRSAndPods(rs *extensions.ReplicaSet, podList *v1.PodList) (*extensions.ReplicaSet, error) { +func (dc *DeploymentController) addHashKeyToRSAndPods(rs *extensions.ReplicaSet, podList *v1.PodList, collisionCount *int64) (*extensions.ReplicaSet, error) { // If the rs already has the new hash label in its selector, it's done syncing if labelsutil.SelectorHasLabel(rs.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey) { return rs, nil } - hash := deploymentutil.GetReplicaSetHash(rs) + hash, err := deploymentutil.GetReplicaSetHash(rs, collisionCount) + if err != nil { + return nil, err + } // 1. Add hash template label to the rs. This ensures that any newly created pods will have the new label. updatedRS, err := deploymentutil.UpdateRSWithRetries(dc.client.Extensions().ReplicaSets(rs.Namespace), dc.rsLister, rs.Namespace, rs.Name, func(updated *extensions.ReplicaSet) error { @@ -224,8 +227,8 @@ func (dc *DeploymentController) addHashKeyToRSAndPods(rs *extensions.ReplicaSet, // 2. If there's existing new RS, update its revision number if it's smaller than (maxOldRevision + 1), where maxOldRevision is the max revision number among all old RSes. // 3. If there's no existing new RS and createIfNotExisted is true, create one with appropriate revision number (maxOldRevision + 1) and replicas. // Note that the pod-template-hash will be added to adopted RSes and pods. -func (dc *DeploymentController) getNewReplicaSet(deployment *extensions.Deployment, rsList, oldRSs []*extensions.ReplicaSet, createIfNotExisted bool) (*extensions.ReplicaSet, error) { - existingNewRS, err := deploymentutil.FindNewReplicaSet(deployment, rsList) +func (dc *DeploymentController) getNewReplicaSet(d *extensions.Deployment, rsList, oldRSs []*extensions.ReplicaSet, createIfNotExisted bool) (*extensions.ReplicaSet, error) { + existingNewRS, err := deploymentutil.FindNewReplicaSet(d, rsList) if err != nil { return nil, err } @@ -247,28 +250,28 @@ func (dc *DeploymentController) getNewReplicaSet(deployment *extensions.Deployme rsCopy := objCopy.(*extensions.ReplicaSet) // Set existing new replica set's annotation - annotationsUpdated := deploymentutil.SetNewReplicaSetAnnotations(deployment, rsCopy, newRevision, true) - minReadySecondsNeedsUpdate := rsCopy.Spec.MinReadySeconds != deployment.Spec.MinReadySeconds + annotationsUpdated := deploymentutil.SetNewReplicaSetAnnotations(d, rsCopy, newRevision, true) + minReadySecondsNeedsUpdate := rsCopy.Spec.MinReadySeconds != d.Spec.MinReadySeconds if annotationsUpdated || minReadySecondsNeedsUpdate { - rsCopy.Spec.MinReadySeconds = deployment.Spec.MinReadySeconds + rsCopy.Spec.MinReadySeconds = d.Spec.MinReadySeconds return dc.client.Extensions().ReplicaSets(rsCopy.ObjectMeta.Namespace).Update(rsCopy) } // Should use the revision in existingNewRS's annotation, since it set by before - updateConditions := deploymentutil.SetDeploymentRevision(deployment, rsCopy.Annotations[deploymentutil.RevisionAnnotation]) + needsUpdate := deploymentutil.SetDeploymentRevision(d, rsCopy.Annotations[deploymentutil.RevisionAnnotation]) // If no other Progressing condition has been recorded and we need to estimate the progress // of this deployment then it is likely that old users started caring about progress. In that // case we need to take into account the first time we noticed their new replica set. - cond := deploymentutil.GetDeploymentCondition(deployment.Status, extensions.DeploymentProgressing) - if deployment.Spec.ProgressDeadlineSeconds != nil && cond == nil { + cond := deploymentutil.GetDeploymentCondition(d.Status, extensions.DeploymentProgressing) + if d.Spec.ProgressDeadlineSeconds != nil && cond == nil { msg := fmt.Sprintf("Found new replica set %q", rsCopy.Name) condition := deploymentutil.NewDeploymentCondition(extensions.DeploymentProgressing, v1.ConditionTrue, deploymentutil.FoundNewRSReason, msg) - deploymentutil.SetDeploymentCondition(&deployment.Status, *condition) - updateConditions = true + deploymentutil.SetDeploymentCondition(&d.Status, *condition) + needsUpdate = true } - if updateConditions { - if deployment, err = dc.client.Extensions().Deployments(deployment.Namespace).UpdateStatus(deployment); err != nil { + if needsUpdate { + if d, err = dc.client.Extensions().Deployments(d.Namespace).UpdateStatus(d); err != nil { return nil, err } } @@ -280,72 +283,107 @@ func (dc *DeploymentController) getNewReplicaSet(deployment *extensions.Deployme } // new ReplicaSet does not exist, create one. - namespace := deployment.Namespace - podTemplateSpecHash := fmt.Sprintf("%d", deploymentutil.GetPodTemplateSpecHash(deployment.Spec.Template)) - newRSTemplate := deploymentutil.GetNewReplicaSetTemplate(deployment) - newRSTemplate.Labels = labelsutil.CloneAndAddLabel(deployment.Spec.Template.Labels, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash) + templateCopy, err := api.Scheme.DeepCopy(d.Spec.Template) + if err != nil { + return nil, err + } + newRSTemplate := templateCopy.(v1.PodTemplateSpec) + podTemplateSpecHash := fmt.Sprintf("%d", deploymentutil.GetPodTemplateSpecHash(&newRSTemplate, d.Status.CollisionCount)) + newRSTemplate.Labels = labelsutil.CloneAndAddLabel(d.Spec.Template.Labels, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash) // Add podTemplateHash label to selector. - newRSSelector := labelsutil.CloneSelectorAndAddLabel(deployment.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash) + newRSSelector := labelsutil.CloneSelectorAndAddLabel(d.Spec.Selector, extensions.DefaultDeploymentUniqueLabelKey, podTemplateSpecHash) // Create new ReplicaSet newRS := extensions.ReplicaSet{ ObjectMeta: metav1.ObjectMeta{ // Make the name deterministic, to ensure idempotence - Name: deployment.Name + "-" + podTemplateSpecHash, - Namespace: namespace, - OwnerReferences: []metav1.OwnerReference{*newControllerRef(deployment)}, + Name: d.Name + "-" + podTemplateSpecHash, + Namespace: d.Namespace, + OwnerReferences: []metav1.OwnerReference{*newControllerRef(d)}, }, Spec: extensions.ReplicaSetSpec{ Replicas: new(int32), - MinReadySeconds: deployment.Spec.MinReadySeconds, + MinReadySeconds: d.Spec.MinReadySeconds, Selector: newRSSelector, Template: newRSTemplate, }, } allRSs := append(oldRSs, &newRS) - newReplicasCount, err := deploymentutil.NewRSNewReplicas(deployment, allRSs, &newRS) + newReplicasCount, err := deploymentutil.NewRSNewReplicas(d, allRSs, &newRS) if err != nil { return nil, err } *(newRS.Spec.Replicas) = newReplicasCount // Set new replica set's annotation - deploymentutil.SetNewReplicaSetAnnotations(deployment, &newRS, newRevision, false) - createdRS, err := dc.client.Extensions().ReplicaSets(namespace).Create(&newRS) + deploymentutil.SetNewReplicaSetAnnotations(d, &newRS, newRevision, false) + // Create the new ReplicaSet. If it already exists, then we need to check for possible + // hash collisions. If there is any other error, we need to report it in the status of + // the Deployment. + alreadyExists := false + createdRS, err := dc.client.Extensions().ReplicaSets(d.Namespace).Create(&newRS) switch { - // We may end up hitting this due to a slow cache or a fast resync of the deployment. - // TODO: Restore once https://github.com/kubernetes/kubernetes/issues/29735 is fixed - // ie. we start using a new hashing algorithm. + // We may end up hitting this due to a slow cache or a fast resync of the Deployment. + // Fetch a copy of the ReplicaSet. If its PodTemplateSpec is semantically deep equal + // with the PodTemplateSpec of the Deployment, then that is our new ReplicaSet. Otherwise, + // this is a hash collision and we need to increment the collisionCount field in the + // status of the Deployment and try the creation again. case errors.IsAlreadyExists(err): - return nil, err - // return dc.rsLister.ReplicaSets(namespace).Get(newRS.Name) + alreadyExists = true + rs, rsErr := dc.rsLister.ReplicaSets(newRS.Namespace).Get(newRS.Name) + if rsErr != nil { + return nil, rsErr + } + isEqual, equalErr := deploymentutil.EqualIgnoreHash(&d.Spec.Template, &rs.Spec.Template) + if equalErr != nil { + return nil, equalErr + } + // Matching ReplicaSet is not equal - increment the collisionCount in the DeploymentStatus + // and requeue the Deployment. + if !isEqual { + if d.Status.CollisionCount == nil { + d.Status.CollisionCount = new(int64) + } + preCollisionCount := *d.Status.CollisionCount + *d.Status.CollisionCount++ + // Update the collisionCount for the Deployment and let it requeue by returning the original + // error. + _, dErr := dc.client.Extensions().Deployments(d.Namespace).UpdateStatus(d) + if dErr == nil { + glog.V(2).Infof("Found a hash collision for deployment %q - bumping collisionCount (%d->%d) to resolve it", d.Name, preCollisionCount, *d.Status.CollisionCount) + } + return nil, err + } + // Pass through the matching ReplicaSet as the new ReplicaSet. + createdRS = rs + err = nil case err != nil: msg := fmt.Sprintf("Failed to create new replica set %q: %v", newRS.Name, err) - if deployment.Spec.ProgressDeadlineSeconds != nil { + if d.Spec.ProgressDeadlineSeconds != nil { cond := deploymentutil.NewDeploymentCondition(extensions.DeploymentProgressing, v1.ConditionFalse, deploymentutil.FailedRSCreateReason, msg) - deploymentutil.SetDeploymentCondition(&deployment.Status, *cond) + deploymentutil.SetDeploymentCondition(&d.Status, *cond) // We don't really care about this error at this point, since we have a bigger issue to report. - // TODO: Update the rest of the Deployment status, too. We may need to do this every time we - // error out in all other places in the controller so that we let users know that their deployments - // have been noticed by the controller, albeit with errors. // TODO: Identify which errors are permanent and switch DeploymentIsFailed to take into account // these reasons as well. Related issue: https://github.com/kubernetes/kubernetes/issues/18568 - _, _ = dc.client.Extensions().Deployments(deployment.ObjectMeta.Namespace).UpdateStatus(deployment) + _, _ = dc.client.Extensions().Deployments(d.Namespace).UpdateStatus(d) } - dc.eventRecorder.Eventf(deployment, v1.EventTypeWarning, deploymentutil.FailedRSCreateReason, msg) + dc.eventRecorder.Eventf(d, v1.EventTypeWarning, deploymentutil.FailedRSCreateReason, msg) return nil, err } - if newReplicasCount > 0 { - dc.eventRecorder.Eventf(deployment, v1.EventTypeNormal, "ScalingReplicaSet", "Scaled up replica set %s to %d", createdRS.Name, newReplicasCount) + if !alreadyExists && newReplicasCount > 0 { + dc.eventRecorder.Eventf(d, v1.EventTypeNormal, "ScalingReplicaSet", "Scaled up replica set %s to %d", createdRS.Name, newReplicasCount) } - deploymentutil.SetDeploymentRevision(deployment, newRevision) - if deployment.Spec.ProgressDeadlineSeconds != nil { + needsUpdate := deploymentutil.SetDeploymentRevision(d, newRevision) + if !alreadyExists && d.Spec.ProgressDeadlineSeconds != nil { msg := fmt.Sprintf("Created new replica set %q", createdRS.Name) condition := deploymentutil.NewDeploymentCondition(extensions.DeploymentProgressing, v1.ConditionTrue, deploymentutil.NewReplicaSetReason, msg) - deploymentutil.SetDeploymentCondition(&deployment.Status, *condition) + deploymentutil.SetDeploymentCondition(&d.Status, *condition) + needsUpdate = true + } + if needsUpdate { + _, err = dc.client.Extensions().Deployments(d.Namespace).UpdateStatus(d) } - _, err = dc.client.Extensions().Deployments(deployment.Namespace).UpdateStatus(deployment) return createdRS, err } @@ -564,6 +602,7 @@ func calculateStatus(allRSs []*extensions.ReplicaSet, newRS *extensions.ReplicaS ReadyReplicas: deploymentutil.GetReadyReplicaCountForReplicaSets(allRSs), AvailableReplicas: availableReplicas, UnavailableReplicas: unavailableReplicas, + CollisionCount: deployment.Status.CollisionCount, } // Copy conditions one by one so we won't mutate the original object. diff --git a/pkg/controller/deployment/util/BUILD b/pkg/controller/deployment/util/BUILD index eb9bf868d7e..9f55884588a 100644 --- a/pkg/controller/deployment/util/BUILD +++ b/pkg/controller/deployment/util/BUILD @@ -48,6 +48,7 @@ go_test( srcs = [ "deployment_util_test.go", "hash_test.go", + "pod_util_test.go", ], library = ":go_default_library", tags = ["automanaged"], @@ -57,6 +58,7 @@ go_test( "//pkg/apis/extensions/v1beta1:go_default_library", "//pkg/client/clientset_generated/clientset/fake:go_default_library", "//pkg/controller:go_default_library", + "//pkg/util/hash:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/controller/deployment/util/deployment_util.go b/pkg/controller/deployment/util/deployment_util.go index bea58726571..ea6ff569a99 100644 --- a/pkg/controller/deployment/util/deployment_util.go +++ b/pkg/controller/deployment/util/deployment_util.go @@ -640,29 +640,42 @@ func ListPods(deployment *extensions.Deployment, rsList []*extensions.ReplicaSet // We ignore pod-template-hash because the hash result would be different upon podTemplateSpec API changes // (e.g. the addition of a new field will cause the hash code to change) // Note that we assume input podTemplateSpecs contain non-empty labels -func EqualIgnoreHash(template1, template2 v1.PodTemplateSpec) bool { +func EqualIgnoreHash(template1, template2 *v1.PodTemplateSpec) (bool, error) { + cp, err := api.Scheme.DeepCopy(template1) + if err != nil { + return false, err + } + t1Copy := cp.(*v1.PodTemplateSpec) + cp, err = api.Scheme.DeepCopy(template2) + if err != nil { + return false, err + } + t2Copy := cp.(*v1.PodTemplateSpec) // First, compare template.Labels (ignoring hash) - labels1, labels2 := template1.Labels, template2.Labels + labels1, labels2 := t1Copy.Labels, t2Copy.Labels if len(labels1) > len(labels2) { labels1, labels2 = labels2, labels1 } // We make sure len(labels2) >= len(labels1) for k, v := range labels2 { if labels1[k] != v && k != extensions.DefaultDeploymentUniqueLabelKey { - return false + return false, nil } } // Then, compare the templates without comparing their labels - template1.Labels, template2.Labels = nil, nil - return apiequality.Semantic.DeepEqual(template1, template2) + t1Copy.Labels, t2Copy.Labels = nil, nil + return apiequality.Semantic.DeepEqual(t1Copy, t2Copy), nil } // FindNewReplicaSet returns the new RS this given deployment targets (the one with the same pod template). func FindNewReplicaSet(deployment *extensions.Deployment, rsList []*extensions.ReplicaSet) (*extensions.ReplicaSet, error) { - newRSTemplate := GetNewReplicaSetTemplate(deployment) sort.Sort(controller.ReplicaSetsByCreationTimestamp(rsList)) for i := range rsList { - if EqualIgnoreHash(rsList[i].Spec.Template, newRSTemplate) { + equal, err := EqualIgnoreHash(&rsList[i].Spec.Template, &deployment.Spec.Template) + if err != nil { + return nil, err + } + if equal { // In rare cases, such as after cluster upgrades, Deployment may end up with // having more than one new ReplicaSets that have the same template as its template, // see https://github.com/kubernetes/kubernetes/issues/40415 @@ -746,31 +759,6 @@ func LabelPodsWithHash(podList *v1.PodList, c clientset.Interface, podLister cor return nil } -// GetNewReplicaSetTemplate returns the desired PodTemplateSpec for the new ReplicaSet corresponding to the given ReplicaSet. -// Callers of this helper need to set the DefaultDeploymentUniqueLabelKey k/v pair. -func GetNewReplicaSetTemplate(deployment *extensions.Deployment) v1.PodTemplateSpec { - // newRS will have the same template as in deployment spec. - return v1.PodTemplateSpec{ - ObjectMeta: deployment.Spec.Template.ObjectMeta, - Spec: deployment.Spec.Template.Spec, - } -} - -// TODO: remove the duplicate -// GetNewReplicaSetTemplateInternal returns the desired PodTemplateSpec for the new ReplicaSet corresponding to the given ReplicaSet. -func GetNewReplicaSetTemplateInternal(deployment *internalextensions.Deployment) api.PodTemplateSpec { - // newRS will have the same template as in deployment spec, plus a unique label in some cases. - newRSTemplate := api.PodTemplateSpec{ - ObjectMeta: deployment.Spec.Template.ObjectMeta, - Spec: deployment.Spec.Template.Spec, - } - newRSTemplate.ObjectMeta.Labels = labelsutil.CloneAndAddLabel( - deployment.Spec.Template.ObjectMeta.Labels, - internalextensions.DefaultDeploymentUniqueLabelKey, - fmt.Sprintf("%d", GetInternalPodTemplateSpecHash(newRSTemplate))) - return newRSTemplate -} - // SetFromReplicaSetTemplate sets the desired PodTemplateSpec from a replica set template to the given deployment. func SetFromReplicaSetTemplate(deployment *extensions.Deployment, template v1.PodTemplateSpec) *extensions.Deployment { deployment.Spec.Template.ObjectMeta = template.ObjectMeta diff --git a/pkg/controller/deployment/util/deployment_util_test.go b/pkg/controller/deployment/util/deployment_util_test.go index b9e9c10d30f..f6c2308a923 100644 --- a/pkg/controller/deployment/util/deployment_util_test.go +++ b/pkg/controller/deployment/util/deployment_util_test.go @@ -184,7 +184,8 @@ func newDControllerRef(d *extensions.Deployment) *metav1.OwnerReference { // generateRS creates a replica set, with the input deployment's template as its template func generateRS(deployment extensions.Deployment) extensions.ReplicaSet { - template := GetNewReplicaSetTemplate(&deployment) + cp, _ := api.Scheme.DeepCopy(deployment.Spec.Template) + template := cp.(v1.PodTemplateSpec) return extensions.ReplicaSet{ ObjectMeta: metav1.ObjectMeta{ UID: randomUID(), @@ -193,7 +194,7 @@ func generateRS(deployment extensions.Deployment) extensions.ReplicaSet { OwnerReferences: []metav1.OwnerReference{*newDControllerRef(&deployment)}, }, Spec: extensions.ReplicaSetSpec{ - Replicas: func() *int32 { i := int32(0); return &i }(), + Replicas: new(int32), Template: template, Selector: &metav1.LabelSelector{MatchLabels: template.Labels}, }, @@ -444,29 +445,22 @@ func TestEqualIgnoreHash(t *testing.T) { for _, test := range tests { runTest := func(t1, t2 *v1.PodTemplateSpec, reversed bool) { - // Set up - t1Copy, err := api.Scheme.DeepCopy(t1) - if err != nil { - t.Errorf("Failed setting up the test: %v", err) - } - t2Copy, err := api.Scheme.DeepCopy(t2) - if err != nil { - t.Errorf("Failed setting up the test: %v", err) - } reverseString := "" if reversed { reverseString = " (reverse order)" } // Run - equal := EqualIgnoreHash(*t1, *t2) + equal, err := EqualIgnoreHash(t1, t2) + if err != nil { + t.Errorf("%s: unexpected error: %v", err, test.test) + return + } if equal != test.expected { - t.Errorf("In test case %q%s, expected %v", test.test, reverseString, test.expected) + t.Errorf("%q%s: expected %v", test.test, reverseString, test.expected) + return } if t1.Labels == nil || t2.Labels == nil { - t.Errorf("In test case %q%s, unexpected labels becomes nil", test.test, reverseString) - } - if !reflect.DeepEqual(t1, t1Copy) || !reflect.DeepEqual(t2, t2Copy) { - t.Errorf("In test case %q%s, unexpected input template modified", test.test, reverseString) + t.Errorf("%q%s: unexpected labels becomes nil", test.test, reverseString) } } runTest(&test.former, &test.latter, false) diff --git a/pkg/controller/deployment/util/hash_test.go b/pkg/controller/deployment/util/hash_test.go index cdabe488876..d1d944df6d1 100644 --- a/pkg/controller/deployment/util/hash_test.go +++ b/pkg/controller/deployment/util/hash_test.go @@ -18,11 +18,13 @@ package util import ( "encoding/json" + "hash/adler32" "strconv" "strings" "testing" "k8s.io/kubernetes/pkg/api/v1" + hashutil "k8s.io/kubernetes/pkg/util/hash" ) var podSpec string = ` @@ -103,34 +105,12 @@ var podSpec string = ` func TestPodTemplateSpecHash(t *testing.T) { seenHashes := make(map[uint32]int) - broken := false for i := 0; i < 1000; i++ { specJson := strings.Replace(podSpec, "@@VERSION@@", strconv.Itoa(i), 1) spec := v1.PodTemplateSpec{} json.Unmarshal([]byte(specJson), &spec) - hash := GetPodTemplateSpecHash(spec) - if v, ok := seenHashes[hash]; ok { - broken = true - t.Logf("Hash collision, old: %d new: %d", v, i) - break - } - seenHashes[hash] = i - } - - if !broken { - t.Errorf("expected adler to break but it didn't") - } -} - -func TestPodTemplateSpecHashFnv(t *testing.T) { - seenHashes := make(map[uint32]int) - - for i := 0; i < 1000; i++ { - specJson := strings.Replace(podSpec, "@@VERSION@@", strconv.Itoa(i), 1) - spec := v1.PodTemplateSpec{} - json.Unmarshal([]byte(specJson), &spec) - hash := GetPodTemplateSpecHashFnv(spec) + hash := GetPodTemplateSpecHash(&spec, nil) if v, ok := seenHashes[hash]; ok { t.Errorf("Hash collision, old: %d new: %d", v, i) break @@ -144,15 +124,21 @@ func BenchmarkAdler(b *testing.B) { json.Unmarshal([]byte(podSpec), &spec) for i := 0; i < b.N; i++ { - GetPodTemplateSpecHash(spec) + getPodTemplateSpecOldHash(spec) } } +func getPodTemplateSpecOldHash(template v1.PodTemplateSpec) uint32 { + podTemplateSpecHasher := adler32.New() + hashutil.DeepHashObject(podTemplateSpecHasher, template) + return podTemplateSpecHasher.Sum32() +} + func BenchmarkFnv(b *testing.B) { spec := v1.PodTemplateSpec{} json.Unmarshal([]byte(podSpec), &spec) for i := 0; i < b.N; i++ { - GetPodTemplateSpecHashFnv(spec) + GetPodTemplateSpecHash(&spec, nil) } } diff --git a/pkg/controller/deployment/util/pod_util.go b/pkg/controller/deployment/util/pod_util.go index b2d4e8464eb..1954ef7076d 100644 --- a/pkg/controller/deployment/util/pod_util.go +++ b/pkg/controller/deployment/util/pod_util.go @@ -17,7 +17,7 @@ limitations under the License. package util import ( - "hash/adler32" + "encoding/binary" "hash/fnv" "github.com/golang/glog" @@ -31,22 +31,17 @@ import ( hashutil "k8s.io/kubernetes/pkg/util/hash" ) -func GetPodTemplateSpecHash(template v1.PodTemplateSpec) uint32 { - podTemplateSpecHasher := adler32.New() - hashutil.DeepHashObject(podTemplateSpecHasher, template) - return podTemplateSpecHasher.Sum32() -} - -// TODO: remove the duplicate -func GetInternalPodTemplateSpecHash(template api.PodTemplateSpec) uint32 { - podTemplateSpecHasher := adler32.New() - hashutil.DeepHashObject(podTemplateSpecHasher, template) - return podTemplateSpecHasher.Sum32() -} - -func GetPodTemplateSpecHashFnv(template v1.PodTemplateSpec) uint32 { +func GetPodTemplateSpecHash(template *v1.PodTemplateSpec, uniquifier *int64) uint32 { podTemplateSpecHasher := fnv.New32a() - hashutil.DeepHashObject(podTemplateSpecHasher, template) + hashutil.DeepHashObject(podTemplateSpecHasher, *template) + + // Add uniquifier in the hash if it exists. + if uniquifier != nil { + uniquifierBytes := make([]byte, 8) + binary.LittleEndian.PutUint64(uniquifierBytes, uint64(*uniquifier)) + podTemplateSpecHasher.Write(uniquifierBytes) + } + return podTemplateSpecHasher.Sum32() } diff --git a/pkg/controller/deployment/util/pod_util_test.go b/pkg/controller/deployment/util/pod_util_test.go new file mode 100644 index 00000000000..c312a372fb1 --- /dev/null +++ b/pkg/controller/deployment/util/pod_util_test.go @@ -0,0 +1,59 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "math" + "testing" + + "k8s.io/kubernetes/pkg/api/v1" +) + +func int64P(num int64) *int64 { + return &num +} + +func TestGetPodTemplateSpecHash(t *testing.T) { + tests := []struct { + name string + template *v1.PodTemplateSpec + collisionCount *int64 + otherCollisionCount *int64 + }{ + { + name: "simple", + template: &v1.PodTemplateSpec{}, + collisionCount: int64P(1), + otherCollisionCount: int64P(2), + }, + { + name: "using math.MaxInt64", + template: &v1.PodTemplateSpec{}, + collisionCount: nil, + otherCollisionCount: int64P(int64(math.MaxInt64)), + }, + } + + for _, test := range tests { + hash := GetPodTemplateSpecHash(test.template, test.collisionCount) + otherHash := GetPodTemplateSpecHash(test.template, test.otherCollisionCount) + + if hash == otherHash { + t.Errorf("expected different hashes but got the same: %d", hash) + } + } +} diff --git a/pkg/controller/deployment/util/replicaset_util.go b/pkg/controller/deployment/util/replicaset_util.go index 52f68eb9627..a816e2522c3 100644 --- a/pkg/controller/deployment/util/replicaset_util.go +++ b/pkg/controller/deployment/util/replicaset_util.go @@ -69,21 +69,12 @@ func UpdateRSWithRetries(rsClient unversionedextensions.ReplicaSetInterface, rsL } // GetReplicaSetHash returns the pod template hash of a ReplicaSet's pod template space -func GetReplicaSetHash(rs *extensions.ReplicaSet) string { - meta := rs.Spec.Template.ObjectMeta - meta.Labels = labelsutil.CloneAndRemoveLabel(meta.Labels, extensions.DefaultDeploymentUniqueLabelKey) - return fmt.Sprintf("%d", GetPodTemplateSpecHash(v1.PodTemplateSpec{ - ObjectMeta: meta, - Spec: rs.Spec.Template.Spec, - })) -} - -// GetReplicaSetHashFnv returns the pod template hash of a ReplicaSet's pod template spec. -func GetReplicaSetHashFnv(rs *extensions.ReplicaSet) string { - meta := rs.Spec.Template.ObjectMeta - meta.Labels = labelsutil.CloneAndRemoveLabel(meta.Labels, extensions.DefaultDeploymentUniqueLabelKey) - return fmt.Sprintf("%d", GetPodTemplateSpecHashFnv(v1.PodTemplateSpec{ - ObjectMeta: meta, - Spec: rs.Spec.Template.Spec, - })) +func GetReplicaSetHash(rs *extensions.ReplicaSet, uniquifier *int64) (string, error) { + template, err := api.Scheme.DeepCopy(rs.Spec.Template) + if err != nil { + return "", err + } + rsTemplate := template.(v1.PodTemplateSpec) + rsTemplate.Labels = labelsutil.CloneAndRemoveLabel(rsTemplate.Labels, extensions.DefaultDeploymentUniqueLabelKey) + return fmt.Sprintf("%d", GetPodTemplateSpecHash(&rsTemplate, uniquifier)), nil } diff --git a/pkg/kubectl/BUILD b/pkg/kubectl/BUILD index c008aa5623b..ec5d79ff3f1 100644 --- a/pkg/kubectl/BUILD +++ b/pkg/kubectl/BUILD @@ -157,7 +157,6 @@ go_test( "//pkg/client/clientset_generated/internalclientset/typed/batch/internalversion:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/core/internalversion:go_default_library", "//pkg/client/clientset_generated/internalclientset/typed/extensions/internalversion:go_default_library", - "//pkg/controller/deployment/util:go_default_library", "//pkg/kubectl/util:go_default_library", "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", diff --git a/pkg/kubectl/stop_test.go b/pkg/kubectl/stop_test.go index 18db58da2f0..dd8752903e7 100644 --- a/pkg/kubectl/stop_test.go +++ b/pkg/kubectl/stop_test.go @@ -35,7 +35,6 @@ import ( "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake" coreclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion" - deploymentutil "k8s.io/kubernetes/pkg/controller/deployment/util" ) func TestReplicationControllerStop(t *testing.T) { @@ -441,7 +440,6 @@ func TestDeploymentStop(t *testing.T) { Replicas: 0, }, } - template := deploymentutil.GetNewReplicaSetTemplateInternal(&deployment) trueVar := true tests := []struct { Name string @@ -492,9 +490,7 @@ func TestDeploymentStop(t *testing.T) { }, }, }, - Spec: extensions.ReplicaSetSpec{ - Template: template, - }, + Spec: extensions.ReplicaSetSpec{}, }, // ReplicaSet owned by something else (should be ignored). { @@ -512,9 +508,7 @@ func TestDeploymentStop(t *testing.T) { }, }, }, - Spec: extensions.ReplicaSetSpec{ - Template: template, - }, + Spec: extensions.ReplicaSetSpec{}, }, }, }, @@ -709,7 +703,6 @@ func TestDeploymentNotFoundError(t *testing.T) { Replicas: 0, }, } - template := deploymentutil.GetNewReplicaSetTemplateInternal(deployment) fake := fake.NewSimpleClientset( deployment, @@ -719,9 +712,7 @@ func TestDeploymentNotFoundError(t *testing.T) { Name: name, Namespace: ns, }, - Spec: extensions.ReplicaSetSpec{ - Template: template, - }, + Spec: extensions.ReplicaSetSpec{}, }, }, }, diff --git a/staging/src/k8s.io/client-go/Godeps/Godeps.json b/staging/src/k8s.io/client-go/Godeps/Godeps.json index 45c6c593ca2..884b82a9f17 100644 --- a/staging/src/k8s.io/client-go/Godeps/Godeps.json +++ b/staging/src/k8s.io/client-go/Godeps/Godeps.json @@ -1,6 +1,6 @@ { "ImportPath": "k8s.io/client-go", - "GoVersion": "go1.7", + "GoVersion": "go1.8", "GodepVersion": "v79", "Packages": [ "./..." diff --git a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/generated.pb.go b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/generated.pb.go index aa8d9ad6468..19ee88edcdb 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/generated.pb.go @@ -455,6 +455,11 @@ func (m *DeploymentStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x38 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ReadyReplicas)) + if m.CollisionCount != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.CollisionCount)) + } return i, nil } @@ -954,6 +959,9 @@ func (m *DeploymentStatus) Size() (n int) { } } n += 1 + sovGenerated(uint64(m.ReadyReplicas)) + if m.CollisionCount != nil { + n += 1 + sovGenerated(uint64(*m.CollisionCount)) + } return n } @@ -1190,6 +1198,7 @@ func (this *DeploymentStatus) String() string { `UnavailableReplicas:` + fmt.Sprintf("%v", this.UnavailableReplicas) + `,`, `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "DeploymentCondition", "DeploymentCondition", 1), `&`, ``, 1) + `,`, `ReadyReplicas:` + fmt.Sprintf("%v", this.ReadyReplicas) + `,`, + `CollisionCount:` + valueToStringGenerated(this.CollisionCount) + `,`, `}`, }, "") return s @@ -2478,6 +2487,26 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { break } } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CollisionCount = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3891,103 +3920,105 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 1561 bytes of a gzipped FileDescriptorProto + // 1585 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x58, 0xcd, 0x6f, 0x1b, 0xb7, 0x12, 0xf7, 0xda, 0x92, 0x2d, 0xd3, 0xb1, 0x1c, 0xd3, 0x7e, 0xb1, 0x9e, 0xf3, 0x20, 0x07, 0x3a, - 0xe4, 0xe3, 0x21, 0x59, 0xbd, 0x38, 0x79, 0xf9, 0x72, 0x11, 0xd4, 0x4a, 0xd2, 0x34, 0x85, 0xdd, - 0x18, 0x94, 0x1d, 0x34, 0x69, 0x0a, 0x94, 0x5a, 0x31, 0x6b, 0xc6, 0xfb, 0x85, 0x25, 0x25, 0x44, - 0xb7, 0x5e, 0x7a, 0x28, 0xd0, 0x43, 0x4f, 0xbd, 0x15, 0xed, 0xb9, 0x28, 0xd0, 0x7f, 0xc3, 0x68, - 0x2f, 0x39, 0x16, 0x3d, 0x18, 0xb5, 0xf3, 0x5f, 0xe4, 0x54, 0x90, 0xcb, 0xfd, 0xd2, 0xae, 0xfc, - 0xa1, 0xa2, 0xb9, 0xf4, 0xa6, 0xe5, 0xcc, 0xef, 0x37, 0x43, 0x72, 0x66, 0x38, 0x23, 0x70, 0x73, - 0xe7, 0x16, 0xd3, 0xa9, 0x5b, 0xdf, 0xe9, 0xb4, 0x88, 0xef, 0x10, 0x4e, 0x58, 0xdd, 0xdb, 0x31, - 0xeb, 0xd8, 0xa3, 0xac, 0x8e, 0x3d, 0x8f, 0xd5, 0xbb, 0x57, 0x5b, 0x84, 0xe3, 0xab, 0x75, 0x93, - 0x38, 0xc4, 0xc7, 0x9c, 0xb4, 0x75, 0xcf, 0x77, 0xb9, 0x0b, 0x2f, 0x04, 0x40, 0x3d, 0x06, 0xea, - 0xde, 0x8e, 0xa9, 0x0b, 0xa0, 0x2e, 0x80, 0xba, 0x02, 0x2e, 0x5e, 0x31, 0x29, 0xdf, 0xee, 0xb4, - 0x74, 0xc3, 0xb5, 0xeb, 0xa6, 0x6b, 0xba, 0x75, 0x89, 0x6f, 0x75, 0x5e, 0xc8, 0x2f, 0xf9, 0x21, - 0x7f, 0x05, 0xbc, 0x8b, 0xd7, 0x95, 0x43, 0xd8, 0xa3, 0x36, 0x36, 0xb6, 0xa9, 0x43, 0xfc, 0x5e, - 0xec, 0x92, 0x4d, 0x38, 0xae, 0x77, 0x33, 0xde, 0x2c, 0xd6, 0x07, 0xa1, 0xfc, 0x8e, 0xc3, 0xa9, - 0x4d, 0x32, 0x80, 0x1b, 0x47, 0x01, 0x98, 0xb1, 0x4d, 0x6c, 0x9c, 0xc1, 0x5d, 0x1b, 0x84, 0xeb, - 0x70, 0x6a, 0xd5, 0xa9, 0xc3, 0x19, 0xf7, 0x33, 0xa0, 0xc4, 0x9e, 0x18, 0xf1, 0xbb, 0xc4, 0x8f, - 0x37, 0x44, 0x5e, 0x61, 0xdb, 0xb3, 0x48, 0xde, 0x9e, 0x2e, 0x0f, 0xbc, 0x9a, 0x3c, 0xed, 0xdb, - 0x87, 0x5c, 0xa4, 0xe7, 0x5a, 0xd4, 0xe8, 0x0d, 0xba, 0xca, 0xda, 0x4f, 0xa3, 0x00, 0xdc, 0x27, - 0x9e, 0xe5, 0xf6, 0x6c, 0xe2, 0x70, 0xf8, 0x39, 0x28, 0x89, 0x63, 0x6e, 0x63, 0x8e, 0x2b, 0xda, - 0x39, 0xed, 0xe2, 0xd4, 0xf2, 0xff, 0x74, 0x75, 0xd9, 0xc9, 0x5d, 0xc7, 0xd7, 0x2d, 0xb4, 0xf5, - 0xee, 0x55, 0xfd, 0x71, 0xeb, 0x25, 0x31, 0xf8, 0x3a, 0xe1, 0xb8, 0x01, 0x77, 0xf7, 0x96, 0x46, - 0x0e, 0xf6, 0x96, 0x40, 0xbc, 0x86, 0x22, 0x56, 0xf8, 0x14, 0x14, 0x98, 0x47, 0x8c, 0xca, 0xa8, - 0x64, 0xbf, 0xa9, 0x1f, 0x33, 0x94, 0xf4, 0xd8, 0xc9, 0xa6, 0x47, 0x8c, 0xc6, 0x29, 0x65, 0xa4, - 0x20, 0xbe, 0x90, 0xa4, 0x84, 0x18, 0x8c, 0x33, 0x8e, 0x79, 0x87, 0x55, 0xc6, 0x24, 0xf9, 0xed, - 0x61, 0xc8, 0x25, 0x41, 0xa3, 0xac, 0xe8, 0xc7, 0x83, 0x6f, 0xa4, 0x88, 0x6b, 0xfb, 0x63, 0x60, - 0x2e, 0x56, 0xbe, 0xe7, 0x3a, 0x6d, 0xca, 0xa9, 0xeb, 0xc0, 0x15, 0x50, 0xe0, 0x3d, 0x8f, 0xc8, - 0x33, 0x9b, 0x6c, 0x5c, 0x08, 0x9d, 0xdb, 0xec, 0x79, 0xe4, 0xed, 0xde, 0xd2, 0x42, 0x0e, 0x44, - 0x88, 0x90, 0x04, 0xc1, 0x27, 0x91, 0xdf, 0xa3, 0x12, 0x7e, 0x37, 0x6d, 0xfc, 0xed, 0xde, 0xd2, - 0xa1, 0xe1, 0xa0, 0x47, 0x9c, 0x69, 0x67, 0xe1, 0x79, 0x30, 0xee, 0x13, 0xcc, 0x5c, 0xa7, 0x52, - 0x90, 0xbc, 0xd1, 0xa6, 0x90, 0x5c, 0x45, 0x4a, 0x0a, 0x2f, 0x81, 0x09, 0x9b, 0x30, 0x86, 0x4d, - 0x52, 0x29, 0x4a, 0xc5, 0x19, 0xa5, 0x38, 0xb1, 0x1e, 0x2c, 0xa3, 0x50, 0x0e, 0x5f, 0x82, 0xb2, - 0x85, 0x19, 0xdf, 0xf2, 0xda, 0x98, 0x93, 0x4d, 0x6a, 0x93, 0xca, 0xb8, 0x3c, 0xea, 0xff, 0x1e, - 0x2f, 0x4a, 0x04, 0xa2, 0x71, 0x46, 0xb1, 0x97, 0xd7, 0x52, 0x4c, 0xa8, 0x8f, 0x19, 0x76, 0x01, - 0x14, 0x2b, 0x9b, 0x3e, 0x76, 0x58, 0x70, 0x64, 0xc2, 0xde, 0xc4, 0x89, 0xed, 0x2d, 0x2a, 0x7b, - 0x70, 0x2d, 0xc3, 0x86, 0x72, 0x2c, 0xd4, 0x76, 0x35, 0x50, 0x8e, 0x2f, 0x6c, 0x8d, 0x32, 0x0e, - 0x9f, 0x67, 0xd2, 0x42, 0x3f, 0x9e, 0x03, 0x02, 0x2d, 0x93, 0xe2, 0xb4, 0x72, 0xa2, 0x14, 0xae, - 0x24, 0x52, 0xe2, 0x13, 0x50, 0xa4, 0x9c, 0xd8, 0xe2, 0xfa, 0xc7, 0x2e, 0x4e, 0x2d, 0x5f, 0x1b, - 0x22, 0x6c, 0x1b, 0xd3, 0x8a, 0xbf, 0xf8, 0x48, 0x30, 0xa1, 0x80, 0xb0, 0xf6, 0xf5, 0x18, 0x80, - 0xb1, 0x12, 0x72, 0x2d, 0xab, 0x85, 0x8d, 0x1d, 0x78, 0x0e, 0x14, 0x1c, 0x6c, 0x87, 0xd1, 0x1a, - 0xa5, 0xd2, 0xc7, 0xd8, 0x26, 0x48, 0x4a, 0xe0, 0xf7, 0x1a, 0x80, 0x1d, 0x79, 0x15, 0xed, 0x55, - 0xc7, 0x71, 0x39, 0x16, 0xa7, 0x13, 0x3a, 0xd8, 0x1c, 0xc2, 0xc1, 0xd0, 0xb6, 0xbe, 0x95, 0x61, - 0x7d, 0xe0, 0x70, 0xbf, 0x17, 0xdf, 0x52, 0x56, 0x01, 0xe5, 0xb8, 0x02, 0x77, 0x00, 0xf0, 0x15, - 0xe7, 0xa6, 0xab, 0x12, 0xfe, 0xf8, 0xd5, 0x24, 0x74, 0xe7, 0x9e, 0xeb, 0xbc, 0xa0, 0x66, 0x5c, - 0xb2, 0x50, 0x44, 0x89, 0x12, 0xf4, 0x8b, 0x0f, 0xc0, 0xc2, 0x00, 0xbf, 0xe1, 0x69, 0x30, 0xb6, - 0x43, 0x7a, 0xc1, 0x51, 0x22, 0xf1, 0x13, 0xce, 0x83, 0x62, 0x17, 0x5b, 0x1d, 0x12, 0x64, 0x33, - 0x0a, 0x3e, 0xee, 0x8c, 0xde, 0xd2, 0x6a, 0xbf, 0x17, 0x93, 0x91, 0x25, 0x2a, 0x17, 0xbc, 0x08, - 0x4a, 0x3e, 0xf1, 0x2c, 0x6a, 0x60, 0x26, 0x39, 0x8a, 0x8d, 0x53, 0x22, 0x4a, 0x90, 0x5a, 0x43, - 0x91, 0x14, 0x7e, 0x06, 0x4a, 0x8c, 0x58, 0xc4, 0xe0, 0xae, 0xaf, 0x8a, 0xe7, 0xb5, 0x63, 0xc6, - 0x20, 0x6e, 0x11, 0xab, 0xa9, 0xa0, 0x01, 0x7d, 0xf8, 0x85, 0x22, 0x4a, 0xf8, 0x29, 0x28, 0x71, - 0x62, 0x7b, 0x16, 0xe6, 0x44, 0x9d, 0xe6, 0x95, 0xc1, 0xa7, 0x29, 0x68, 0x37, 0xdc, 0xf6, 0xa6, - 0x02, 0xc8, 0x8a, 0x1c, 0x45, 0x78, 0xb8, 0x8a, 0x22, 0x42, 0x48, 0x41, 0x89, 0x71, 0xf1, 0xec, - 0x98, 0x3d, 0x59, 0x8b, 0xa6, 0x96, 0x57, 0x86, 0xaa, 0xcd, 0x01, 0x45, 0x6c, 0x2a, 0x5c, 0x41, - 0x11, 0x3d, 0x5c, 0x05, 0x33, 0x36, 0x75, 0x10, 0xc1, 0xed, 0x5e, 0x93, 0x18, 0xae, 0xd3, 0x66, - 0xb2, 0xa8, 0x15, 0x1b, 0x0b, 0x0a, 0x34, 0xb3, 0x9e, 0x16, 0xa3, 0x7e, 0x7d, 0xb8, 0x06, 0xe6, - 0x7d, 0xd2, 0xa5, 0x8c, 0xba, 0xce, 0x87, 0x94, 0x71, 0xd7, 0xef, 0xad, 0x51, 0x9b, 0x72, 0x59, - 0xea, 0x8a, 0x8d, 0xca, 0xc1, 0xde, 0xd2, 0x3c, 0xca, 0x91, 0xa3, 0x5c, 0x94, 0xa8, 0xc2, 0x1e, - 0xee, 0x30, 0xd2, 0x96, 0xa5, 0xab, 0x14, 0x57, 0xe1, 0x0d, 0xb9, 0x8a, 0x94, 0x14, 0x9a, 0xa9, - 0x80, 0x2e, 0xfd, 0xb5, 0x80, 0x2e, 0x0f, 0x0e, 0x66, 0xb8, 0x05, 0x16, 0x3c, 0xdf, 0x35, 0x7d, - 0xc2, 0xd8, 0x7d, 0x82, 0xdb, 0x16, 0x75, 0x48, 0x78, 0x52, 0x93, 0x72, 0x87, 0x67, 0x0f, 0xf6, - 0x96, 0x16, 0x36, 0xf2, 0x55, 0xd0, 0x20, 0x6c, 0xed, 0xdb, 0x02, 0x38, 0xdd, 0xff, 0x8e, 0xc2, - 0x8f, 0x00, 0x74, 0x5b, 0xb2, 0xef, 0x69, 0x3f, 0x0c, 0x3a, 0x0f, 0xea, 0x3a, 0x32, 0xd0, 0xc7, - 0xe2, 0x8c, 0x7f, 0x9c, 0xd1, 0x40, 0x39, 0x28, 0x78, 0x39, 0x91, 0x2a, 0xa3, 0xd2, 0xd1, 0x28, - 0x0e, 0x72, 0xd2, 0x65, 0x15, 0xcc, 0xa8, 0xaa, 0x11, 0x0a, 0x65, 0x58, 0x27, 0xe2, 0x60, 0x2b, - 0x2d, 0x46, 0xfd, 0xfa, 0xf0, 0x21, 0x98, 0xc5, 0x5d, 0x4c, 0x2d, 0xdc, 0xb2, 0x48, 0x44, 0x52, - 0x90, 0x24, 0xff, 0x56, 0x24, 0xb3, 0xab, 0xfd, 0x0a, 0x28, 0x8b, 0x81, 0xeb, 0x60, 0xae, 0xe3, - 0x64, 0xa9, 0x82, 0xb8, 0x3c, 0xab, 0xa8, 0xe6, 0xb6, 0xb2, 0x2a, 0x28, 0x0f, 0x07, 0x3d, 0x00, - 0x8c, 0xf0, 0xc9, 0x67, 0x95, 0x71, 0x59, 0x93, 0xdf, 0x1b, 0x22, 0x9f, 0xa2, 0xbe, 0x21, 0xae, - 0x7f, 0xd1, 0x12, 0x43, 0x09, 0x1b, 0x70, 0x05, 0x4c, 0xfb, 0x22, 0x43, 0x22, 0xd7, 0x27, 0xa4, - 0xeb, 0xff, 0x52, 0xb0, 0x69, 0x94, 0x14, 0xa2, 0xb4, 0x6e, 0xed, 0x57, 0x2d, 0xf9, 0x08, 0x85, - 0x29, 0x0b, 0xef, 0xa4, 0x5a, 0xa6, 0xf3, 0x7d, 0x2d, 0xd3, 0x99, 0x2c, 0x22, 0xd1, 0x31, 0xf5, - 0xc0, 0xb4, 0x08, 0x68, 0xea, 0x98, 0xc1, 0x25, 0xaa, 0x82, 0xf8, 0xfe, 0x89, 0xd2, 0x25, 0x42, - 0x27, 0x9e, 0xd1, 0x59, 0xb9, 0x9b, 0xa4, 0x10, 0xa5, 0x2d, 0xd5, 0xee, 0x82, 0x72, 0x3a, 0xd7, - 0x82, 0xb8, 0x0c, 0x12, 0x5f, 0x45, 0x76, 0x22, 0x2e, 0x83, 0x75, 0x14, 0x69, 0xd4, 0xde, 0x68, - 0x60, 0x61, 0x80, 0x75, 0x68, 0x81, 0xb2, 0x8d, 0x5f, 0x25, 0xe2, 0xe0, 0xc8, 0x1e, 0x5c, 0x4c, - 0x1e, 0x7a, 0x30, 0x79, 0xe8, 0x8f, 0x1c, 0xfe, 0xd8, 0x6f, 0x72, 0x9f, 0x3a, 0x66, 0x03, 0x8a, - 0xfe, 0x6a, 0x3d, 0xc5, 0x85, 0xfa, 0xb8, 0xe1, 0x33, 0x50, 0xb2, 0xf1, 0xab, 0x66, 0xc7, 0x37, - 0xc3, 0xf3, 0x3b, 0xb9, 0x1d, 0xf9, 0x9a, 0xac, 0x2b, 0x16, 0x14, 0xf1, 0xd5, 0xbe, 0x1b, 0x05, - 0xc5, 0xa6, 0x81, 0x2d, 0xf2, 0x0e, 0x26, 0x8a, 0xcd, 0xd4, 0x44, 0xb1, 0x7c, 0xec, 0x18, 0x90, - 0xfe, 0x0d, 0x1c, 0x26, 0x9e, 0xf7, 0x0d, 0x13, 0xd7, 0x4f, 0xc8, 0x7b, 0xf8, 0x1c, 0x71, 0x1b, - 0x4c, 0x46, 0xe6, 0x53, 0x85, 0x4d, 0x3b, 0xaa, 0xb0, 0xd5, 0x7e, 0x1c, 0x05, 0x53, 0x09, 0x13, - 0x27, 0x43, 0x43, 0x2f, 0xd5, 0x45, 0x88, 0xca, 0xd1, 0x18, 0x66, 0x63, 0x7a, 0xd8, 0x41, 0x04, - 0xcd, 0x5b, 0xfc, 0x20, 0x67, 0x1b, 0x8b, 0xbb, 0xa0, 0xcc, 0xb1, 0x6f, 0x12, 0x1e, 0xca, 0xe4, - 0x81, 0x4e, 0xc6, 0x63, 0xc0, 0x66, 0x4a, 0x8a, 0xfa, 0xb4, 0x17, 0x57, 0xc0, 0x74, 0xca, 0xd8, - 0x89, 0x3a, 0xae, 0x9f, 0xc5, 0x61, 0x71, 0xcc, 0xc9, 0x8b, 0x8e, 0xd5, 0x24, 0xef, 0x62, 0xbe, - 0x7d, 0x96, 0x8a, 0xc6, 0x5b, 0xc7, 0x3f, 0xdc, 0xd8, 0xcb, 0x81, 0x31, 0xd9, 0xea, 0x8b, 0xc9, - 0x3b, 0x43, 0xb1, 0x1f, 0x1e, 0x99, 0xbf, 0x68, 0x60, 0x26, 0xa1, 0xfd, 0x0e, 0xc6, 0x9f, 0xa7, - 0xe9, 0xf1, 0xe7, 0xfa, 0x30, 0x9b, 0x1a, 0x30, 0xff, 0xfc, 0x50, 0x48, 0x6d, 0xe6, 0x1f, 0xd4, - 0x71, 0x7f, 0xa9, 0x81, 0xf9, 0xae, 0x6b, 0x75, 0x6c, 0x72, 0xcf, 0xc2, 0xd4, 0x0e, 0x35, 0x44, - 0xff, 0x72, 0xc4, 0x8c, 0x29, 0x2d, 0x11, 0x9f, 0x51, 0xc6, 0x89, 0xc3, 0x9f, 0xc4, 0x1c, 0x8d, - 0xff, 0x28, 0x7b, 0xf3, 0x4f, 0x72, 0x88, 0x51, 0xae, 0x39, 0xf8, 0x7f, 0x30, 0x25, 0x1a, 0x39, - 0x6a, 0x10, 0x31, 0x5d, 0xaa, 0xff, 0x17, 0xe6, 0x14, 0xd1, 0x54, 0x33, 0x16, 0xa1, 0xa4, 0x1e, - 0xdc, 0x06, 0x73, 0x9e, 0xdb, 0x5e, 0xc7, 0x0e, 0x36, 0x89, 0x78, 0x1a, 0x37, 0xe4, 0xbf, 0x58, - 0xb2, 0x03, 0x9f, 0x6c, 0xdc, 0x08, 0x3b, 0xa6, 0x8d, 0xac, 0xca, 0x5b, 0xd1, 0xba, 0x66, 0x97, - 0x65, 0xef, 0x90, 0x47, 0x59, 0xfb, 0x4a, 0x03, 0xb3, 0x99, 0xec, 0x80, 0x1f, 0x1c, 0xd2, 0xb7, - 0x9e, 0xf9, 0xbb, 0x7a, 0xd6, 0xc6, 0xa5, 0xdd, 0xfd, 0xea, 0xc8, 0xeb, 0xfd, 0xea, 0xc8, 0x6f, - 0xfb, 0xd5, 0x91, 0x2f, 0x0e, 0xaa, 0xda, 0xee, 0x41, 0x55, 0x7b, 0x7d, 0x50, 0xd5, 0xfe, 0x38, - 0xa8, 0x6a, 0xdf, 0xbc, 0xa9, 0x8e, 0x3c, 0x9b, 0x50, 0xb1, 0xff, 0x67, 0x00, 0x00, 0x00, 0xff, - 0xff, 0xdb, 0x8b, 0x00, 0x6d, 0xbc, 0x15, 0x00, 0x00, + 0xe4, 0xe3, 0x21, 0x59, 0xbd, 0x38, 0x79, 0xf9, 0xb0, 0x8b, 0xa0, 0x96, 0x93, 0xa6, 0x29, 0xec, + 0xc6, 0xa0, 0xec, 0xa0, 0x49, 0x53, 0xa0, 0xd4, 0x8a, 0x59, 0x33, 0xde, 0x2f, 0x2c, 0x29, 0x21, + 0xba, 0xf5, 0xd2, 0x43, 0x81, 0x1e, 0xfa, 0x0f, 0x14, 0xed, 0xb9, 0x28, 0xd0, 0x7f, 0xc3, 0x68, + 0x2f, 0x41, 0x4f, 0x45, 0x0f, 0x46, 0xed, 0xfc, 0x17, 0x39, 0x15, 0xe4, 0x72, 0xbf, 0xb4, 0x92, + 0x2d, 0xab, 0x68, 0x2e, 0xbd, 0x69, 0x39, 0xf3, 0xfb, 0xcd, 0x90, 0x9c, 0x19, 0xce, 0x08, 0xdc, + 0xde, 0xbb, 0xc3, 0x74, 0xea, 0x56, 0xf7, 0x5a, 0x0d, 0xe2, 0x3b, 0x84, 0x13, 0x56, 0xf5, 0xf6, + 0xcc, 0x2a, 0xf6, 0x28, 0xab, 0x62, 0xcf, 0x63, 0xd5, 0xf6, 0xf5, 0x06, 0xe1, 0xf8, 0x7a, 0xd5, + 0x24, 0x0e, 0xf1, 0x31, 0x27, 0x4d, 0xdd, 0xf3, 0x5d, 0xee, 0xc2, 0x4b, 0x01, 0x50, 0x8f, 0x81, + 0xba, 0xb7, 0x67, 0xea, 0x02, 0xa8, 0x0b, 0xa0, 0xae, 0x80, 0x8b, 0xd7, 0x4c, 0xca, 0x77, 0x5b, + 0x0d, 0xdd, 0x70, 0xed, 0xaa, 0xe9, 0x9a, 0x6e, 0x55, 0xe2, 0x1b, 0xad, 0x17, 0xf2, 0x4b, 0x7e, + 0xc8, 0x5f, 0x01, 0xef, 0xe2, 0x4d, 0xe5, 0x10, 0xf6, 0xa8, 0x8d, 0x8d, 0x5d, 0xea, 0x10, 0xbf, + 0x13, 0xbb, 0x64, 0x13, 0x8e, 0xab, 0xed, 0x8c, 0x37, 0x8b, 0xd5, 0x7e, 0x28, 0xbf, 0xe5, 0x70, + 0x6a, 0x93, 0x0c, 0xe0, 0xd6, 0x49, 0x00, 0x66, 0xec, 0x12, 0x1b, 0x67, 0x70, 0x37, 0xfa, 0xe1, + 0x5a, 0x9c, 0x5a, 0x55, 0xea, 0x70, 0xc6, 0xfd, 0x0c, 0x28, 0xb1, 0x27, 0x46, 0xfc, 0x36, 0xf1, + 0xe3, 0x0d, 0x91, 0x57, 0xd8, 0xf6, 0x2c, 0xd2, 0x6b, 0x4f, 0x57, 0xfb, 0x5e, 0x4d, 0x2f, 0xed, + 0xbb, 0xc7, 0x5c, 0xa4, 0xe7, 0x5a, 0xd4, 0xe8, 0xf4, 0xbb, 0xca, 0xca, 0x8f, 0xa3, 0x00, 0xdc, + 0x27, 0x9e, 0xe5, 0x76, 0x6c, 0xe2, 0x70, 0xf8, 0x39, 0x28, 0x88, 0x63, 0x6e, 0x62, 0x8e, 0x4b, + 0xda, 0x05, 0xed, 0xf2, 0xd4, 0xf2, 0xff, 0x74, 0x75, 0xd9, 0xc9, 0x5d, 0xc7, 0xd7, 0x2d, 0xb4, + 0xf5, 0xf6, 0x75, 0xfd, 0x71, 0xe3, 0x25, 0x31, 0xf8, 0x26, 0xe1, 0xb8, 0x06, 0xf7, 0x0f, 0x96, + 0x46, 0x8e, 0x0e, 0x96, 0x40, 0xbc, 0x86, 0x22, 0x56, 0xf8, 0x14, 0xe4, 0x98, 0x47, 0x8c, 0xd2, + 0xa8, 0x64, 0xbf, 0xad, 0x0f, 0x18, 0x4a, 0x7a, 0xec, 0x64, 0xdd, 0x23, 0x46, 0xed, 0x8c, 0x32, + 0x92, 0x13, 0x5f, 0x48, 0x52, 0x42, 0x0c, 0xc6, 0x19, 0xc7, 0xbc, 0xc5, 0x4a, 0x63, 0x92, 0xfc, + 0xee, 0x30, 0xe4, 0x92, 0xa0, 0x56, 0x54, 0xf4, 0xe3, 0xc1, 0x37, 0x52, 0xc4, 0x95, 0xc3, 0x31, + 0x30, 0x17, 0x2b, 0xaf, 0xbb, 0x4e, 0x93, 0x72, 0xea, 0x3a, 0x70, 0x15, 0xe4, 0x78, 0xc7, 0x23, + 0xf2, 0xcc, 0x26, 0x6b, 0x97, 0x42, 0xe7, 0xb6, 0x3b, 0x1e, 0x79, 0x7b, 0xb0, 0xb4, 0xd0, 0x03, + 0x22, 0x44, 0x48, 0x82, 0xe0, 0x93, 0xc8, 0xef, 0x51, 0x09, 0xbf, 0x97, 0x36, 0xfe, 0xf6, 0x60, + 0xe9, 0xd8, 0x70, 0xd0, 0x23, 0xce, 0xb4, 0xb3, 0xf0, 0x22, 0x18, 0xf7, 0x09, 0x66, 0xae, 0x53, + 0xca, 0x49, 0xde, 0x68, 0x53, 0x48, 0xae, 0x22, 0x25, 0x85, 0x57, 0xc0, 0x84, 0x4d, 0x18, 0xc3, + 0x26, 0x29, 0xe5, 0xa5, 0xe2, 0x8c, 0x52, 0x9c, 0xd8, 0x0c, 0x96, 0x51, 0x28, 0x87, 0x2f, 0x41, + 0xd1, 0xc2, 0x8c, 0xef, 0x78, 0x4d, 0xcc, 0xc9, 0x36, 0xb5, 0x49, 0x69, 0x5c, 0x1e, 0xf5, 0x7f, + 0x07, 0x8b, 0x12, 0x81, 0xa8, 0x9d, 0x53, 0xec, 0xc5, 0x8d, 0x14, 0x13, 0xea, 0x62, 0x86, 0x6d, + 0x00, 0xc5, 0xca, 0xb6, 0x8f, 0x1d, 0x16, 0x1c, 0x99, 0xb0, 0x37, 0x71, 0x6a, 0x7b, 0x8b, 0xca, + 0x1e, 0xdc, 0xc8, 0xb0, 0xa1, 0x1e, 0x16, 0x2a, 0xfb, 0x1a, 0x28, 0xc6, 0x17, 0xb6, 0x41, 0x19, + 0x87, 0xcf, 0x33, 0x69, 0xa1, 0x0f, 0xe6, 0x80, 0x40, 0xcb, 0xa4, 0x38, 0xab, 0x9c, 0x28, 0x84, + 0x2b, 0x89, 0x94, 0xf8, 0x04, 0xe4, 0x29, 0x27, 0xb6, 0xb8, 0xfe, 0xb1, 0xcb, 0x53, 0xcb, 0x37, + 0x86, 0x08, 0xdb, 0xda, 0xb4, 0xe2, 0xcf, 0x3f, 0x12, 0x4c, 0x28, 0x20, 0xac, 0x7c, 0x3d, 0x06, + 0x60, 0xac, 0x84, 0x5c, 0xcb, 0x6a, 0x60, 0x63, 0x0f, 0x5e, 0x00, 0x39, 0x07, 0xdb, 0x61, 0xb4, + 0x46, 0xa9, 0xf4, 0x31, 0xb6, 0x09, 0x92, 0x12, 0xf8, 0x9d, 0x06, 0x60, 0x4b, 0x5e, 0x45, 0x73, + 0xcd, 0x71, 0x5c, 0x8e, 0xc5, 0xe9, 0x84, 0x0e, 0xd6, 0x87, 0x70, 0x30, 0xb4, 0xad, 0xef, 0x64, + 0x58, 0x1f, 0x38, 0xdc, 0xef, 0xc4, 0xb7, 0x94, 0x55, 0x40, 0x3d, 0x5c, 0x81, 0x7b, 0x00, 0xf8, + 0x8a, 0x73, 0xdb, 0x55, 0x09, 0x3f, 0x78, 0x35, 0x09, 0xdd, 0x59, 0x77, 0x9d, 0x17, 0xd4, 0x8c, + 0x4b, 0x16, 0x8a, 0x28, 0x51, 0x82, 0x7e, 0xf1, 0x01, 0x58, 0xe8, 0xe3, 0x37, 0x3c, 0x0b, 0xc6, + 0xf6, 0x48, 0x27, 0x38, 0x4a, 0x24, 0x7e, 0xc2, 0x79, 0x90, 0x6f, 0x63, 0xab, 0x45, 0x82, 0x6c, + 0x46, 0xc1, 0xc7, 0xca, 0xe8, 0x1d, 0xad, 0xf2, 0x7b, 0x3e, 0x19, 0x59, 0xa2, 0x72, 0xc1, 0xcb, + 0xa0, 0xe0, 0x13, 0xcf, 0xa2, 0x06, 0x66, 0x92, 0x23, 0x5f, 0x3b, 0x23, 0xa2, 0x04, 0xa9, 0x35, + 0x14, 0x49, 0xe1, 0x67, 0xa0, 0xc0, 0x88, 0x45, 0x0c, 0xee, 0xfa, 0xaa, 0x78, 0xde, 0x18, 0x30, + 0x06, 0x71, 0x83, 0x58, 0x75, 0x05, 0x0d, 0xe8, 0xc3, 0x2f, 0x14, 0x51, 0xc2, 0x4f, 0x41, 0x81, + 0x13, 0xdb, 0xb3, 0x30, 0x27, 0xea, 0x34, 0xaf, 0xf5, 0x3f, 0x4d, 0x41, 0xbb, 0xe5, 0x36, 0xb7, + 0x15, 0x40, 0x56, 0xe4, 0x28, 0xc2, 0xc3, 0x55, 0x14, 0x11, 0x42, 0x0a, 0x0a, 0x8c, 0x8b, 0x67, + 0xc7, 0xec, 0xc8, 0x5a, 0x34, 0xb5, 0xbc, 0x3a, 0x54, 0x6d, 0x0e, 0x28, 0x62, 0x53, 0xe1, 0x0a, + 0x8a, 0xe8, 0xe1, 0x1a, 0x98, 0xb1, 0xa9, 0x83, 0x08, 0x6e, 0x76, 0xea, 0xc4, 0x70, 0x9d, 0x26, + 0x93, 0x45, 0x2d, 0x5f, 0x5b, 0x50, 0xa0, 0x99, 0xcd, 0xb4, 0x18, 0x75, 0xeb, 0xc3, 0x0d, 0x30, + 0xef, 0x93, 0x36, 0x65, 0xd4, 0x75, 0x3e, 0xa4, 0x8c, 0xbb, 0x7e, 0x67, 0x83, 0xda, 0x94, 0xcb, + 0x52, 0x97, 0xaf, 0x95, 0x8e, 0x0e, 0x96, 0xe6, 0x51, 0x0f, 0x39, 0xea, 0x89, 0x12, 0x55, 0xd8, + 0xc3, 0x2d, 0x46, 0x9a, 0xb2, 0x74, 0x15, 0xe2, 0x2a, 0xbc, 0x25, 0x57, 0x91, 0x92, 0x42, 0x33, + 0x15, 0xd0, 0x85, 0xbf, 0x16, 0xd0, 0xc5, 0xfe, 0xc1, 0x0c, 0x77, 0xc0, 0x82, 0xe7, 0xbb, 0xa6, + 0x4f, 0x18, 0xbb, 0x4f, 0x70, 0xd3, 0xa2, 0x0e, 0x09, 0x4f, 0x6a, 0x52, 0xee, 0xf0, 0xfc, 0xd1, + 0xc1, 0xd2, 0xc2, 0x56, 0x6f, 0x15, 0xd4, 0x0f, 0x5b, 0xf9, 0x35, 0x07, 0xce, 0x76, 0xbf, 0xa3, + 0xf0, 0x23, 0x00, 0xdd, 0x86, 0xec, 0x7b, 0x9a, 0x0f, 0x83, 0xce, 0x83, 0xba, 0x8e, 0x0c, 0xf4, + 0xb1, 0x38, 0xe3, 0x1f, 0x67, 0x34, 0x50, 0x0f, 0x14, 0xbc, 0x9a, 0x48, 0x95, 0x51, 0xe9, 0x68, + 0x14, 0x07, 0x3d, 0xd2, 0x65, 0x0d, 0xcc, 0xa8, 0xaa, 0x11, 0x0a, 0x65, 0x58, 0x27, 0xe2, 0x60, + 0x27, 0x2d, 0x46, 0xdd, 0xfa, 0xf0, 0x21, 0x98, 0xc5, 0x6d, 0x4c, 0x2d, 0xdc, 0xb0, 0x48, 0x44, + 0x92, 0x93, 0x24, 0xff, 0x56, 0x24, 0xb3, 0x6b, 0xdd, 0x0a, 0x28, 0x8b, 0x81, 0x9b, 0x60, 0xae, + 0xe5, 0x64, 0xa9, 0x82, 0xb8, 0x3c, 0xaf, 0xa8, 0xe6, 0x76, 0xb2, 0x2a, 0xa8, 0x17, 0x0e, 0x7a, + 0x00, 0x18, 0xe1, 0x93, 0xcf, 0x4a, 0xe3, 0xb2, 0x26, 0xbf, 0x37, 0x44, 0x3e, 0x45, 0x7d, 0x43, + 0x5c, 0xff, 0xa2, 0x25, 0x86, 0x12, 0x36, 0xe0, 0x2a, 0x98, 0xf6, 0x45, 0x86, 0x44, 0xae, 0x4f, + 0x48, 0xd7, 0xff, 0xa5, 0x60, 0xd3, 0x28, 0x29, 0x44, 0x69, 0x5d, 0xb8, 0x02, 0x8a, 0x86, 0x6b, + 0x59, 0x32, 0x33, 0xd6, 0xdd, 0x96, 0xc3, 0x65, 0x70, 0x8f, 0xd5, 0xa0, 0xe8, 0x01, 0xd6, 0x53, + 0x12, 0xd4, 0xa5, 0x59, 0xf9, 0x45, 0x4b, 0x3e, 0x60, 0x61, 0xba, 0xc3, 0x95, 0x54, 0xbb, 0x75, + 0xb1, 0xab, 0xdd, 0x3a, 0x97, 0x45, 0x24, 0xba, 0xad, 0x0e, 0x98, 0x16, 0xc9, 0x40, 0x1d, 0x33, + 0x08, 0x00, 0x55, 0x4c, 0xdf, 0x3f, 0x55, 0xaa, 0x45, 0xe8, 0xc4, 0x13, 0x3c, 0x2b, 0x4f, 0x22, + 0x29, 0x44, 0x69, 0x4b, 0x95, 0x7b, 0xa0, 0x98, 0xce, 0xd3, 0x20, 0xa6, 0x83, 0xa2, 0xa1, 0xb2, + 0x22, 0x11, 0xd3, 0xc1, 0x3a, 0x8a, 0x34, 0x2a, 0x6f, 0x34, 0xb0, 0xd0, 0xc7, 0x3a, 0xb4, 0x40, + 0xd1, 0xc6, 0xaf, 0x12, 0x31, 0x74, 0x62, 0xff, 0x2e, 0xa6, 0x16, 0x3d, 0x98, 0x5a, 0xf4, 0x47, + 0x0e, 0x7f, 0xec, 0xd7, 0xb9, 0x4f, 0x1d, 0x33, 0xb8, 0x97, 0xcd, 0x14, 0x17, 0xea, 0xe2, 0x86, + 0xcf, 0x40, 0xc1, 0xc6, 0xaf, 0xea, 0x2d, 0xdf, 0x0c, 0xcf, 0xef, 0xf4, 0x76, 0xe4, 0x4b, 0xb4, + 0xa9, 0x58, 0x50, 0xc4, 0x57, 0xf9, 0x76, 0x14, 0xe4, 0xeb, 0x06, 0xb6, 0xc8, 0x3b, 0x98, 0x46, + 0xb6, 0x53, 0xd3, 0xc8, 0xf2, 0xc0, 0x31, 0x20, 0xfd, 0xeb, 0x3b, 0x88, 0x3c, 0xef, 0x1a, 0x44, + 0x6e, 0x9e, 0x92, 0xf7, 0xf8, 0x19, 0xe4, 0x2e, 0x98, 0x8c, 0xcc, 0xa7, 0x8a, 0xa2, 0x76, 0x52, + 0x51, 0xac, 0xfc, 0x30, 0x0a, 0xa6, 0x12, 0x26, 0x4e, 0x87, 0x86, 0x5e, 0xaa, 0x03, 0x11, 0x55, + 0xa7, 0x36, 0xcc, 0xc6, 0xf4, 0xb0, 0xfb, 0x08, 0x1a, 0xbf, 0xf8, 0x31, 0xcf, 0x36, 0x25, 0xf7, + 0x40, 0x91, 0x63, 0xdf, 0x24, 0x3c, 0x94, 0xc9, 0x03, 0x9d, 0x8c, 0x47, 0x88, 0xed, 0x94, 0x14, + 0x75, 0x69, 0x2f, 0xae, 0x82, 0xe9, 0x94, 0xb1, 0x53, 0x75, 0x6b, 0x3f, 0x89, 0xc3, 0xe2, 0x98, + 0x93, 0x17, 0x2d, 0xab, 0x4e, 0xde, 0xc5, 0x6c, 0xfc, 0x2c, 0x15, 0x8d, 0x77, 0x06, 0x3f, 0xdc, + 0xd8, 0xcb, 0xbe, 0x31, 0xd9, 0xe8, 0x8a, 0xc9, 0x95, 0xa1, 0xd8, 0x8f, 0x8f, 0xcc, 0x9f, 0x35, + 0x30, 0x93, 0xd0, 0x7e, 0x07, 0xa3, 0xd3, 0xd3, 0xf4, 0xe8, 0x74, 0x73, 0x98, 0x4d, 0xf5, 0x99, + 0x9d, 0xbe, 0xcf, 0xa5, 0x36, 0xf3, 0x0f, 0xea, 0xd6, 0xbf, 0xd4, 0xc0, 0x7c, 0xdb, 0xb5, 0x5a, + 0x36, 0x59, 0xb7, 0x30, 0xb5, 0x43, 0x0d, 0xd1, 0xfb, 0x9c, 0x30, 0x9f, 0x4a, 0x4b, 0xc4, 0x67, + 0x94, 0x71, 0xe2, 0xf0, 0x27, 0x31, 0x47, 0xed, 0x3f, 0xca, 0xde, 0xfc, 0x93, 0x1e, 0xc4, 0xa8, + 0xa7, 0x39, 0xf8, 0x7f, 0x30, 0x25, 0x9a, 0x40, 0x6a, 0x10, 0x31, 0x99, 0xaa, 0xff, 0x26, 0xe6, + 0x14, 0xd1, 0x54, 0x3d, 0x16, 0xa1, 0xa4, 0x1e, 0xdc, 0x05, 0x73, 0x9e, 0xdb, 0xdc, 0xc4, 0x0e, + 0x36, 0x89, 0x78, 0x1a, 0xb7, 0xe4, 0x3f, 0x60, 0xb2, 0x7b, 0x9f, 0xac, 0xdd, 0x0a, 0xbb, 0xad, + 0xad, 0xac, 0xca, 0x5b, 0xd1, 0xf6, 0x66, 0x97, 0x65, 0xef, 0xd0, 0x8b, 0xb2, 0xf2, 0x95, 0x06, + 0x66, 0x33, 0xd9, 0x01, 0x3f, 0x38, 0xa6, 0xe7, 0x3d, 0xf7, 0x77, 0xf5, 0xbb, 0xb5, 0x2b, 0xfb, + 0x87, 0xe5, 0x91, 0xd7, 0x87, 0xe5, 0x91, 0xdf, 0x0e, 0xcb, 0x23, 0x5f, 0x1c, 0x95, 0xb5, 0xfd, + 0xa3, 0xb2, 0xf6, 0xfa, 0xa8, 0xac, 0xfd, 0x71, 0x54, 0xd6, 0xbe, 0x79, 0x53, 0x1e, 0x79, 0x36, + 0xa1, 0x62, 0xff, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf2, 0xdb, 0x2f, 0x40, 0xf8, 0x15, 0x00, + 0x00, } diff --git a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/generated.proto b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/generated.proto index ad1d271464c..5e3d4b99fe2 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/generated.proto +++ b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/generated.proto @@ -170,6 +170,12 @@ message DeploymentStatus { // +patchMergeKey=type // +patchStrategy=merge repeated DeploymentCondition conditions = 6; + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + optional int64 collisionCount = 8; } // DeploymentStrategy describes how to replace existing pods with new ones. diff --git a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types.generated.go b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types.generated.go index 72d486de83c..7e8b15f174f 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types.generated.go +++ b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types.generated.go @@ -4672,7 +4672,7 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [7]bool + var yyq2 [8]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.ObservedGeneration != 0 @@ -4682,9 +4682,10 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[4] = x.AvailableReplicas != 0 yyq2[5] = x.UnavailableReplicas != 0 yyq2[6] = len(x.Conditions) != 0 + yyq2[7] = x.CollisionCount != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(7) + r.EncodeArrayStart(8) } else { yynn2 = 0 for _, b := range yyq2 { @@ -4878,6 +4879,41 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[7] { + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy25 := *x.CollisionCount + yym26 := z.EncBinary() + _ = yym26 + if false { + } else { + r.EncodeInt(int64(yy25)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[7] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("collisionCount")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy27 := *x.CollisionCount + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeInt(int64(yy27)) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -5023,6 +5059,22 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv16), d) } } + case "collisionCount": + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym19 := z.DecBinary() + _ = yym19 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -5034,16 +5086,16 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj18 int - var yyb18 bool - var yyhl18 bool = l >= 0 - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + var yyj20 int + var yyb20 bool + var yyhl20 bool = l >= 0 + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5051,21 +5103,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.ObservedGeneration = 0 } else { - yyv19 := &x.ObservedGeneration - yym20 := z.DecBinary() - _ = yym20 + yyv21 := &x.ObservedGeneration + yym22 := z.DecBinary() + _ = yym22 if false { } else { - *((*int64)(yyv19)) = int64(r.DecodeInt(64)) + *((*int64)(yyv21)) = int64(r.DecodeInt(64)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5073,29 +5125,7 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.Replicas = 0 } else { - yyv21 := &x.Replicas - yym22 := z.DecBinary() - _ = yym22 - if false { - } else { - *((*int32)(yyv21)) = int32(r.DecodeInt(32)) - } - } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l - } else { - yyb18 = r.CheckBreak() - } - if yyb18 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.UpdatedReplicas = 0 - } else { - yyv23 := &x.UpdatedReplicas + yyv23 := &x.Replicas yym24 := z.DecBinary() _ = yym24 if false { @@ -5103,21 +5133,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv23)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.ReadyReplicas = 0 + x.UpdatedReplicas = 0 } else { - yyv25 := &x.ReadyReplicas + yyv25 := &x.UpdatedReplicas yym26 := z.DecBinary() _ = yym26 if false { @@ -5125,21 +5155,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv25)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.AvailableReplicas = 0 + x.ReadyReplicas = 0 } else { - yyv27 := &x.AvailableReplicas + yyv27 := &x.ReadyReplicas yym28 := z.DecBinary() _ = yym28 if false { @@ -5147,21 +5177,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv27)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.UnavailableReplicas = 0 + x.AvailableReplicas = 0 } else { - yyv29 := &x.UnavailableReplicas + yyv29 := &x.AvailableReplicas yym30 := z.DecBinary() _ = yym30 if false { @@ -5169,13 +5199,35 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv29)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.UnavailableReplicas = 0 + } else { + yyv31 := &x.UnavailableReplicas + yym32 := z.DecBinary() + _ = yym32 + if false { + } else { + *((*int32)(yyv31)) = int32(r.DecodeInt(32)) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5183,26 +5235,52 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.Conditions = nil } else { - yyv31 := &x.Conditions - yym32 := z.DecBinary() - _ = yym32 + yyv33 := &x.Conditions + yym34 := z.DecBinary() + _ = yym34 if false { } else { - h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv31), d) + h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv33), d) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) } } for { - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj18-1, "") + z.DecStructFieldNotFound(yyj20-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -6470,7 +6548,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 960) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 968) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types.go b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types.go index cd1d2c2f205..ef76205acdb 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types.go +++ b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types.go @@ -356,6 +356,12 @@ type DeploymentStatus struct { // +patchMergeKey=type // +patchStrategy=merge Conditions []DeploymentCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,6,rep,name=conditions"` + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` } type DeploymentConditionType string diff --git a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go index f40254cb749..fffd81c3168 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/types_swagger_doc_generated.go @@ -99,6 +99,7 @@ var map_DeploymentStatus = map[string]string{ "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.", "unavailableReplicas": "Total number of unavailable pods targeted by this deployment.", "conditions": "Represents the latest available observations of a deployment's current state.", + "collisionCount": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", } func (DeploymentStatus) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go index 6047da92140..5d9bbf1c273 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/client-go/pkg/apis/apps/v1beta1/zz_generated.deepcopy.go @@ -184,6 +184,11 @@ func DeepCopy_v1beta1_DeploymentStatus(in interface{}, out interface{}, c *conve } } } + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + *out = new(int64) + **out = **in + } return nil } } diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/types.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/types.go index a1697cd8386..8cfbb3c7849 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/types.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/types.go @@ -327,6 +327,12 @@ type DeploymentStatus struct { // Represents the latest available observations of a deployment's current state. Conditions []DeploymentCondition + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + CollisionCount *int64 } type DeploymentConditionType string diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/generated.pb.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/generated.pb.go index d6c39c2549b..d8a4effd128 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/generated.pb.go @@ -1069,6 +1069,11 @@ func (m *DeploymentStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x38 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ReadyReplicas)) + if m.CollisionCount != nil { + dAtA[i] = 0x40 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(*m.CollisionCount)) + } return i, nil } @@ -2911,6 +2916,9 @@ func (m *DeploymentStatus) Size() (n int) { } } n += 1 + sovGenerated(uint64(m.ReadyReplicas)) + if m.CollisionCount != nil { + n += 1 + sovGenerated(uint64(*m.CollisionCount)) + } return n } @@ -3699,6 +3707,7 @@ func (this *DeploymentStatus) String() string { `UnavailableReplicas:` + fmt.Sprintf("%v", this.UnavailableReplicas) + `,`, `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "DeploymentCondition", "DeploymentCondition", 1), `&`, ``, 1) + `,`, `ReadyReplicas:` + fmt.Sprintf("%v", this.ReadyReplicas) + `,`, + `CollisionCount:` + valueToStringGenerated(this.CollisionCount) + `,`, `}`, }, "") return s @@ -6558,6 +6567,26 @@ func (m *DeploymentStatus) Unmarshal(dAtA []byte) error { break } } + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CollisionCount", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.CollisionCount = &v default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -11794,217 +11823,218 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 3379 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0xdb, 0x6f, 0x1b, 0xc7, - 0xd5, 0xf7, 0x8a, 0xa4, 0x45, 0x1d, 0x59, 0x92, 0x35, 0x72, 0x64, 0x46, 0x49, 0x44, 0x67, 0x3f, - 0x7c, 0x89, 0xf3, 0x7d, 0x09, 0xf5, 0xc5, 0xf9, 0x9c, 0x26, 0x4e, 0xe2, 0x44, 0x94, 0x7c, 0x51, - 0x21, 0xc9, 0xcc, 0x90, 0x32, 0x1a, 0xe7, 0xd6, 0x15, 0x39, 0xa2, 0xd6, 0xde, 0x5b, 0x76, 0x67, - 0x15, 0x11, 0x41, 0xdb, 0x00, 0x45, 0xf3, 0x58, 0xb4, 0x2f, 0x45, 0x0a, 0xa4, 0x8f, 0x7d, 0xe8, - 0x4b, 0x9b, 0x3c, 0xb4, 0x69, 0xff, 0x82, 0xfa, 0xa1, 0x28, 0x52, 0xa0, 0x05, 0x8a, 0x22, 0x15, - 0x6a, 0x05, 0xcd, 0x3f, 0xd0, 0xe6, 0xc5, 0x4f, 0xc5, 0xcc, 0xce, 0xde, 0x77, 0x65, 0x93, 0xb2, - 0x89, 0x02, 0x7d, 0xe3, 0xce, 0x9c, 0xf3, 0x3b, 0x97, 0x39, 0x73, 0xe6, 0xcc, 0x85, 0xf0, 0xd2, + // 3402 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0x4b, 0x6f, 0x1c, 0xc7, + 0xb5, 0x56, 0xcf, 0x43, 0x1c, 0x1e, 0x8a, 0xa4, 0x58, 0x94, 0xa9, 0x31, 0x6d, 0x93, 0x72, 0x5f, + 0x5c, 0x5b, 0xbe, 0xd7, 0x1e, 0x5e, 0xcb, 0x57, 0x8e, 0x2d, 0xdb, 0xb2, 0x39, 0xa4, 0x1e, 0x0c, + 0x48, 0x6a, 0x5c, 0x33, 0x14, 0x62, 0xf9, 0x95, 0xe6, 0x4c, 0x71, 0xd8, 0x52, 0xbf, 0xdc, 0x5d, + 0x4d, 0x73, 0x60, 0x24, 0x31, 0x10, 0xc4, 0xcb, 0x20, 0xd9, 0x04, 0x0e, 0x90, 0x2c, 0xb3, 0xc8, + 0x26, 0xb1, 0x17, 0x89, 0x93, 0x5f, 0x10, 0x2d, 0x82, 0xc0, 0x01, 0x12, 0xc0, 0x08, 0x1c, 0x22, + 0xa2, 0x11, 0xff, 0x81, 0xc4, 0x1b, 0xad, 0x82, 0xaa, 0xae, 0x7e, 0x77, 0x53, 0x9a, 0xa1, 0x34, + 0x08, 0x90, 0x1d, 0xa7, 0xea, 0x9c, 0xef, 0x3c, 0xea, 0xd4, 0xa9, 0x53, 0x75, 0x9a, 0xf0, 0xd2, 0x8d, 0xe7, 0x9c, 0x9a, 0x6a, 0x2e, 0xdc, 0x70, 0x37, 0x89, 0x6d, 0x10, 0x4a, 0x9c, 0x05, 0xeb, 0x46, 0x77, 0x41, 0xb1, 0x54, 0x67, 0x81, 0xec, 0x52, 0x62, 0x38, 0xaa, 0x69, 0x38, 0x0b, 0x3b, 0x4f, 0x6f, 0x12, 0xaa, 0x3c, 0xbd, 0xd0, 0x25, 0x06, 0xb1, 0x15, 0x4a, 0x3a, 0x35, 0xcb, 0x36, 0xa9, 0x89, 0x9e, 0xf2, 0xd8, 0x6b, 0x21, 0x7b, 0xcd, 0xba, 0xd1, 0xad, 0x31, 0xf6, 0x5a, 0xc8, - 0x5e, 0x13, 0xec, 0x73, 0x4f, 0x75, 0x55, 0xba, 0xed, 0x6e, 0xd6, 0xda, 0xa6, 0xbe, 0xd0, 0x35, - 0xbb, 0xe6, 0x02, 0x47, 0xd9, 0x74, 0xb7, 0xf8, 0x17, 0xff, 0xe0, 0xbf, 0x3c, 0xf4, 0xb9, 0xff, - 0x17, 0xca, 0x29, 0x96, 0xaa, 0x2b, 0xed, 0x6d, 0xd5, 0x20, 0x76, 0xcf, 0x57, 0x6f, 0xc1, 0x26, - 0x8e, 0xe9, 0xda, 0x6d, 0x92, 0xd4, 0xe9, 0x40, 0x2e, 0x67, 0x41, 0x27, 0x54, 0x59, 0xd8, 0x49, - 0x59, 0x32, 0xb7, 0x90, 0xc7, 0x65, 0xbb, 0x06, 0x55, 0xf5, 0xb4, 0x98, 0x67, 0xef, 0xc4, 0xe0, - 0xb4, 0xb7, 0x89, 0xae, 0xa4, 0xf8, 0x9e, 0xc9, 0xe3, 0x73, 0xa9, 0xaa, 0x2d, 0xa8, 0x06, 0x75, - 0xa8, 0x7d, 0x90, 0x4d, 0x0e, 0xb1, 0x77, 0x88, 0x1d, 0x1d, 0x25, 0x45, 0xb7, 0x34, 0x92, 0x65, - 0xd3, 0x93, 0xb9, 0x83, 0x9b, 0x45, 0xfd, 0xfc, 0x01, 0xa1, 0x60, 0x99, 0x9a, 0xda, 0xee, 0xe5, - 0x85, 0x81, 0x5c, 0x03, 0x58, 0x6c, 0xac, 0x5c, 0x25, 0x36, 0x1b, 0x6e, 0x74, 0x0a, 0x8a, 0x86, - 0xa2, 0x93, 0x8a, 0x74, 0x4a, 0x3a, 0x3d, 0x56, 0x3f, 0x76, 0x73, 0xaf, 0x7a, 0x64, 0x7f, 0xaf, - 0x5a, 0x5c, 0x57, 0x74, 0x82, 0x79, 0x8f, 0xfc, 0x63, 0x09, 0x1e, 0x5c, 0x72, 0x1d, 0x6a, 0xea, - 0x6b, 0x84, 0xda, 0x6a, 0x7b, 0xc9, 0xb5, 0x6d, 0x62, 0xd0, 0x26, 0x55, 0xa8, 0xeb, 0xdc, 0x99, - 0x1f, 0x5d, 0x83, 0xd2, 0x8e, 0xa2, 0xb9, 0xa4, 0x32, 0x72, 0x4a, 0x3a, 0x3d, 0x7e, 0xa6, 0x56, - 0x13, 0x61, 0x18, 0xf5, 0xa9, 0x1f, 0x88, 0x35, 0x3f, 0x50, 0x6a, 0xaf, 0xba, 0x8a, 0x41, 0x55, - 0xda, 0xab, 0x9f, 0x10, 0x90, 0xc7, 0x84, 0xdc, 0xab, 0x0c, 0x0b, 0x7b, 0x90, 0xf2, 0xf7, 0x25, - 0x78, 0x24, 0x57, 0xb7, 0x55, 0xd5, 0xa1, 0x48, 0x87, 0x92, 0x4a, 0x89, 0xee, 0x54, 0xa4, 0x53, - 0x85, 0xd3, 0xe3, 0x67, 0x2e, 0xd7, 0xfa, 0x9a, 0x04, 0xb5, 0x5c, 0xf0, 0xfa, 0x84, 0xd0, 0xab, - 0xb4, 0xc2, 0xe0, 0xb1, 0x27, 0x45, 0xfe, 0xa1, 0x04, 0x28, 0xca, 0xd3, 0x52, 0xec, 0x2e, 0xa1, - 0x77, 0xe1, 0xa5, 0xd7, 0x0e, 0xe7, 0xa5, 0x19, 0x01, 0x39, 0xee, 0x09, 0x8c, 0x39, 0xe9, 0x7d, - 0x09, 0x66, 0xd3, 0x3a, 0x71, 0xef, 0x6c, 0xc5, 0xbd, 0xb3, 0x78, 0x08, 0xef, 0x78, 0xa8, 0x39, - 0x6e, 0xf9, 0xe5, 0x08, 0x8c, 0x2d, 0x2b, 0x44, 0x37, 0x8d, 0x26, 0xa1, 0xe8, 0x9b, 0x50, 0x66, - 0x33, 0xbb, 0xa3, 0x50, 0x85, 0x7b, 0x64, 0xfc, 0xcc, 0xff, 0x1d, 0x64, 0xae, 0x53, 0x63, 0xd4, - 0xb5, 0x9d, 0xa7, 0x6b, 0x57, 0x36, 0xaf, 0x93, 0x36, 0x5d, 0x23, 0x54, 0xa9, 0x23, 0x21, 0x07, - 0xc2, 0x36, 0x1c, 0xa0, 0xa2, 0xb7, 0xa0, 0xe8, 0x58, 0xa4, 0x2d, 0x9c, 0xf9, 0x62, 0x9f, 0x66, - 0x05, 0x9a, 0x36, 0x2d, 0xd2, 0x0e, 0x47, 0x8b, 0x7d, 0x61, 0x8e, 0x8b, 0xb6, 0xe0, 0xa8, 0xc3, - 0xc3, 0xa0, 0x52, 0xe0, 0x12, 0xce, 0x0f, 0x2c, 0xc1, 0x0b, 0xa6, 0x49, 0x21, 0xe3, 0xa8, 0xf7, - 0x8d, 0x05, 0xba, 0xfc, 0x3b, 0x09, 0x26, 0x02, 0x5a, 0x3e, 0x62, 0x6f, 0xa4, 0x7c, 0x57, 0xbb, - 0x3b, 0xdf, 0x31, 0x6e, 0xee, 0xb9, 0xe3, 0x42, 0x56, 0xd9, 0x6f, 0x89, 0xf8, 0xed, 0x4d, 0x3f, - 0x1e, 0x46, 0x78, 0x3c, 0x3c, 0x37, 0xa8, 0x59, 0x39, 0x61, 0xf0, 0x45, 0x21, 0x62, 0x0e, 0x73, - 0x27, 0x7a, 0x13, 0xca, 0x0e, 0xd1, 0x48, 0x9b, 0x9a, 0xb6, 0x30, 0xe7, 0x99, 0xbb, 0x34, 0x47, - 0xd9, 0x24, 0x5a, 0x53, 0xb0, 0xd6, 0x8f, 0x31, 0x7b, 0xfc, 0x2f, 0x1c, 0x40, 0xa2, 0xd7, 0xa1, - 0x4c, 0x89, 0x6e, 0x69, 0x0a, 0xf5, 0x27, 0xd6, 0x53, 0xf9, 0x26, 0x31, 0xd8, 0x86, 0xd9, 0x69, - 0x09, 0x06, 0x3e, 0xf8, 0x81, 0xb3, 0xfc, 0x56, 0x1c, 0x00, 0xa2, 0x0f, 0x24, 0x98, 0x74, 0xad, - 0x0e, 0x23, 0xa5, 0x2c, 0xc1, 0x76, 0x7b, 0x22, 0x1a, 0x2e, 0x0e, 0xea, 0xb6, 0x8d, 0x18, 0x5a, - 0x7d, 0x56, 0x08, 0x9f, 0x8c, 0xb7, 0xe3, 0x84, 0x54, 0xb4, 0x08, 0x53, 0xba, 0x6a, 0x60, 0xa2, - 0x74, 0x7a, 0x4d, 0xd2, 0x36, 0x8d, 0x8e, 0x53, 0x29, 0x9e, 0x92, 0x4e, 0x97, 0xea, 0x27, 0x05, - 0xc0, 0xd4, 0x5a, 0xbc, 0x1b, 0x27, 0xe9, 0xd1, 0xd7, 0x01, 0xf9, 0x76, 0x5d, 0xf2, 0xd6, 0x0b, - 0xd5, 0x34, 0x2a, 0xa5, 0x53, 0xd2, 0xe9, 0x42, 0x7d, 0x4e, 0xa0, 0xa0, 0x56, 0x8a, 0x02, 0x67, - 0x70, 0xc9, 0xff, 0x2c, 0xc2, 0x54, 0x22, 0xc0, 0xd1, 0x55, 0x98, 0x6d, 0x7b, 0xe9, 0x73, 0xdd, - 0xd5, 0x37, 0x89, 0xdd, 0x6c, 0x6f, 0x93, 0x8e, 0xab, 0x91, 0x0e, 0x1f, 0xf5, 0x52, 0x7d, 0x5e, - 0xc8, 0x98, 0x5d, 0xca, 0xa4, 0xc2, 0x39, 0xdc, 0x4c, 0x6f, 0x83, 0x37, 0xad, 0xa9, 0x8e, 0x13, - 0x60, 0x8e, 0x70, 0xcc, 0x40, 0xef, 0xf5, 0x14, 0x05, 0xce, 0xe0, 0x62, 0x3a, 0x76, 0x88, 0xa3, - 0xda, 0xa4, 0x93, 0xd4, 0xb1, 0x10, 0xd7, 0x71, 0x39, 0x93, 0x0a, 0xe7, 0x70, 0xa3, 0xb3, 0x30, - 0xee, 0x49, 0xe3, 0x1e, 0x17, 0x43, 0x13, 0x24, 0xec, 0xf5, 0xb0, 0x0b, 0x47, 0xe9, 0x98, 0x69, - 0xe6, 0x26, 0x2f, 0x20, 0x3a, 0xf9, 0x43, 0x72, 0x25, 0x45, 0x81, 0x33, 0xb8, 0x98, 0x69, 0x5e, - 0xcc, 0xa4, 0x4c, 0x3b, 0x1a, 0x37, 0x6d, 0x23, 0x93, 0x0a, 0xe7, 0x70, 0xb3, 0xc8, 0xf3, 0x54, - 0x5e, 0xdc, 0x51, 0x54, 0x4d, 0xd9, 0xd4, 0x48, 0x65, 0x34, 0x1e, 0x79, 0xeb, 0xf1, 0x6e, 0x9c, - 0xa4, 0x47, 0x97, 0x60, 0xda, 0x6b, 0xda, 0x30, 0x94, 0x00, 0xa4, 0xcc, 0x41, 0x1e, 0x14, 0x20, - 0xd3, 0xeb, 0x49, 0x02, 0x9c, 0xe6, 0x91, 0xff, 0x22, 0xc1, 0xc9, 0x9c, 0x99, 0x84, 0x5e, 0x86, - 0x22, 0xed, 0x59, 0xfe, 0xfa, 0xfb, 0xbf, 0x7e, 0x46, 0x6f, 0xf5, 0x2c, 0x72, 0x7b, 0xaf, 0xfa, - 0x50, 0x0e, 0x1b, 0xeb, 0xc6, 0x9c, 0x11, 0x7d, 0x1b, 0x26, 0x6c, 0x53, 0xd3, 0x54, 0xa3, 0xeb, - 0x91, 0x88, 0x6c, 0x72, 0xa1, 0xcf, 0x99, 0x8e, 0xa3, 0x18, 0x61, 0xb6, 0x9c, 0xde, 0xdf, 0xab, - 0x4e, 0xc4, 0xfa, 0x70, 0x5c, 0x9c, 0xfc, 0xeb, 0x11, 0x80, 0x65, 0x62, 0x69, 0x66, 0x4f, 0x27, - 0xc6, 0x30, 0x56, 0xd0, 0xb7, 0x63, 0x2b, 0xe8, 0x4b, 0xfd, 0x66, 0xb4, 0x40, 0xd5, 0xdc, 0x25, - 0xb4, 0x9b, 0x58, 0x42, 0x5f, 0x1e, 0x5c, 0xc4, 0xc1, 0x6b, 0xe8, 0xad, 0x02, 0xcc, 0x84, 0xc4, - 0x4b, 0xa6, 0xd1, 0x51, 0xf9, 0x9c, 0x78, 0x21, 0x16, 0x13, 0x8f, 0x27, 0x62, 0xe2, 0x64, 0x06, - 0x4b, 0x24, 0x1e, 0xae, 0x06, 0xda, 0x8f, 0x70, 0xf6, 0xf3, 0x71, 0xe1, 0xb7, 0xf7, 0xaa, 0x07, - 0xd6, 0xf3, 0xb5, 0x00, 0x33, 0xae, 0x2c, 0x7a, 0x0c, 0x8e, 0xda, 0x44, 0x71, 0x4c, 0x83, 0xa7, - 0x89, 0xb1, 0xd0, 0x28, 0xcc, 0x5b, 0xb1, 0xe8, 0x45, 0x4f, 0xc0, 0xa8, 0x4e, 0x1c, 0x47, 0xe9, - 0x12, 0x9e, 0x11, 0xc6, 0xea, 0x53, 0x82, 0x70, 0x74, 0xcd, 0x6b, 0xc6, 0x7e, 0x3f, 0xba, 0x0e, - 0x93, 0x9a, 0xe2, 0x88, 0xd0, 0x6e, 0xa9, 0x3a, 0xe1, 0x73, 0x7e, 0xfc, 0xcc, 0xff, 0xdc, 0x5d, - 0xc4, 0x30, 0x8e, 0x70, 0x25, 0x5a, 0x8d, 0x21, 0xe1, 0x04, 0x32, 0xda, 0x01, 0xc4, 0x5a, 0x5a, - 0xb6, 0x62, 0x38, 0x9e, 0xcb, 0x98, 0xbc, 0xd1, 0xbe, 0xe5, 0x05, 0xf9, 0x6d, 0x35, 0x85, 0x86, - 0x33, 0x24, 0xc8, 0xbf, 0x97, 0x60, 0x32, 0x1c, 0xb0, 0x21, 0x14, 0x4a, 0x6f, 0xc5, 0x0b, 0xa5, - 0xe7, 0x07, 0x0e, 0xde, 0x9c, 0x4a, 0xe9, 0xc3, 0x02, 0xa0, 0x90, 0x88, 0xa5, 0x86, 0x4d, 0xa5, - 0x7d, 0xe3, 0x2e, 0xf6, 0x11, 0x3f, 0x95, 0x00, 0x89, 0x64, 0xbd, 0x68, 0x18, 0x26, 0xe5, 0xf9, - 0xdf, 0x57, 0xf3, 0xb5, 0x81, 0xd5, 0xf4, 0x35, 0xa8, 0x6d, 0xa4, 0xb0, 0x2f, 0x18, 0xd4, 0xee, - 0x85, 0x23, 0x96, 0x26, 0xc0, 0x19, 0x0a, 0xa1, 0x77, 0x00, 0x6c, 0x81, 0xd9, 0x32, 0x45, 0x0a, - 0x78, 0x69, 0x80, 0x6c, 0xca, 0x00, 0x96, 0x4c, 0x63, 0x4b, 0xed, 0x86, 0x09, 0x0d, 0x07, 0xc0, - 0x38, 0x22, 0x64, 0xee, 0x02, 0x9c, 0xcc, 0xd1, 0x1e, 0x1d, 0x87, 0xc2, 0x0d, 0xd2, 0xf3, 0xdc, - 0x8a, 0xd9, 0x4f, 0x74, 0x22, 0xba, 0x1f, 0x1b, 0x13, 0x5b, 0xa9, 0x73, 0x23, 0xcf, 0x49, 0xf2, - 0x97, 0xa5, 0x68, 0xac, 0xf1, 0x2a, 0xf6, 0x34, 0x94, 0x6d, 0x62, 0x69, 0x6a, 0x5b, 0x71, 0x44, - 0x3d, 0xc3, 0x0b, 0x52, 0x2c, 0xda, 0x70, 0xd0, 0x1b, 0xab, 0x77, 0x47, 0xee, 0x6f, 0xbd, 0x5b, - 0xb8, 0xd7, 0xf5, 0xae, 0x09, 0x65, 0xc7, 0x2f, 0x74, 0x8b, 0x1c, 0x7c, 0xf1, 0x10, 0x39, 0x5b, - 0xd4, 0xb8, 0x81, 0xc0, 0xa0, 0xba, 0x0d, 0x84, 0x64, 0xd5, 0xb5, 0xa5, 0x3e, 0xeb, 0xda, 0x55, - 0x38, 0x61, 0x93, 0x1d, 0x95, 0xa9, 0x71, 0x59, 0x75, 0xa8, 0x69, 0xf7, 0x56, 0x55, 0x5d, 0xa5, - 0xa2, 0xec, 0xa9, 0xec, 0xef, 0x55, 0x4f, 0xe0, 0x8c, 0x7e, 0x9c, 0xc9, 0xc5, 0xb2, 0xb3, 0xa5, - 0xb8, 0x0e, 0xe9, 0xf0, 0x94, 0x56, 0x0e, 0xb3, 0x73, 0x83, 0xb7, 0x62, 0xd1, 0x8b, 0xf4, 0x58, - 0x70, 0x97, 0xef, 0x45, 0x70, 0x4f, 0xe6, 0x07, 0x36, 0xda, 0x80, 0x93, 0x96, 0x6d, 0x76, 0x6d, - 0xe2, 0x38, 0xcb, 0x44, 0xe9, 0x68, 0xaa, 0x41, 0x7c, 0x7f, 0x8d, 0x71, 0x3b, 0x1f, 0xda, 0xdf, - 0xab, 0x9e, 0x6c, 0x64, 0x93, 0xe0, 0x3c, 0x5e, 0xf9, 0xa3, 0x22, 0x1c, 0x4f, 0xae, 0xb2, 0x39, - 0x55, 0xa9, 0x34, 0x50, 0x55, 0xfa, 0x64, 0x64, 0xda, 0x78, 0x25, 0x7b, 0x10, 0x0d, 0x19, 0x53, - 0x67, 0x11, 0xa6, 0x44, 0x1e, 0xf1, 0x3b, 0x45, 0x5d, 0x1e, 0x44, 0xc3, 0x46, 0xbc, 0x1b, 0x27, - 0xe9, 0x59, 0xad, 0x19, 0x96, 0x90, 0x3e, 0x48, 0x31, 0x5e, 0x6b, 0x2e, 0x26, 0x09, 0x70, 0x9a, - 0x07, 0xad, 0xc1, 0x8c, 0x6b, 0xa4, 0xa1, 0xbc, 0xe8, 0x7c, 0x48, 0x40, 0xcd, 0x6c, 0xa4, 0x49, - 0x70, 0x16, 0x1f, 0xda, 0x01, 0x68, 0xfb, 0x05, 0x81, 0x53, 0x39, 0xca, 0x73, 0x75, 0x7d, 0xe0, - 0xb9, 0x15, 0xd4, 0x16, 0x61, 0x46, 0x0c, 0x9a, 0x1c, 0x1c, 0x91, 0x84, 0x5e, 0x80, 0x09, 0x9b, - 0x6f, 0x3c, 0x7c, 0x03, 0xbc, 0xe2, 0xfd, 0x01, 0xc1, 0x36, 0x81, 0xa3, 0x9d, 0x38, 0x4e, 0x2b, - 0xff, 0x41, 0x8a, 0x2e, 0x51, 0x41, 0xa9, 0x7d, 0x2e, 0x56, 0x56, 0x3d, 0x96, 0x28, 0xab, 0x66, - 0xd3, 0x1c, 0x91, 0xaa, 0xea, 0x3b, 0xd9, 0x55, 0xf6, 0xc5, 0x43, 0x55, 0xd9, 0xe1, 0x52, 0x7b, - 0xe7, 0x32, 0xfb, 0x13, 0x09, 0x66, 0x2f, 0x36, 0x2f, 0xd9, 0xa6, 0x6b, 0xf9, 0xea, 0x5d, 0xb1, - 0x3c, 0x5f, 0x7d, 0x0d, 0x8a, 0xb6, 0xab, 0xf9, 0x76, 0xfd, 0x97, 0x6f, 0x17, 0x76, 0x35, 0x66, - 0xd7, 0x4c, 0x82, 0xcb, 0x33, 0x8a, 0x31, 0xa0, 0xb7, 0xe0, 0xa8, 0xad, 0x18, 0x5d, 0xe2, 0x2f, - 0xc2, 0xcf, 0xf6, 0x69, 0xcd, 0xca, 0x32, 0x66, 0xec, 0x91, 0x52, 0x90, 0xa3, 0x61, 0x81, 0x2a, - 0xff, 0x44, 0x82, 0xa9, 0xcb, 0xad, 0x56, 0x63, 0xc5, 0xe0, 0xb3, 0xb8, 0xa1, 0xd0, 0x6d, 0x56, - 0x27, 0x58, 0x0a, 0xdd, 0x4e, 0xd6, 0x09, 0xac, 0x0f, 0xf3, 0x1e, 0xb4, 0x0d, 0xa3, 0x2c, 0x7b, - 0x10, 0xa3, 0x33, 0x60, 0x89, 0x2f, 0xc4, 0xd5, 0x3d, 0x90, 0xb0, 0xfe, 0x14, 0x0d, 0xd8, 0x87, - 0x97, 0xdf, 0x83, 0x13, 0x11, 0xf5, 0x98, 0xbf, 0xf8, 0xe9, 0x24, 0x6a, 0x43, 0x89, 0x69, 0xe2, - 0x9f, 0x3d, 0xf6, 0x7b, 0x84, 0x96, 0x30, 0x39, 0xac, 0xa3, 0xd8, 0x97, 0x83, 0x3d, 0x6c, 0x79, - 0x0d, 0x26, 0x2e, 0x9b, 0x0e, 0x6d, 0x98, 0x36, 0xe5, 0x6e, 0x43, 0x8f, 0x40, 0x41, 0x57, 0x0d, - 0xb1, 0x4a, 0x8f, 0x0b, 0x9e, 0x02, 0x5b, 0x47, 0x58, 0x3b, 0xef, 0x56, 0x76, 0x45, 0x36, 0x0a, - 0xbb, 0x95, 0x5d, 0xcc, 0xda, 0xe5, 0x4b, 0x30, 0x2a, 0x86, 0x23, 0x0a, 0x54, 0x38, 0x18, 0xa8, - 0x90, 0x01, 0xf4, 0x8b, 0x11, 0x18, 0x15, 0xda, 0x0f, 0x61, 0x33, 0xf7, 0x46, 0x6c, 0x33, 0x77, - 0x6e, 0xb0, 0x91, 0xce, 0xdd, 0xc9, 0x75, 0x12, 0x3b, 0xb9, 0x17, 0x07, 0xc4, 0x3f, 0x78, 0x1b, - 0xf7, 0xb1, 0x04, 0x93, 0xf1, 0x98, 0x43, 0x67, 0x61, 0x9c, 0xad, 0x29, 0x6a, 0x9b, 0xac, 0x87, - 0x45, 0x71, 0x70, 0xb0, 0xd2, 0x0c, 0xbb, 0x70, 0x94, 0x0e, 0x75, 0x03, 0x36, 0x16, 0x16, 0xc2, - 0x29, 0xf9, 0x2e, 0x77, 0xa9, 0xaa, 0xd5, 0xbc, 0xab, 0x9e, 0xda, 0x8a, 0x41, 0xaf, 0xd8, 0x4d, - 0x6a, 0xab, 0x46, 0x37, 0x25, 0x88, 0xc7, 0x58, 0x14, 0x59, 0xbe, 0x29, 0xc1, 0xb8, 0x50, 0x79, - 0x08, 0x5b, 0x92, 0xd7, 0xe3, 0x5b, 0x92, 0x67, 0x07, 0x9c, 0xcf, 0xd9, 0xfb, 0x91, 0x4f, 0x43, - 0x53, 0xd8, 0x0c, 0x66, 0x09, 0x66, 0xdb, 0x74, 0x68, 0x32, 0xc1, 0xb0, 0xb9, 0x86, 0x79, 0x0f, - 0xfa, 0x9e, 0x04, 0xc7, 0xd5, 0xc4, 0x9c, 0x17, 0xbe, 0x7e, 0x79, 0x30, 0xd5, 0x02, 0x98, 0x7a, - 0x45, 0xc8, 0x3b, 0x9e, 0xec, 0xc1, 0x29, 0x91, 0xb2, 0x0b, 0x29, 0x2a, 0xa4, 0x40, 0x71, 0x9b, - 0x52, 0x4b, 0x0c, 0xc2, 0xd2, 0xe0, 0x99, 0x27, 0x54, 0xa9, 0xcc, 0xcd, 0x6f, 0xb5, 0x1a, 0x98, - 0x43, 0xcb, 0x3f, 0x1f, 0x09, 0x1c, 0xd6, 0xf4, 0x26, 0x49, 0x90, 0x6f, 0xa5, 0x7b, 0x91, 0x6f, - 0xc7, 0xb3, 0x72, 0x2d, 0xfa, 0x06, 0x14, 0xa8, 0x36, 0xe8, 0xa6, 0x54, 0x48, 0x68, 0xad, 0x36, - 0xc3, 0x84, 0xd5, 0x5a, 0x6d, 0x62, 0x06, 0x89, 0xde, 0x86, 0x12, 0x5b, 0xcd, 0xd8, 0x1c, 0x2f, - 0x0c, 0x9e, 0x43, 0x98, 0xbf, 0xc2, 0x08, 0x63, 0x5f, 0x0e, 0xf6, 0x70, 0xe5, 0xf7, 0x60, 0x22, - 0x96, 0x08, 0xd0, 0x75, 0x38, 0xa6, 0x99, 0x4a, 0xa7, 0xae, 0x68, 0x8a, 0xd1, 0x26, 0x76, 0x32, - 0x35, 0x66, 0xef, 0x67, 0x56, 0x23, 0x1c, 0x22, 0xa1, 0x04, 0x17, 0x88, 0xd1, 0x3e, 0x1c, 0xc3, - 0x96, 0x15, 0x80, 0xd0, 0x7a, 0x54, 0x85, 0x12, 0x0b, 0x61, 0x6f, 0x65, 0x1a, 0xab, 0x8f, 0x31, - 0x5d, 0x59, 0x64, 0x3b, 0xd8, 0x6b, 0x47, 0x67, 0x00, 0x1c, 0xd2, 0xb6, 0x09, 0xe5, 0x79, 0xc7, - 0x3b, 0x01, 0x0a, 0x32, 0x70, 0x33, 0xe8, 0xc1, 0x11, 0x2a, 0xf9, 0x4f, 0x12, 0x4c, 0xac, 0x13, - 0xfa, 0xae, 0x69, 0xdf, 0x68, 0xf0, 0x0b, 0xda, 0x21, 0xe4, 0xfd, 0xcd, 0x58, 0xde, 0x7f, 0xa5, - 0xcf, 0x31, 0x8b, 0x69, 0x9b, 0x97, 0xfd, 0xe5, 0xbf, 0x4b, 0x50, 0x89, 0x51, 0x46, 0xd3, 0x04, - 0x81, 0x92, 0x65, 0xda, 0xd4, 0x5f, 0xe3, 0x0f, 0xa5, 0x01, 0x4b, 0xa9, 0x91, 0x55, 0x9e, 0xc1, - 0x62, 0x0f, 0x9d, 0xd9, 0xb9, 0x65, 0x9b, 0xba, 0x88, 0xfb, 0xc3, 0x49, 0x21, 0xc4, 0x0e, 0xed, - 0xbc, 0x68, 0x9b, 0x3a, 0xe6, 0xd8, 0xf2, 0x1f, 0x25, 0x98, 0x8e, 0x51, 0x0e, 0x21, 0xa5, 0x2b, - 0xf1, 0x94, 0xfe, 0xe2, 0x61, 0x0c, 0xcb, 0x49, 0xec, 0x5f, 0x25, 0xcd, 0x62, 0x0e, 0x40, 0x5b, - 0x30, 0x6e, 0x99, 0x9d, 0xe6, 0x3d, 0xb8, 0x99, 0x9b, 0x62, 0x2b, 0x64, 0x23, 0xc4, 0xc2, 0x51, - 0x60, 0xb4, 0x0b, 0xd3, 0x86, 0xa2, 0x13, 0xc7, 0x52, 0xda, 0xa4, 0x79, 0x0f, 0xce, 0x45, 0x1e, - 0xe0, 0xb7, 0x05, 0x49, 0x44, 0x9c, 0x16, 0x22, 0xff, 0x2a, 0x65, 0xb7, 0x69, 0x53, 0xf4, 0x2a, - 0x94, 0xf9, 0x23, 0x89, 0xb6, 0xa9, 0x89, 0xa5, 0xed, 0x2c, 0x1b, 0x9a, 0x86, 0x68, 0xbb, 0xbd, - 0x57, 0xfd, 0xef, 0x03, 0x8f, 0x75, 0x7d, 0x42, 0x1c, 0xc0, 0xa0, 0x75, 0x28, 0x5a, 0x87, 0x29, - 0x33, 0xf8, 0xc2, 0xc2, 0x6b, 0x0b, 0x8e, 0x23, 0xff, 0x23, 0xa9, 0x38, 0x5f, 0x5e, 0xae, 0xdf, - 0xb3, 0x01, 0x0b, 0xca, 0x9a, 0xdc, 0x41, 0xb3, 0x61, 0x54, 0xac, 0xb2, 0x22, 0x2e, 0x2f, 0x1d, - 0x26, 0x2e, 0xa3, 0x2b, 0x43, 0xb0, 0x89, 0xf0, 0x1b, 0x7d, 0x41, 0xf2, 0x5f, 0x25, 0x98, 0xe6, - 0x0a, 0xb5, 0x5d, 0x5b, 0xa5, 0xbd, 0xa1, 0x65, 0xd0, 0xad, 0x58, 0x06, 0x5d, 0xee, 0xd3, 0xd0, - 0x94, 0xc6, 0xb9, 0x59, 0xf4, 0x73, 0x09, 0x1e, 0x48, 0x51, 0x0f, 0x21, 0xc3, 0x90, 0x78, 0x86, - 0x79, 0xe5, 0xb0, 0x06, 0xe6, 0x64, 0x99, 0x9b, 0x90, 0x61, 0x1e, 0x0f, 0xdc, 0x33, 0x00, 0x96, - 0xad, 0xee, 0xa8, 0x1a, 0xe9, 0x8a, 0xcb, 0xe0, 0x72, 0x38, 0x24, 0x8d, 0xa0, 0x07, 0x47, 0xa8, - 0xd0, 0xb7, 0x60, 0xb6, 0x43, 0xb6, 0x14, 0x57, 0xa3, 0x8b, 0x9d, 0xce, 0x92, 0x62, 0x29, 0x9b, - 0xaa, 0xa6, 0x52, 0x55, 0xec, 0xb0, 0xc7, 0xea, 0x17, 0xbc, 0x4b, 0xda, 0x2c, 0x8a, 0xdb, 0x7b, - 0xd5, 0xc7, 0x0f, 0xbe, 0x98, 0xf1, 0x89, 0x7b, 0x38, 0x47, 0x08, 0xfa, 0xae, 0x04, 0x15, 0x9b, - 0xbc, 0xe3, 0xaa, 0x36, 0xe9, 0x2c, 0xdb, 0xa6, 0x15, 0xd3, 0xa0, 0xc0, 0x35, 0xb8, 0xb4, 0xbf, - 0x57, 0xad, 0xe0, 0x1c, 0x9a, 0x7e, 0x74, 0xc8, 0x15, 0x84, 0x28, 0xcc, 0x28, 0x9a, 0x66, 0xbe, - 0x4b, 0xe2, 0x1e, 0x28, 0x72, 0xf9, 0xf5, 0xfd, 0xbd, 0xea, 0xcc, 0x62, 0xba, 0xbb, 0x1f, 0xd1, - 0x59, 0xf0, 0x68, 0x01, 0x46, 0x77, 0x4c, 0xcd, 0xd5, 0x89, 0x53, 0x29, 0x71, 0x49, 0x2c, 0xe3, - 0x8e, 0x5e, 0xf5, 0x9a, 0x6e, 0xef, 0x55, 0x8f, 0x5e, 0x6c, 0xf2, 0xa3, 0x0f, 0x9f, 0x8a, 0xed, - 0xd1, 0x58, 0xcd, 0x24, 0xa6, 0x3c, 0x3f, 0x77, 0x2d, 0x87, 0x39, 0xe6, 0x72, 0xd8, 0x85, 0xa3, - 0x74, 0x48, 0x87, 0xb1, 0x6d, 0xb1, 0x6f, 0x77, 0x2a, 0xa3, 0x03, 0xad, 0x7e, 0xb1, 0x7d, 0x7f, - 0x7d, 0x5a, 0x88, 0x1c, 0xf3, 0x9b, 0x1d, 0x1c, 0x4a, 0x40, 0x4f, 0xc0, 0x28, 0xff, 0x58, 0x59, - 0xe6, 0xa7, 0xb5, 0xe5, 0x30, 0x13, 0x5d, 0xf6, 0x9a, 0xb1, 0xdf, 0xef, 0x93, 0xae, 0x34, 0x96, - 0xf8, 0xe1, 0x6a, 0x82, 0x74, 0xa5, 0xb1, 0x84, 0xfd, 0x7e, 0x64, 0xc1, 0xa8, 0x43, 0x56, 0x55, - 0xc3, 0xdd, 0xad, 0xc0, 0x40, 0xd7, 0xc5, 0xcd, 0x0b, 0x9c, 0x3b, 0x71, 0x14, 0x15, 0x4a, 0x14, - 0xfd, 0xd8, 0x17, 0x83, 0x76, 0x61, 0xcc, 0x76, 0x8d, 0x45, 0x67, 0xc3, 0x21, 0x76, 0x65, 0x9c, - 0xcb, 0xec, 0x37, 0x39, 0x63, 0x9f, 0x3f, 0x29, 0x35, 0xf0, 0x60, 0x40, 0x81, 0x43, 0x61, 0xe8, - 0x23, 0x09, 0x90, 0xe3, 0x5a, 0x96, 0x46, 0x74, 0x62, 0x50, 0x45, 0xe3, 0xa7, 0x61, 0x4e, 0xe5, - 0x18, 0xd7, 0xa1, 0xd1, 0xaf, 0xdd, 0x29, 0xa0, 0xa4, 0x32, 0xc1, 0x51, 0x73, 0x9a, 0x14, 0x67, - 0xe8, 0xc1, 0x86, 0x62, 0xcb, 0xe1, 0xbf, 0x2b, 0x13, 0x03, 0x0d, 0x45, 0xf6, 0xa9, 0x60, 0x38, - 0x14, 0xa2, 0x1f, 0xfb, 0x62, 0xd0, 0x55, 0x98, 0xb5, 0x89, 0xd2, 0xb9, 0x62, 0x68, 0x3d, 0x6c, - 0x9a, 0xf4, 0xa2, 0xaa, 0x11, 0xa7, 0xe7, 0x50, 0xa2, 0x57, 0x26, 0x79, 0xd8, 0x04, 0x4f, 0x2e, - 0x70, 0x26, 0x15, 0xce, 0xe1, 0xe6, 0x2f, 0x01, 0xc4, 0x19, 0xec, 0x70, 0xde, 0xd2, 0x1d, 0xee, - 0x25, 0x40, 0xa8, 0xea, 0x7d, 0x7b, 0x09, 0x10, 0x11, 0x71, 0xf0, 0x11, 0xd2, 0x57, 0x23, 0x30, - 0x13, 0x12, 0xdf, 0xf5, 0x4b, 0x80, 0x0c, 0x96, 0x21, 0xbc, 0x04, 0xc8, 0xbe, 0x4a, 0x2f, 0xdc, - 0xef, 0xab, 0xf4, 0xfb, 0xf0, 0x02, 0x81, 0xdf, 0xce, 0x87, 0x4e, 0xfc, 0xf7, 0xbf, 0x9d, 0x0f, - 0x75, 0xcd, 0x29, 0x67, 0x7e, 0x33, 0x12, 0x35, 0xe8, 0x3f, 0xe8, 0x0a, 0xf8, 0xf0, 0x2f, 0x0d, - 0xe5, 0xcf, 0x0b, 0x70, 0x3c, 0x39, 0x63, 0x63, 0x37, 0x81, 0xd2, 0x1d, 0x6f, 0x02, 0x1b, 0x70, - 0x62, 0xcb, 0xd5, 0xb4, 0x1e, 0x77, 0x48, 0xe4, 0x3a, 0xd0, 0x3b, 0xb5, 0x7f, 0x58, 0x70, 0x9e, - 0xb8, 0x98, 0x41, 0x83, 0x33, 0x39, 0x73, 0x6e, 0x35, 0x0b, 0x03, 0xdd, 0x6a, 0xa6, 0x2e, 0xd5, - 0x8a, 0x77, 0x7f, 0xa9, 0x96, 0x7d, 0x43, 0x59, 0x1a, 0xe0, 0x86, 0xf2, 0x5e, 0x5c, 0x29, 0x66, - 0x24, 0xbe, 0x3b, 0x5d, 0x29, 0xca, 0x0f, 0xc3, 0x9c, 0x60, 0x63, 0xdf, 0x4b, 0xa6, 0x41, 0x6d, - 0x53, 0xd3, 0x88, 0xbd, 0xec, 0xea, 0x7a, 0x4f, 0x3e, 0x0f, 0x93, 0xf1, 0x7b, 0x6d, 0x6f, 0xe4, - 0xbd, 0xab, 0x76, 0x71, 0x97, 0x12, 0x19, 0x79, 0xaf, 0x1d, 0x07, 0x14, 0xf2, 0x07, 0x12, 0xcc, - 0x66, 0xbf, 0xa1, 0x43, 0x1a, 0x4c, 0xea, 0xca, 0x6e, 0xf4, 0x11, 0xa1, 0x34, 0xe0, 0x8e, 0x1b, - 0xed, 0xef, 0x55, 0x27, 0xd7, 0x62, 0x58, 0x38, 0x81, 0x2d, 0x7f, 0x21, 0xc1, 0xc9, 0x9c, 0x6b, - 0xc6, 0xe1, 0x6a, 0x82, 0xae, 0x41, 0x59, 0x57, 0x76, 0x9b, 0xae, 0xdd, 0x25, 0x03, 0x9f, 0x31, - 0xf0, 0x5c, 0xb2, 0x26, 0x50, 0x70, 0x80, 0x27, 0x7f, 0x22, 0x41, 0x25, 0xaf, 0x1e, 0x44, 0x67, - 0x63, 0x17, 0xa2, 0x8f, 0x26, 0x2e, 0x44, 0xa7, 0x53, 0x7c, 0x43, 0xba, 0x0e, 0xfd, 0x54, 0x82, - 0xd9, 0xec, 0xba, 0x19, 0x3d, 0x13, 0xd3, 0xb8, 0x9a, 0xd0, 0x78, 0x2a, 0xc1, 0x25, 0xf4, 0xdd, - 0x86, 0x49, 0x51, 0x5d, 0x0b, 0x18, 0xe1, 0xe5, 0x27, 0x0f, 0xce, 0xaa, 0x02, 0xcc, 0xaf, 0x13, - 0xf9, 0x48, 0xc6, 0xdb, 0x70, 0x02, 0x57, 0xfe, 0xd9, 0x08, 0x94, 0x9a, 0x6d, 0x45, 0x23, 0x43, - 0x28, 0xea, 0xae, 0xc5, 0x8a, 0xba, 0x7e, 0xdf, 0xf9, 0x73, 0x2d, 0x73, 0xeb, 0xb9, 0xcd, 0x44, - 0x3d, 0x77, 0x6e, 0x20, 0xf4, 0x83, 0x4b, 0xb9, 0xe7, 0x61, 0x2c, 0x50, 0xa2, 0xbf, 0xd5, 0x43, - 0xfe, 0x78, 0x04, 0xc6, 0x23, 0x22, 0xfa, 0x5c, 0x7b, 0x76, 0x62, 0xab, 0xf7, 0x20, 0x7f, 0x29, - 0x8a, 0xc8, 0xae, 0xf9, 0xeb, 0xb7, 0xf7, 0x86, 0x2e, 0x7c, 0x0b, 0x95, 0x5e, 0xd6, 0xcf, 0xc3, - 0x24, 0xe5, 0xff, 0xb0, 0x09, 0xce, 0xf8, 0x0a, 0x3c, 0x8a, 0x83, 0x97, 0x99, 0xad, 0x58, 0x2f, - 0x4e, 0x50, 0xcf, 0xbd, 0x00, 0x13, 0x31, 0x61, 0x7d, 0x3d, 0x79, 0xfb, 0xad, 0x04, 0x8f, 0xde, - 0x71, 0x4f, 0x86, 0xea, 0xb1, 0xe9, 0x55, 0x4b, 0x4c, 0xaf, 0xf9, 0x7c, 0x80, 0x21, 0x3e, 0x96, - 0xf8, 0xd1, 0x08, 0xa0, 0xd6, 0xb6, 0x6a, 0x77, 0x1a, 0x8a, 0x4d, 0x7b, 0x58, 0xfc, 0x8f, 0x6a, - 0x08, 0x13, 0xee, 0x2c, 0x8c, 0x77, 0x88, 0xd3, 0xb6, 0x55, 0xee, 0x2c, 0xb1, 0x57, 0x08, 0xce, - 0x41, 0x96, 0xc3, 0x2e, 0x1c, 0xa5, 0x43, 0x5d, 0x28, 0xef, 0x78, 0xff, 0xd4, 0xf3, 0x6f, 0xde, - 0xfa, 0x2d, 0x66, 0xc3, 0xff, 0xfa, 0x85, 0xf1, 0x25, 0x1a, 0x1c, 0x1c, 0x80, 0xcb, 0x1f, 0x4a, - 0x30, 0x9b, 0x76, 0xcc, 0x32, 0x53, 0xfd, 0xfe, 0x3b, 0xe7, 0x61, 0x28, 0x72, 0x74, 0xe6, 0x95, - 0x63, 0xde, 0x89, 0x37, 0x93, 0x8c, 0x79, 0xab, 0xfc, 0xa5, 0x04, 0x73, 0xd9, 0xaa, 0x0d, 0x61, - 0x2b, 0x71, 0x3d, 0xbe, 0x95, 0xe8, 0xf7, 0xd8, 0x20, 0x5b, 0xef, 0x9c, 0x6d, 0xc5, 0x5e, 0xe6, - 0x18, 0x0c, 0xc1, 0xc8, 0xad, 0xb8, 0x91, 0x8b, 0x87, 0x36, 0x32, 0xdb, 0xc0, 0xfa, 0x13, 0x37, - 0x6f, 0xcd, 0x1f, 0xf9, 0xec, 0xd6, 0xfc, 0x91, 0x3f, 0xdf, 0x9a, 0x3f, 0xf2, 0xfe, 0xfe, 0xbc, - 0x74, 0x73, 0x7f, 0x5e, 0xfa, 0x6c, 0x7f, 0x5e, 0xfa, 0xdb, 0xfe, 0xbc, 0xf4, 0x83, 0x2f, 0xe6, - 0x8f, 0x5c, 0x1b, 0x15, 0x98, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0xdb, 0xfb, 0x34, 0x4b, 0xec, - 0x3c, 0x00, 0x00, + 0x5e, 0x13, 0xec, 0xb3, 0x4f, 0x75, 0x55, 0xba, 0xed, 0x6e, 0xd6, 0xda, 0xa6, 0xbe, 0xd0, 0x35, + 0xbb, 0xe6, 0x02, 0x47, 0xd9, 0x74, 0xb7, 0xf8, 0x2f, 0xfe, 0x83, 0xff, 0xe5, 0xa1, 0xcf, 0xfe, + 0xbf, 0x50, 0x4e, 0xb1, 0x54, 0x5d, 0x69, 0x6f, 0xab, 0x06, 0xb1, 0x7b, 0xbe, 0x7a, 0x0b, 0x36, + 0x71, 0x4c, 0xd7, 0x6e, 0x93, 0xa4, 0x4e, 0x07, 0x72, 0x39, 0x0b, 0x3a, 0xa1, 0xca, 0xc2, 0x4e, + 0xca, 0x92, 0xd9, 0x85, 0x3c, 0x2e, 0xdb, 0x35, 0xa8, 0xaa, 0xa7, 0xc5, 0x3c, 0x7b, 0x27, 0x06, + 0xa7, 0xbd, 0x4d, 0x74, 0x25, 0xc5, 0xf7, 0x4c, 0x1e, 0x9f, 0x4b, 0x55, 0x6d, 0x41, 0x35, 0xa8, + 0x43, 0xed, 0x83, 0x6c, 0x72, 0x88, 0xbd, 0x43, 0xec, 0xe8, 0x2a, 0x29, 0xba, 0xa5, 0x91, 0x2c, + 0x9b, 0x9e, 0xcc, 0x5d, 0xdc, 0x2c, 0xea, 0xe7, 0x0f, 0x08, 0x05, 0xcb, 0xd4, 0xd4, 0x76, 0x2f, + 0x2f, 0x0c, 0xe4, 0x1a, 0xc0, 0x62, 0x63, 0xe5, 0x2a, 0xb1, 0xd9, 0x72, 0xa3, 0x53, 0x50, 0x32, + 0x14, 0x9d, 0x54, 0xa5, 0x53, 0xd2, 0xe9, 0xd1, 0xfa, 0xb1, 0x9b, 0x7b, 0xf3, 0x47, 0xf6, 0xf7, + 0xe6, 0x4b, 0xeb, 0x8a, 0x4e, 0x30, 0x9f, 0x91, 0x7f, 0x2c, 0xc1, 0x83, 0x4b, 0xae, 0x43, 0x4d, + 0x7d, 0x8d, 0x50, 0x5b, 0x6d, 0x2f, 0xb9, 0xb6, 0x4d, 0x0c, 0xda, 0xa4, 0x0a, 0x75, 0x9d, 0x3b, + 0xf3, 0xa3, 0x6b, 0x50, 0xde, 0x51, 0x34, 0x97, 0x54, 0x0b, 0xa7, 0xa4, 0xd3, 0x63, 0x67, 0x6a, + 0x35, 0x11, 0x86, 0x51, 0x9f, 0xfa, 0x81, 0x58, 0xf3, 0x03, 0xa5, 0xf6, 0xaa, 0xab, 0x18, 0x54, + 0xa5, 0xbd, 0xfa, 0x09, 0x01, 0x79, 0x4c, 0xc8, 0xbd, 0xca, 0xb0, 0xb0, 0x07, 0x29, 0x7f, 0x5f, + 0x82, 0x47, 0x72, 0x75, 0x5b, 0x55, 0x1d, 0x8a, 0x74, 0x28, 0xab, 0x94, 0xe8, 0x4e, 0x55, 0x3a, + 0x55, 0x3c, 0x3d, 0x76, 0xe6, 0x72, 0xad, 0xaf, 0x4d, 0x50, 0xcb, 0x05, 0xaf, 0x8f, 0x0b, 0xbd, + 0xca, 0x2b, 0x0c, 0x1e, 0x7b, 0x52, 0xe4, 0x1f, 0x4a, 0x80, 0xa2, 0x3c, 0x2d, 0xc5, 0xee, 0x12, + 0x7a, 0x17, 0x5e, 0x7a, 0xed, 0x70, 0x5e, 0x9a, 0x16, 0x90, 0x63, 0x9e, 0xc0, 0x98, 0x93, 0xde, + 0x97, 0x60, 0x26, 0xad, 0x13, 0xf7, 0xce, 0x56, 0xdc, 0x3b, 0x8b, 0x87, 0xf0, 0x8e, 0x87, 0x9a, + 0xe3, 0x96, 0x5f, 0x15, 0x60, 0x74, 0x59, 0x21, 0xba, 0x69, 0x34, 0x09, 0x45, 0xdf, 0x84, 0x0a, + 0xdb, 0xd9, 0x1d, 0x85, 0x2a, 0xdc, 0x23, 0x63, 0x67, 0xfe, 0xef, 0x20, 0x73, 0x9d, 0x1a, 0xa3, + 0xae, 0xed, 0x3c, 0x5d, 0xbb, 0xb2, 0x79, 0x9d, 0xb4, 0xe9, 0x1a, 0xa1, 0x4a, 0x1d, 0x09, 0x39, + 0x10, 0x8e, 0xe1, 0x00, 0x15, 0xbd, 0x05, 0x25, 0xc7, 0x22, 0x6d, 0xe1, 0xcc, 0x17, 0xfb, 0x34, + 0x2b, 0xd0, 0xb4, 0x69, 0x91, 0x76, 0xb8, 0x5a, 0xec, 0x17, 0xe6, 0xb8, 0x68, 0x0b, 0x8e, 0x3a, + 0x3c, 0x0c, 0xaa, 0x45, 0x2e, 0xe1, 0xfc, 0xc0, 0x12, 0xbc, 0x60, 0x9a, 0x10, 0x32, 0x8e, 0x7a, + 0xbf, 0xb1, 0x40, 0x97, 0x7f, 0x2f, 0xc1, 0x78, 0x40, 0xcb, 0x57, 0xec, 0x8d, 0x94, 0xef, 0x6a, + 0x77, 0xe7, 0x3b, 0xc6, 0xcd, 0x3d, 0x77, 0x5c, 0xc8, 0xaa, 0xf8, 0x23, 0x11, 0xbf, 0xbd, 0xe9, + 0xc7, 0x43, 0x81, 0xc7, 0xc3, 0x73, 0x83, 0x9a, 0x95, 0x13, 0x06, 0x5f, 0x14, 0x23, 0xe6, 0x30, + 0x77, 0xa2, 0x37, 0xa1, 0xe2, 0x10, 0x8d, 0xb4, 0xa9, 0x69, 0x0b, 0x73, 0x9e, 0xb9, 0x4b, 0x73, + 0x94, 0x4d, 0xa2, 0x35, 0x05, 0x6b, 0xfd, 0x18, 0xb3, 0xc7, 0xff, 0x85, 0x03, 0x48, 0xf4, 0x3a, + 0x54, 0x28, 0xd1, 0x2d, 0x4d, 0xa1, 0xfe, 0xc6, 0x7a, 0x2a, 0xdf, 0x24, 0x06, 0xdb, 0x30, 0x3b, + 0x2d, 0xc1, 0xc0, 0x17, 0x3f, 0x70, 0x96, 0x3f, 0x8a, 0x03, 0x40, 0xf4, 0x81, 0x04, 0x13, 0xae, + 0xd5, 0x61, 0xa4, 0x94, 0x25, 0xd8, 0x6e, 0x4f, 0x44, 0xc3, 0xc5, 0x41, 0xdd, 0xb6, 0x11, 0x43, + 0xab, 0xcf, 0x08, 0xe1, 0x13, 0xf1, 0x71, 0x9c, 0x90, 0x8a, 0x16, 0x61, 0x52, 0x57, 0x0d, 0x4c, + 0x94, 0x4e, 0xaf, 0x49, 0xda, 0xa6, 0xd1, 0x71, 0xaa, 0xa5, 0x53, 0xd2, 0xe9, 0x72, 0xfd, 0xa4, + 0x00, 0x98, 0x5c, 0x8b, 0x4f, 0xe3, 0x24, 0x3d, 0xfa, 0x3a, 0x20, 0xdf, 0xae, 0x4b, 0xde, 0x79, + 0xa1, 0x9a, 0x46, 0xb5, 0x7c, 0x4a, 0x3a, 0x5d, 0xac, 0xcf, 0x0a, 0x14, 0xd4, 0x4a, 0x51, 0xe0, + 0x0c, 0x2e, 0xf9, 0x9f, 0x25, 0x98, 0x4c, 0x04, 0x38, 0xba, 0x0a, 0x33, 0x6d, 0x2f, 0x7d, 0xae, + 0xbb, 0xfa, 0x26, 0xb1, 0x9b, 0xed, 0x6d, 0xd2, 0x71, 0x35, 0xd2, 0xe1, 0xab, 0x5e, 0xae, 0xcf, + 0x09, 0x19, 0x33, 0x4b, 0x99, 0x54, 0x38, 0x87, 0x9b, 0xe9, 0x6d, 0xf0, 0xa1, 0x35, 0xd5, 0x71, + 0x02, 0xcc, 0x02, 0xc7, 0x0c, 0xf4, 0x5e, 0x4f, 0x51, 0xe0, 0x0c, 0x2e, 0xa6, 0x63, 0x87, 0x38, + 0xaa, 0x4d, 0x3a, 0x49, 0x1d, 0x8b, 0x71, 0x1d, 0x97, 0x33, 0xa9, 0x70, 0x0e, 0x37, 0x3a, 0x0b, + 0x63, 0x9e, 0x34, 0xee, 0x71, 0xb1, 0x34, 0x41, 0xc2, 0x5e, 0x0f, 0xa7, 0x70, 0x94, 0x8e, 0x99, + 0x66, 0x6e, 0xf2, 0x02, 0xa2, 0x93, 0xbf, 0x24, 0x57, 0x52, 0x14, 0x38, 0x83, 0x8b, 0x99, 0xe6, + 0xc5, 0x4c, 0xca, 0xb4, 0xa3, 0x71, 0xd3, 0x36, 0x32, 0xa9, 0x70, 0x0e, 0x37, 0x8b, 0x3c, 0x4f, + 0xe5, 0xc5, 0x1d, 0x45, 0xd5, 0x94, 0x4d, 0x8d, 0x54, 0x47, 0xe2, 0x91, 0xb7, 0x1e, 0x9f, 0xc6, + 0x49, 0x7a, 0x74, 0x09, 0xa6, 0xbc, 0xa1, 0x0d, 0x43, 0x09, 0x40, 0x2a, 0x1c, 0xe4, 0x41, 0x01, + 0x32, 0xb5, 0x9e, 0x24, 0xc0, 0x69, 0x1e, 0xf9, 0x2f, 0x12, 0x9c, 0xcc, 0xd9, 0x49, 0xe8, 0x65, + 0x28, 0xd1, 0x9e, 0xe5, 0x9f, 0xbf, 0xff, 0xeb, 0x67, 0xf4, 0x56, 0xcf, 0x22, 0xb7, 0xf7, 0xe6, + 0x1f, 0xca, 0x61, 0x63, 0xd3, 0x98, 0x33, 0xa2, 0x6f, 0xc3, 0xb8, 0x6d, 0x6a, 0x9a, 0x6a, 0x74, + 0x3d, 0x12, 0x91, 0x4d, 0x2e, 0xf4, 0xb9, 0xd3, 0x71, 0x14, 0x23, 0xcc, 0x96, 0x53, 0xfb, 0x7b, + 0xf3, 0xe3, 0xb1, 0x39, 0x1c, 0x17, 0x27, 0xff, 0xa6, 0x00, 0xb0, 0x4c, 0x2c, 0xcd, 0xec, 0xe9, + 0xc4, 0x18, 0xc6, 0x09, 0xfa, 0x76, 0xec, 0x04, 0x7d, 0xa9, 0xdf, 0x8c, 0x16, 0xa8, 0x9a, 0x7b, + 0x84, 0x76, 0x13, 0x47, 0xe8, 0xcb, 0x83, 0x8b, 0x38, 0xf8, 0x0c, 0xbd, 0x55, 0x84, 0xe9, 0x90, + 0x78, 0xc9, 0x34, 0x3a, 0x2a, 0xdf, 0x13, 0x2f, 0xc4, 0x62, 0xe2, 0xf1, 0x44, 0x4c, 0x9c, 0xcc, + 0x60, 0x89, 0xc4, 0xc3, 0xd5, 0x40, 0xfb, 0x02, 0x67, 0x3f, 0x1f, 0x17, 0x7e, 0x7b, 0x6f, 0xfe, + 0xc0, 0x7a, 0xbe, 0x16, 0x60, 0xc6, 0x95, 0x45, 0x8f, 0xc1, 0x51, 0x9b, 0x28, 0x8e, 0x69, 0xf0, + 0x34, 0x31, 0x1a, 0x1a, 0x85, 0xf9, 0x28, 0x16, 0xb3, 0xe8, 0x09, 0x18, 0xd1, 0x89, 0xe3, 0x28, + 0x5d, 0xc2, 0x33, 0xc2, 0x68, 0x7d, 0x52, 0x10, 0x8e, 0xac, 0x79, 0xc3, 0xd8, 0x9f, 0x47, 0xd7, + 0x61, 0x42, 0x53, 0x1c, 0x11, 0xda, 0x2d, 0x55, 0x27, 0x7c, 0xcf, 0x8f, 0x9d, 0xf9, 0x9f, 0xbb, + 0x8b, 0x18, 0xc6, 0x11, 0x9e, 0x44, 0xab, 0x31, 0x24, 0x9c, 0x40, 0x46, 0x3b, 0x80, 0xd8, 0x48, + 0xcb, 0x56, 0x0c, 0xc7, 0x73, 0x19, 0x93, 0x37, 0xd2, 0xb7, 0xbc, 0x20, 0xbf, 0xad, 0xa6, 0xd0, + 0x70, 0x86, 0x04, 0xf9, 0x0f, 0x12, 0x4c, 0x84, 0x0b, 0x36, 0x84, 0x42, 0xe9, 0xad, 0x78, 0xa1, + 0xf4, 0xfc, 0xc0, 0xc1, 0x9b, 0x53, 0x29, 0x7d, 0x58, 0x04, 0x14, 0x12, 0xb1, 0xd4, 0xb0, 0xa9, + 0xb4, 0x6f, 0xdc, 0xc5, 0x3d, 0xe2, 0x67, 0x12, 0x20, 0x91, 0xac, 0x17, 0x0d, 0xc3, 0xa4, 0x3c, + 0xff, 0xfb, 0x6a, 0xbe, 0x36, 0xb0, 0x9a, 0xbe, 0x06, 0xb5, 0x8d, 0x14, 0xf6, 0x05, 0x83, 0xda, + 0xbd, 0x70, 0xc5, 0xd2, 0x04, 0x38, 0x43, 0x21, 0xf4, 0x0e, 0x80, 0x2d, 0x30, 0x5b, 0xa6, 0x48, + 0x01, 0x2f, 0x0d, 0x90, 0x4d, 0x19, 0xc0, 0x92, 0x69, 0x6c, 0xa9, 0xdd, 0x30, 0xa1, 0xe1, 0x00, + 0x18, 0x47, 0x84, 0xcc, 0x5e, 0x80, 0x93, 0x39, 0xda, 0xa3, 0xe3, 0x50, 0xbc, 0x41, 0x7a, 0x9e, + 0x5b, 0x31, 0xfb, 0x13, 0x9d, 0x88, 0xde, 0xc7, 0x46, 0xc5, 0x55, 0xea, 0x5c, 0xe1, 0x39, 0x49, + 0xfe, 0xb2, 0x1c, 0x8d, 0x35, 0x5e, 0xc5, 0x9e, 0x86, 0x8a, 0x4d, 0x2c, 0x4d, 0x6d, 0x2b, 0x8e, + 0xa8, 0x67, 0x78, 0x41, 0x8a, 0xc5, 0x18, 0x0e, 0x66, 0x63, 0xf5, 0x6e, 0xe1, 0xfe, 0xd6, 0xbb, + 0xc5, 0x7b, 0x5d, 0xef, 0x9a, 0x50, 0x71, 0xfc, 0x42, 0xb7, 0xc4, 0xc1, 0x17, 0x0f, 0x91, 0xb3, + 0x45, 0x8d, 0x1b, 0x08, 0x0c, 0xaa, 0xdb, 0x40, 0x48, 0x56, 0x5d, 0x5b, 0xee, 0xb3, 0xae, 0x5d, + 0x85, 0x13, 0x36, 0xd9, 0x51, 0x99, 0x1a, 0x97, 0x55, 0x87, 0x9a, 0x76, 0x6f, 0x55, 0xd5, 0x55, + 0x2a, 0xca, 0x9e, 0xea, 0xfe, 0xde, 0xfc, 0x09, 0x9c, 0x31, 0x8f, 0x33, 0xb9, 0x58, 0x76, 0xb6, + 0x14, 0xd7, 0x21, 0x1d, 0x9e, 0xd2, 0x2a, 0x61, 0x76, 0x6e, 0xf0, 0x51, 0x2c, 0x66, 0x91, 0x1e, + 0x0b, 0xee, 0xca, 0xbd, 0x08, 0xee, 0x89, 0xfc, 0xc0, 0x46, 0x1b, 0x70, 0xd2, 0xb2, 0xcd, 0xae, + 0x4d, 0x1c, 0x67, 0x99, 0x28, 0x1d, 0x4d, 0x35, 0x88, 0xef, 0xaf, 0x51, 0x6e, 0xe7, 0x43, 0xfb, + 0x7b, 0xf3, 0x27, 0x1b, 0xd9, 0x24, 0x38, 0x8f, 0x57, 0xfe, 0xac, 0x04, 0xc7, 0x93, 0xa7, 0x6c, + 0x4e, 0x55, 0x2a, 0x0d, 0x54, 0x95, 0x3e, 0x19, 0xd9, 0x36, 0x5e, 0xc9, 0x1e, 0x44, 0x43, 0xc6, + 0xd6, 0x59, 0x84, 0x49, 0x91, 0x47, 0xfc, 0x49, 0x51, 0x97, 0x07, 0xd1, 0xb0, 0x11, 0x9f, 0xc6, + 0x49, 0x7a, 0x56, 0x6b, 0x86, 0x25, 0xa4, 0x0f, 0x52, 0x8a, 0xd7, 0x9a, 0x8b, 0x49, 0x02, 0x9c, + 0xe6, 0x41, 0x6b, 0x30, 0xed, 0x1a, 0x69, 0x28, 0x2f, 0x3a, 0x1f, 0x12, 0x50, 0xd3, 0x1b, 0x69, + 0x12, 0x9c, 0xc5, 0x87, 0x76, 0x00, 0xda, 0x7e, 0x41, 0xe0, 0x54, 0x8f, 0xf2, 0x5c, 0x5d, 0x1f, + 0x78, 0x6f, 0x05, 0xb5, 0x45, 0x98, 0x11, 0x83, 0x21, 0x07, 0x47, 0x24, 0xa1, 0x17, 0x60, 0xdc, + 0xe6, 0x17, 0x0f, 0xdf, 0x00, 0xaf, 0x78, 0x7f, 0x40, 0xb0, 0x8d, 0xe3, 0xe8, 0x24, 0x8e, 0xd3, + 0xa2, 0x73, 0x30, 0xd1, 0x66, 0x35, 0x2a, 0x53, 0x63, 0xc9, 0x74, 0x0d, 0xca, 0x03, 0xbd, 0x58, + 0x47, 0xac, 0x4e, 0x58, 0x8a, 0xcd, 0xe0, 0x04, 0xa5, 0xfc, 0x47, 0x29, 0x7a, 0xbc, 0x05, 0x65, + 0xfa, 0xb9, 0x58, 0x49, 0xf6, 0x58, 0xa2, 0x24, 0x9b, 0x49, 0x73, 0x44, 0x2a, 0xb2, 0xef, 0x64, + 0x57, 0xe8, 0x17, 0x0f, 0x55, 0xa1, 0x87, 0xc7, 0xf4, 0x9d, 0x4b, 0xf4, 0x8f, 0x25, 0x98, 0xb9, + 0xd8, 0xbc, 0x64, 0x9b, 0xae, 0xe5, 0xab, 0x77, 0xc5, 0xf2, 0xfc, 0xfc, 0x35, 0x28, 0xd9, 0xae, + 0xe6, 0xdb, 0xf5, 0x5f, 0xbe, 0x5d, 0xd8, 0xd5, 0x98, 0x5d, 0xd3, 0x09, 0x2e, 0xcf, 0x28, 0xc6, + 0x80, 0xde, 0x82, 0xa3, 0xb6, 0x62, 0x74, 0x89, 0x7f, 0x80, 0x3f, 0xdb, 0xa7, 0x35, 0x2b, 0xcb, + 0x98, 0xb1, 0x47, 0xca, 0x48, 0x8e, 0x86, 0x05, 0xaa, 0xfc, 0x53, 0x09, 0x26, 0x2f, 0xb7, 0x5a, + 0x8d, 0x15, 0x83, 0x67, 0x80, 0x86, 0x42, 0xb7, 0x59, 0x8d, 0x61, 0x29, 0x74, 0x3b, 0x59, 0x63, + 0xb0, 0x39, 0xcc, 0x67, 0xd0, 0x36, 0x8c, 0xb0, 0xcc, 0x43, 0x8c, 0xce, 0x80, 0xd7, 0x03, 0x21, + 0xae, 0xee, 0x81, 0x84, 0xb5, 0xab, 0x18, 0xc0, 0x3e, 0xbc, 0xfc, 0x1e, 0x9c, 0x88, 0xa8, 0xc7, + 0xfc, 0xc5, 0x5f, 0x36, 0x51, 0x1b, 0xca, 0x4c, 0x13, 0xff, 0xdd, 0xb2, 0xdf, 0xe7, 0xb7, 0x84, + 0xc9, 0x61, 0x0d, 0xc6, 0x7e, 0x39, 0xd8, 0xc3, 0x96, 0xd7, 0x60, 0xfc, 0xb2, 0xe9, 0xd0, 0x86, + 0x69, 0x53, 0xee, 0x36, 0xf4, 0x08, 0x14, 0x75, 0xd5, 0x10, 0x27, 0xfc, 0x98, 0xe0, 0x29, 0xb2, + 0x33, 0x88, 0x8d, 0xf3, 0x69, 0x65, 0x57, 0x64, 0xb2, 0x70, 0x5a, 0xd9, 0xc5, 0x6c, 0x5c, 0xbe, + 0x04, 0x23, 0x62, 0x39, 0xa2, 0x40, 0xc5, 0x83, 0x81, 0x8a, 0x19, 0x40, 0xbf, 0x2c, 0xc0, 0x88, + 0xd0, 0x7e, 0x08, 0x17, 0xc1, 0x37, 0x62, 0x17, 0xc1, 0x73, 0x83, 0xad, 0x74, 0xee, 0x2d, 0xb0, + 0x93, 0xb8, 0x05, 0xbe, 0x38, 0x20, 0xfe, 0xc1, 0x57, 0xc0, 0x8f, 0x24, 0x98, 0x88, 0xc7, 0x1c, + 0x3a, 0x0b, 0x63, 0xec, 0x3c, 0x52, 0xdb, 0x64, 0x3d, 0x2c, 0xa8, 0x83, 0x47, 0x99, 0x66, 0x38, + 0x85, 0xa3, 0x74, 0xa8, 0x1b, 0xb0, 0xb1, 0xb0, 0x10, 0x4e, 0xc9, 0x77, 0xb9, 0x4b, 0x55, 0xad, + 0xe6, 0xb5, 0x89, 0x6a, 0x2b, 0x06, 0xbd, 0x62, 0x37, 0xa9, 0xad, 0x1a, 0xdd, 0x94, 0x20, 0x1e, + 0x63, 0x51, 0x64, 0xf9, 0xa6, 0x04, 0x63, 0x42, 0xe5, 0x21, 0x5c, 0x67, 0x5e, 0x8f, 0x5f, 0x67, + 0x9e, 0x1d, 0x70, 0x3f, 0x67, 0xdf, 0x65, 0x3e, 0x09, 0x4d, 0x61, 0x3b, 0x98, 0x25, 0x98, 0x6d, + 0xd3, 0xa1, 0xc9, 0x04, 0xc3, 0xf6, 0x1a, 0xe6, 0x33, 0xe8, 0x7b, 0x12, 0x1c, 0x57, 0x13, 0x7b, + 0x5e, 0xf8, 0xfa, 0xe5, 0xc1, 0x54, 0x0b, 0x60, 0xea, 0x55, 0x21, 0xef, 0x78, 0x72, 0x06, 0xa7, + 0x44, 0xca, 0x2e, 0xa4, 0xa8, 0x90, 0x02, 0xa5, 0x6d, 0x4a, 0x2d, 0xb1, 0x08, 0x4b, 0x83, 0x67, + 0x9e, 0x50, 0xa5, 0x0a, 0x37, 0xbf, 0xd5, 0x6a, 0x60, 0x0e, 0x2d, 0xff, 0xa2, 0x10, 0x38, 0xac, + 0xe9, 0x6d, 0x92, 0x20, 0xdf, 0x4a, 0xf7, 0x22, 0xdf, 0x8e, 0x65, 0xe5, 0x5a, 0xf4, 0x0d, 0x28, + 0x52, 0x6d, 0xd0, 0x0b, 0xad, 0x90, 0xd0, 0x5a, 0x6d, 0x86, 0x09, 0xab, 0xb5, 0xda, 0xc4, 0x0c, + 0x12, 0xbd, 0x0d, 0x65, 0x76, 0x9a, 0xb1, 0x3d, 0x5e, 0x1c, 0x3c, 0x87, 0x30, 0x7f, 0x85, 0x11, + 0xc6, 0x7e, 0x39, 0xd8, 0xc3, 0x95, 0xdf, 0x83, 0xf1, 0x58, 0x22, 0x40, 0xd7, 0xe1, 0x98, 0x66, + 0x2a, 0x9d, 0xba, 0xa2, 0x29, 0x46, 0x9b, 0xd8, 0xc9, 0xd4, 0x98, 0x7d, 0x17, 0x5a, 0x8d, 0x70, + 0x88, 0x84, 0x12, 0x34, 0x1f, 0xa3, 0x73, 0x38, 0x86, 0x2d, 0x2b, 0x00, 0xa1, 0xf5, 0x68, 0x1e, + 0xca, 0x2c, 0x84, 0xbd, 0x93, 0x69, 0xb4, 0x3e, 0xca, 0x74, 0x65, 0x91, 0xed, 0x60, 0x6f, 0x1c, + 0x9d, 0x01, 0x70, 0x48, 0xdb, 0x26, 0x94, 0xe7, 0x1d, 0xef, 0xf5, 0x28, 0xc8, 0xc0, 0xcd, 0x60, + 0x06, 0x47, 0xa8, 0xe4, 0x3f, 0x4b, 0x30, 0xbe, 0x4e, 0xe8, 0xbb, 0xa6, 0x7d, 0xa3, 0xc1, 0x9b, + 0xbb, 0x43, 0xc8, 0xfb, 0x9b, 0xb1, 0xbc, 0xff, 0x4a, 0x9f, 0x6b, 0x16, 0xd3, 0x36, 0x2f, 0xfb, + 0xcb, 0x7f, 0x97, 0xa0, 0x1a, 0xa3, 0x8c, 0xa6, 0x09, 0x02, 0x65, 0xcb, 0xb4, 0xa9, 0x7f, 0xc6, + 0x1f, 0x4a, 0x03, 0x96, 0x52, 0x23, 0xa7, 0x3c, 0x83, 0xc5, 0x1e, 0x3a, 0xb3, 0x73, 0xcb, 0x36, + 0x75, 0x11, 0xf7, 0x87, 0x93, 0x42, 0x88, 0x1d, 0xda, 0x79, 0xd1, 0x36, 0x75, 0xcc, 0xb1, 0xe5, + 0x3f, 0x49, 0x30, 0x15, 0xa3, 0x1c, 0x42, 0x4a, 0x57, 0xe2, 0x29, 0xfd, 0xc5, 0xc3, 0x18, 0x96, + 0x93, 0xd8, 0xbf, 0x4a, 0x9a, 0xc5, 0x1c, 0x80, 0xb6, 0x60, 0xcc, 0x32, 0x3b, 0xcd, 0x7b, 0xd0, + 0xd5, 0x9b, 0x64, 0x27, 0x64, 0x23, 0xc4, 0xc2, 0x51, 0x60, 0xb4, 0x0b, 0x53, 0x86, 0xa2, 0x13, + 0xc7, 0x52, 0xda, 0xa4, 0x79, 0x0f, 0xde, 0x54, 0x1e, 0xe0, 0x9d, 0x86, 0x24, 0x22, 0x4e, 0x0b, + 0x91, 0x7f, 0x9d, 0xb2, 0xdb, 0xb4, 0x29, 0x7a, 0x15, 0x2a, 0xfc, 0x03, 0x8b, 0xb6, 0xa9, 0x89, + 0xa3, 0xed, 0x2c, 0x5b, 0x9a, 0x86, 0x18, 0xbb, 0xbd, 0x37, 0xff, 0xdf, 0x07, 0x3e, 0x09, 0xfb, + 0x84, 0x38, 0x80, 0x41, 0xeb, 0x50, 0xb2, 0x0e, 0x53, 0x66, 0xf0, 0x83, 0x85, 0xd7, 0x16, 0x1c, + 0x47, 0xfe, 0x47, 0x52, 0x71, 0x7e, 0xbc, 0x5c, 0xbf, 0x67, 0x0b, 0x16, 0x94, 0x35, 0xb9, 0x8b, + 0x66, 0xc3, 0x88, 0x38, 0x65, 0x45, 0x5c, 0x5e, 0x3a, 0x4c, 0x5c, 0x46, 0x4f, 0x86, 0xe0, 0x12, + 0xe1, 0x0f, 0xfa, 0x82, 0xe4, 0xbf, 0x4a, 0x30, 0xc5, 0x15, 0x6a, 0xbb, 0xb6, 0x4a, 0x7b, 0x43, + 0xcb, 0xa0, 0x5b, 0xb1, 0x0c, 0xba, 0xdc, 0xa7, 0xa1, 0x29, 0x8d, 0x73, 0xb3, 0xe8, 0xe7, 0x12, + 0x3c, 0x90, 0xa2, 0x1e, 0x42, 0x86, 0x21, 0xf1, 0x0c, 0xf3, 0xca, 0x61, 0x0d, 0xcc, 0xc9, 0x32, + 0x37, 0x21, 0xc3, 0x3c, 0x1e, 0xb8, 0x67, 0x00, 0x2c, 0x5b, 0xdd, 0x51, 0x35, 0xd2, 0x15, 0x8d, + 0xe4, 0x4a, 0xb8, 0x24, 0x8d, 0x60, 0x06, 0x47, 0xa8, 0xd0, 0xb7, 0x60, 0xa6, 0x43, 0xb6, 0x14, + 0x57, 0xa3, 0x8b, 0x9d, 0xce, 0x92, 0x62, 0x29, 0x9b, 0xaa, 0xa6, 0x52, 0x55, 0xdc, 0xb0, 0x47, + 0xeb, 0x17, 0xbc, 0x06, 0x6f, 0x16, 0xc5, 0xed, 0xbd, 0xf9, 0xc7, 0x0f, 0x6e, 0xea, 0xf8, 0xc4, + 0x3d, 0x9c, 0x23, 0x04, 0x7d, 0x57, 0x82, 0xaa, 0x4d, 0xde, 0x71, 0x55, 0x9b, 0x74, 0x96, 0x6d, + 0xd3, 0x8a, 0x69, 0x50, 0xe4, 0x1a, 0x5c, 0xda, 0xdf, 0x9b, 0xaf, 0xe2, 0x1c, 0x9a, 0x7e, 0x74, + 0xc8, 0x15, 0x84, 0x28, 0x4c, 0x2b, 0x9a, 0x66, 0xbe, 0x4b, 0xe2, 0x1e, 0x28, 0x71, 0xf9, 0xf5, + 0xfd, 0xbd, 0xf9, 0xe9, 0xc5, 0xf4, 0x74, 0x3f, 0xa2, 0xb3, 0xe0, 0xd1, 0x02, 0x8c, 0xec, 0x98, + 0x9a, 0xab, 0x13, 0xa7, 0x5a, 0xe6, 0x92, 0x58, 0xc6, 0x1d, 0xb9, 0xea, 0x0d, 0xdd, 0xde, 0x9b, + 0x3f, 0x7a, 0xb1, 0xc9, 0x9f, 0x3e, 0x7c, 0x2a, 0x76, 0x47, 0x63, 0x35, 0x93, 0xd8, 0xf2, 0xfc, + 0xcd, 0xb6, 0x12, 0xe6, 0x98, 0xcb, 0xe1, 0x14, 0x8e, 0xd2, 0x21, 0x1d, 0x46, 0xb7, 0xc5, 0xbd, + 0xdd, 0xa9, 0x8e, 0x0c, 0x74, 0xfa, 0xc5, 0xee, 0xfd, 0xf5, 0x29, 0x21, 0x72, 0xd4, 0x1f, 0x76, + 0x70, 0x28, 0x01, 0x3d, 0x01, 0x23, 0xfc, 0xc7, 0xca, 0x32, 0x7f, 0x00, 0xab, 0x84, 0x99, 0xe8, + 0xb2, 0x37, 0x8c, 0xfd, 0x79, 0x9f, 0x74, 0xa5, 0xb1, 0xc4, 0x1f, 0x66, 0x13, 0xa4, 0x2b, 0x8d, + 0x25, 0xec, 0xcf, 0x23, 0x0b, 0x46, 0x1c, 0xb2, 0xaa, 0x1a, 0xee, 0x6e, 0x15, 0x06, 0x6a, 0x35, + 0x37, 0x2f, 0x70, 0xee, 0xc4, 0x53, 0x54, 0x28, 0x51, 0xcc, 0x63, 0x5f, 0x0c, 0xda, 0x85, 0x51, + 0xdb, 0x35, 0x16, 0x9d, 0x0d, 0x87, 0xd8, 0xd5, 0x31, 0x2e, 0xb3, 0xdf, 0xe4, 0x8c, 0x7d, 0xfe, + 0xa4, 0xd4, 0xc0, 0x83, 0x01, 0x05, 0x0e, 0x85, 0xa1, 0x9f, 0x48, 0x80, 0x1c, 0xd7, 0xb2, 0x34, + 0xa2, 0x13, 0x83, 0x2a, 0x1a, 0x7f, 0x0d, 0x73, 0xaa, 0xc7, 0xb8, 0x0e, 0x8d, 0x7e, 0xed, 0x4e, + 0x01, 0x25, 0x95, 0x09, 0x9e, 0xa9, 0xd3, 0xa4, 0x38, 0x43, 0x0f, 0xb6, 0x14, 0x5b, 0x0e, 0xff, + 0xbb, 0x3a, 0x3e, 0xd0, 0x52, 0x64, 0xbf, 0x0a, 0x86, 0x4b, 0x21, 0xe6, 0xb1, 0x2f, 0x06, 0x5d, + 0x85, 0x19, 0x9b, 0x28, 0x9d, 0x2b, 0x86, 0xd6, 0xc3, 0xa6, 0x49, 0x2f, 0xaa, 0x1a, 0x71, 0x7a, + 0x0e, 0x25, 0x7a, 0x75, 0x82, 0x87, 0x4d, 0xf0, 0xb9, 0x06, 0xce, 0xa4, 0xc2, 0x39, 0xdc, 0xfc, + 0x2b, 0x02, 0xf1, 0x7e, 0x3b, 0x9c, 0xef, 0xf0, 0x0e, 0xf7, 0x15, 0x41, 0xa8, 0xea, 0x7d, 0xfb, + 0x8a, 0x20, 0x22, 0xe2, 0xe0, 0x27, 0xa4, 0xaf, 0x0a, 0x30, 0x1d, 0x12, 0xdf, 0xf5, 0x57, 0x04, + 0x19, 0x2c, 0x43, 0xf8, 0x8a, 0x20, 0xbb, 0x0d, 0x5f, 0xbc, 0xdf, 0x6d, 0xf8, 0xfb, 0xf0, 0xf5, + 0x02, 0xef, 0xec, 0x87, 0x4e, 0xfc, 0xf7, 0xef, 0xec, 0x87, 0xba, 0xe6, 0x94, 0x33, 0xbf, 0x2d, + 0x44, 0x0d, 0xfa, 0x0f, 0x6a, 0x1f, 0x1f, 0xfe, 0x2b, 0x45, 0xf9, 0xf3, 0x22, 0x1c, 0x4f, 0xee, + 0xd8, 0x58, 0x17, 0x51, 0xba, 0x63, 0x17, 0xb1, 0x01, 0x27, 0xb6, 0x5c, 0x4d, 0xeb, 0x71, 0x87, + 0x44, 0x5a, 0x89, 0xde, 0xab, 0xfd, 0xc3, 0x82, 0xf3, 0xc4, 0xc5, 0x0c, 0x1a, 0x9c, 0xc9, 0x99, + 0xd3, 0x11, 0x2d, 0x0e, 0xd4, 0x11, 0x4d, 0x35, 0xe4, 0x4a, 0x7d, 0x34, 0xe4, 0x32, 0xbb, 0x9b, + 0xe5, 0x01, 0xba, 0x9b, 0xf7, 0xa2, 0x1d, 0x99, 0x91, 0xf8, 0xee, 0xd4, 0x8e, 0x94, 0x1f, 0x86, + 0x59, 0xc1, 0x46, 0x79, 0xa7, 0xd0, 0xa0, 0xb6, 0xa9, 0x69, 0xc4, 0x5e, 0x76, 0x75, 0xbd, 0x27, + 0x9f, 0x87, 0x89, 0x78, 0x4f, 0xdc, 0x5b, 0x79, 0xaf, 0x4d, 0x2f, 0x7a, 0x29, 0x91, 0x95, 0xf7, + 0xc6, 0x71, 0x40, 0x21, 0x7f, 0x20, 0xc1, 0x4c, 0xf6, 0xf7, 0x77, 0x48, 0x83, 0x09, 0x5d, 0xd9, + 0x8d, 0x7e, 0x80, 0x28, 0x0d, 0x78, 0xe3, 0xe6, 0xcd, 0xcf, 0xb5, 0x18, 0x16, 0x4e, 0x60, 0xcb, + 0x5f, 0x48, 0x70, 0x32, 0xa7, 0xcd, 0x38, 0x5c, 0x4d, 0xd0, 0x35, 0xa8, 0xe8, 0xca, 0x6e, 0xd3, + 0xb5, 0xbb, 0x64, 0xe0, 0x37, 0x06, 0x9e, 0x4b, 0xd6, 0x04, 0x0a, 0x0e, 0xf0, 0xe4, 0x8f, 0x25, + 0xa8, 0xe6, 0xd5, 0x83, 0xe8, 0x6c, 0xac, 0x21, 0xfa, 0x68, 0xa2, 0x21, 0x3a, 0x95, 0xe2, 0x1b, + 0x52, 0x3b, 0xf4, 0x13, 0x09, 0x66, 0xb2, 0xeb, 0x66, 0xf4, 0x4c, 0x4c, 0xe3, 0xf9, 0x84, 0xc6, + 0x93, 0x09, 0x2e, 0xa1, 0xef, 0x36, 0x4c, 0x88, 0xea, 0x5a, 0xc0, 0x08, 0x2f, 0x3f, 0x79, 0x70, + 0x56, 0x15, 0x60, 0x7e, 0x9d, 0xc8, 0x57, 0x32, 0x3e, 0x86, 0x13, 0xb8, 0xf2, 0xcf, 0x0b, 0x50, + 0x6e, 0xb6, 0x15, 0x8d, 0x0c, 0xa1, 0xa8, 0xbb, 0x16, 0x2b, 0xea, 0xfa, 0xfd, 0x1f, 0x01, 0xae, + 0x65, 0x6e, 0x3d, 0xb7, 0x99, 0xa8, 0xe7, 0xce, 0x0d, 0x84, 0x7e, 0x70, 0x29, 0xf7, 0x3c, 0x8c, + 0x06, 0x4a, 0xf4, 0x77, 0x7a, 0xc8, 0x1f, 0x15, 0x60, 0x2c, 0x22, 0xa2, 0xcf, 0xb3, 0x67, 0x27, + 0x76, 0x7a, 0x0f, 0xf2, 0xef, 0x48, 0x11, 0xd9, 0x35, 0xff, 0xfc, 0xf6, 0xbe, 0xbf, 0x0b, 0xbf, + 0xa3, 0x4a, 0x1f, 0xeb, 0xe7, 0x61, 0x82, 0xf2, 0xff, 0xce, 0x09, 0xde, 0xf8, 0x8a, 0x3c, 0x8a, + 0x83, 0xaf, 0x3a, 0x5b, 0xb1, 0x59, 0x9c, 0xa0, 0x9e, 0x7d, 0x01, 0xc6, 0x63, 0xc2, 0xfa, 0xfa, + 0x5c, 0xee, 0x77, 0x12, 0x3c, 0x7a, 0xc7, 0x3b, 0x19, 0xaa, 0xc7, 0xb6, 0x57, 0x2d, 0xb1, 0xbd, + 0xe6, 0xf2, 0x01, 0x86, 0xf8, 0xb1, 0xc4, 0x8f, 0x0a, 0x80, 0x5a, 0xdb, 0xaa, 0xdd, 0x69, 0x28, + 0x36, 0xed, 0x61, 0xf1, 0x3f, 0x58, 0x43, 0xd8, 0x70, 0x67, 0x61, 0xac, 0x43, 0x9c, 0xb6, 0xad, + 0x72, 0x67, 0x89, 0xbb, 0x42, 0xf0, 0x0e, 0xb2, 0x1c, 0x4e, 0xe1, 0x28, 0x1d, 0xea, 0x42, 0x65, + 0xc7, 0xfb, 0x2f, 0x3f, 0xbf, 0xf3, 0xd6, 0x6f, 0x31, 0x1b, 0xfe, 0x9f, 0x60, 0x18, 0x5f, 0x62, + 0xc0, 0xc1, 0x01, 0xb8, 0xfc, 0xa1, 0x04, 0x33, 0x69, 0xc7, 0x2c, 0x33, 0xd5, 0xef, 0xbf, 0x73, + 0x1e, 0x86, 0x12, 0x47, 0x67, 0x5e, 0x39, 0xe6, 0xbd, 0x78, 0x33, 0xc9, 0x98, 0x8f, 0xca, 0x5f, + 0x4a, 0x30, 0x9b, 0xad, 0xda, 0x10, 0xae, 0x12, 0xd7, 0xe3, 0x57, 0x89, 0x7e, 0x9f, 0x0d, 0xb2, + 0xf5, 0xce, 0xb9, 0x56, 0xec, 0x65, 0xae, 0xc1, 0x10, 0x8c, 0xdc, 0x8a, 0x1b, 0xb9, 0x78, 0x68, + 0x23, 0xb3, 0x0d, 0xac, 0x3f, 0x71, 0xf3, 0xd6, 0xdc, 0x91, 0x4f, 0x6f, 0xcd, 0x1d, 0xf9, 0xec, + 0xd6, 0xdc, 0x91, 0xf7, 0xf7, 0xe7, 0xa4, 0x9b, 0xfb, 0x73, 0xd2, 0xa7, 0xfb, 0x73, 0xd2, 0xdf, + 0xf6, 0xe7, 0xa4, 0x1f, 0x7c, 0x31, 0x77, 0xe4, 0xda, 0x88, 0xc0, 0xfc, 0x57, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x5a, 0xe3, 0x5a, 0x1b, 0x28, 0x3d, 0x00, 0x00, } diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/generated.proto b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/generated.proto index a7580703f50..6e12f519eef 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/generated.proto +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/generated.proto @@ -325,6 +325,12 @@ message DeploymentStatus { // +patchMergeKey=type // +patchStrategy=merge repeated DeploymentCondition conditions = 6; + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + optional int64 collisionCount = 8; } // DeploymentStrategy describes how to replace existing pods with new ones. diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types.generated.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types.generated.go index 423a1647118..633862633f7 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types.generated.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types.generated.go @@ -5606,7 +5606,7 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [7]bool + var yyq2 [8]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.ObservedGeneration != 0 @@ -5616,9 +5616,10 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[4] = x.AvailableReplicas != 0 yyq2[5] = x.UnavailableReplicas != 0 yyq2[6] = len(x.Conditions) != 0 + yyq2[7] = x.CollisionCount != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(7) + r.EncodeArrayStart(8) } else { yynn2 = 0 for _, b := range yyq2 { @@ -5812,6 +5813,41 @@ func (x *DeploymentStatus) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[7] { + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy25 := *x.CollisionCount + yym26 := z.EncBinary() + _ = yym26 + if false { + } else { + r.EncodeInt(int64(yy25)) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[7] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("collisionCount")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.CollisionCount == nil { + r.EncodeNil() + } else { + yy27 := *x.CollisionCount + yym28 := z.EncBinary() + _ = yym28 + if false { + } else { + r.EncodeInt(int64(yy27)) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -5957,6 +5993,22 @@ func (x *DeploymentStatus) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv16), d) } } + case "collisionCount": + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym19 := z.DecBinary() + _ = yym19 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -5968,16 +6020,16 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj18 int - var yyb18 bool - var yyhl18 bool = l >= 0 - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + var yyj20 int + var yyb20 bool + var yyhl20 bool = l >= 0 + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -5985,21 +6037,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.ObservedGeneration = 0 } else { - yyv19 := &x.ObservedGeneration - yym20 := z.DecBinary() - _ = yym20 + yyv21 := &x.ObservedGeneration + yym22 := z.DecBinary() + _ = yym22 if false { } else { - *((*int64)(yyv19)) = int64(r.DecodeInt(64)) + *((*int64)(yyv21)) = int64(r.DecodeInt(64)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6007,29 +6059,7 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.Replicas = 0 } else { - yyv21 := &x.Replicas - yym22 := z.DecBinary() - _ = yym22 - if false { - } else { - *((*int32)(yyv21)) = int32(r.DecodeInt(32)) - } - } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l - } else { - yyb18 = r.CheckBreak() - } - if yyb18 { - z.DecSendContainerState(codecSelfer_containerArrayEnd1234) - return - } - z.DecSendContainerState(codecSelfer_containerArrayElem1234) - if r.TryDecodeAsNil() { - x.UpdatedReplicas = 0 - } else { - yyv23 := &x.UpdatedReplicas + yyv23 := &x.Replicas yym24 := z.DecBinary() _ = yym24 if false { @@ -6037,21 +6067,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv23)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.ReadyReplicas = 0 + x.UpdatedReplicas = 0 } else { - yyv25 := &x.ReadyReplicas + yyv25 := &x.UpdatedReplicas yym26 := z.DecBinary() _ = yym26 if false { @@ -6059,21 +6089,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv25)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.AvailableReplicas = 0 + x.ReadyReplicas = 0 } else { - yyv27 := &x.AvailableReplicas + yyv27 := &x.ReadyReplicas yym28 := z.DecBinary() _ = yym28 if false { @@ -6081,21 +6111,21 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv27)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } z.DecSendContainerState(codecSelfer_containerArrayElem1234) if r.TryDecodeAsNil() { - x.UnavailableReplicas = 0 + x.AvailableReplicas = 0 } else { - yyv29 := &x.UnavailableReplicas + yyv29 := &x.AvailableReplicas yym30 := z.DecBinary() _ = yym30 if false { @@ -6103,13 +6133,35 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) *((*int32)(yyv29)) = int32(r.DecodeInt(32)) } } - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.UnavailableReplicas = 0 + } else { + yyv31 := &x.UnavailableReplicas + yym32 := z.DecBinary() + _ = yym32 + if false { + } else { + *((*int32)(yyv31)) = int32(r.DecodeInt(32)) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -6117,26 +6169,52 @@ func (x *DeploymentStatus) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) if r.TryDecodeAsNil() { x.Conditions = nil } else { - yyv31 := &x.Conditions - yym32 := z.DecBinary() - _ = yym32 + yyv33 := &x.Conditions + yym34 := z.DecBinary() + _ = yym34 if false { } else { - h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv31), d) + h.decSliceDeploymentCondition((*[]DeploymentCondition)(yyv33), d) + } + } + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l + } else { + yyb20 = r.CheckBreak() + } + if yyb20 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.CollisionCount != nil { + x.CollisionCount = nil + } + } else { + if x.CollisionCount == nil { + x.CollisionCount = new(int64) + } + yym36 := z.DecBinary() + _ = yym36 + if false { + } else { + *((*int64)(x.CollisionCount)) = int64(r.DecodeInt(64)) } } for { - yyj18++ - if yyhl18 { - yyb18 = yyj18 > l + yyj20++ + if yyhl20 { + yyb20 = yyj20 > l } else { - yyb18 = r.CheckBreak() + yyb20 = r.CheckBreak() } - if yyb18 { + if yyb20 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj18-1, "") + z.DecStructFieldNotFound(yyj20-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -19652,7 +19730,7 @@ func (x codecSelfer1234) decSliceDeployment(v *[]Deployment, d *codec1978.Decode yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 960) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 968) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types.go index 0b950e35c27..75bd7505aed 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types.go @@ -325,6 +325,12 @@ type DeploymentStatus struct { // +patchMergeKey=type // +patchStrategy=merge Conditions []DeploymentCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,6,rep,name=conditions"` + + // Count of hash collisions for the Deployment. The Deployment controller uses this + // field as a collision avoidance mechanism when it needs to create the name for the + // newest ReplicaSet. + // +optional + CollisionCount *int64 `json:"collisionCount,omitempty" protobuf:"varint,8,opt,name=collisionCount"` } type DeploymentConditionType string diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go index 9e9a03ffb14..d94bc009e9d 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/types_swagger_doc_generated.go @@ -186,6 +186,7 @@ var map_DeploymentStatus = map[string]string{ "availableReplicas": "Total number of available pods (ready for at least minReadySeconds) targeted by this deployment.", "unavailableReplicas": "Total number of unavailable pods targeted by this deployment.", "conditions": "Represents the latest available observations of a deployment's current state.", + "collisionCount": "Count of hash collisions for the Deployment. The Deployment controller uses this field as a collision avoidance mechanism when it needs to create the name for the newest ReplicaSet.", } func (DeploymentStatus) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.conversion.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.conversion.go index e90fa6af11e..9c73c3711dc 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.conversion.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.conversion.go @@ -628,6 +628,7 @@ func autoConvert_v1beta1_DeploymentStatus_To_extensions_DeploymentStatus(in *Dep out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]extensions.DeploymentCondition)(unsafe.Pointer(&in.Conditions)) + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) return nil } @@ -644,6 +645,7 @@ func autoConvert_extensions_DeploymentStatus_To_v1beta1_DeploymentStatus(in *ext out.AvailableReplicas = in.AvailableReplicas out.UnavailableReplicas = in.UnavailableReplicas out.Conditions = *(*[]DeploymentCondition)(unsafe.Pointer(&in.Conditions)) + out.CollisionCount = (*int64)(unsafe.Pointer(in.CollisionCount)) return nil } diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.deepcopy.go index 67bdcee1382..95a5ecc0a13 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/v1beta1/zz_generated.deepcopy.go @@ -384,6 +384,11 @@ func DeepCopy_v1beta1_DeploymentStatus(in interface{}, out interface{}, c *conve } } } + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + *out = new(int64) + **out = **in + } return nil } } diff --git a/staging/src/k8s.io/client-go/pkg/apis/extensions/zz_generated.deepcopy.go b/staging/src/k8s.io/client-go/pkg/apis/extensions/zz_generated.deepcopy.go index d692dd7e939..b06b0692663 100644 --- a/staging/src/k8s.io/client-go/pkg/apis/extensions/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/client-go/pkg/apis/extensions/zz_generated.deepcopy.go @@ -378,6 +378,11 @@ func DeepCopy_extensions_DeploymentStatus(in interface{}, out interface{}, c *co } } } + if in.CollisionCount != nil { + in, out := &in.CollisionCount, &out.CollisionCount + *out = new(int64) + **out = **in + } return nil } } diff --git a/test/e2e/BUILD b/test/e2e/BUILD index ec8df8278d8..3097b77e694 100644 --- a/test/e2e/BUILD +++ b/test/e2e/BUILD @@ -164,6 +164,7 @@ go_library( "//test/e2e_federation:go_default_library", "//test/images/net/nat:go_default_library", "//test/utils:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew:go_default_library", "//vendor/github.com/elazarl/goproxy:go_default_library", "//vendor/github.com/ghodss/yaml:go_default_library", "//vendor/github.com/golang/glog:go_default_library", diff --git a/test/e2e/deployment.go b/test/e2e/deployment.go index 4d2bd3fd779..822d18d9f6e 100644 --- a/test/e2e/deployment.go +++ b/test/e2e/deployment.go @@ -21,8 +21,10 @@ import ( "math/rand" "time" + "github.com/davecgh/go-spew/spew" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" @@ -108,6 +110,9 @@ var _ = framework.KubeDescribe("Deployment", func() { It("test Deployment ReplicaSet orphaning and adoption regarding controllerRef", func() { testDeploymentsControllerRef(f) }) + It("deployment can avoid hash collisions", func() { + testDeploymentHashCollisionAvoidance(f) + }) // TODO: add tests that cover deployment.Spec.MinReadySeconds once we solved clock-skew issues // See https://github.com/kubernetes/kubernetes/issues/29229 }) @@ -1359,3 +1364,47 @@ func orphanDeploymentReplicaSets(c clientset.Interface, d *extensions.Deployment deleteOptions.Preconditions = metav1.NewUIDPreconditions(string(d.UID)) return c.Extensions().Deployments(d.Namespace).Delete(d.Name, deleteOptions) } + +func testDeploymentHashCollisionAvoidance(f *framework.Framework) { + ns := f.Namespace.Name + c := f.ClientSet + + deploymentName := "test-hash-collision" + framework.Logf("Creating Deployment %q", deploymentName) + podLabels := map[string]string{"name": nginxImageName} + d := framework.NewDeployment(deploymentName, int32(0), podLabels, nginxImageName, nginxImage, extensions.RollingUpdateDeploymentStrategyType) + deployment, err := c.Extensions().Deployments(ns).Create(d) + Expect(err).NotTo(HaveOccurred()) + err = framework.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, "1", nginxImage) + Expect(err).NotTo(HaveOccurred()) + + // TODO: Switch this to do a non-cascading deletion of the Deployment, mutate the ReplicaSet + // once it has no owner reference, then recreate the Deployment if we ever proceed with + // https://github.com/kubernetes/kubernetes/issues/44237 + framework.Logf("Mock a hash collision") + newRS, err := deploymentutil.GetNewReplicaSet(deployment, c) + Expect(err).NotTo(HaveOccurred()) + var nilRs *extensions.ReplicaSet + Expect(newRS).NotTo(Equal(nilRs)) + _, err = framework.UpdateReplicaSetWithRetries(c, ns, newRS.Name, func(update *extensions.ReplicaSet) { + *update.Spec.Template.Spec.TerminationGracePeriodSeconds = int64(5) + }) + Expect(err).NotTo(HaveOccurred()) + + framework.Logf("Expect deployment collision counter to increment") + if err := wait.PollImmediate(time.Second, time.Minute, func() (bool, error) { + d, err := c.Extensions().Deployments(ns).Get(deploymentName, metav1.GetOptions{}) + if err != nil { + framework.Logf("cannot get deployment %q: %v", deploymentName, err) + return false, nil + } + framework.Logf(spew.Sprintf("deployment status: %#v", d.Status)) + return d.Status.CollisionCount != nil && *d.Status.CollisionCount == int64(1), nil + }); err != nil { + framework.Failf("Failed to increment collision counter for deployment %q: %v", deploymentName, err) + } + + framework.Logf("Expect a new ReplicaSet to be created") + err = framework.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, "2", nginxImage) + Expect(err).NotTo(HaveOccurred()) +} diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index 16e280b08b9..55986ae2f3d 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -3348,9 +3348,10 @@ func WatchRecreateDeployment(c clientset.Interface, d *extensions.Deployment) er } // WaitForDeploymentRevisionAndImage waits for the deployment's and its new RS's revision and container image to match the given revision and image. -// Note that deployment revision and its new RS revision should be updated shortly, so we only wait for 1 minute here to fail early. +// Note that deployment revision and its new RS revision should be updated shortly most of the time, but an overwhelmed RS controller +// may result in taking longer to relabel a RS. func WaitForDeploymentRevisionAndImage(c clientset.Interface, ns, deploymentName string, revision, image string) error { - return testutil.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, revision, image, Logf, Poll, pollShortTimeout) + return testutil.WaitForDeploymentRevisionAndImage(c, ns, deploymentName, revision, image, Logf, Poll, pollLongTimeout) } // CheckNewRSAnnotations check if the new RS's annotation is as expected @@ -3486,16 +3487,17 @@ func WaitForPartialEvents(c clientset.Interface, ns string, objOrRef runtime.Obj type updateDeploymentFunc func(d *extensions.Deployment) -func UpdateDeploymentWithRetries(c clientset.Interface, namespace, name string, applyUpdate updateDeploymentFunc) (deployment *extensions.Deployment, err error) { - deployments := c.Extensions().Deployments(namespace) +func UpdateDeploymentWithRetries(c clientset.Interface, namespace, name string, applyUpdate updateDeploymentFunc) (*extensions.Deployment, error) { + var deployment *extensions.Deployment var updateErr error - pollErr := wait.Poll(10*time.Millisecond, 1*time.Minute, func() (bool, error) { - if deployment, err = deployments.Get(name, metav1.GetOptions{}); err != nil { + pollErr := wait.PollImmediate(1*time.Second, 1*time.Minute, func() (bool, error) { + var err error + if deployment, err = c.Extensions().Deployments(namespace).Get(name, metav1.GetOptions{}); err != nil { return false, err } // Apply the update, then attempt to push it to the apiserver. applyUpdate(deployment) - if deployment, err = deployments.Update(deployment); err == nil { + if deployment, err = c.Extensions().Deployments(namespace).Update(deployment); err == nil { Logf("Updating deployment %s", name) return true, nil } @@ -3513,7 +3515,7 @@ type updateRsFunc func(d *extensions.ReplicaSet) func UpdateReplicaSetWithRetries(c clientset.Interface, namespace, name string, applyUpdate updateRsFunc) (*extensions.ReplicaSet, error) { var rs *extensions.ReplicaSet var updateErr error - pollErr := wait.PollImmediate(10*time.Millisecond, 1*time.Minute, func() (bool, error) { + pollErr := wait.PollImmediate(1*time.Second, 1*time.Minute, func() (bool, error) { var err error if rs, err = c.Extensions().ReplicaSets(namespace).Get(name, metav1.GetOptions{}); err != nil { return false, err