Merge pull request #43946 from jhorwit2/jah/host-path-psp

Automatic merge from submit-queue (batch tested with PRs 46489, 46281, 46463, 46114, 43946)

Allow PSP's to specify a whitelist of allowed paths for host volume

**What this PR does / why we need it**:

This PR adds the ability to whitelist paths for the host volume to ensure pods cannot access directories they aren't supposed to. E.g. `/var/lib/kubelet`, `/etc/kubernetes/*`, etc. 

**Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes #29326


**Special notes for your reviewer**:

**Release note**:

```release-note
Allow PSP's to specify a whitelist of allowed paths for host volume based on path prefixes
```
This commit is contained in:
Kubernetes Submit Queue
2017-05-30 11:59:10 -07:00
committed by GitHub
25 changed files with 1217 additions and 724 deletions

View File

@@ -53319,6 +53319,13 @@
"type": "string" "type": "string"
} }
}, },
"allowedHostPaths": {
"description": "AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all host paths may be used.",
"type": "array",
"items": {
"type": "string"
}
},
"defaultAddCapabilities": { "defaultAddCapabilities": {
"description": "DefaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capabiility in both DefaultAddCapabilities and RequiredDropCapabilities.", "description": "DefaultAddCapabilities is the default set of capabilities that will be added to the container unless the pod spec specifically drops the capability. You may not list a capabiility in both DefaultAddCapabilities and RequiredDropCapabilities.",
"type": "array", "type": "array",

View File

@@ -9984,6 +9984,13 @@
"readOnlyRootFilesystem": { "readOnlyRootFilesystem": {
"type": "boolean", "type": "boolean",
"description": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to." "description": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to."
},
"allowedHostPaths": {
"type": "array",
"items": {
"type": "string"
},
"description": "AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all host paths may be used."
} }
} }
}, },

View File

@@ -7655,6 +7655,13 @@ Both these may change in the future. Incoming requests are matched against the h
<td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
</tr> </tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">allowedHostPaths</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all host paths may be used.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">string array</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody> </tbody>
</table> </table>
@@ -8120,7 +8127,7 @@ Both these may change in the future. Incoming requests are matched against the h
</div> </div>
<div id="footer"> <div id="footer">
<div id="footer-text"> <div id="footer-text">
Last updated 2017-05-27 18:54:49 UTC Last updated 2017-05-29 17:05:24 UTC
</div> </div>
</div> </div>
</body> </body>

View File

@@ -884,6 +884,10 @@ type PodSecurityPolicySpec struct {
// will not be forced to. // will not be forced to.
// +optional // +optional
ReadOnlyRootFilesystem bool ReadOnlyRootFilesystem bool
// AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all
// host paths may be used.
// +optional
AllowedHostPaths []string
} }
// HostPortRange defines a range of host ports that will be enabled by a policy // HostPortRange defines a range of host ports that will be enabled by a policy

View File

@@ -1988,6 +1988,21 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0 dAtA[i] = 0
} }
i++ i++
if len(m.AllowedHostPaths) > 0 {
for _, s := range m.AllowedHostPaths {
dAtA[i] = 0x7a
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
return i, nil return i, nil
} }
@@ -3239,6 +3254,12 @@ func (m *PodSecurityPolicySpec) Size() (n int) {
l = m.FSGroup.Size() l = m.FSGroup.Size()
n += 1 + l + sovGenerated(uint64(l)) n += 1 + l + sovGenerated(uint64(l))
n += 2 n += 2
if len(m.AllowedHostPaths) > 0 {
for _, s := range m.AllowedHostPaths {
l = len(s)
n += 1 + l + sovGenerated(uint64(l))
}
}
return n return n
} }
@@ -3971,6 +3992,7 @@ func (this *PodSecurityPolicySpec) String() string {
`SupplementalGroups:` + strings.Replace(strings.Replace(this.SupplementalGroups.String(), "SupplementalGroupsStrategyOptions", "SupplementalGroupsStrategyOptions", 1), `&`, ``, 1) + `,`, `SupplementalGroups:` + strings.Replace(strings.Replace(this.SupplementalGroups.String(), "SupplementalGroupsStrategyOptions", "SupplementalGroupsStrategyOptions", 1), `&`, ``, 1) + `,`,
`FSGroup:` + strings.Replace(strings.Replace(this.FSGroup.String(), "FSGroupStrategyOptions", "FSGroupStrategyOptions", 1), `&`, ``, 1) + `,`, `FSGroup:` + strings.Replace(strings.Replace(this.FSGroup.String(), "FSGroupStrategyOptions", "FSGroupStrategyOptions", 1), `&`, ``, 1) + `,`,
`ReadOnlyRootFilesystem:` + fmt.Sprintf("%v", this.ReadOnlyRootFilesystem) + `,`, `ReadOnlyRootFilesystem:` + fmt.Sprintf("%v", this.ReadOnlyRootFilesystem) + `,`,
`AllowedHostPaths:` + fmt.Sprintf("%v", this.AllowedHostPaths) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@@ -9370,6 +9392,35 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error {
} }
} }
m.ReadOnlyRootFilesystem = bool(v != 0) m.ReadOnlyRootFilesystem = bool(v != 0)
case 15:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field AllowedHostPaths", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.AllowedHostPaths = append(m.AllowedHostPaths, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:]) skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -11822,217 +11873,219 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 3390 bytes of a gzipped FileDescriptorProto // 3412 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0x4b, 0x6f, 0x1c, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0xdd, 0x6f, 0x1c, 0x57,
0xb5, 0x56, 0xcf, 0x43, 0x1c, 0x1e, 0x8a, 0xa4, 0x58, 0x94, 0xa9, 0x31, 0x6d, 0x93, 0x72, 0x5f, 0x15, 0xcf, 0x78, 0xbd, 0xf1, 0xfa, 0x6c, 0x6c, 0xc7, 0xd7, 0xae, 0xb3, 0x75, 0x5b, 0x3b, 0x1d,
0x5c, 0x5b, 0xbe, 0xd7, 0x1e, 0x5e, 0xcb, 0x57, 0x8e, 0x2d, 0xdb, 0xb2, 0x39, 0xa4, 0x1e, 0x0c, 0x44, 0x9b, 0x42, 0xbb, 0xa6, 0x29, 0x29, 0x6d, 0xda, 0xa6, 0xf5, 0xda, 0xf9, 0x30, 0xb2, 0x9d,
0x48, 0x6a, 0x5c, 0x33, 0x14, 0x62, 0xf9, 0x95, 0xe6, 0x4c, 0x71, 0xd8, 0x52, 0xbf, 0xdc, 0x5d, 0xed, 0xdd, 0x75, 0x44, 0xd3, 0x2f, 0xc6, 0xbb, 0xd7, 0xeb, 0x49, 0xe6, 0xab, 0x33, 0x77, 0x5c,
0x4d, 0x73, 0x60, 0x24, 0x31, 0x10, 0xc4, 0xcb, 0x20, 0xd9, 0x04, 0x0e, 0x90, 0x2c, 0xb3, 0xc8, 0xaf, 0x2a, 0xa0, 0x12, 0xa2, 0x0f, 0x3c, 0x20, 0x78, 0x41, 0x45, 0x82, 0x47, 0x1e, 0x78, 0x81,
0x26, 0xb1, 0x17, 0x89, 0x93, 0x5f, 0x10, 0x2d, 0x82, 0xc0, 0x01, 0x12, 0xc0, 0x08, 0x1c, 0x22, 0xf6, 0x01, 0x0a, 0x7f, 0x01, 0x79, 0x40, 0xa8, 0x48, 0x20, 0x55, 0xa8, 0x58, 0xc4, 0x15, 0xfd,
0xa2, 0x11, 0xff, 0x81, 0xc4, 0x1b, 0xad, 0x82, 0xaa, 0xae, 0x7e, 0x77, 0x53, 0x9a, 0xa1, 0x34, 0x07, 0xa0, 0x2f, 0x79, 0x42, 0xf7, 0xce, 0x9d, 0xef, 0x19, 0x27, 0xbb, 0x4e, 0x56, 0x48, 0xbc,
0x08, 0x90, 0x1d, 0xa7, 0xea, 0x9c, 0xef, 0x3c, 0xea, 0xd4, 0xa9, 0x53, 0x75, 0x9a, 0xf0, 0xd2, 0xed, 0xdc, 0x7b, 0xce, 0xef, 0x7c, 0xdc, 0x73, 0xcf, 0x3d, 0xf7, 0x63, 0xe1, 0x85, 0xeb, 0xcf,
0x8d, 0xe7, 0x9c, 0x9a, 0x6a, 0x2e, 0xdc, 0x70, 0x37, 0x89, 0x6d, 0x10, 0x4a, 0x9c, 0x05, 0xeb, 0x38, 0x55, 0xd5, 0x5c, 0xb8, 0xee, 0x6e, 0x12, 0xdb, 0x20, 0x94, 0x38, 0x0b, 0xd6, 0xf5, 0xce,
0x46, 0x77, 0x41, 0xb1, 0x54, 0x67, 0x81, 0xec, 0x52, 0x62, 0x38, 0xaa, 0x69, 0x38, 0x0b, 0x3b, 0x82, 0x62, 0xa9, 0xce, 0x02, 0xd9, 0xa5, 0xc4, 0x70, 0x54, 0xd3, 0x70, 0x16, 0x76, 0x9e, 0xdc,
0x4f, 0x6f, 0x12, 0xaa, 0x3c, 0xbd, 0xd0, 0x25, 0x06, 0xb1, 0x15, 0x4a, 0x3a, 0x35, 0xcb, 0x36, 0x24, 0x54, 0x79, 0x72, 0xa1, 0x43, 0x0c, 0x62, 0x2b, 0x94, 0xb4, 0xab, 0x96, 0x6d, 0x52, 0x13,
0xa9, 0x89, 0x9e, 0xf2, 0xd8, 0x6b, 0x21, 0x7b, 0xcd, 0xba, 0xd1, 0xad, 0x31, 0xf6, 0x5a, 0xc8, 0x3d, 0xe1, 0xb1, 0x57, 0x43, 0xf6, 0xaa, 0x75, 0xbd, 0x53, 0x65, 0xec, 0xd5, 0x90, 0xbd, 0x2a,
0x5e, 0x13, 0xec, 0xb3, 0x4f, 0x75, 0x55, 0xba, 0xed, 0x6e, 0xd6, 0xda, 0xa6, 0xbe, 0xd0, 0x35, 0xd8, 0x67, 0x9f, 0xe8, 0xa8, 0x74, 0xdb, 0xdd, 0xac, 0xb6, 0x4c, 0x7d, 0xa1, 0x63, 0x76, 0xcc,
0xbb, 0xe6, 0x02, 0x47, 0xd9, 0x74, 0xb7, 0xf8, 0x2f, 0xfe, 0x83, 0xff, 0xe5, 0xa1, 0xcf, 0xfe, 0x05, 0x8e, 0xb2, 0xe9, 0x6e, 0xf1, 0x2f, 0xfe, 0xc1, 0x7f, 0x79, 0xe8, 0xb3, 0x5f, 0x17, 0xca,
0xbf, 0x50, 0x4e, 0xb1, 0x54, 0x5d, 0x69, 0x6f, 0xab, 0x06, 0xb1, 0x7b, 0xbe, 0x7a, 0x0b, 0x36, 0x29, 0x96, 0xaa, 0x2b, 0xad, 0x6d, 0xd5, 0x20, 0x76, 0xd7, 0x57, 0x6f, 0xc1, 0x26, 0x8e, 0xe9,
0x71, 0x4c, 0xd7, 0x6e, 0x93, 0xa4, 0x4e, 0x07, 0x72, 0x39, 0x0b, 0x3a, 0xa1, 0xca, 0xc2, 0x4e, 0xda, 0x2d, 0x92, 0xd4, 0xe9, 0x40, 0x2e, 0x67, 0x41, 0x27, 0x54, 0x59, 0xd8, 0x49, 0x59, 0x32,
0xca, 0x92, 0xd9, 0x85, 0x3c, 0x2e, 0xdb, 0x35, 0xa8, 0xaa, 0xa7, 0xc5, 0x3c, 0x7b, 0x27, 0x06, 0xbb, 0x90, 0xc7, 0x65, 0xbb, 0x06, 0x55, 0xf5, 0xb4, 0x98, 0xa7, 0x6f, 0xc7, 0xe0, 0xb4, 0xb6,
0xa7, 0xbd, 0x4d, 0x74, 0x25, 0xc5, 0xf7, 0x4c, 0x1e, 0x9f, 0x4b, 0x55, 0x6d, 0x41, 0x35, 0xa8, 0x89, 0xae, 0xa4, 0xf8, 0x9e, 0xca, 0xe3, 0x73, 0xa9, 0xaa, 0x2d, 0xa8, 0x06, 0x75, 0xa8, 0x9d,
0x43, 0xed, 0x14, 0xd3, 0x93, 0xb9, 0xcb, 0x94, 0x65, 0xcb, 0xf3, 0x07, 0x2c, 0xaa, 0x65, 0x6a, 0x62, 0x7a, 0x3c, 0x77, 0x98, 0xb2, 0x6c, 0x79, 0xf6, 0x80, 0x41, 0xb5, 0x4c, 0x4d, 0x6d, 0x75,
0x6a, 0xbb, 0x97, 0xb7, 0xa0, 0x72, 0x0d, 0x60, 0xb1, 0xb1, 0x72, 0x95, 0xd8, 0x6c, 0xe1, 0xd0, 0xf3, 0x06, 0x54, 0xae, 0x02, 0x2c, 0xd6, 0x57, 0xae, 0x10, 0x9b, 0x0d, 0x1c, 0x3a, 0x09, 0xc3,
0x29, 0x28, 0x19, 0x8a, 0x4e, 0xaa, 0xd2, 0x29, 0xe9, 0xf4, 0x68, 0xfd, 0xd8, 0xcd, 0xbd, 0xf9, 0x86, 0xa2, 0x93, 0x8a, 0x74, 0x52, 0x3a, 0x35, 0x5a, 0x3b, 0x76, 0x63, 0x6f, 0xfe, 0xc8, 0xfe,
0x23, 0xfb, 0x7b, 0xf3, 0xa5, 0x75, 0x45, 0x27, 0x98, 0xcf, 0xc8, 0x3f, 0x96, 0xe0, 0xc1, 0x25, 0xde, 0xfc, 0xf0, 0xba, 0xa2, 0x13, 0xcc, 0x7b, 0xe4, 0x9f, 0x49, 0x70, 0xff, 0x92, 0xeb, 0x50,
0xd7, 0xa1, 0xa6, 0xbe, 0x46, 0xa8, 0xad, 0xb6, 0x97, 0x5c, 0xdb, 0x26, 0x06, 0x6d, 0x52, 0x85, 0x53, 0x5f, 0x23, 0xd4, 0x56, 0x5b, 0x4b, 0xae, 0x6d, 0x13, 0x83, 0x36, 0xa8, 0x42, 0x5d, 0xe7,
0xba, 0xce, 0x9d, 0xf9, 0xd1, 0x35, 0x28, 0xef, 0x28, 0x9a, 0x4b, 0xaa, 0x85, 0x53, 0xd2, 0xe9, 0xf6, 0xfc, 0xe8, 0x2a, 0x14, 0x77, 0x14, 0xcd, 0x25, 0x95, 0xa1, 0x93, 0xd2, 0xa9, 0xf2, 0xe9,
0xb1, 0x33, 0xb5, 0x9a, 0x08, 0xa8, 0xa8, 0x77, 0xfc, 0x90, 0xaa, 0xf9, 0x4b, 0x5e, 0x7b, 0xd5, 0x6a, 0x55, 0x04, 0x54, 0xd4, 0x3b, 0x7e, 0x48, 0x55, 0xfd, 0x21, 0xaf, 0xbe, 0xec, 0x2a, 0x06,
0x55, 0x0c, 0xaa, 0xd2, 0x5e, 0xfd, 0x84, 0x80, 0x3c, 0x26, 0xe4, 0x5e, 0x65, 0x58, 0xd8, 0x83, 0x55, 0x69, 0xb7, 0x36, 0x2d, 0x20, 0x8f, 0x09, 0xb9, 0x57, 0x18, 0x16, 0xf6, 0x20, 0xe5, 0x1f,
0x94, 0xbf, 0x2f, 0xc1, 0x23, 0xb9, 0xba, 0xad, 0xaa, 0x0e, 0x45, 0x3a, 0x94, 0x55, 0x4a, 0x74, 0x49, 0xf0, 0x50, 0xae, 0x6e, 0xab, 0xaa, 0x43, 0x91, 0x0e, 0x45, 0x95, 0x12, 0xdd, 0xa9, 0x48,
0xa7, 0x2a, 0x9d, 0x2a, 0x9e, 0x1e, 0x3b, 0x73, 0xb9, 0xd6, 0x57, 0x38, 0xd7, 0x72, 0xc1, 0xeb, 0x27, 0x0b, 0xa7, 0xca, 0xa7, 0x2f, 0x55, 0x7b, 0x0a, 0xe7, 0x6a, 0x2e, 0x78, 0x6d, 0x4c, 0xe8,
0xe3, 0x42, 0xaf, 0xf2, 0x0a, 0x83, 0xc7, 0x9e, 0x14, 0xf9, 0x87, 0x12, 0xa0, 0x28, 0x4f, 0x4b, 0x55, 0x5c, 0x61, 0xf0, 0xd8, 0x93, 0x22, 0xff, 0x44, 0x02, 0x14, 0xe5, 0x69, 0x2a, 0x76, 0x87,
0xb1, 0xbb, 0x84, 0xde, 0x85, 0x97, 0x5e, 0x3b, 0x9c, 0x97, 0xa6, 0x05, 0xe4, 0x98, 0x27, 0x30, 0xd0, 0x3b, 0xf0, 0xd2, 0x2b, 0x87, 0xf3, 0xd2, 0x94, 0x80, 0x2c, 0x7b, 0x02, 0x63, 0x4e, 0x7a,
0xe6, 0xa4, 0xf7, 0x25, 0x98, 0x49, 0xeb, 0xc4, 0xbd, 0xb3, 0x15, 0xf7, 0xce, 0xe2, 0x21, 0xbc, 0x57, 0x82, 0x99, 0xb4, 0x4e, 0xdc, 0x3b, 0x5b, 0x71, 0xef, 0x2c, 0x1e, 0xc2, 0x3b, 0x1e, 0x6a,
0xe3, 0xa1, 0xe6, 0xb8, 0xe5, 0x57, 0x05, 0x18, 0x5d, 0x56, 0x88, 0x6e, 0x1a, 0x4d, 0x42, 0xd1, 0x8e, 0x5b, 0x7e, 0x3b, 0x04, 0xa3, 0xcb, 0x0a, 0xd1, 0x4d, 0xa3, 0x41, 0x28, 0xfa, 0x36, 0x94,
0x37, 0xa1, 0xc2, 0xf6, 0x68, 0x47, 0xa1, 0x0a, 0xf7, 0xc8, 0xd8, 0x99, 0xff, 0x3b, 0xc8, 0x5c, 0xd8, 0x1c, 0x6d, 0x2b, 0x54, 0xe1, 0x1e, 0x29, 0x9f, 0xfe, 0xda, 0x41, 0xe6, 0x3a, 0x55, 0x46,
0xa7, 0xc6, 0xa8, 0x6b, 0x3b, 0x4f, 0xd7, 0xae, 0x6c, 0x5e, 0x27, 0x6d, 0xba, 0x46, 0xa8, 0x52, 0x5d, 0xdd, 0x79, 0xb2, 0x7a, 0x79, 0xf3, 0x1a, 0x69, 0xd1, 0x35, 0x42, 0x95, 0x1a, 0x12, 0x72,
0x47, 0x42, 0x0e, 0x84, 0x63, 0x38, 0x40, 0x45, 0x6f, 0x41, 0xc9, 0xb1, 0x48, 0x5b, 0x38, 0xf3, 0x20, 0x6c, 0xc3, 0x01, 0x2a, 0x7a, 0x03, 0x86, 0x1d, 0x8b, 0xb4, 0x84, 0x33, 0x9f, 0xef, 0xd1,
0xc5, 0x3e, 0xcd, 0x0a, 0x34, 0x6d, 0x5a, 0xa4, 0x1d, 0xae, 0x16, 0xfb, 0x85, 0x39, 0x2e, 0xda, 0xac, 0x40, 0xd3, 0x86, 0x45, 0x5a, 0xe1, 0x68, 0xb1, 0x2f, 0xcc, 0x71, 0xd1, 0x16, 0x1c, 0x75,
0x82, 0xa3, 0x0e, 0x0f, 0x83, 0x6a, 0x91, 0x4b, 0x38, 0x3f, 0xb0, 0x04, 0x2f, 0x98, 0x26, 0x84, 0x78, 0x18, 0x54, 0x0a, 0x5c, 0xc2, 0xb9, 0xbe, 0x25, 0x78, 0xc1, 0x34, 0x2e, 0x64, 0x1c, 0xf5,
0x8c, 0xa3, 0xde, 0x6f, 0x2c, 0xd0, 0xe5, 0xdf, 0x4b, 0x30, 0x1e, 0xd0, 0xf2, 0x15, 0x7b, 0x23, 0xbe, 0xb1, 0x40, 0x97, 0xff, 0x24, 0xc1, 0x58, 0x40, 0xcb, 0x47, 0xec, 0xb5, 0x94, 0xef, 0xaa,
0xe5, 0xbb, 0xda, 0xdd, 0xf9, 0x8e, 0x71, 0x73, 0xcf, 0x1d, 0x17, 0xb2, 0x2a, 0xfe, 0x48, 0xc4, 0x77, 0xe6, 0x3b, 0xc6, 0xcd, 0x3d, 0x77, 0x5c, 0xc8, 0x2a, 0xf9, 0x2d, 0x11, 0xbf, 0xbd, 0xee,
0x6f, 0x6f, 0xfa, 0xf1, 0x50, 0xe0, 0xf1, 0xf0, 0xdc, 0xa0, 0x66, 0xe5, 0x84, 0xc1, 0x17, 0xc5, 0xc7, 0xc3, 0x10, 0x8f, 0x87, 0x67, 0xfa, 0x35, 0x2b, 0x27, 0x0c, 0x3e, 0x2b, 0x44, 0xcc, 0x61,
0x88, 0x39, 0xcc, 0x9d, 0xe8, 0x4d, 0xa8, 0x38, 0x44, 0x23, 0x6d, 0x6a, 0xda, 0xc2, 0x9c, 0x67, 0xee, 0x44, 0xaf, 0x43, 0xc9, 0x21, 0x1a, 0x69, 0x51, 0xd3, 0x16, 0xe6, 0x3c, 0x75, 0x87, 0xe6,
0xee, 0xd2, 0x1c, 0x65, 0x93, 0x68, 0x4d, 0xc1, 0x5a, 0x3f, 0xc6, 0xec, 0xf1, 0x7f, 0xe1, 0x00, 0x28, 0x9b, 0x44, 0x6b, 0x08, 0xd6, 0xda, 0x31, 0x66, 0x8f, 0xff, 0x85, 0x03, 0x48, 0xf4, 0x2a,
0x12, 0xbd, 0x0e, 0x15, 0x4a, 0x74, 0x4b, 0x53, 0xa8, 0xbf, 0xb1, 0x9e, 0xca, 0x37, 0x89, 0xc1, 0x94, 0x28, 0xd1, 0x2d, 0x4d, 0xa1, 0xfe, 0xc4, 0x7a, 0x22, 0xdf, 0x24, 0x06, 0x5b, 0x37, 0xdb,
0x36, 0xcc, 0x4e, 0x4b, 0x30, 0xf0, 0xc5, 0x0f, 0x9c, 0xe5, 0x8f, 0xe2, 0x00, 0x10, 0x7d, 0x20, 0x4d, 0xc1, 0xc0, 0x07, 0x3f, 0x70, 0x96, 0xdf, 0x8a, 0x03, 0x40, 0xf4, 0x9e, 0x04, 0xe3, 0xae,
0xc1, 0x84, 0x6b, 0x75, 0x18, 0x29, 0x65, 0x09, 0xb6, 0xdb, 0x13, 0xd1, 0x70, 0x71, 0x50, 0xb7, 0xd5, 0x66, 0xa4, 0x94, 0x25, 0xd8, 0x4e, 0x57, 0x44, 0xc3, 0x85, 0x7e, 0xdd, 0xb6, 0x11, 0x43,
0x6d, 0xc4, 0xd0, 0xea, 0x33, 0x42, 0xf8, 0x44, 0x7c, 0x1c, 0x27, 0xa4, 0xa2, 0x45, 0x98, 0xd4, 0xab, 0xcd, 0x08, 0xe1, 0xe3, 0xf1, 0x76, 0x9c, 0x90, 0x8a, 0x16, 0x61, 0x42, 0x57, 0x0d, 0x4c,
0x55, 0x03, 0x13, 0xa5, 0xd3, 0x6b, 0x92, 0xb6, 0x69, 0x74, 0x9c, 0x6a, 0xe9, 0x94, 0x74, 0xba, 0x94, 0x76, 0xb7, 0x41, 0x5a, 0xa6, 0xd1, 0x76, 0x2a, 0xc3, 0x27, 0xa5, 0x53, 0xc5, 0xda, 0x09,
0x5c, 0x3f, 0x29, 0x00, 0x26, 0xd7, 0xe2, 0xd3, 0x38, 0x49, 0x8f, 0xbe, 0x0e, 0xc8, 0xb7, 0xeb, 0x01, 0x30, 0xb1, 0x16, 0xef, 0xc6, 0x49, 0x7a, 0xf4, 0x4d, 0x40, 0xbe, 0x5d, 0x17, 0xbd, 0xf5,
0x92, 0x77, 0x5e, 0xa8, 0xa6, 0x51, 0x2d, 0x9f, 0x92, 0x4e, 0x17, 0xeb, 0xb3, 0x02, 0x05, 0xb5, 0x42, 0x35, 0x8d, 0x4a, 0xf1, 0xa4, 0x74, 0xaa, 0x50, 0x9b, 0x15, 0x28, 0xa8, 0x99, 0xa2, 0xc0,
0x52, 0x14, 0x38, 0x83, 0x4b, 0xfe, 0x67, 0x09, 0x26, 0x13, 0x01, 0x8e, 0xae, 0xc2, 0x4c, 0xdb, 0x19, 0x5c, 0xf2, 0x7f, 0x86, 0x61, 0x22, 0x11, 0xe0, 0xe8, 0x0a, 0xcc, 0xb4, 0xbc, 0xf4, 0xb9,
0x4b, 0x9f, 0xeb, 0xae, 0xbe, 0x49, 0xec, 0x66, 0x7b, 0x9b, 0x74, 0x5c, 0x8d, 0x74, 0xf8, 0xaa, 0xee, 0xea, 0x9b, 0xc4, 0x6e, 0xb4, 0xb6, 0x49, 0xdb, 0xd5, 0x48, 0x9b, 0x8f, 0x7a, 0xb1, 0x36,
0x97, 0xeb, 0x73, 0x42, 0xc6, 0xcc, 0x52, 0x26, 0x15, 0xce, 0xe1, 0x66, 0x7a, 0x1b, 0x7c, 0x68, 0x27, 0x64, 0xcc, 0x2c, 0x65, 0x52, 0xe1, 0x1c, 0x6e, 0xa6, 0xb7, 0xc1, 0x9b, 0xd6, 0x54, 0xc7,
0x4d, 0x75, 0x9c, 0x00, 0xb3, 0xc0, 0x31, 0x03, 0xbd, 0xd7, 0x53, 0x14, 0x38, 0x83, 0x8b, 0xe9, 0x09, 0x30, 0x87, 0x38, 0x66, 0xa0, 0xf7, 0x7a, 0x8a, 0x02, 0x67, 0x70, 0x31, 0x1d, 0xdb, 0xc4,
0xd8, 0x21, 0x8e, 0x6a, 0x93, 0x4e, 0x52, 0xc7, 0x62, 0x5c, 0xc7, 0xe5, 0x4c, 0x2a, 0x9c, 0xc3, 0x51, 0x6d, 0xd2, 0x4e, 0xea, 0x58, 0x88, 0xeb, 0xb8, 0x9c, 0x49, 0x85, 0x73, 0xb8, 0xd1, 0x19,
0x8d, 0xce, 0xc2, 0x98, 0x27, 0x8d, 0x7b, 0x5c, 0x2c, 0x4d, 0x90, 0xb0, 0xd7, 0xc3, 0x29, 0x1c, 0x28, 0x7b, 0xd2, 0xb8, 0xc7, 0xc5, 0xd0, 0x04, 0x09, 0x7b, 0x3d, 0xec, 0xc2, 0x51, 0x3a, 0x66,
0xa5, 0x63, 0xa6, 0x99, 0x9b, 0x0e, 0xb1, 0x77, 0x48, 0x27, 0x7f, 0x49, 0xae, 0xa4, 0x28, 0x70, 0x9a, 0xb9, 0xe9, 0x10, 0x7b, 0x87, 0xb4, 0xf3, 0x87, 0xe4, 0x72, 0x8a, 0x02, 0x67, 0x70, 0x31,
0x06, 0x17, 0x33, 0xcd, 0x8b, 0x99, 0x94, 0x69, 0x47, 0xe3, 0xa6, 0x6d, 0x64, 0x52, 0xe1, 0x1c, 0xd3, 0xbc, 0x98, 0x49, 0x99, 0x76, 0x34, 0x6e, 0xda, 0x46, 0x26, 0x15, 0xce, 0xe1, 0x66, 0x91,
0x6e, 0x16, 0x79, 0x9e, 0xca, 0x8b, 0x3b, 0x8a, 0xaa, 0x29, 0x9b, 0x1a, 0xa9, 0x8e, 0xc4, 0x23, 0xe7, 0xa9, 0xbc, 0xb8, 0xa3, 0xa8, 0x9a, 0xb2, 0xa9, 0x91, 0xca, 0x48, 0x3c, 0xf2, 0xd6, 0xe3,
0x6f, 0x3d, 0x3e, 0x8d, 0x93, 0xf4, 0xe8, 0x12, 0x4c, 0x79, 0x43, 0x1b, 0x86, 0x12, 0x80, 0x54, 0xdd, 0x38, 0x49, 0x8f, 0x2e, 0xc2, 0xa4, 0xd7, 0xb4, 0x61, 0x28, 0x01, 0x48, 0x89, 0x83, 0xdc,
0x38, 0xc8, 0x83, 0x02, 0x64, 0x6a, 0x3d, 0x49, 0x80, 0xd3, 0x3c, 0xf2, 0x5f, 0x24, 0x38, 0x99, 0x2f, 0x40, 0x26, 0xd7, 0x93, 0x04, 0x38, 0xcd, 0x23, 0xff, 0x5d, 0x82, 0x13, 0x39, 0x33, 0x09,
0xb3, 0x93, 0xd0, 0xcb, 0x50, 0xa2, 0x3d, 0xcb, 0x3f, 0x7f, 0xff, 0xd7, 0xcf, 0xe8, 0xad, 0x9e, 0xbd, 0x08, 0xc3, 0xb4, 0x6b, 0xf9, 0xeb, 0xef, 0x57, 0xfd, 0x8c, 0xde, 0xec, 0x5a, 0xe4, 0xd6,
0x45, 0x6e, 0xef, 0xcd, 0x3f, 0x94, 0xc3, 0xc6, 0xa6, 0x31, 0x67, 0x44, 0xdf, 0x86, 0x71, 0xdb, 0xde, 0xfc, 0x03, 0x39, 0x6c, 0xac, 0x1b, 0x73, 0x46, 0xf4, 0x5d, 0x18, 0xb3, 0x4d, 0x4d, 0x53,
0xd4, 0x34, 0xd5, 0xe8, 0x7a, 0x24, 0x22, 0x9b, 0x5c, 0xe8, 0x73, 0xa7, 0xe3, 0x28, 0x46, 0x98, 0x8d, 0x8e, 0x47, 0x22, 0xb2, 0xc9, 0xf9, 0x1e, 0x67, 0x3a, 0x8e, 0x62, 0x84, 0xd9, 0x72, 0x72,
0x2d, 0xa7, 0xf6, 0xf7, 0xe6, 0xc7, 0x63, 0x73, 0x38, 0x2e, 0x4e, 0xfe, 0x4d, 0x01, 0x60, 0x99, 0x7f, 0x6f, 0x7e, 0x2c, 0xd6, 0x87, 0xe3, 0xe2, 0xe4, 0xdf, 0x0f, 0x01, 0x2c, 0x13, 0x4b, 0x33,
0x58, 0x9a, 0xd9, 0xd3, 0x89, 0x31, 0x8c, 0x13, 0xf4, 0xed, 0xd8, 0x09, 0xfa, 0x52, 0xbf, 0x19, 0xbb, 0x3a, 0x31, 0x06, 0xb1, 0x82, 0xbe, 0x19, 0x5b, 0x41, 0x5f, 0xe8, 0x35, 0xa3, 0x05, 0xaa,
0x2d, 0x50, 0x35, 0xf7, 0x08, 0xed, 0x26, 0x8e, 0xd0, 0x97, 0x07, 0x17, 0x71, 0xf0, 0x19, 0x7a, 0xe6, 0x2e, 0xa1, 0x9d, 0xc4, 0x12, 0xfa, 0x62, 0xff, 0x22, 0x0e, 0x5e, 0x43, 0x6f, 0x16, 0x60,
0xab, 0x08, 0xd3, 0x21, 0xf1, 0x92, 0x69, 0x74, 0x54, 0xbe, 0x27, 0x5e, 0x88, 0xc5, 0xc4, 0xe3, 0x2a, 0x24, 0x5e, 0x32, 0x8d, 0xb6, 0xca, 0xe7, 0xc4, 0x73, 0xb1, 0x98, 0x78, 0x34, 0x11, 0x13,
0x89, 0x98, 0x38, 0x99, 0xc1, 0x12, 0x89, 0x87, 0xab, 0x81, 0xf6, 0x05, 0xce, 0x7e, 0x3e, 0x2e, 0x27, 0x32, 0x58, 0x22, 0xf1, 0x70, 0x25, 0xd0, 0x7e, 0x88, 0xb3, 0x9f, 0x8b, 0x0b, 0xbf, 0xb5,
0xfc, 0xf6, 0xde, 0xfc, 0x81, 0xf5, 0x7c, 0x2d, 0xc0, 0x8c, 0x2b, 0x8b, 0x1e, 0x83, 0xa3, 0x36, 0x37, 0x7f, 0x60, 0x3d, 0x5f, 0x0d, 0x30, 0xe3, 0xca, 0xa2, 0x47, 0xe0, 0xa8, 0x4d, 0x14, 0xc7,
0x51, 0x1c, 0xd3, 0xe0, 0x69, 0x62, 0x34, 0x34, 0x0a, 0xf3, 0x51, 0x2c, 0x66, 0xd1, 0x13, 0x30, 0x34, 0x78, 0x9a, 0x18, 0x0d, 0x8d, 0xc2, 0xbc, 0x15, 0x8b, 0x5e, 0xf4, 0x18, 0x8c, 0xe8, 0xc4,
0xa2, 0x13, 0xc7, 0x51, 0xba, 0x84, 0x67, 0x84, 0xd1, 0xfa, 0xa4, 0x20, 0x1c, 0x59, 0xf3, 0x86, 0x71, 0x94, 0x0e, 0xe1, 0x19, 0x61, 0xb4, 0x36, 0x21, 0x08, 0x47, 0xd6, 0xbc, 0x66, 0xec, 0xf7,
0xb1, 0x3f, 0x8f, 0xae, 0xc3, 0x84, 0xa6, 0x38, 0x22, 0xb4, 0x5b, 0xaa, 0x4e, 0xf8, 0x9e, 0x1f, 0xa3, 0x6b, 0x30, 0xae, 0x29, 0x8e, 0x08, 0xed, 0xa6, 0xaa, 0x13, 0x3e, 0xe7, 0xcb, 0xa7, 0xbf,
0x3b, 0xf3, 0x3f, 0x77, 0x17, 0x31, 0x8c, 0x23, 0x3c, 0x89, 0x56, 0x63, 0x48, 0x38, 0x81, 0x8c, 0x72, 0x67, 0x11, 0xc3, 0x38, 0xc2, 0x95, 0x68, 0x35, 0x86, 0x84, 0x13, 0xc8, 0x68, 0x07, 0x10,
0x76, 0x00, 0xb1, 0x91, 0x96, 0xad, 0x18, 0x8e, 0xe7, 0x32, 0x26, 0x6f, 0xa4, 0x6f, 0x79, 0x41, 0x6b, 0x69, 0xda, 0x8a, 0xe1, 0x78, 0x2e, 0x63, 0xf2, 0x46, 0x7a, 0x96, 0x17, 0xe4, 0xb7, 0xd5,
0x7e, 0x5b, 0x4d, 0xa1, 0xe1, 0x0c, 0x09, 0xf2, 0x1f, 0x24, 0x98, 0x08, 0x17, 0x6c, 0x08, 0x85, 0x14, 0x1a, 0xce, 0x90, 0x20, 0xff, 0x59, 0x82, 0xf1, 0x70, 0xc0, 0x06, 0x50, 0x28, 0xbd, 0x11,
0xd2, 0x5b, 0xf1, 0x42, 0xe9, 0xf9, 0x81, 0x83, 0x37, 0xa7, 0x52, 0xfa, 0xb0, 0x08, 0x28, 0x24, 0x2f, 0x94, 0x9e, 0xed, 0x3b, 0x78, 0x73, 0x2a, 0xa5, 0xf7, 0x0b, 0x80, 0x42, 0x22, 0x96, 0x1a,
0x62, 0xa9, 0x61, 0x53, 0x69, 0xdf, 0xb8, 0x8b, 0x7b, 0xc4, 0xcf, 0x24, 0x40, 0x22, 0x59, 0x2f, 0x36, 0x95, 0xd6, 0xf5, 0x3b, 0xd8, 0x47, 0xfc, 0x52, 0x02, 0x24, 0x92, 0xf5, 0xa2, 0x61, 0x98,
0x1a, 0x86, 0x49, 0x79, 0xfe, 0xf7, 0xd5, 0x7c, 0x6d, 0x60, 0x35, 0x7d, 0x0d, 0x6a, 0x1b, 0x29, 0x94, 0xe7, 0x7f, 0x5f, 0xcd, 0x57, 0xfa, 0x56, 0xd3, 0xd7, 0xa0, 0xba, 0x91, 0xc2, 0x3e, 0x6f,
0xec, 0x0b, 0x06, 0xb5, 0x7b, 0xe1, 0x8a, 0xa5, 0x09, 0x70, 0x86, 0x42, 0xe8, 0x1d, 0x00, 0x5b, 0x50, 0xbb, 0x1b, 0x8e, 0x58, 0x9a, 0x00, 0x67, 0x28, 0x84, 0xde, 0x02, 0xb0, 0x05, 0x66, 0xd3,
0x60, 0xb6, 0x4c, 0x91, 0x02, 0x5e, 0x1a, 0x20, 0x9b, 0x32, 0x80, 0x25, 0xd3, 0xd8, 0x52, 0xbb, 0x14, 0x29, 0xe0, 0x85, 0x3e, 0xb2, 0x29, 0x03, 0x58, 0x32, 0x8d, 0x2d, 0xb5, 0x13, 0x26, 0x34,
0x61, 0x42, 0xc3, 0x01, 0x30, 0x8e, 0x08, 0x99, 0xbd, 0x00, 0x27, 0x73, 0xb4, 0x47, 0xc7, 0xa1, 0x1c, 0x00, 0xe3, 0x88, 0x90, 0xd9, 0xf3, 0x70, 0x22, 0x47, 0x7b, 0x74, 0x1c, 0x0a, 0xd7, 0x49,
0x78, 0x83, 0xf4, 0x3c, 0xb7, 0x62, 0xf6, 0x27, 0x3a, 0x11, 0xbd, 0x8f, 0x8d, 0x8a, 0xab, 0xd4, 0xd7, 0x73, 0x2b, 0x66, 0x3f, 0xd1, 0x74, 0x74, 0x3f, 0x36, 0x2a, 0xb6, 0x52, 0x67, 0x87, 0x9e,
0xb9, 0xc2, 0x73, 0x92, 0xfc, 0x65, 0x39, 0x1a, 0x6b, 0xbc, 0x8a, 0x3d, 0x0d, 0x15, 0x9b, 0x58, 0x91, 0xe4, 0xcf, 0x8b, 0xd1, 0x58, 0xe3, 0x55, 0xec, 0x29, 0x28, 0xd9, 0xc4, 0xd2, 0xd4, 0x96,
0x9a, 0xda, 0x56, 0x1c, 0x51, 0xcf, 0xf0, 0x82, 0x14, 0x8b, 0x31, 0x1c, 0xcc, 0xc6, 0xea, 0xdd, 0xe2, 0x88, 0x7a, 0x86, 0x17, 0xa4, 0x58, 0xb4, 0xe1, 0xa0, 0x37, 0x56, 0xef, 0x0e, 0xdd, 0xdb,
0xc2, 0xfd, 0xad, 0x77, 0x8b, 0xf7, 0xba, 0xde, 0x35, 0xa1, 0xe2, 0xf8, 0x85, 0x6e, 0x89, 0x83, 0x7a, 0xb7, 0x70, 0xb7, 0xeb, 0x5d, 0x13, 0x4a, 0x8e, 0x5f, 0xe8, 0x0e, 0x73, 0xf0, 0xc5, 0x43,
0x2f, 0x1e, 0x22, 0x67, 0x8b, 0x1a, 0x37, 0x10, 0x18, 0x54, 0xb7, 0x81, 0x90, 0xac, 0xba, 0xb6, 0xe4, 0x6c, 0x51, 0xe3, 0x06, 0x02, 0x83, 0xea, 0x36, 0x10, 0x92, 0x55, 0xd7, 0x16, 0x7b, 0xac,
0xdc, 0x67, 0x5d, 0xbb, 0x0a, 0x27, 0x6c, 0xb2, 0xa3, 0x32, 0x35, 0x2e, 0xab, 0x0e, 0x35, 0xed, 0x6b, 0x57, 0x61, 0xda, 0x26, 0x3b, 0x2a, 0x53, 0xe3, 0x92, 0xea, 0x50, 0xd3, 0xee, 0xae, 0xaa,
0xde, 0xaa, 0xaa, 0xab, 0x54, 0x94, 0x3d, 0xd5, 0xfd, 0xbd, 0xf9, 0x13, 0x38, 0x63, 0x1e, 0x67, 0xba, 0x4a, 0x45, 0xd9, 0x53, 0xd9, 0xdf, 0x9b, 0x9f, 0xc6, 0x19, 0xfd, 0x38, 0x93, 0x8b, 0x65,
0x72, 0xb1, 0xec, 0x6c, 0x29, 0xae, 0x43, 0x3a, 0x3c, 0xa5, 0x55, 0xc2, 0xec, 0xdc, 0xe0, 0xa3, 0x67, 0x4b, 0x71, 0x1d, 0xd2, 0xe6, 0x29, 0xad, 0x14, 0x66, 0xe7, 0x3a, 0x6f, 0xc5, 0xa2, 0x17,
0x58, 0xcc, 0x22, 0x3d, 0x16, 0xdc, 0x95, 0x7b, 0x11, 0xdc, 0x13, 0xf9, 0x81, 0x8d, 0x36, 0xe0, 0xe9, 0xb1, 0xe0, 0x2e, 0xdd, 0x8d, 0xe0, 0x1e, 0xcf, 0x0f, 0x6c, 0xb4, 0x01, 0x27, 0x2c, 0xdb,
0xa4, 0x65, 0x9b, 0x5d, 0x9b, 0x38, 0xce, 0x32, 0x51, 0x3a, 0x9a, 0x6a, 0x10, 0xdf, 0x5f, 0xa3, 0xec, 0xd8, 0xc4, 0x71, 0x96, 0x89, 0xd2, 0xd6, 0x54, 0x83, 0xf8, 0xfe, 0x1a, 0xe5, 0x76, 0x3e,
0xdc, 0xce, 0x87, 0xf6, 0xf7, 0xe6, 0x4f, 0x36, 0xb2, 0x49, 0x70, 0x1e, 0xaf, 0xfc, 0x59, 0x09, 0xb0, 0xbf, 0x37, 0x7f, 0xa2, 0x9e, 0x4d, 0x82, 0xf3, 0x78, 0xe5, 0x4f, 0x86, 0xe1, 0x78, 0x72,
0x8e, 0x27, 0x4f, 0xd9, 0x9c, 0xaa, 0x54, 0x1a, 0xa8, 0x2a, 0x7d, 0x32, 0xb2, 0x6d, 0xbc, 0x92, 0x95, 0xcd, 0xa9, 0x4a, 0xa5, 0xbe, 0xaa, 0xd2, 0xc7, 0x23, 0xd3, 0xc6, 0x2b, 0xd9, 0x83, 0x68,
0x3d, 0x88, 0x86, 0x8c, 0xad, 0xb3, 0x08, 0x93, 0x22, 0x8f, 0xf8, 0x93, 0xa2, 0x2e, 0x0f, 0xa2, 0xc8, 0x98, 0x3a, 0x8b, 0x30, 0x21, 0xf2, 0x88, 0xdf, 0x29, 0xea, 0xf2, 0x20, 0x1a, 0x36, 0xe2,
0x61, 0x23, 0x3e, 0x8d, 0x93, 0xf4, 0xac, 0xd6, 0x0c, 0x4b, 0x48, 0x1f, 0xa4, 0x14, 0xaf, 0x35, 0xdd, 0x38, 0x49, 0xcf, 0x6a, 0xcd, 0xb0, 0x84, 0xf4, 0x41, 0x86, 0xe3, 0xb5, 0xe6, 0x62, 0x92,
0x17, 0x93, 0x04, 0x38, 0xcd, 0x83, 0xd6, 0x60, 0xda, 0x35, 0xd2, 0x50, 0x5e, 0x74, 0x3e, 0x24, 0x00, 0xa7, 0x79, 0xd0, 0x1a, 0x4c, 0xb9, 0x46, 0x1a, 0xca, 0x8b, 0xce, 0x07, 0x04, 0xd4, 0xd4,
0xa0, 0xa6, 0x37, 0xd2, 0x24, 0x38, 0x8b, 0x0f, 0xed, 0x00, 0xb4, 0xfd, 0x82, 0xc0, 0xa9, 0x1e, 0x46, 0x9a, 0x04, 0x67, 0xf1, 0xa1, 0x1d, 0x80, 0x96, 0x5f, 0x10, 0x38, 0x95, 0xa3, 0x3c, 0x57,
0xe5, 0xb9, 0xba, 0x3e, 0xf0, 0xde, 0x0a, 0x6a, 0x8b, 0x30, 0x23, 0x06, 0x43, 0x0e, 0x8e, 0x48, 0xd7, 0xfa, 0x9e, 0x5b, 0x41, 0x6d, 0x11, 0x66, 0xc4, 0xa0, 0xc9, 0xc1, 0x11, 0x49, 0xe8, 0x39,
0x42, 0x2f, 0xc0, 0xb8, 0xcd, 0x2f, 0x1e, 0xbe, 0x01, 0x5e, 0xf1, 0xfe, 0x80, 0x60, 0x1b, 0xc7, 0x18, 0xb3, 0xf9, 0xc6, 0xc3, 0x37, 0xc0, 0x2b, 0xde, 0xef, 0x13, 0x6c, 0x63, 0x38, 0xda, 0x89,
0xd1, 0x49, 0x1c, 0xa7, 0x45, 0xe7, 0x60, 0xa2, 0xcd, 0x6a, 0x54, 0xa6, 0xc6, 0x92, 0xe9, 0x1a, 0xe3, 0xb4, 0xe8, 0x2c, 0x8c, 0xb7, 0x58, 0x8d, 0xca, 0xd4, 0x58, 0x32, 0x5d, 0x83, 0xf2, 0x40,
0x94, 0x07, 0x7a, 0xb1, 0x8e, 0x58, 0x9d, 0xb0, 0x14, 0x9b, 0xc1, 0x09, 0x4a, 0xf9, 0x8f, 0x52, 0x2f, 0xd4, 0x10, 0xab, 0x13, 0x96, 0x62, 0x3d, 0x38, 0x41, 0x29, 0xff, 0x45, 0x8a, 0x2e, 0x6f,
0xf4, 0x78, 0x0b, 0xca, 0xf4, 0x73, 0xb1, 0x92, 0xec, 0xb1, 0x44, 0x49, 0x36, 0x93, 0xe6, 0x88, 0x41, 0x99, 0x7e, 0x36, 0x56, 0x92, 0x3d, 0x92, 0x28, 0xc9, 0x66, 0xd2, 0x1c, 0x91, 0x8a, 0xec,
0x54, 0x64, 0xdf, 0xc9, 0xae, 0xd0, 0x2f, 0x1e, 0xaa, 0x42, 0x0f, 0x8f, 0xe9, 0x3b, 0x97, 0xe8, 0x7b, 0xd9, 0x15, 0xfa, 0x85, 0x43, 0x55, 0xe8, 0xe1, 0x32, 0x7d, 0xfb, 0x12, 0xfd, 0x43, 0x09,
0x1f, 0x4b, 0x30, 0x73, 0xb1, 0x79, 0xc9, 0x36, 0x5d, 0xcb, 0x57, 0xef, 0x8a, 0xe5, 0xf9, 0xf9, 0x66, 0x2e, 0x34, 0x2e, 0xda, 0xa6, 0x6b, 0xf9, 0xea, 0x5d, 0xb6, 0x3c, 0x3f, 0x7f, 0x03, 0x86,
0x6b, 0x50, 0xb2, 0x5d, 0xcd, 0xb7, 0xeb, 0xbf, 0x7c, 0xbb, 0xb0, 0xab, 0x31, 0xbb, 0xa6, 0x13, 0x6d, 0x57, 0xf3, 0xed, 0xfa, 0x92, 0x6f, 0x17, 0x76, 0x35, 0x66, 0xd7, 0x54, 0x82, 0xcb, 0x33,
0x5c, 0x9e, 0x51, 0x8c, 0x01, 0xbd, 0x05, 0x47, 0x6d, 0xc5, 0xe8, 0x12, 0xff, 0x00, 0x7f, 0xb6, 0x8a, 0x31, 0xa0, 0x37, 0xe0, 0xa8, 0xad, 0x18, 0x1d, 0xe2, 0x2f, 0xe0, 0x4f, 0xf7, 0x68, 0xcd,
0x4f, 0x6b, 0x56, 0x96, 0x31, 0x63, 0x8f, 0x94, 0x91, 0x1c, 0x0d, 0x0b, 0x54, 0xf9, 0xa7, 0x12, 0xca, 0x32, 0x66, 0xec, 0x91, 0x32, 0x92, 0xa3, 0x61, 0x81, 0x2a, 0xff, 0x42, 0x82, 0x89, 0x4b,
0x4c, 0x5e, 0x6e, 0xb5, 0x1a, 0x2b, 0x06, 0xcf, 0x00, 0x0d, 0x85, 0x6e, 0xb3, 0x1a, 0xc3, 0x52, 0xcd, 0x66, 0x7d, 0xc5, 0xe0, 0x19, 0xa0, 0xae, 0xd0, 0x6d, 0x56, 0x63, 0x58, 0x0a, 0xdd, 0x4e,
0xe8, 0x76, 0xb2, 0xc6, 0x60, 0x73, 0x98, 0xcf, 0xa0, 0x6d, 0x18, 0x61, 0x99, 0x87, 0x18, 0x9d, 0xd6, 0x18, 0xac, 0x0f, 0xf3, 0x1e, 0xb4, 0x0d, 0x23, 0x2c, 0xf3, 0x10, 0xa3, 0xdd, 0xe7, 0xf6,
0x01, 0xaf, 0x07, 0x42, 0x5c, 0xdd, 0x03, 0x09, 0x6b, 0x57, 0x31, 0x80, 0x7d, 0x78, 0xf9, 0x3d, 0x40, 0x88, 0xab, 0x79, 0x20, 0x61, 0xed, 0x2a, 0x1a, 0xb0, 0x0f, 0x2f, 0xbf, 0x03, 0xd3, 0x11,
0x38, 0x11, 0x51, 0x8f, 0xf9, 0x8b, 0xbf, 0x6c, 0xa2, 0x36, 0x94, 0x99, 0x26, 0xfe, 0xbb, 0x65, 0xf5, 0x98, 0xbf, 0xf8, 0xc9, 0x26, 0x6a, 0x41, 0x91, 0x69, 0xe2, 0x9f, 0x5b, 0xf6, 0x7a, 0xfc,
0xbf, 0xcf, 0x6f, 0x09, 0x93, 0xc3, 0x1a, 0x8c, 0xfd, 0x72, 0xb0, 0x87, 0x2d, 0xaf, 0xc1, 0xf8, 0x96, 0x30, 0x39, 0xac, 0xc1, 0xd8, 0x97, 0x83, 0x3d, 0x6c, 0x79, 0x0d, 0xc6, 0x2e, 0x99, 0x0e,
0x65, 0xd3, 0xa1, 0x0d, 0xd3, 0xa6, 0xdc, 0x6d, 0xe8, 0x11, 0x28, 0xea, 0xaa, 0x21, 0x4e, 0xf8, 0xad, 0x9b, 0x36, 0xe5, 0x6e, 0x43, 0x0f, 0x41, 0x41, 0x57, 0x0d, 0xb1, 0xc2, 0x97, 0x05, 0x4f,
0x31, 0xc1, 0x53, 0x64, 0x67, 0x10, 0x1b, 0xe7, 0xd3, 0xca, 0xae, 0xc8, 0x64, 0xe1, 0xb4, 0xb2, 0x81, 0xad, 0x41, 0xac, 0x9d, 0x77, 0x2b, 0xbb, 0x22, 0x93, 0x85, 0xdd, 0xca, 0x2e, 0x66, 0xed,
0x8b, 0xd9, 0xb8, 0x7c, 0x09, 0x46, 0xc4, 0x72, 0x44, 0x81, 0x8a, 0x07, 0x03, 0x15, 0x33, 0x80, 0xf2, 0x45, 0x18, 0x11, 0xc3, 0x11, 0x05, 0x2a, 0x1c, 0x0c, 0x54, 0xc8, 0x00, 0xfa, 0xcd, 0x10,
0x7e, 0x59, 0x80, 0x11, 0xa1, 0xfd, 0x10, 0x2e, 0x82, 0x6f, 0xc4, 0x2e, 0x82, 0xe7, 0x06, 0x5b, 0x8c, 0x08, 0xed, 0x07, 0xb0, 0x11, 0x7c, 0x2d, 0xb6, 0x11, 0x3c, 0xdb, 0xdf, 0x48, 0xe7, 0xee,
0xe9, 0xdc, 0x5b, 0x60, 0x27, 0x71, 0x0b, 0x7c, 0x71, 0x40, 0xfc, 0x83, 0xaf, 0x80, 0x1f, 0x49, 0x02, 0xdb, 0x89, 0x5d, 0xe0, 0xf3, 0x7d, 0xe2, 0x1f, 0xbc, 0x05, 0xfc, 0x40, 0x82, 0xf1, 0x78,
0x30, 0x11, 0x8f, 0x39, 0x74, 0x16, 0xc6, 0xd8, 0x79, 0xa4, 0xb6, 0xc9, 0x7a, 0x58, 0x50, 0x07, 0xcc, 0xa1, 0x33, 0x50, 0x66, 0xeb, 0x91, 0xda, 0x22, 0xeb, 0x61, 0x41, 0x1d, 0x1c, 0xca, 0x34,
0x8f, 0x32, 0xcd, 0x70, 0x0a, 0x47, 0xe9, 0x50, 0x37, 0x60, 0x63, 0x61, 0x21, 0x9c, 0x92, 0xef, 0xc2, 0x2e, 0x1c, 0xa5, 0x43, 0x9d, 0x80, 0x8d, 0x85, 0x85, 0x70, 0x4a, 0xbe, 0xcb, 0x5d, 0xaa,
0x72, 0x97, 0xaa, 0x5a, 0xcd, 0x6b, 0xf8, 0xd4, 0x56, 0x0c, 0x7a, 0xc5, 0x6e, 0x52, 0x5b, 0x35, 0x6a, 0x55, 0xef, 0xc2, 0xa7, 0xba, 0x62, 0xd0, 0xcb, 0x76, 0x83, 0xda, 0xaa, 0xd1, 0x49, 0x09,
0xba, 0x29, 0x41, 0x3c, 0xc6, 0xa2, 0xc8, 0xf2, 0x4d, 0x09, 0xc6, 0x84, 0xca, 0x43, 0xb8, 0xce, 0xe2, 0x31, 0x16, 0x45, 0x96, 0x6f, 0x48, 0x50, 0x16, 0x2a, 0x0f, 0x60, 0x3b, 0xf3, 0x6a, 0x7c,
0xbc, 0x1e, 0xbf, 0xce, 0x3c, 0x3b, 0xe0, 0x7e, 0xce, 0xbe, 0xcb, 0x7c, 0x12, 0x9a, 0xc2, 0x76, 0x3b, 0xf3, 0x74, 0x9f, 0xf3, 0x39, 0x7b, 0x2f, 0xf3, 0x51, 0x68, 0x0a, 0x9b, 0xc1, 0x2c, 0xc1,
0x30, 0x4b, 0x30, 0xdb, 0xa6, 0x43, 0x93, 0x09, 0x86, 0xed, 0x35, 0xcc, 0x67, 0xd0, 0xf7, 0x24, 0x6c, 0x9b, 0x0e, 0x4d, 0x26, 0x18, 0x36, 0xd7, 0x30, 0xef, 0x41, 0x3f, 0x90, 0xe0, 0xb8, 0x9a,
0x38, 0xae, 0x26, 0xf6, 0xbc, 0xf0, 0xf5, 0xcb, 0x83, 0xa9, 0x16, 0xc0, 0xd4, 0xab, 0x42, 0xde, 0x98, 0xf3, 0xc2, 0xd7, 0x2f, 0xf6, 0xa7, 0x5a, 0x00, 0x53, 0xab, 0x08, 0x79, 0xc7, 0x93, 0x3d,
0xf1, 0xe4, 0x0c, 0x4e, 0x89, 0x94, 0x5d, 0x48, 0x51, 0x21, 0x05, 0x4a, 0xdb, 0x94, 0x5a, 0x62, 0x38, 0x25, 0x52, 0x76, 0x21, 0x45, 0x85, 0x14, 0x18, 0xde, 0xa6, 0xd4, 0x12, 0x83, 0xb0, 0xd4,
0x11, 0x96, 0x06, 0xcf, 0x3c, 0xa1, 0x4a, 0x15, 0x6e, 0x7e, 0xab, 0xd5, 0xc0, 0x1c, 0x5a, 0xfe, 0x7f, 0xe6, 0x09, 0x55, 0x2a, 0x71, 0xf3, 0x9b, 0xcd, 0x3a, 0xe6, 0xd0, 0xf2, 0xaf, 0x87, 0x02,
0x45, 0x21, 0x70, 0x58, 0xd3, 0xdb, 0x24, 0x41, 0xbe, 0x95, 0xee, 0x45, 0xbe, 0x1d, 0xcb, 0xca, 0x87, 0x35, 0xbc, 0x49, 0x12, 0xe4, 0x5b, 0xe9, 0x6e, 0xe4, 0xdb, 0x72, 0x56, 0xae, 0x45, 0xdf,
0xb5, 0xe8, 0x1b, 0x50, 0xa4, 0xda, 0xa0, 0x17, 0x5a, 0x21, 0xa1, 0xb5, 0xda, 0x0c, 0x13, 0x56, 0x82, 0x02, 0xd5, 0xfa, 0xdd, 0xd0, 0x0a, 0x09, 0xcd, 0xd5, 0x46, 0x98, 0xb0, 0x9a, 0xab, 0x0d,
0x6b, 0xb5, 0x89, 0x19, 0x24, 0x7a, 0x1b, 0xca, 0xec, 0x34, 0x63, 0x7b, 0xbc, 0x38, 0x78, 0x0e, 0xcc, 0x20, 0xd1, 0x9b, 0x50, 0x64, 0xab, 0x19, 0x9b, 0xe3, 0x85, 0xfe, 0x73, 0x08, 0xf3, 0x57,
0x61, 0xfe, 0x0a, 0x23, 0x8c, 0xfd, 0x72, 0xb0, 0x87, 0x2b, 0xbf, 0x07, 0xe3, 0xb1, 0x44, 0x80, 0x18, 0x61, 0xec, 0xcb, 0xc1, 0x1e, 0xae, 0xfc, 0x0e, 0x8c, 0xc5, 0x12, 0x01, 0xba, 0x06, 0xc7,
0xae, 0xc3, 0x31, 0xcd, 0x54, 0x3a, 0x75, 0x45, 0x53, 0x8c, 0x36, 0xb1, 0x93, 0xa9, 0x31, 0xfb, 0x34, 0x53, 0x69, 0xd7, 0x14, 0x4d, 0x31, 0x5a, 0xc4, 0x4e, 0xa6, 0xc6, 0xec, 0xbd, 0xd0, 0x6a,
0x2e, 0xb4, 0x1a, 0xe1, 0x10, 0x09, 0x25, 0x68, 0x3e, 0x46, 0xe7, 0x70, 0x0c, 0x5b, 0x56, 0x00, 0x84, 0x43, 0x24, 0x94, 0xe0, 0xf2, 0x31, 0xda, 0x87, 0x63, 0xd8, 0xb2, 0x02, 0x10, 0x5a, 0x8f,
0x42, 0xeb, 0xd1, 0x3c, 0x94, 0x59, 0x08, 0x7b, 0x27, 0xd3, 0x68, 0x7d, 0x94, 0xe9, 0xca, 0x22, 0xe6, 0xa1, 0xc8, 0x42, 0xd8, 0x5b, 0x99, 0x46, 0x6b, 0xa3, 0x4c, 0x57, 0x16, 0xd9, 0x0e, 0xf6,
0xdb, 0xc1, 0xde, 0x38, 0x3a, 0x03, 0xe0, 0x90, 0xb6, 0x4d, 0x28, 0xcf, 0x3b, 0xde, 0xeb, 0x51, 0xda, 0xd1, 0x69, 0x00, 0x87, 0xb4, 0x6c, 0x42, 0x79, 0xde, 0xf1, 0x4e, 0x8f, 0x82, 0x0c, 0xdc,
0x90, 0x81, 0x9b, 0xc1, 0x0c, 0x8e, 0x50, 0xc9, 0x7f, 0x96, 0x60, 0x7c, 0x9d, 0xd0, 0x77, 0x4d, 0x08, 0x7a, 0x70, 0x84, 0x4a, 0xfe, 0x9b, 0x04, 0x63, 0xeb, 0x84, 0xbe, 0x6d, 0xda, 0xd7, 0xeb,
0xfb, 0x46, 0x83, 0x37, 0x77, 0x87, 0x90, 0xf7, 0x37, 0x63, 0x79, 0xff, 0x95, 0x3e, 0xd7, 0x2c, 0xfc, 0x72, 0x77, 0x00, 0x79, 0x7f, 0x33, 0x96, 0xf7, 0x5f, 0xea, 0x71, 0xcc, 0x62, 0xda, 0xe6,
0xa6, 0x6d, 0x5e, 0xf6, 0x97, 0xff, 0x2e, 0x41, 0x35, 0x46, 0x19, 0x4d, 0x13, 0x04, 0xca, 0x96, 0x65, 0x7f, 0xf9, 0x5f, 0x12, 0x54, 0x62, 0x94, 0xd1, 0x34, 0x41, 0xa0, 0x68, 0x99, 0x36, 0xf5,
0x69, 0x53, 0xff, 0x8c, 0x3f, 0x94, 0x06, 0x2c, 0xa5, 0x46, 0x4e, 0x79, 0x06, 0x8b, 0x3d, 0x74, 0xd7, 0xf8, 0x43, 0x69, 0xc0, 0x52, 0x6a, 0x64, 0x95, 0x67, 0xb0, 0xd8, 0x43, 0x67, 0x76, 0x6e,
0x66, 0xe7, 0x96, 0x6d, 0xea, 0x22, 0xee, 0x0f, 0x27, 0x85, 0x10, 0x3b, 0xb4, 0xf3, 0xa2, 0x6d, 0xd9, 0xa6, 0x2e, 0xe2, 0xfe, 0x70, 0x52, 0x08, 0xb1, 0x43, 0x3b, 0x2f, 0xd8, 0xa6, 0x8e, 0x39,
0xea, 0x98, 0x63, 0xcb, 0x7f, 0x92, 0x60, 0x2a, 0x46, 0x39, 0x84, 0x94, 0xae, 0xc4, 0x53, 0xfa, 0xb6, 0xfc, 0x57, 0x09, 0x26, 0x63, 0x94, 0x03, 0x48, 0xe9, 0x4a, 0x3c, 0xa5, 0x3f, 0x7f, 0x18,
0x8b, 0x87, 0x31, 0x2c, 0x27, 0xb1, 0x7f, 0x95, 0x34, 0x8b, 0x39, 0x00, 0x6d, 0xc1, 0x98, 0x65, 0xc3, 0x72, 0x12, 0xfb, 0x17, 0x49, 0xb3, 0x98, 0x03, 0xd0, 0x16, 0x94, 0x2d, 0xb3, 0xdd, 0xb8,
0x76, 0x9a, 0xf7, 0xa0, 0xab, 0x37, 0xc9, 0x4e, 0xc8, 0x46, 0x88, 0x85, 0xa3, 0xc0, 0x68, 0x17, 0x0b, 0xb7, 0x7a, 0x13, 0x6c, 0x85, 0xac, 0x87, 0x58, 0x38, 0x0a, 0x8c, 0x76, 0x61, 0xd2, 0x50,
0xa6, 0x0c, 0x45, 0x27, 0x8e, 0xa5, 0xb4, 0x49, 0xf3, 0x1e, 0xbc, 0xa9, 0x3c, 0xc0, 0x3b, 0x0d, 0x74, 0xe2, 0x58, 0x4a, 0x8b, 0x34, 0xee, 0xc2, 0x99, 0xca, 0x7d, 0xfc, 0xa6, 0x21, 0x89, 0x88,
0x49, 0x44, 0x9c, 0x16, 0x22, 0xff, 0x3a, 0x65, 0xb7, 0x69, 0x53, 0xf4, 0x2a, 0x54, 0xf8, 0x07, 0xd3, 0x42, 0xe4, 0xdf, 0xa5, 0xec, 0x36, 0x6d, 0x8a, 0x5e, 0x86, 0x12, 0x7f, 0x60, 0xd1, 0x32,
0x16, 0x6d, 0x53, 0x13, 0x47, 0xdb, 0x59, 0xb6, 0x34, 0x0d, 0x31, 0x76, 0x7b, 0x6f, 0xfe, 0xbf, 0x35, 0xb1, 0xb4, 0x9d, 0x61, 0x43, 0x53, 0x17, 0x6d, 0xb7, 0xf6, 0xe6, 0xbf, 0x7c, 0xe0, 0x91,
0x0f, 0x7c, 0x12, 0xf6, 0x09, 0x71, 0x00, 0x83, 0xd6, 0xa1, 0x64, 0x1d, 0xa6, 0xcc, 0xe0, 0x07, 0xb0, 0x4f, 0x88, 0x03, 0x18, 0xb4, 0x0e, 0xc3, 0xd6, 0x61, 0xca, 0x0c, 0xbe, 0xb0, 0xf0, 0xda,
0x0b, 0xaf, 0x2d, 0x38, 0x8e, 0xfc, 0x8f, 0xa4, 0xe2, 0xfc, 0x78, 0xb9, 0x7e, 0xcf, 0x16, 0x2c, 0x82, 0xe3, 0xc8, 0xff, 0x4e, 0x2a, 0xce, 0x97, 0x97, 0x6b, 0x77, 0x6d, 0xc0, 0x82, 0xb2, 0x26,
0x28, 0x6b, 0x72, 0x17, 0xcd, 0x86, 0x11, 0x71, 0xca, 0x8a, 0xb8, 0xbc, 0x74, 0x98, 0xb8, 0x8c, 0x77, 0xd0, 0x6c, 0x18, 0x11, 0xab, 0xac, 0x88, 0xcb, 0x8b, 0x87, 0x89, 0xcb, 0xe8, 0xca, 0x10,
0x9e, 0x0c, 0xc1, 0x25, 0xc2, 0x1f, 0xf4, 0x05, 0xc9, 0x7f, 0x95, 0x60, 0x8a, 0x2b, 0xd4, 0x76, 0x6c, 0x22, 0xfc, 0x46, 0x5f, 0x90, 0xfc, 0x0f, 0x09, 0x26, 0xb9, 0x42, 0x2d, 0xd7, 0x56, 0x69,
0x6d, 0x95, 0xf6, 0x86, 0x96, 0x41, 0xb7, 0x62, 0x19, 0x74, 0xb9, 0x4f, 0x43, 0x53, 0x1a, 0xe7, 0x77, 0x60, 0x19, 0x74, 0x2b, 0x96, 0x41, 0x97, 0x7b, 0x34, 0x34, 0xa5, 0x71, 0x6e, 0x16, 0xfd,
0x66, 0xd1, 0xcf, 0x25, 0x78, 0x20, 0x45, 0x3d, 0x84, 0x0c, 0x43, 0xe2, 0x19, 0xe6, 0x95, 0xc3, 0x54, 0x82, 0xfb, 0x52, 0xd4, 0x03, 0xc8, 0x30, 0x24, 0x9e, 0x61, 0x5e, 0x3a, 0xac, 0x81, 0x39,
0x1a, 0x98, 0x93, 0x65, 0x6e, 0x42, 0x86, 0x79, 0x3c, 0x70, 0xcf, 0x00, 0x58, 0xb6, 0xba, 0xa3, 0x59, 0xe6, 0x87, 0xe5, 0x0c, 0xf3, 0x78, 0xe0, 0x9e, 0x06, 0xb0, 0x6c, 0x75, 0x47, 0xd5, 0x48,
0x6a, 0xa4, 0x2b, 0x1a, 0xc9, 0x95, 0x70, 0x49, 0x1a, 0xc1, 0x0c, 0x8e, 0x50, 0xa1, 0x6f, 0xc1, 0x47, 0x5c, 0x24, 0x97, 0xc2, 0x21, 0xa9, 0x07, 0x3d, 0x38, 0x42, 0x85, 0xbe, 0x03, 0x33, 0x6d,
0x4c, 0x87, 0x6c, 0x29, 0xae, 0x46, 0x17, 0x3b, 0x9d, 0x25, 0xc5, 0x52, 0x36, 0x55, 0x4d, 0xa5, 0xb2, 0xa5, 0xb8, 0x1a, 0x5d, 0x6c, 0xb7, 0x97, 0x14, 0x4b, 0xd9, 0x54, 0x35, 0x95, 0xaa, 0x62,
0xaa, 0xb8, 0x61, 0x8f, 0xd6, 0x2f, 0x78, 0x0d, 0xde, 0x2c, 0x8a, 0xdb, 0x7b, 0xf3, 0x8f, 0x1f, 0x87, 0x3d, 0x5a, 0x3b, 0xef, 0x5d, 0xf0, 0x66, 0x51, 0xdc, 0xda, 0x9b, 0x7f, 0xf4, 0xe0, 0x4b,
0xdc, 0xd4, 0xf1, 0x89, 0x7b, 0x38, 0x47, 0x08, 0xfa, 0xae, 0x04, 0x55, 0x9b, 0xbc, 0xe3, 0xaa, 0x1d, 0x9f, 0xb8, 0x8b, 0x73, 0x84, 0xa0, 0xef, 0x4b, 0x50, 0xb1, 0xc9, 0x5b, 0xae, 0x6a, 0x93,
0x36, 0xe9, 0x2c, 0xdb, 0xa6, 0x15, 0xd3, 0xa0, 0xc8, 0x35, 0xb8, 0xb4, 0xbf, 0x37, 0x5f, 0xc5, 0xf6, 0xb2, 0x6d, 0x5a, 0x31, 0x0d, 0x0a, 0x5c, 0x83, 0x8b, 0xfb, 0x7b, 0xf3, 0x15, 0x9c, 0x43,
0x39, 0x34, 0xfd, 0xe8, 0x90, 0x2b, 0x08, 0x51, 0x98, 0x56, 0x34, 0xcd, 0x7c, 0x97, 0xc4, 0x3d, 0xd3, 0x8b, 0x0e, 0xb9, 0x82, 0x10, 0x85, 0x29, 0x45, 0xd3, 0xcc, 0xb7, 0x49, 0xdc, 0x03, 0xc3,
0x50, 0xe2, 0xf2, 0xeb, 0xfb, 0x7b, 0xf3, 0xd3, 0x8b, 0xe9, 0xe9, 0x7e, 0x44, 0x67, 0xc1, 0xa3, 0x5c, 0x7e, 0x6d, 0x7f, 0x6f, 0x7e, 0x6a, 0x31, 0xdd, 0xdd, 0x8b, 0xe8, 0x2c, 0x78, 0xb4, 0x00,
0x05, 0x18, 0xd9, 0x31, 0x35, 0x57, 0x27, 0x4e, 0xb5, 0xcc, 0x25, 0xb1, 0x8c, 0x3b, 0x72, 0xd5, 0x23, 0x3b, 0xa6, 0xe6, 0xea, 0xc4, 0xa9, 0x14, 0xb9, 0x24, 0x96, 0x71, 0x47, 0xae, 0x78, 0x4d,
0x1b, 0xba, 0xbd, 0x37, 0x7f, 0xf4, 0x62, 0x93, 0x3f, 0x7d, 0xf8, 0x54, 0xec, 0x8e, 0xc6, 0x6a, 0xb7, 0xf6, 0xe6, 0x8f, 0x5e, 0x68, 0xf0, 0xa3, 0x0f, 0x9f, 0x8a, 0xed, 0xd1, 0x58, 0xcd, 0x24,
0x26, 0xb1, 0xe5, 0xf9, 0x9b, 0x6d, 0x25, 0xcc, 0x31, 0x97, 0xc3, 0x29, 0x1c, 0xa5, 0x43, 0x3a, 0xa6, 0x3c, 0x3f, 0xb3, 0x2d, 0x85, 0x39, 0xe6, 0x52, 0xd8, 0x85, 0xa3, 0x74, 0x48, 0x87, 0xd1,
0x8c, 0x6e, 0x8b, 0x7b, 0xbb, 0x53, 0x1d, 0x19, 0xe8, 0xf4, 0x8b, 0xdd, 0xfb, 0xeb, 0x53, 0x42, 0x6d, 0xb1, 0x6f, 0x77, 0x2a, 0x23, 0x7d, 0xad, 0x7e, 0xb1, 0x7d, 0x7f, 0x6d, 0x52, 0x88, 0x1c,
0xe4, 0xa8, 0x3f, 0xec, 0xe0, 0x50, 0x02, 0x7a, 0x02, 0x46, 0xf8, 0x8f, 0x95, 0x65, 0xfe, 0x00, 0xf5, 0x9b, 0x1d, 0x1c, 0x4a, 0x40, 0x8f, 0xc1, 0x08, 0xff, 0x58, 0x59, 0xe6, 0x07, 0x60, 0xa5,
0x56, 0x09, 0x33, 0xd1, 0x65, 0x6f, 0x18, 0xfb, 0xf3, 0x3e, 0xe9, 0x4a, 0x63, 0x89, 0x3f, 0xcc, 0x30, 0x13, 0x5d, 0xf2, 0x9a, 0xb1, 0xdf, 0xef, 0x93, 0xae, 0xd4, 0x97, 0xf8, 0xc1, 0x6c, 0x82,
0x26, 0x48, 0x57, 0x1a, 0x4b, 0xd8, 0x9f, 0x47, 0x16, 0x8c, 0x38, 0x64, 0x55, 0x35, 0xdc, 0xdd, 0x74, 0xa5, 0xbe, 0x84, 0xfd, 0x7e, 0x64, 0xc1, 0x88, 0x43, 0x56, 0x55, 0xc3, 0xdd, 0xad, 0x40,
0x2a, 0x0c, 0xd4, 0x6a, 0x6e, 0x5e, 0xe0, 0xdc, 0x89, 0xa7, 0xa8, 0x50, 0xa2, 0x98, 0xc7, 0xbe, 0x5f, 0x57, 0xcd, 0x8d, 0xf3, 0x9c, 0x3b, 0x71, 0x14, 0x15, 0x4a, 0x14, 0xfd, 0xd8, 0x17, 0x83,
0x18, 0xb4, 0x0b, 0xa3, 0xb6, 0x6b, 0x2c, 0x3a, 0x1b, 0x0e, 0xb1, 0xab, 0x63, 0x5c, 0x66, 0xbf, 0x76, 0x61, 0xd4, 0x76, 0x8d, 0x45, 0x67, 0xc3, 0x21, 0x76, 0xa5, 0xcc, 0x65, 0xf6, 0x9a, 0x9c,
0xc9, 0x19, 0xfb, 0xfc, 0x49, 0xa9, 0x81, 0x07, 0x03, 0x0a, 0x1c, 0x0a, 0x43, 0x3f, 0x91, 0x00, 0xb1, 0xcf, 0x9f, 0x94, 0x1a, 0x78, 0x30, 0xa0, 0xc0, 0xa1, 0x30, 0xf4, 0x73, 0x09, 0x90, 0xe3,
0x39, 0xae, 0x65, 0x69, 0x44, 0x27, 0x06, 0x55, 0x34, 0xfe, 0x1a, 0xe6, 0x54, 0x8f, 0x71, 0x1d, 0x5a, 0x96, 0x46, 0x74, 0x62, 0x50, 0x45, 0xe3, 0xa7, 0x61, 0x4e, 0xe5, 0x18, 0xd7, 0xa1, 0xde,
0x1a, 0xfd, 0xda, 0x9d, 0x02, 0x4a, 0x2a, 0x13, 0x3c, 0x53, 0xa7, 0x49, 0x71, 0x86, 0x1e, 0x6c, 0xab, 0xdd, 0x29, 0xa0, 0xa4, 0x32, 0xc1, 0x31, 0x75, 0x9a, 0x14, 0x67, 0xe8, 0xc1, 0x86, 0x62,
0x29, 0xb6, 0x1c, 0xfe, 0x77, 0x75, 0x7c, 0xa0, 0xa5, 0xc8, 0x7e, 0x15, 0x0c, 0x97, 0x42, 0xcc, 0xcb, 0xe1, 0xbf, 0x2b, 0x63, 0x7d, 0x0d, 0x45, 0xf6, 0xa9, 0x60, 0x38, 0x14, 0xa2, 0x1f, 0xfb,
0x63, 0x5f, 0x0c, 0xba, 0x0a, 0x33, 0x36, 0x51, 0x3a, 0x57, 0x0c, 0xad, 0x87, 0x4d, 0x93, 0x5e, 0x62, 0xd0, 0x15, 0x98, 0xb1, 0x89, 0xd2, 0xbe, 0x6c, 0x68, 0x5d, 0x6c, 0x9a, 0xf4, 0x82, 0xaa,
0x54, 0x35, 0xe2, 0xf4, 0x1c, 0x4a, 0xf4, 0xea, 0x04, 0x0f, 0x9b, 0xe0, 0x73, 0x0d, 0x9c, 0x49, 0x11, 0xa7, 0xeb, 0x50, 0xa2, 0x57, 0xc6, 0x79, 0xd8, 0x04, 0xcf, 0x35, 0x70, 0x26, 0x15, 0xce,
0x85, 0x73, 0xb8, 0xf9, 0x57, 0x04, 0xe2, 0xfd, 0x76, 0x38, 0xdf, 0xe1, 0x1d, 0xee, 0x2b, 0x82, 0xe1, 0x46, 0x2f, 0xc1, 0x71, 0x31, 0x31, 0x79, 0x68, 0xf2, 0x13, 0xb4, 0x09, 0x3e, 0x15, 0xa7,
0x50, 0xd5, 0xfb, 0xf6, 0x15, 0x41, 0x44, 0xc4, 0xc1, 0x4f, 0x48, 0x5f, 0x15, 0x60, 0x3a, 0x24, 0xd9, 0x8e, 0x78, 0x31, 0xd1, 0x87, 0x53, 0xd4, 0xfc, 0x1d, 0x82, 0x38, 0x01, 0x1e, 0xcc, 0x4b,
0xbe, 0xeb, 0xaf, 0x08, 0x32, 0x58, 0x86, 0xf0, 0x15, 0x41, 0x76, 0x1b, 0xbe, 0x78, 0xbf, 0xdb, 0xbe, 0xc3, 0xbd, 0x43, 0x08, 0x55, 0xbd, 0x67, 0xef, 0x10, 0x22, 0x22, 0x0e, 0x3e, 0x84, 0xfa,
0xf0, 0xf7, 0xe1, 0xeb, 0x05, 0xde, 0xd9, 0x0f, 0x9d, 0xf8, 0xef, 0xdf, 0xd9, 0x0f, 0x75, 0xcd, 0x62, 0x08, 0xa6, 0x42, 0xe2, 0x3b, 0x7e, 0x87, 0x90, 0xc1, 0x32, 0x80, 0x77, 0x08, 0xd9, 0x17,
0x29, 0x67, 0x7e, 0x5b, 0x88, 0x1a, 0xf4, 0x1f, 0xd4, 0x3e, 0x3e, 0xfc, 0x57, 0x8a, 0xf2, 0xe7, 0xf9, 0x85, 0x7b, 0x7d, 0x91, 0x7f, 0x0f, 0xde, 0x3f, 0xf0, 0xb7, 0x01, 0xa1, 0x13, 0xff, 0xf7,
0x45, 0x38, 0x9e, 0xdc, 0xb1, 0xb1, 0x2e, 0xa2, 0x74, 0xc7, 0x2e, 0x62, 0x03, 0x4e, 0x6c, 0xb9, 0xdf, 0x06, 0x84, 0xba, 0xe6, 0x14, 0x44, 0x7f, 0x18, 0x8a, 0x1a, 0xf4, 0x7f, 0x74, 0x01, 0x7d,
0x9a, 0xd6, 0xe3, 0x0e, 0x89, 0xb4, 0x12, 0xbd, 0x57, 0xfb, 0x87, 0x05, 0xe7, 0x89, 0x8b, 0x19, 0xf8, 0x77, 0x8e, 0xf2, 0xa7, 0x05, 0x38, 0x9e, 0x9c, 0xb1, 0xb1, 0x7b, 0x48, 0xe9, 0xb6, 0xf7,
0x34, 0x38, 0x93, 0x33, 0xa7, 0x23, 0x5a, 0x1c, 0xa8, 0x23, 0x9a, 0x6a, 0xc8, 0x95, 0xfa, 0x68, 0x90, 0x75, 0x98, 0xde, 0x72, 0x35, 0xad, 0xcb, 0x1d, 0x12, 0xb9, 0x8c, 0xf4, 0xce, 0xfd, 0x1f,
0xc8, 0x65, 0x76, 0x37, 0xcb, 0x03, 0x74, 0x37, 0xef, 0x45, 0x3b, 0x32, 0x23, 0xf1, 0xdd, 0xa9, 0x14, 0x9c, 0xd3, 0x17, 0x32, 0x68, 0x70, 0x26, 0x67, 0xce, 0x9d, 0x6a, 0xa1, 0xaf, 0x3b, 0xd5,
0x1d, 0x29, 0x3f, 0x0c, 0xb3, 0x82, 0x8d, 0xf2, 0x4e, 0xa1, 0x41, 0x6d, 0x53, 0xd3, 0x88, 0xbd, 0xd4, 0x95, 0xde, 0x70, 0x0f, 0x57, 0x7a, 0x99, 0xf7, 0xa3, 0xc5, 0x3e, 0xee, 0x47, 0xef, 0xc6,
0xec, 0xea, 0x7a, 0x4f, 0x3e, 0x0f, 0x13, 0xf1, 0x9e, 0xb8, 0xb7, 0xf2, 0x5e, 0x9b, 0x5e, 0xf4, 0x85, 0x66, 0x46, 0xe2, 0xbb, 0xdd, 0x85, 0xa6, 0xfc, 0x20, 0xcc, 0x0a, 0x36, 0xca, 0xef, 0x1a,
0x52, 0x22, 0x2b, 0xef, 0x8d, 0xe3, 0x80, 0x42, 0xfe, 0x40, 0x82, 0x99, 0xec, 0xef, 0xef, 0x90, 0x0d, 0x6a, 0x9b, 0x9a, 0x46, 0xec, 0x65, 0x57, 0xd7, 0xbb, 0xf2, 0x39, 0x18, 0x8f, 0xdf, 0xaa,
0x06, 0x13, 0xba, 0xb2, 0x1b, 0xfd, 0x00, 0x51, 0x1a, 0xf0, 0xc6, 0xcd, 0x9b, 0x9f, 0x6b, 0x31, 0x7b, 0x23, 0xef, 0x5d, 0xf4, 0x8b, 0xdb, 0x98, 0xc8, 0xc8, 0x7b, 0xed, 0x38, 0xa0, 0x90, 0xdf,
0x2c, 0x9c, 0xc0, 0x96, 0xbf, 0x90, 0xe0, 0x64, 0x4e, 0x9b, 0x71, 0xb8, 0x9a, 0xa0, 0x6b, 0x50, 0x93, 0x60, 0x26, 0xfb, 0x05, 0x1f, 0xd2, 0x60, 0x5c, 0x57, 0x76, 0xa3, 0x4f, 0x18, 0xa5, 0x3e,
0xd1, 0x95, 0xdd, 0xa6, 0x6b, 0x77, 0xc9, 0xc0, 0x6f, 0x0c, 0x3c, 0x97, 0xac, 0x09, 0x14, 0x1c, 0xf7, 0xec, 0xfc, 0xfa, 0x74, 0x2d, 0x86, 0x85, 0x13, 0xd8, 0xf2, 0x67, 0x12, 0x9c, 0xc8, 0xb9,
0xe0, 0xc9, 0x1f, 0x4b, 0x50, 0xcd, 0xab, 0x07, 0xd1, 0xd9, 0x58, 0x43, 0xf4, 0xd1, 0x44, 0x43, 0xa8, 0x1c, 0xac, 0x26, 0xe8, 0x2a, 0x94, 0x74, 0x65, 0xb7, 0xe1, 0xda, 0x1d, 0xd2, 0xf7, 0x29,
0x74, 0x2a, 0xc5, 0x37, 0xa4, 0x76, 0xe8, 0x27, 0x12, 0xcc, 0x64, 0xd7, 0xcd, 0xe8, 0x99, 0x98, 0x05, 0xcf, 0x25, 0x6b, 0x02, 0x05, 0x07, 0x78, 0xf2, 0x87, 0x12, 0x54, 0xf2, 0x2a, 0x4a, 0x74,
0xc6, 0xf3, 0x09, 0x8d, 0x27, 0x13, 0x5c, 0x42, 0xdf, 0x6d, 0x98, 0x10, 0xd5, 0xb5, 0x80, 0x11, 0x26, 0x76, 0xa5, 0xfa, 0x70, 0xe2, 0x4a, 0x75, 0x32, 0xc5, 0x37, 0xa0, 0x0b, 0xd5, 0x8f, 0x24,
0x5e, 0x7e, 0xf2, 0xe0, 0xac, 0x2a, 0xc0, 0xfc, 0x3a, 0x91, 0xaf, 0x64, 0x7c, 0x0c, 0x27, 0x70, 0x98, 0xc9, 0xae, 0xbc, 0xd1, 0x53, 0x31, 0x8d, 0xe7, 0x13, 0x1a, 0x4f, 0x24, 0xb8, 0x84, 0xbe,
0xe5, 0x9f, 0x17, 0xa0, 0xdc, 0x6c, 0x2b, 0x1a, 0x19, 0x42, 0x51, 0x77, 0x2d, 0x56, 0xd4, 0xf5, 0xdb, 0x30, 0x2e, 0xea, 0x73, 0x01, 0x23, 0xbc, 0xfc, 0xf8, 0xc1, 0x59, 0x55, 0x80, 0xf9, 0x95,
0xfb, 0x3f, 0x02, 0x5c, 0xcb, 0xdc, 0x7a, 0x6e, 0x33, 0x51, 0xcf, 0x9d, 0x1b, 0x08, 0xfd, 0xe0, 0x26, 0x1f, 0xc9, 0x78, 0x1b, 0x4e, 0xe0, 0xca, 0xbf, 0x1a, 0x82, 0x62, 0xa3, 0xa5, 0x68, 0x64,
0x52, 0xee, 0x79, 0x18, 0x0d, 0x94, 0xe8, 0xef, 0xf4, 0x90, 0x3f, 0x2a, 0xc0, 0x58, 0x44, 0x44, 0x00, 0x45, 0xdd, 0xd5, 0x58, 0x51, 0xd7, 0xeb, 0xbf, 0x0c, 0xb8, 0x96, 0xb9, 0xf5, 0xdc, 0x66,
0x9f, 0x67, 0xcf, 0x4e, 0xec, 0xf4, 0x1e, 0xe4, 0xdf, 0x91, 0x22, 0xb2, 0x6b, 0xfe, 0xf9, 0xed, 0xa2, 0x9e, 0x3b, 0xdb, 0x17, 0xfa, 0xc1, 0xa5, 0xdc, 0xb3, 0x30, 0x1a, 0x28, 0xd1, 0xdb, 0xea,
0x7d, 0x7f, 0x17, 0x7e, 0x47, 0x95, 0x3e, 0xd6, 0xcf, 0xc3, 0x04, 0xe5, 0xff, 0x9d, 0x13, 0xbc, 0x21, 0x7f, 0x30, 0x04, 0xe5, 0x88, 0x88, 0x1e, 0xd7, 0x9e, 0x9d, 0xd8, 0xea, 0xdd, 0xcf, 0x1f,
0xf1, 0x15, 0x79, 0x14, 0x07, 0x5f, 0x75, 0xb6, 0x62, 0xb3, 0x38, 0x41, 0x3d, 0xfb, 0x02, 0x8c, 0x9a, 0x22, 0xb2, 0xab, 0xfe, 0xfa, 0xed, 0xbd, 0xe0, 0x0b, 0x5f, 0x62, 0xa5, 0x97, 0xf5, 0x73,
0xc7, 0x84, 0xf5, 0xf5, 0xb9, 0xdc, 0xef, 0x24, 0x78, 0xf4, 0x8e, 0x77, 0x32, 0x54, 0x8f, 0x6d, 0x30, 0x4e, 0xf9, 0xff, 0x7b, 0x82, 0x53, 0xc2, 0x02, 0x8f, 0xe2, 0xe0, 0x5d, 0x68, 0x33, 0xd6,
0xaf, 0x5a, 0x62, 0x7b, 0xcd, 0xe5, 0x03, 0x0c, 0xf1, 0x63, 0x89, 0x1f, 0x15, 0x00, 0xb5, 0xb6, 0x8b, 0x13, 0xd4, 0xb3, 0xcf, 0xc1, 0x58, 0x4c, 0x58, 0x4f, 0x0f, 0xee, 0xfe, 0x28, 0xc1, 0xc3,
0x55, 0xbb, 0xd3, 0x50, 0x6c, 0xda, 0xc3, 0xe2, 0x7f, 0xb0, 0x86, 0xb0, 0xe1, 0xce, 0xc2, 0x58, 0xb7, 0xdd, 0xd5, 0xa1, 0x5a, 0x6c, 0x7a, 0x55, 0x13, 0xd3, 0x6b, 0x2e, 0x1f, 0x60, 0x80, 0xcf,
0x87, 0x38, 0x6d, 0x5b, 0xe5, 0xce, 0x12, 0x77, 0x85, 0xe0, 0x1d, 0x64, 0x39, 0x9c, 0xc2, 0x51, 0x2d, 0x7e, 0x3a, 0x04, 0xa8, 0xb9, 0xad, 0xda, 0xed, 0xba, 0x62, 0xd3, 0x2e, 0x16, 0xff, 0xe2,
0x3a, 0xd4, 0x85, 0xca, 0x8e, 0xf7, 0x5f, 0x7e, 0x7e, 0xe7, 0xad, 0xdf, 0x62, 0x36, 0xfc, 0x3f, 0x1a, 0xc0, 0x84, 0x3b, 0x03, 0xe5, 0x36, 0x71, 0x5a, 0xb6, 0xca, 0x9d, 0x25, 0xf6, 0x0a, 0xc1,
0xc1, 0x30, 0xbe, 0xc4, 0x80, 0x83, 0x03, 0x70, 0xf9, 0x43, 0x09, 0x66, 0xd2, 0x8e, 0x59, 0x66, 0x49, 0xca, 0x72, 0xd8, 0x85, 0xa3, 0x74, 0xa8, 0x03, 0xa5, 0x1d, 0xef, 0x7f, 0x82, 0xfe, 0xdd,
0xaa, 0xdf, 0x7f, 0xe7, 0x3c, 0x0c, 0x25, 0x8e, 0xce, 0xbc, 0x72, 0xcc, 0x7b, 0xf1, 0x66, 0x92, 0x5d, 0xaf, 0xc5, 0x6c, 0xf8, 0x4f, 0xc3, 0x30, 0xbe, 0x44, 0x83, 0x83, 0x03, 0x70, 0xf9, 0x7d,
0x31, 0x1f, 0x95, 0xbf, 0x94, 0x60, 0x36, 0x5b, 0xb5, 0x21, 0x5c, 0x25, 0xae, 0xc7, 0xaf, 0x12, 0x09, 0x66, 0xd2, 0x8e, 0x59, 0x66, 0xaa, 0xdf, 0x7b, 0xe7, 0x3c, 0x08, 0xc3, 0x1c, 0x9d, 0x79,
0xfd, 0x3e, 0x1b, 0x64, 0xeb, 0x9d, 0x73, 0xad, 0xd8, 0xcb, 0x5c, 0x83, 0x21, 0x18, 0xb9, 0x15, 0xe5, 0x98, 0x77, 0x66, 0xce, 0x24, 0x63, 0xde, 0x2a, 0x7f, 0x2e, 0xc1, 0x6c, 0xb6, 0x6a, 0x03,
0x37, 0x72, 0xf1, 0xd0, 0x46, 0x66, 0x1b, 0x58, 0x7f, 0xe2, 0xe6, 0xad, 0xb9, 0x23, 0x9f, 0xde, 0xd8, 0x4a, 0x5c, 0x8b, 0x6f, 0x25, 0x7a, 0x3d, 0x78, 0xc8, 0xd6, 0x3b, 0x67, 0x5b, 0xb1, 0x97,
0x9a, 0x3b, 0xf2, 0xd9, 0xad, 0xb9, 0x23, 0xef, 0xef, 0xcf, 0x49, 0x37, 0xf7, 0xe7, 0xa4, 0x4f, 0x39, 0x06, 0x03, 0x30, 0x72, 0x2b, 0x6e, 0xe4, 0xe2, 0xa1, 0x8d, 0xcc, 0x36, 0xb0, 0xf6, 0xd8,
0xf7, 0xe7, 0xa4, 0xbf, 0xed, 0xcf, 0x49, 0x3f, 0xf8, 0x62, 0xee, 0xc8, 0xb5, 0x11, 0x81, 0xf9, 0x8d, 0x9b, 0x73, 0x47, 0x3e, 0xbe, 0x39, 0x77, 0xe4, 0x93, 0x9b, 0x73, 0x47, 0xde, 0xdd, 0x9f,
0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x73, 0xfd, 0x6b, 0xf2, 0x3c, 0x00, 0x00, 0x93, 0x6e, 0xec, 0xcf, 0x49, 0x1f, 0xef, 0xcf, 0x49, 0xff, 0xdc, 0x9f, 0x93, 0x7e, 0xfc, 0xd9,
0xdc, 0x91, 0xab, 0x23, 0x02, 0xf3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x3f, 0x0c, 0xbe,
0x34, 0x3d, 0x00, 0x00,
} }

View File

@@ -710,6 +710,11 @@ message PodSecurityPolicySpec {
// will not be forced to. // will not be forced to.
// +optional // +optional
optional bool readOnlyRootFilesystem = 14; optional bool readOnlyRootFilesystem = 14;
// AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all
// host paths may be used.
// +optional
repeated string allowedHostPaths = 15;
} }
// ReplicaSet represents the configuration of a ReplicaSet. // ReplicaSet represents the configuration of a ReplicaSet.

View File

@@ -14595,7 +14595,7 @@ func (x *PodSecurityPolicySpec) CodecEncodeSelf(e *codec1978.Encoder) {
} else { } else {
yysep2 := !z.EncBinary() yysep2 := !z.EncBinary()
yy2arr2 := z.EncBasicHandle().StructToArray yy2arr2 := z.EncBasicHandle().StructToArray
var yyq2 [14]bool var yyq2 [15]bool
_, _, _ = yysep2, yyq2, yy2arr2 _, _, _ = yysep2, yyq2, yy2arr2
const yyr2 bool = false const yyr2 bool = false
yyq2[0] = x.Privileged != false yyq2[0] = x.Privileged != false
@@ -14608,9 +14608,10 @@ func (x *PodSecurityPolicySpec) CodecEncodeSelf(e *codec1978.Encoder) {
yyq2[7] = x.HostPID != false yyq2[7] = x.HostPID != false
yyq2[8] = x.HostIPC != false yyq2[8] = x.HostIPC != false
yyq2[13] = x.ReadOnlyRootFilesystem != false yyq2[13] = x.ReadOnlyRootFilesystem != false
yyq2[14] = len(x.AllowedHostPaths) != 0
var yynn2 int var yynn2 int
if yyr2 || yy2arr2 { if yyr2 || yy2arr2 {
r.EncodeArrayStart(14) r.EncodeArrayStart(15)
} else { } else {
yynn2 = 4 yynn2 = 4
for _, b := range yyq2 { for _, b := range yyq2 {
@@ -14955,6 +14956,39 @@ func (x *PodSecurityPolicySpec) CodecEncodeSelf(e *codec1978.Encoder) {
} }
} }
} }
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
if yyq2[14] {
if x.AllowedHostPaths == nil {
r.EncodeNil()
} else {
yym54 := z.EncBinary()
_ = yym54
if false {
} else {
z.F.EncSliceStringV(x.AllowedHostPaths, false, e)
}
}
} else {
r.EncodeNil()
}
} else {
if yyq2[14] {
z.EncSendContainerState(codecSelfer_containerMapKey1234)
r.EncodeString(codecSelferC_UTF81234, string("allowedHostPaths"))
z.EncSendContainerState(codecSelfer_containerMapValue1234)
if x.AllowedHostPaths == nil {
r.EncodeNil()
} else {
yym55 := z.EncBinary()
_ = yym55
if false {
} else {
z.F.EncSliceStringV(x.AllowedHostPaths, false, e)
}
}
}
}
if yyr2 || yy2arr2 { if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayEnd1234) z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
} else { } else {
@@ -15164,6 +15198,18 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromMap(l int, d *codec1978.Decod
*((*bool)(yyv26)) = r.DecodeBool() *((*bool)(yyv26)) = r.DecodeBool()
} }
} }
case "allowedHostPaths":
if r.TryDecodeAsNil() {
x.AllowedHostPaths = nil
} else {
yyv28 := &x.AllowedHostPaths
yym29 := z.DecBinary()
_ = yym29
if false {
} else {
z.F.DecSliceStringX(yyv28, false, d)
}
}
default: default:
z.DecStructFieldNotFound(-1, yys3) z.DecStructFieldNotFound(-1, yys3)
} // end switch yys3 } // end switch yys3
@@ -15175,16 +15221,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
var h codecSelfer1234 var h codecSelfer1234
z, r := codec1978.GenHelperDecoder(d) z, r := codec1978.GenHelperDecoder(d)
_, _, _ = h, z, r _, _, _ = h, z, r
var yyj28 int var yyj30 int
var yyb28 bool var yyb30 bool
var yyhl28 bool = l >= 0 var yyhl30 bool = l >= 0
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15192,21 +15238,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Privileged = false x.Privileged = false
} else { } else {
yyv29 := &x.Privileged yyv31 := &x.Privileged
yym30 := z.DecBinary() yym32 := z.DecBinary()
_ = yym30 _ = yym32
if false { if false {
} else { } else {
*((*bool)(yyv29)) = r.DecodeBool() *((*bool)(yyv31)) = r.DecodeBool()
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15214,29 +15260,7 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.DefaultAddCapabilities = nil x.DefaultAddCapabilities = nil
} else { } else {
yyv31 := &x.DefaultAddCapabilities yyv33 := &x.DefaultAddCapabilities
yym32 := z.DecBinary()
_ = yym32
if false {
} else {
h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv31), d)
}
}
yyj28++
if yyhl28 {
yyb28 = yyj28 > l
} else {
yyb28 = r.CheckBreak()
}
if yyb28 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.RequiredDropCapabilities = nil
} else {
yyv33 := &x.RequiredDropCapabilities
yym34 := z.DecBinary() yym34 := z.DecBinary()
_ = yym34 _ = yym34
if false { if false {
@@ -15244,21 +15268,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv33), d) h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv33), d)
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
z.DecSendContainerState(codecSelfer_containerArrayElem1234) z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.AllowedCapabilities = nil x.RequiredDropCapabilities = nil
} else { } else {
yyv35 := &x.AllowedCapabilities yyv35 := &x.RequiredDropCapabilities
yym36 := z.DecBinary() yym36 := z.DecBinary()
_ = yym36 _ = yym36
if false { if false {
@@ -15266,13 +15290,35 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv35), d) h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv35), d)
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.AllowedCapabilities = nil
} else {
yyv37 := &x.AllowedCapabilities
yym38 := z.DecBinary()
_ = yym38
if false {
} else {
h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv37), d)
}
}
yyj30++
if yyhl30 {
yyb30 = yyj30 > l
} else {
yyb30 = r.CheckBreak()
}
if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15280,21 +15326,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Volumes = nil x.Volumes = nil
} else { } else {
yyv37 := &x.Volumes yyv39 := &x.Volumes
yym38 := z.DecBinary() yym40 := z.DecBinary()
_ = yym38 _ = yym40
if false { if false {
} else { } else {
h.decSliceFSType((*[]FSType)(yyv37), d) h.decSliceFSType((*[]FSType)(yyv39), d)
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15302,21 +15348,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.HostNetwork = false x.HostNetwork = false
} else { } else {
yyv39 := &x.HostNetwork yyv41 := &x.HostNetwork
yym40 := z.DecBinary() yym42 := z.DecBinary()
_ = yym40 _ = yym42
if false { if false {
} else { } else {
*((*bool)(yyv39)) = r.DecodeBool() *((*bool)(yyv41)) = r.DecodeBool()
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15324,21 +15370,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.HostPorts = nil x.HostPorts = nil
} else { } else {
yyv41 := &x.HostPorts yyv43 := &x.HostPorts
yym42 := z.DecBinary() yym44 := z.DecBinary()
_ = yym42 _ = yym44
if false { if false {
} else { } else {
h.decSliceHostPortRange((*[]HostPortRange)(yyv41), d) h.decSliceHostPortRange((*[]HostPortRange)(yyv43), d)
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15346,29 +15392,7 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.HostPID = false x.HostPID = false
} else { } else {
yyv43 := &x.HostPID yyv45 := &x.HostPID
yym44 := z.DecBinary()
_ = yym44
if false {
} else {
*((*bool)(yyv43)) = r.DecodeBool()
}
}
yyj28++
if yyhl28 {
yyb28 = yyj28 > l
} else {
yyb28 = r.CheckBreak()
}
if yyb28 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.HostIPC = false
} else {
yyv45 := &x.HostIPC
yym46 := z.DecBinary() yym46 := z.DecBinary()
_ = yym46 _ = yym46
if false { if false {
@@ -15376,13 +15400,35 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
*((*bool)(yyv45)) = r.DecodeBool() *((*bool)(yyv45)) = r.DecodeBool()
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.HostIPC = false
} else {
yyv47 := &x.HostIPC
yym48 := z.DecBinary()
_ = yym48
if false {
} else {
*((*bool)(yyv47)) = r.DecodeBool()
}
}
yyj30++
if yyhl30 {
yyb30 = yyj30 > l
} else {
yyb30 = r.CheckBreak()
}
if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15390,16 +15436,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.SELinux = SELinuxStrategyOptions{} x.SELinux = SELinuxStrategyOptions{}
} else { } else {
yyv47 := &x.SELinux yyv49 := &x.SELinux
yyv47.CodecDecodeSelf(d) yyv49.CodecDecodeSelf(d)
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15407,16 +15453,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.RunAsUser = RunAsUserStrategyOptions{} x.RunAsUser = RunAsUserStrategyOptions{}
} else { } else {
yyv48 := &x.RunAsUser yyv50 := &x.RunAsUser
yyv48.CodecDecodeSelf(d) yyv50.CodecDecodeSelf(d)
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15424,16 +15470,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.SupplementalGroups = SupplementalGroupsStrategyOptions{} x.SupplementalGroups = SupplementalGroupsStrategyOptions{}
} else { } else {
yyv49 := &x.SupplementalGroups yyv51 := &x.SupplementalGroups
yyv49.CodecDecodeSelf(d) yyv51.CodecDecodeSelf(d)
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15441,16 +15487,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.FSGroup = FSGroupStrategyOptions{} x.FSGroup = FSGroupStrategyOptions{}
} else { } else {
yyv50 := &x.FSGroup yyv52 := &x.FSGroup
yyv50.CodecDecodeSelf(d) yyv52.CodecDecodeSelf(d)
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15458,26 +15504,48 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.ReadOnlyRootFilesystem = false x.ReadOnlyRootFilesystem = false
} else { } else {
yyv51 := &x.ReadOnlyRootFilesystem yyv53 := &x.ReadOnlyRootFilesystem
yym52 := z.DecBinary() yym54 := z.DecBinary()
_ = yym52 _ = yym54
if false { if false {
} else { } else {
*((*bool)(yyv51)) = r.DecodeBool() *((*bool)(yyv53)) = r.DecodeBool()
}
}
yyj30++
if yyhl30 {
yyb30 = yyj30 > l
} else {
yyb30 = r.CheckBreak()
}
if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.AllowedHostPaths = nil
} else {
yyv55 := &x.AllowedHostPaths
yym56 := z.DecBinary()
_ = yym56
if false {
} else {
z.F.DecSliceStringX(yyv55, false, d)
} }
} }
for { for {
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
break break
} }
z.DecSendContainerState(codecSelfer_containerArrayElem1234) z.DecSendContainerState(codecSelfer_containerArrayElem1234)
z.DecStructFieldNotFound(yyj28-1, "") z.DecStructFieldNotFound(yyj30-1, "")
} }
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
} }
@@ -21266,7 +21334,7 @@ func (x codecSelfer1234) decSlicePodSecurityPolicy(v *[]PodSecurityPolicy, d *co
yyrg1 := len(yyv1) > 0 yyrg1 := len(yyv1) > 0
yyv21 := yyv1 yyv21 := yyv1
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 560) yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 584)
if yyrt1 { if yyrt1 {
if yyrl1 <= cap(yyv1) { if yyrl1 <= cap(yyv1) {
yyv1 = yyv1[:yyrl1] yyv1 = yyv1[:yyrl1]

View File

@@ -909,6 +909,10 @@ type PodSecurityPolicySpec struct {
// will not be forced to. // will not be forced to.
// +optional // +optional
ReadOnlyRootFilesystem bool `json:"readOnlyRootFilesystem,omitempty" protobuf:"varint,14,opt,name=readOnlyRootFilesystem"` ReadOnlyRootFilesystem bool `json:"readOnlyRootFilesystem,omitempty" protobuf:"varint,14,opt,name=readOnlyRootFilesystem"`
// AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all
// host paths may be used.
// +optional
AllowedHostPaths []string `json:"allowedHostPaths,omitempty" protobuf:"bytes,15,opt,name=allowedHostPaths"`
} }
// FS Type gives strong typing to different file systems that are used by volumes. // FS Type gives strong typing to different file systems that are used by volumes.

View File

@@ -423,6 +423,7 @@ var map_PodSecurityPolicySpec = map[string]string{
"supplementalGroups": "SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext.", "supplementalGroups": "SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext.",
"fsGroup": "FSGroup is the strategy that will dictate what fs group is used by the SecurityContext.", "fsGroup": "FSGroup is the strategy that will dictate what fs group is used by the SecurityContext.",
"readOnlyRootFilesystem": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.", "readOnlyRootFilesystem": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.",
"allowedHostPaths": "AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all host paths may be used.",
} }
func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { func (PodSecurityPolicySpec) SwaggerDoc() map[string]string {

View File

@@ -1215,6 +1215,7 @@ func autoConvert_v1beta1_PodSecurityPolicySpec_To_extensions_PodSecurityPolicySp
return err return err
} }
out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem
out.AllowedHostPaths = *(*[]string)(unsafe.Pointer(&in.AllowedHostPaths))
return nil return nil
} }
@@ -1256,6 +1257,7 @@ func autoConvert_extensions_PodSecurityPolicySpec_To_v1beta1_PodSecurityPolicySp
return err return err
} }
out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem
out.AllowedHostPaths = *(*[]string)(unsafe.Pointer(&in.AllowedHostPaths))
return nil return nil
} }

View File

@@ -826,6 +826,11 @@ func DeepCopy_v1beta1_PodSecurityPolicySpec(in interface{}, out interface{}, c *
if err := DeepCopy_v1beta1_FSGroupStrategyOptions(&in.FSGroup, &out.FSGroup, c); err != nil { if err := DeepCopy_v1beta1_FSGroupStrategyOptions(&in.FSGroup, &out.FSGroup, c); err != nil {
return err return err
} }
if in.AllowedHostPaths != nil {
in, out := &in.AllowedHostPaths, &out.AllowedHostPaths
*out = make([]string, len(*in))
copy(*out, *in)
}
return nil return nil
} }
} }

View File

@@ -818,6 +818,11 @@ func DeepCopy_extensions_PodSecurityPolicySpec(in interface{}, out interface{},
if err := DeepCopy_extensions_FSGroupStrategyOptions(&in.FSGroup, &out.FSGroup, c); err != nil { if err := DeepCopy_extensions_FSGroupStrategyOptions(&in.FSGroup, &out.FSGroup, c); err != nil {
return err return err
} }
if in.AllowedHostPaths != nil {
in, out := &in.AllowedHostPaths, &out.AllowedHostPaths
*out = make([]string, len(*in))
copy(*out, *in)
}
return nil return nil
} }
} }

View File

@@ -241,6 +241,15 @@ func (s *simpleProvider) ValidatePodSecurityContext(pod *api.Pod, fldPath *field
allErrs = append(allErrs, field.Invalid( allErrs = append(allErrs, field.Invalid(
field.NewPath("spec", "volumes").Index(i), string(fsType), field.NewPath("spec", "volumes").Index(i), string(fsType),
fmt.Sprintf("%s volumes are not allowed to be used", string(fsType)))) fmt.Sprintf("%s volumes are not allowed to be used", string(fsType))))
continue
}
if fsType == extensions.HostPath {
if !psputil.PSPAllowsHostVolumePath(s.psp, v.HostPath.Path) {
allErrs = append(allErrs, field.Invalid(
field.NewPath("spec", "volumes").Index(i), string(fsType),
fmt.Sprintf("host path %s is not allowed to be used. allowed host paths: %v", v.HostPath.Path, s.psp.Spec.AllowedHostPaths)))
}
} }
} }
} }

View File

@@ -238,6 +238,21 @@ func TestValidatePodSecurityContextFailures(t *testing.T) {
}, },
} }
failHostPathDirPod := defaultPod()
failHostPathDirPod.Spec.Volumes = []api.Volume{
{
Name: "bad volume",
VolumeSource: api.VolumeSource{
HostPath: &api.HostPathVolumeSource{
Path: "/fail",
},
},
},
}
failHostPathDirPSP := defaultPSP()
failHostPathDirPSP.Spec.Volumes = []extensions.FSType{extensions.HostPath}
failHostPathDirPSP.Spec.AllowedHostPaths = []string{"/foo/bar"}
failOtherSysctlsAllowedPSP := defaultPSP() failOtherSysctlsAllowedPSP := defaultPSP()
failOtherSysctlsAllowedPSP.Annotations[extensions.SysctlsPodSecurityPolicyAnnotationKey] = "bar,abc" failOtherSysctlsAllowedPSP.Annotations[extensions.SysctlsPodSecurityPolicyAnnotationKey] = "bar,abc"
@@ -308,6 +323,11 @@ func TestValidatePodSecurityContextFailures(t *testing.T) {
psp: defaultPSP(), psp: defaultPSP(),
expectedError: "hostPath volumes are not allowed to be used", expectedError: "hostPath volumes are not allowed to be used",
}, },
"failHostPathDirPSP": {
pod: failHostPathDirPod,
psp: failHostPathDirPSP,
expectedError: "host path /fail is not allowed to be used. allowed host paths: [/foo/bar]",
},
"failSafeSysctlFooPod with failNoSysctlAllowedSCC": { "failSafeSysctlFooPod with failNoSysctlAllowedSCC": {
pod: failSafeSysctlFooPod, pod: failSafeSysctlFooPod,
psp: failNoSysctlAllowedPSP, psp: failNoSysctlAllowedPSP,
@@ -706,13 +726,28 @@ func TestValidateContainerSecurityContextSuccess(t *testing.T) {
hostDirPod := defaultPod() hostDirPod := defaultPod()
hostDirPod.Spec.Volumes = []api.Volume{ hostDirPod.Spec.Volumes = []api.Volume{
{ {
Name: "bad volume", Name: "good volume",
VolumeSource: api.VolumeSource{ VolumeSource: api.VolumeSource{
HostPath: &api.HostPathVolumeSource{}, HostPath: &api.HostPathVolumeSource{},
}, },
}, },
} }
hostPathDirPod := defaultPod()
hostPathDirPod.Spec.Volumes = []api.Volume{
{
Name: "good volume",
VolumeSource: api.VolumeSource{
HostPath: &api.HostPathVolumeSource{
Path: "/foo/bar/baz",
},
},
},
}
hostPathDirPSP := defaultPSP()
hostPathDirPSP.Spec.Volumes = []extensions.FSType{extensions.HostPath}
hostPathDirPSP.Spec.AllowedHostPaths = []string{"/foo/bar"}
hostPortPSP := defaultPSP() hostPortPSP := defaultPSP()
hostPortPSP.Spec.HostPorts = []extensions.HostPortRange{{Min: 1, Max: 1}} hostPortPSP.Spec.HostPorts = []extensions.HostPortRange{{Min: 1, Max: 1}}
hostPortPod := defaultPod() hostPortPod := defaultPod()
@@ -773,6 +808,10 @@ func TestValidateContainerSecurityContextSuccess(t *testing.T) {
pod: hostDirPod, pod: hostDirPod,
psp: hostDirPSP, psp: hostDirPSP,
}, },
"pass hostDir allowed directory validating PSP": {
pod: hostPathDirPod,
psp: hostPathDirPSP,
},
"pass hostPort validating PSP": { "pass hostPort validating PSP": {
pod: hostPortPod, pod: hostPortPod,
psp: hostPortPSP, psp: hostPortPSP,

View File

@@ -18,6 +18,7 @@ package util
import ( import (
"fmt" "fmt"
"strings"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
@@ -168,3 +169,52 @@ func UserFallsInRange(id types.UnixUserID, rng extensions.UserIDRange) bool {
func GroupFallsInRange(id types.UnixGroupID, rng extensions.GroupIDRange) bool { func GroupFallsInRange(id types.UnixGroupID, rng extensions.GroupIDRange) bool {
return id >= rng.Min && id <= rng.Max return id >= rng.Min && id <= rng.Max
} }
// PSPAllowsHostVolumePath is a utility for checking if a PSP allows the host volume path.
// This only checks the path. You should still check to make sure the host volume fs type is allowed.
func PSPAllowsHostVolumePath(psp *extensions.PodSecurityPolicy, hostPath string) bool {
if psp == nil {
return false
}
// If no allowed paths are specified then allow any path
if len(psp.Spec.AllowedHostPaths) == 0 {
return true
}
for _, allowedPath := range psp.Spec.AllowedHostPaths {
if hasPathPrefix(hostPath, allowedPath) {
return true
}
}
return false
}
// hasPathPrefix returns true if the string matches pathPrefix exactly, or if is prefixed with pathPrefix at a path segment boundary
// the string and pathPrefix are both normalized to remove trailing slashes prior to checking.
func hasPathPrefix(s, pathPrefix string) bool {
s = strings.TrimSuffix(s, "/")
pathPrefix = strings.TrimSuffix(pathPrefix, "/")
// Short circuit if s doesn't contain the prefix at all
if !strings.HasPrefix(s, pathPrefix) {
return false
}
pathPrefixLength := len(pathPrefix)
if len(s) == pathPrefixLength {
// Exact match
return true
}
if s[pathPrefixLength:pathPrefixLength+1] == "/" {
// The next character in s is a path segment boundary
// Check this instead of normalizing pathPrefix to avoid allocating on every call
return true
}
return false
}

View File

@@ -103,3 +103,83 @@ func TestPSPAllowsFSType(t *testing.T) {
} }
} }
} }
func TestPSPAllowsHostVolumePath(t *testing.T) {
tests := map[string]struct {
psp *extensions.PodSecurityPolicy
path string
allows bool
}{
"nil psp": {
psp: nil,
path: "/test",
allows: false,
},
"empty allowed paths": {
psp: &extensions.PodSecurityPolicy{},
path: "/test",
allows: true,
},
"non-matching": {
psp: &extensions.PodSecurityPolicy{
Spec: extensions.PodSecurityPolicySpec{
AllowedHostPaths: []string{"/foo"},
},
},
path: "/foobar",
allows: false,
},
"match on direct match": {
psp: &extensions.PodSecurityPolicy{
Spec: extensions.PodSecurityPolicySpec{
AllowedHostPaths: []string{"/foo"},
},
},
path: "/foo",
allows: true,
},
"match with trailing slash on host path": {
psp: &extensions.PodSecurityPolicy{
Spec: extensions.PodSecurityPolicySpec{
AllowedHostPaths: []string{"/foo"},
},
},
path: "/foo/",
allows: true,
},
"match with trailing slash on allowed path": {
psp: &extensions.PodSecurityPolicy{
Spec: extensions.PodSecurityPolicySpec{
AllowedHostPaths: []string{"/foo/"},
},
},
path: "/foo",
allows: true,
},
"match child directory": {
psp: &extensions.PodSecurityPolicy{
Spec: extensions.PodSecurityPolicySpec{
AllowedHostPaths: []string{"/foo/"},
},
},
path: "/foo/bar",
allows: true,
},
"non-matching parent directory": {
psp: &extensions.PodSecurityPolicy{
Spec: extensions.PodSecurityPolicySpec{
AllowedHostPaths: []string{"/foo/bar"},
},
},
path: "/foo",
allows: false,
},
}
for k, v := range tests {
allows := PSPAllowsHostVolumePath(v.psp, v.path)
if v.allows != allows {
t.Errorf("%s expected PSPAllowsHostVolumePath to return %t but got %t", k, v.allows, allows)
}
}
}

View File

@@ -884,6 +884,10 @@ type PodSecurityPolicySpec struct {
// will not be forced to. // will not be forced to.
// +optional // +optional
ReadOnlyRootFilesystem bool ReadOnlyRootFilesystem bool
// AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all
// host paths may be used.
// +optional
AllowedHostPaths []string
} }
// HostPortRange defines a range of host ports that will be enabled by a policy // HostPortRange defines a range of host ports that will be enabled by a policy

View File

@@ -1988,6 +1988,21 @@ func (m *PodSecurityPolicySpec) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0 dAtA[i] = 0
} }
i++ i++
if len(m.AllowedHostPaths) > 0 {
for _, s := range m.AllowedHostPaths {
dAtA[i] = 0x7a
i++
l = len(s)
for l >= 1<<7 {
dAtA[i] = uint8(uint64(l)&0x7f | 0x80)
l >>= 7
i++
}
dAtA[i] = uint8(l)
i++
i += copy(dAtA[i:], s)
}
}
return i, nil return i, nil
} }
@@ -3239,6 +3254,12 @@ func (m *PodSecurityPolicySpec) Size() (n int) {
l = m.FSGroup.Size() l = m.FSGroup.Size()
n += 1 + l + sovGenerated(uint64(l)) n += 1 + l + sovGenerated(uint64(l))
n += 2 n += 2
if len(m.AllowedHostPaths) > 0 {
for _, s := range m.AllowedHostPaths {
l = len(s)
n += 1 + l + sovGenerated(uint64(l))
}
}
return n return n
} }
@@ -3971,6 +3992,7 @@ func (this *PodSecurityPolicySpec) String() string {
`SupplementalGroups:` + strings.Replace(strings.Replace(this.SupplementalGroups.String(), "SupplementalGroupsStrategyOptions", "SupplementalGroupsStrategyOptions", 1), `&`, ``, 1) + `,`, `SupplementalGroups:` + strings.Replace(strings.Replace(this.SupplementalGroups.String(), "SupplementalGroupsStrategyOptions", "SupplementalGroupsStrategyOptions", 1), `&`, ``, 1) + `,`,
`FSGroup:` + strings.Replace(strings.Replace(this.FSGroup.String(), "FSGroupStrategyOptions", "FSGroupStrategyOptions", 1), `&`, ``, 1) + `,`, `FSGroup:` + strings.Replace(strings.Replace(this.FSGroup.String(), "FSGroupStrategyOptions", "FSGroupStrategyOptions", 1), `&`, ``, 1) + `,`,
`ReadOnlyRootFilesystem:` + fmt.Sprintf("%v", this.ReadOnlyRootFilesystem) + `,`, `ReadOnlyRootFilesystem:` + fmt.Sprintf("%v", this.ReadOnlyRootFilesystem) + `,`,
`AllowedHostPaths:` + fmt.Sprintf("%v", this.AllowedHostPaths) + `,`,
`}`, `}`,
}, "") }, "")
return s return s
@@ -9370,6 +9392,35 @@ func (m *PodSecurityPolicySpec) Unmarshal(dAtA []byte) error {
} }
} }
m.ReadOnlyRootFilesystem = bool(v != 0) m.ReadOnlyRootFilesystem = bool(v != 0)
case 15:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field AllowedHostPaths", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= (uint64(b) & 0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + intStringLen
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.AllowedHostPaths = append(m.AllowedHostPaths, string(dAtA[iNdEx:postIndex]))
iNdEx = postIndex
default: default:
iNdEx = preIndex iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:]) skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -11822,217 +11873,219 @@ func init() {
} }
var fileDescriptorGenerated = []byte{ var fileDescriptorGenerated = []byte{
// 3390 bytes of a gzipped FileDescriptorProto // 3412 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0x4b, 0x6f, 0x1c, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0xdd, 0x6f, 0x1c, 0x57,
0xb5, 0x56, 0xcf, 0x43, 0x1c, 0x1e, 0x8a, 0xa4, 0x58, 0x94, 0xa9, 0x31, 0x6d, 0x93, 0x72, 0x5f, 0x15, 0xcf, 0x78, 0xbd, 0xf1, 0xfa, 0x6c, 0x6c, 0xc7, 0xd7, 0xae, 0xb3, 0x75, 0x5b, 0x3b, 0x1d,
0x5c, 0x5b, 0xbe, 0xd7, 0x1e, 0x5e, 0xcb, 0x57, 0x8e, 0x2d, 0xdb, 0xb2, 0x39, 0xa4, 0x1e, 0x0c, 0x44, 0x9b, 0x42, 0xbb, 0xa6, 0x29, 0x29, 0x6d, 0xda, 0xa6, 0xf5, 0xda, 0xf9, 0x30, 0xb2, 0x9d,
0x48, 0x6a, 0x5c, 0x33, 0x14, 0x62, 0xf9, 0x95, 0xe6, 0x4c, 0x71, 0xd8, 0x52, 0xbf, 0xdc, 0x5d, 0xed, 0xdd, 0x75, 0x44, 0xd3, 0x2f, 0xc6, 0xbb, 0xd7, 0xeb, 0x49, 0xe6, 0xab, 0x33, 0x77, 0x5c,
0x4d, 0x73, 0x60, 0x24, 0x31, 0x10, 0xc4, 0xcb, 0x20, 0xd9, 0x04, 0x0e, 0x90, 0x2c, 0xb3, 0xc8, 0xaf, 0x2a, 0xa0, 0x12, 0xa2, 0x0f, 0x3c, 0x20, 0x78, 0x41, 0x45, 0x82, 0x47, 0x1e, 0x78, 0x81,
0x26, 0xb1, 0x17, 0x89, 0x93, 0x5f, 0x10, 0x2d, 0x82, 0xc0, 0x01, 0x12, 0xc0, 0x08, 0x1c, 0x22, 0xf6, 0x01, 0x0a, 0x7f, 0x01, 0x79, 0x40, 0xa8, 0x48, 0x20, 0x55, 0xa8, 0x58, 0xc4, 0x15, 0xfd,
0xa2, 0x11, 0xff, 0x81, 0xc4, 0x1b, 0xad, 0x82, 0xaa, 0xae, 0x7e, 0x77, 0x53, 0x9a, 0xa1, 0x34, 0x07, 0xa0, 0x2f, 0x79, 0x42, 0xf7, 0xce, 0x9d, 0xef, 0x19, 0x27, 0xbb, 0x4e, 0x56, 0x48, 0xbc,
0x08, 0x90, 0x1d, 0xa7, 0xea, 0x9c, 0xef, 0x3c, 0xea, 0xd4, 0xa9, 0x53, 0x75, 0x9a, 0xf0, 0xd2, 0xed, 0xdc, 0x7b, 0xce, 0xef, 0x7c, 0xdc, 0x73, 0xcf, 0x3d, 0xf7, 0x63, 0xe1, 0x85, 0xeb, 0xcf,
0x8d, 0xe7, 0x9c, 0x9a, 0x6a, 0x2e, 0xdc, 0x70, 0x37, 0x89, 0x6d, 0x10, 0x4a, 0x9c, 0x05, 0xeb, 0x38, 0x55, 0xd5, 0x5c, 0xb8, 0xee, 0x6e, 0x12, 0xdb, 0x20, 0x94, 0x38, 0x0b, 0xd6, 0xf5, 0xce,
0x46, 0x77, 0x41, 0xb1, 0x54, 0x67, 0x81, 0xec, 0x52, 0x62, 0x38, 0xaa, 0x69, 0x38, 0x0b, 0x3b, 0x82, 0x62, 0xa9, 0xce, 0x02, 0xd9, 0xa5, 0xc4, 0x70, 0x54, 0xd3, 0x70, 0x16, 0x76, 0x9e, 0xdc,
0x4f, 0x6f, 0x12, 0xaa, 0x3c, 0xbd, 0xd0, 0x25, 0x06, 0xb1, 0x15, 0x4a, 0x3a, 0x35, 0xcb, 0x36, 0x24, 0x54, 0x79, 0x72, 0xa1, 0x43, 0x0c, 0x62, 0x2b, 0x94, 0xb4, 0xab, 0x96, 0x6d, 0x52, 0x13,
0xa9, 0x89, 0x9e, 0xf2, 0xd8, 0x6b, 0x21, 0x7b, 0xcd, 0xba, 0xd1, 0xad, 0x31, 0xf6, 0x5a, 0xc8, 0x3d, 0xe1, 0xb1, 0x57, 0x43, 0xf6, 0xaa, 0x75, 0xbd, 0x53, 0x65, 0xec, 0xd5, 0x90, 0xbd, 0x2a,
0x5e, 0x13, 0xec, 0xb3, 0x4f, 0x75, 0x55, 0xba, 0xed, 0x6e, 0xd6, 0xda, 0xa6, 0xbe, 0xd0, 0x35, 0xd8, 0x67, 0x9f, 0xe8, 0xa8, 0x74, 0xdb, 0xdd, 0xac, 0xb6, 0x4c, 0x7d, 0xa1, 0x63, 0x76, 0xcc,
0xbb, 0xe6, 0x02, 0x47, 0xd9, 0x74, 0xb7, 0xf8, 0x2f, 0xfe, 0x83, 0xff, 0xe5, 0xa1, 0xcf, 0xfe, 0x05, 0x8e, 0xb2, 0xe9, 0x6e, 0xf1, 0x2f, 0xfe, 0xc1, 0x7f, 0x79, 0xe8, 0xb3, 0x5f, 0x17, 0xca,
0xbf, 0x50, 0x4e, 0xb1, 0x54, 0x5d, 0x69, 0x6f, 0xab, 0x06, 0xb1, 0x7b, 0xbe, 0x7a, 0x0b, 0x36, 0x29, 0x96, 0xaa, 0x2b, 0xad, 0x6d, 0xd5, 0x20, 0x76, 0xd7, 0x57, 0x6f, 0xc1, 0x26, 0x8e, 0xe9,
0x71, 0x4c, 0xd7, 0x6e, 0x93, 0xa4, 0x4e, 0x07, 0x72, 0x39, 0x0b, 0x3a, 0xa1, 0xca, 0xc2, 0x4e, 0xda, 0x2d, 0x92, 0xd4, 0xe9, 0x40, 0x2e, 0x67, 0x41, 0x27, 0x54, 0x59, 0xd8, 0x49, 0x59, 0x32,
0xca, 0x92, 0xd9, 0x85, 0x3c, 0x2e, 0xdb, 0x35, 0xa8, 0xaa, 0xa7, 0xc5, 0x3c, 0x7b, 0x27, 0x06, 0xbb, 0x90, 0xc7, 0x65, 0xbb, 0x06, 0x55, 0xf5, 0xb4, 0x98, 0xa7, 0x6f, 0xc7, 0xe0, 0xb4, 0xb6,
0xa7, 0xbd, 0x4d, 0x74, 0x25, 0xc5, 0xf7, 0x4c, 0x1e, 0x9f, 0x4b, 0x55, 0x6d, 0x41, 0x35, 0xa8, 0x89, 0xae, 0xa4, 0xf8, 0x9e, 0xca, 0xe3, 0x73, 0xa9, 0xaa, 0x2d, 0xa8, 0x06, 0x75, 0xa8, 0x9d,
0x43, 0xed, 0x14, 0xd3, 0x93, 0xb9, 0xcb, 0x94, 0x65, 0xcb, 0xf3, 0x07, 0x2c, 0xaa, 0x65, 0x6a, 0x62, 0x7a, 0x3c, 0x77, 0x98, 0xb2, 0x6c, 0x79, 0xf6, 0x80, 0x41, 0xb5, 0x4c, 0x4d, 0x6d, 0x75,
0x6a, 0xbb, 0x97, 0xb7, 0xa0, 0x72, 0x0d, 0x60, 0xb1, 0xb1, 0x72, 0x95, 0xd8, 0x6c, 0xe1, 0xd0, 0xf3, 0x06, 0x54, 0xae, 0x02, 0x2c, 0xd6, 0x57, 0xae, 0x10, 0x9b, 0x0d, 0x1c, 0x3a, 0x09, 0xc3,
0x29, 0x28, 0x19, 0x8a, 0x4e, 0xaa, 0xd2, 0x29, 0xe9, 0xf4, 0x68, 0xfd, 0xd8, 0xcd, 0xbd, 0xf9, 0x86, 0xa2, 0x93, 0x8a, 0x74, 0x52, 0x3a, 0x35, 0x5a, 0x3b, 0x76, 0x63, 0x6f, 0xfe, 0xc8, 0xfe,
0x23, 0xfb, 0x7b, 0xf3, 0xa5, 0x75, 0x45, 0x27, 0x98, 0xcf, 0xc8, 0x3f, 0x96, 0xe0, 0xc1, 0x25, 0xde, 0xfc, 0xf0, 0xba, 0xa2, 0x13, 0xcc, 0x7b, 0xe4, 0x9f, 0x49, 0x70, 0xff, 0x92, 0xeb, 0x50,
0xd7, 0xa1, 0xa6, 0xbe, 0x46, 0xa8, 0xad, 0xb6, 0x97, 0x5c, 0xdb, 0x26, 0x06, 0x6d, 0x52, 0x85, 0x53, 0x5f, 0x23, 0xd4, 0x56, 0x5b, 0x4b, 0xae, 0x6d, 0x13, 0x83, 0x36, 0xa8, 0x42, 0x5d, 0xe7,
0xba, 0xce, 0x9d, 0xf9, 0xd1, 0x35, 0x28, 0xef, 0x28, 0x9a, 0x4b, 0xaa, 0x85, 0x53, 0xd2, 0xe9, 0xf6, 0xfc, 0xe8, 0x2a, 0x14, 0x77, 0x14, 0xcd, 0x25, 0x95, 0xa1, 0x93, 0xd2, 0xa9, 0xf2, 0xe9,
0xb1, 0x33, 0xb5, 0x9a, 0x08, 0xa8, 0xa8, 0x77, 0xfc, 0x90, 0xaa, 0xf9, 0x4b, 0x5e, 0x7b, 0xd5, 0x6a, 0x55, 0x04, 0x54, 0xd4, 0x3b, 0x7e, 0x48, 0x55, 0xfd, 0x21, 0xaf, 0xbe, 0xec, 0x2a, 0x06,
0x55, 0x0c, 0xaa, 0xd2, 0x5e, 0xfd, 0x84, 0x80, 0x3c, 0x26, 0xe4, 0x5e, 0x65, 0x58, 0xd8, 0x83, 0x55, 0x69, 0xb7, 0x36, 0x2d, 0x20, 0x8f, 0x09, 0xb9, 0x57, 0x18, 0x16, 0xf6, 0x20, 0xe5, 0x1f,
0x94, 0xbf, 0x2f, 0xc1, 0x23, 0xb9, 0xba, 0xad, 0xaa, 0x0e, 0x45, 0x3a, 0x94, 0x55, 0x4a, 0x74, 0x49, 0xf0, 0x50, 0xae, 0x6e, 0xab, 0xaa, 0x43, 0x91, 0x0e, 0x45, 0x95, 0x12, 0xdd, 0xa9, 0x48,
0xa7, 0x2a, 0x9d, 0x2a, 0x9e, 0x1e, 0x3b, 0x73, 0xb9, 0xd6, 0x57, 0x38, 0xd7, 0x72, 0xc1, 0xeb, 0x27, 0x0b, 0xa7, 0xca, 0xa7, 0x2f, 0x55, 0x7b, 0x0a, 0xe7, 0x6a, 0x2e, 0x78, 0x6d, 0x4c, 0xe8,
0xe3, 0x42, 0xaf, 0xf2, 0x0a, 0x83, 0xc7, 0x9e, 0x14, 0xf9, 0x87, 0x12, 0xa0, 0x28, 0x4f, 0x4b, 0x55, 0x5c, 0x61, 0xf0, 0xd8, 0x93, 0x22, 0xff, 0x44, 0x02, 0x14, 0xe5, 0x69, 0x2a, 0x76, 0x87,
0xb1, 0xbb, 0x84, 0xde, 0x85, 0x97, 0x5e, 0x3b, 0x9c, 0x97, 0xa6, 0x05, 0xe4, 0x98, 0x27, 0x30, 0xd0, 0x3b, 0xf0, 0xd2, 0x2b, 0x87, 0xf3, 0xd2, 0x94, 0x80, 0x2c, 0x7b, 0x02, 0x63, 0x4e, 0x7a,
0xe6, 0xa4, 0xf7, 0x25, 0x98, 0x49, 0xeb, 0xc4, 0xbd, 0xb3, 0x15, 0xf7, 0xce, 0xe2, 0x21, 0xbc, 0x57, 0x82, 0x99, 0xb4, 0x4e, 0xdc, 0x3b, 0x5b, 0x71, 0xef, 0x2c, 0x1e, 0xc2, 0x3b, 0x1e, 0x6a,
0xe3, 0xa1, 0xe6, 0xb8, 0xe5, 0x57, 0x05, 0x18, 0x5d, 0x56, 0x88, 0x6e, 0x1a, 0x4d, 0x42, 0xd1, 0x8e, 0x5b, 0x7e, 0x3b, 0x04, 0xa3, 0xcb, 0x0a, 0xd1, 0x4d, 0xa3, 0x41, 0x28, 0xfa, 0x36, 0x94,
0x37, 0xa1, 0xc2, 0xf6, 0x68, 0x47, 0xa1, 0x0a, 0xf7, 0xc8, 0xd8, 0x99, 0xff, 0x3b, 0xc8, 0x5c, 0xd8, 0x1c, 0x6d, 0x2b, 0x54, 0xe1, 0x1e, 0x29, 0x9f, 0xfe, 0xda, 0x41, 0xe6, 0x3a, 0x55, 0x46,
0xa7, 0xc6, 0xa8, 0x6b, 0x3b, 0x4f, 0xd7, 0xae, 0x6c, 0x5e, 0x27, 0x6d, 0xba, 0x46, 0xa8, 0x52, 0x5d, 0xdd, 0x79, 0xb2, 0x7a, 0x79, 0xf3, 0x1a, 0x69, 0xd1, 0x35, 0x42, 0x95, 0x1a, 0x12, 0x72,
0x47, 0x42, 0x0e, 0x84, 0x63, 0x38, 0x40, 0x45, 0x6f, 0x41, 0xc9, 0xb1, 0x48, 0x5b, 0x38, 0xf3, 0x20, 0x6c, 0xc3, 0x01, 0x2a, 0x7a, 0x03, 0x86, 0x1d, 0x8b, 0xb4, 0x84, 0x33, 0x9f, 0xef, 0xd1,
0xc5, 0x3e, 0xcd, 0x0a, 0x34, 0x6d, 0x5a, 0xa4, 0x1d, 0xae, 0x16, 0xfb, 0x85, 0x39, 0x2e, 0xda, 0xac, 0x40, 0xd3, 0x86, 0x45, 0x5a, 0xe1, 0x68, 0xb1, 0x2f, 0xcc, 0x71, 0xd1, 0x16, 0x1c, 0x75,
0x82, 0xa3, 0x0e, 0x0f, 0x83, 0x6a, 0x91, 0x4b, 0x38, 0x3f, 0xb0, 0x04, 0x2f, 0x98, 0x26, 0x84, 0x78, 0x18, 0x54, 0x0a, 0x5c, 0xc2, 0xb9, 0xbe, 0x25, 0x78, 0xc1, 0x34, 0x2e, 0x64, 0x1c, 0xf5,
0x8c, 0xa3, 0xde, 0x6f, 0x2c, 0xd0, 0xe5, 0xdf, 0x4b, 0x30, 0x1e, 0xd0, 0xf2, 0x15, 0x7b, 0x23, 0xbe, 0xb1, 0x40, 0x97, 0xff, 0x24, 0xc1, 0x58, 0x40, 0xcb, 0x47, 0xec, 0xb5, 0x94, 0xef, 0xaa,
0xe5, 0xbb, 0xda, 0xdd, 0xf9, 0x8e, 0x71, 0x73, 0xcf, 0x1d, 0x17, 0xb2, 0x2a, 0xfe, 0x48, 0xc4, 0x77, 0xe6, 0x3b, 0xc6, 0xcd, 0x3d, 0x77, 0x5c, 0xc8, 0x2a, 0xf9, 0x2d, 0x11, 0xbf, 0xbd, 0xee,
0x6f, 0x6f, 0xfa, 0xf1, 0x50, 0xe0, 0xf1, 0xf0, 0xdc, 0xa0, 0x66, 0xe5, 0x84, 0xc1, 0x17, 0xc5, 0xc7, 0xc3, 0x10, 0x8f, 0x87, 0x67, 0xfa, 0x35, 0x2b, 0x27, 0x0c, 0x3e, 0x2b, 0x44, 0xcc, 0x61,
0x88, 0x39, 0xcc, 0x9d, 0xe8, 0x4d, 0xa8, 0x38, 0x44, 0x23, 0x6d, 0x6a, 0xda, 0xc2, 0x9c, 0x67, 0xee, 0x44, 0xaf, 0x43, 0xc9, 0x21, 0x1a, 0x69, 0x51, 0xd3, 0x16, 0xe6, 0x3c, 0x75, 0x87, 0xe6,
0xee, 0xd2, 0x1c, 0x65, 0x93, 0x68, 0x4d, 0xc1, 0x5a, 0x3f, 0xc6, 0xec, 0xf1, 0x7f, 0xe1, 0x00, 0x28, 0x9b, 0x44, 0x6b, 0x08, 0xd6, 0xda, 0x31, 0x66, 0x8f, 0xff, 0x85, 0x03, 0x48, 0xf4, 0x2a,
0x12, 0xbd, 0x0e, 0x15, 0x4a, 0x74, 0x4b, 0x53, 0xa8, 0xbf, 0xb1, 0x9e, 0xca, 0x37, 0x89, 0xc1, 0x94, 0x28, 0xd1, 0x2d, 0x4d, 0xa1, 0xfe, 0xc4, 0x7a, 0x22, 0xdf, 0x24, 0x06, 0x5b, 0x37, 0xdb,
0x36, 0xcc, 0x4e, 0x4b, 0x30, 0xf0, 0xc5, 0x0f, 0x9c, 0xe5, 0x8f, 0xe2, 0x00, 0x10, 0x7d, 0x20, 0x4d, 0xc1, 0xc0, 0x07, 0x3f, 0x70, 0x96, 0xdf, 0x8a, 0x03, 0x40, 0xf4, 0x9e, 0x04, 0xe3, 0xae,
0xc1, 0x84, 0x6b, 0x75, 0x18, 0x29, 0x65, 0x09, 0xb6, 0xdb, 0x13, 0xd1, 0x70, 0x71, 0x50, 0xb7, 0xd5, 0x66, 0xa4, 0x94, 0x25, 0xd8, 0x4e, 0x57, 0x44, 0xc3, 0x85, 0x7e, 0xdd, 0xb6, 0x11, 0x43,
0x6d, 0xc4, 0xd0, 0xea, 0x33, 0x42, 0xf8, 0x44, 0x7c, 0x1c, 0x27, 0xa4, 0xa2, 0x45, 0x98, 0xd4, 0xab, 0xcd, 0x08, 0xe1, 0xe3, 0xf1, 0x76, 0x9c, 0x90, 0x8a, 0x16, 0x61, 0x42, 0x57, 0x0d, 0x4c,
0x55, 0x03, 0x13, 0xa5, 0xd3, 0x6b, 0x92, 0xb6, 0x69, 0x74, 0x9c, 0x6a, 0xe9, 0x94, 0x74, 0xba, 0x94, 0x76, 0xb7, 0x41, 0x5a, 0xa6, 0xd1, 0x76, 0x2a, 0xc3, 0x27, 0xa5, 0x53, 0xc5, 0xda, 0x09,
0x5c, 0x3f, 0x29, 0x00, 0x26, 0xd7, 0xe2, 0xd3, 0x38, 0x49, 0x8f, 0xbe, 0x0e, 0xc8, 0xb7, 0xeb, 0x01, 0x30, 0xb1, 0x16, 0xef, 0xc6, 0x49, 0x7a, 0xf4, 0x4d, 0x40, 0xbe, 0x5d, 0x17, 0xbd, 0xf5,
0x92, 0x77, 0x5e, 0xa8, 0xa6, 0x51, 0x2d, 0x9f, 0x92, 0x4e, 0x17, 0xeb, 0xb3, 0x02, 0x05, 0xb5, 0x42, 0x35, 0x8d, 0x4a, 0xf1, 0xa4, 0x74, 0xaa, 0x50, 0x9b, 0x15, 0x28, 0xa8, 0x99, 0xa2, 0xc0,
0x52, 0x14, 0x38, 0x83, 0x4b, 0xfe, 0x67, 0x09, 0x26, 0x13, 0x01, 0x8e, 0xae, 0xc2, 0x4c, 0xdb, 0x19, 0x5c, 0xf2, 0x7f, 0x86, 0x61, 0x22, 0x11, 0xe0, 0xe8, 0x0a, 0xcc, 0xb4, 0xbc, 0xf4, 0xb9,
0x4b, 0x9f, 0xeb, 0xae, 0xbe, 0x49, 0xec, 0x66, 0x7b, 0x9b, 0x74, 0x5c, 0x8d, 0x74, 0xf8, 0xaa, 0xee, 0xea, 0x9b, 0xc4, 0x6e, 0xb4, 0xb6, 0x49, 0xdb, 0xd5, 0x48, 0x9b, 0x8f, 0x7a, 0xb1, 0x36,
0x97, 0xeb, 0x73, 0x42, 0xc6, 0xcc, 0x52, 0x26, 0x15, 0xce, 0xe1, 0x66, 0x7a, 0x1b, 0x7c, 0x68, 0x27, 0x64, 0xcc, 0x2c, 0x65, 0x52, 0xe1, 0x1c, 0x6e, 0xa6, 0xb7, 0xc1, 0x9b, 0xd6, 0x54, 0xc7,
0x4d, 0x75, 0x9c, 0x00, 0xb3, 0xc0, 0x31, 0x03, 0xbd, 0xd7, 0x53, 0x14, 0x38, 0x83, 0x8b, 0xe9, 0x09, 0x30, 0x87, 0x38, 0x66, 0xa0, 0xf7, 0x7a, 0x8a, 0x02, 0x67, 0x70, 0x31, 0x1d, 0xdb, 0xc4,
0xd8, 0x21, 0x8e, 0x6a, 0x93, 0x4e, 0x52, 0xc7, 0x62, 0x5c, 0xc7, 0xe5, 0x4c, 0x2a, 0x9c, 0xc3, 0x51, 0x6d, 0xd2, 0x4e, 0xea, 0x58, 0x88, 0xeb, 0xb8, 0x9c, 0x49, 0x85, 0x73, 0xb8, 0xd1, 0x19,
0x8d, 0xce, 0xc2, 0x98, 0x27, 0x8d, 0x7b, 0x5c, 0x2c, 0x4d, 0x90, 0xb0, 0xd7, 0xc3, 0x29, 0x1c, 0x28, 0x7b, 0xd2, 0xb8, 0xc7, 0xc5, 0xd0, 0x04, 0x09, 0x7b, 0x3d, 0xec, 0xc2, 0x51, 0x3a, 0x66,
0xa5, 0x63, 0xa6, 0x99, 0x9b, 0x0e, 0xb1, 0x77, 0x48, 0x27, 0x7f, 0x49, 0xae, 0xa4, 0x28, 0x70, 0x9a, 0xb9, 0xe9, 0x10, 0x7b, 0x87, 0xb4, 0xf3, 0x87, 0xe4, 0x72, 0x8a, 0x02, 0x67, 0x70, 0x31,
0x06, 0x17, 0x33, 0xcd, 0x8b, 0x99, 0x94, 0x69, 0x47, 0xe3, 0xa6, 0x6d, 0x64, 0x52, 0xe1, 0x1c, 0xd3, 0xbc, 0x98, 0x49, 0x99, 0x76, 0x34, 0x6e, 0xda, 0x46, 0x26, 0x15, 0xce, 0xe1, 0x66, 0x91,
0x6e, 0x16, 0x79, 0x9e, 0xca, 0x8b, 0x3b, 0x8a, 0xaa, 0x29, 0x9b, 0x1a, 0xa9, 0x8e, 0xc4, 0x23, 0xe7, 0xa9, 0xbc, 0xb8, 0xa3, 0xa8, 0x9a, 0xb2, 0xa9, 0x91, 0xca, 0x48, 0x3c, 0xf2, 0xd6, 0xe3,
0x6f, 0x3d, 0x3e, 0x8d, 0x93, 0xf4, 0xe8, 0x12, 0x4c, 0x79, 0x43, 0x1b, 0x86, 0x12, 0x80, 0x54, 0xdd, 0x38, 0x49, 0x8f, 0x2e, 0xc2, 0xa4, 0xd7, 0xb4, 0x61, 0x28, 0x01, 0x48, 0x89, 0x83, 0xdc,
0x38, 0xc8, 0x83, 0x02, 0x64, 0x6a, 0x3d, 0x49, 0x80, 0xd3, 0x3c, 0xf2, 0x5f, 0x24, 0x38, 0x99, 0x2f, 0x40, 0x26, 0xd7, 0x93, 0x04, 0x38, 0xcd, 0x23, 0xff, 0x5d, 0x82, 0x13, 0x39, 0x33, 0x09,
0xb3, 0x93, 0xd0, 0xcb, 0x50, 0xa2, 0x3d, 0xcb, 0x3f, 0x7f, 0xff, 0xd7, 0xcf, 0xe8, 0xad, 0x9e, 0xbd, 0x08, 0xc3, 0xb4, 0x6b, 0xf9, 0xeb, 0xef, 0x57, 0xfd, 0x8c, 0xde, 0xec, 0x5a, 0xe4, 0xd6,
0x45, 0x6e, 0xef, 0xcd, 0x3f, 0x94, 0xc3, 0xc6, 0xa6, 0x31, 0x67, 0x44, 0xdf, 0x86, 0x71, 0xdb, 0xde, 0xfc, 0x03, 0x39, 0x6c, 0xac, 0x1b, 0x73, 0x46, 0xf4, 0x5d, 0x18, 0xb3, 0x4d, 0x4d, 0x53,
0xd4, 0x34, 0xd5, 0xe8, 0x7a, 0x24, 0x22, 0x9b, 0x5c, 0xe8, 0x73, 0xa7, 0xe3, 0x28, 0x46, 0x98, 0x8d, 0x8e, 0x47, 0x22, 0xb2, 0xc9, 0xf9, 0x1e, 0x67, 0x3a, 0x8e, 0x62, 0x84, 0xd9, 0x72, 0x72,
0x2d, 0xa7, 0xf6, 0xf7, 0xe6, 0xc7, 0x63, 0x73, 0x38, 0x2e, 0x4e, 0xfe, 0x4d, 0x01, 0x60, 0x99, 0x7f, 0x6f, 0x7e, 0x2c, 0xd6, 0x87, 0xe3, 0xe2, 0xe4, 0xdf, 0x0f, 0x01, 0x2c, 0x13, 0x4b, 0x33,
0x58, 0x9a, 0xd9, 0xd3, 0x89, 0x31, 0x8c, 0x13, 0xf4, 0xed, 0xd8, 0x09, 0xfa, 0x52, 0xbf, 0x19, 0xbb, 0x3a, 0x31, 0x06, 0xb1, 0x82, 0xbe, 0x19, 0x5b, 0x41, 0x5f, 0xe8, 0x35, 0xa3, 0x05, 0xaa,
0x2d, 0x50, 0x35, 0xf7, 0x08, 0xed, 0x26, 0x8e, 0xd0, 0x97, 0x07, 0x17, 0x71, 0xf0, 0x19, 0x7a, 0xe6, 0x2e, 0xa1, 0x9d, 0xc4, 0x12, 0xfa, 0x62, 0xff, 0x22, 0x0e, 0x5e, 0x43, 0x6f, 0x16, 0x60,
0xab, 0x08, 0xd3, 0x21, 0xf1, 0x92, 0x69, 0x74, 0x54, 0xbe, 0x27, 0x5e, 0x88, 0xc5, 0xc4, 0xe3, 0x2a, 0x24, 0x5e, 0x32, 0x8d, 0xb6, 0xca, 0xe7, 0xc4, 0x73, 0xb1, 0x98, 0x78, 0x34, 0x11, 0x13,
0x89, 0x98, 0x38, 0x99, 0xc1, 0x12, 0x89, 0x87, 0xab, 0x81, 0xf6, 0x05, 0xce, 0x7e, 0x3e, 0x2e, 0x27, 0x32, 0x58, 0x22, 0xf1, 0x70, 0x25, 0xd0, 0x7e, 0x88, 0xb3, 0x9f, 0x8b, 0x0b, 0xbf, 0xb5,
0xfc, 0xf6, 0xde, 0xfc, 0x81, 0xf5, 0x7c, 0x2d, 0xc0, 0x8c, 0x2b, 0x8b, 0x1e, 0x83, 0xa3, 0x36, 0x37, 0x7f, 0x60, 0x3d, 0x5f, 0x0d, 0x30, 0xe3, 0xca, 0xa2, 0x47, 0xe0, 0xa8, 0x4d, 0x14, 0xc7,
0x51, 0x1c, 0xd3, 0xe0, 0x69, 0x62, 0x34, 0x34, 0x0a, 0xf3, 0x51, 0x2c, 0x66, 0xd1, 0x13, 0x30, 0x34, 0x78, 0x9a, 0x18, 0x0d, 0x8d, 0xc2, 0xbc, 0x15, 0x8b, 0x5e, 0xf4, 0x18, 0x8c, 0xe8, 0xc4,
0xa2, 0x13, 0xc7, 0x51, 0xba, 0x84, 0x67, 0x84, 0xd1, 0xfa, 0xa4, 0x20, 0x1c, 0x59, 0xf3, 0x86, 0x71, 0x94, 0x0e, 0xe1, 0x19, 0x61, 0xb4, 0x36, 0x21, 0x08, 0x47, 0xd6, 0xbc, 0x66, 0xec, 0xf7,
0xb1, 0x3f, 0x8f, 0xae, 0xc3, 0x84, 0xa6, 0x38, 0x22, 0xb4, 0x5b, 0xaa, 0x4e, 0xf8, 0x9e, 0x1f, 0xa3, 0x6b, 0x30, 0xae, 0x29, 0x8e, 0x08, 0xed, 0xa6, 0xaa, 0x13, 0x3e, 0xe7, 0xcb, 0xa7, 0xbf,
0x3b, 0xf3, 0x3f, 0x77, 0x17, 0x31, 0x8c, 0x23, 0x3c, 0x89, 0x56, 0x63, 0x48, 0x38, 0x81, 0x8c, 0x72, 0x67, 0x11, 0xc3, 0x38, 0xc2, 0x95, 0x68, 0x35, 0x86, 0x84, 0x13, 0xc8, 0x68, 0x07, 0x10,
0x76, 0x00, 0xb1, 0x91, 0x96, 0xad, 0x18, 0x8e, 0xe7, 0x32, 0x26, 0x6f, 0xa4, 0x6f, 0x79, 0x41, 0x6b, 0x69, 0xda, 0x8a, 0xe1, 0x78, 0x2e, 0x63, 0xf2, 0x46, 0x7a, 0x96, 0x17, 0xe4, 0xb7, 0xd5,
0x7e, 0x5b, 0x4d, 0xa1, 0xe1, 0x0c, 0x09, 0xf2, 0x1f, 0x24, 0x98, 0x08, 0x17, 0x6c, 0x08, 0x85, 0x14, 0x1a, 0xce, 0x90, 0x20, 0xff, 0x59, 0x82, 0xf1, 0x70, 0xc0, 0x06, 0x50, 0x28, 0xbd, 0x11,
0xd2, 0x5b, 0xf1, 0x42, 0xe9, 0xf9, 0x81, 0x83, 0x37, 0xa7, 0x52, 0xfa, 0xb0, 0x08, 0x28, 0x24, 0x2f, 0x94, 0x9e, 0xed, 0x3b, 0x78, 0x73, 0x2a, 0xa5, 0xf7, 0x0b, 0x80, 0x42, 0x22, 0x96, 0x1a,
0x62, 0xa9, 0x61, 0x53, 0x69, 0xdf, 0xb8, 0x8b, 0x7b, 0xc4, 0xcf, 0x24, 0x40, 0x22, 0x59, 0x2f, 0x36, 0x95, 0xd6, 0xf5, 0x3b, 0xd8, 0x47, 0xfc, 0x52, 0x02, 0x24, 0x92, 0xf5, 0xa2, 0x61, 0x98,
0x1a, 0x86, 0x49, 0x79, 0xfe, 0xf7, 0xd5, 0x7c, 0x6d, 0x60, 0x35, 0x7d, 0x0d, 0x6a, 0x1b, 0x29, 0x94, 0xe7, 0x7f, 0x5f, 0xcd, 0x57, 0xfa, 0x56, 0xd3, 0xd7, 0xa0, 0xba, 0x91, 0xc2, 0x3e, 0x6f,
0xec, 0x0b, 0x06, 0xb5, 0x7b, 0xe1, 0x8a, 0xa5, 0x09, 0x70, 0x86, 0x42, 0xe8, 0x1d, 0x00, 0x5b, 0x50, 0xbb, 0x1b, 0x8e, 0x58, 0x9a, 0x00, 0x67, 0x28, 0x84, 0xde, 0x02, 0xb0, 0x05, 0x66, 0xd3,
0x60, 0xb6, 0x4c, 0x91, 0x02, 0x5e, 0x1a, 0x20, 0x9b, 0x32, 0x80, 0x25, 0xd3, 0xd8, 0x52, 0xbb, 0x14, 0x29, 0xe0, 0x85, 0x3e, 0xb2, 0x29, 0x03, 0x58, 0x32, 0x8d, 0x2d, 0xb5, 0x13, 0x26, 0x34,
0x61, 0x42, 0xc3, 0x01, 0x30, 0x8e, 0x08, 0x99, 0xbd, 0x00, 0x27, 0x73, 0xb4, 0x47, 0xc7, 0xa1, 0x1c, 0x00, 0xe3, 0x88, 0x90, 0xd9, 0xf3, 0x70, 0x22, 0x47, 0x7b, 0x74, 0x1c, 0x0a, 0xd7, 0x49,
0x78, 0x83, 0xf4, 0x3c, 0xb7, 0x62, 0xf6, 0x27, 0x3a, 0x11, 0xbd, 0x8f, 0x8d, 0x8a, 0xab, 0xd4, 0xd7, 0x73, 0x2b, 0x66, 0x3f, 0xd1, 0x74, 0x74, 0x3f, 0x36, 0x2a, 0xb6, 0x52, 0x67, 0x87, 0x9e,
0xb9, 0xc2, 0x73, 0x92, 0xfc, 0x65, 0x39, 0x1a, 0x6b, 0xbc, 0x8a, 0x3d, 0x0d, 0x15, 0x9b, 0x58, 0x91, 0xe4, 0xcf, 0x8b, 0xd1, 0x58, 0xe3, 0x55, 0xec, 0x29, 0x28, 0xd9, 0xc4, 0xd2, 0xd4, 0x96,
0x9a, 0xda, 0x56, 0x1c, 0x51, 0xcf, 0xf0, 0x82, 0x14, 0x8b, 0x31, 0x1c, 0xcc, 0xc6, 0xea, 0xdd, 0xe2, 0x88, 0x7a, 0x86, 0x17, 0xa4, 0x58, 0xb4, 0xe1, 0xa0, 0x37, 0x56, 0xef, 0x0e, 0xdd, 0xdb,
0xc2, 0xfd, 0xad, 0x77, 0x8b, 0xf7, 0xba, 0xde, 0x35, 0xa1, 0xe2, 0xf8, 0x85, 0x6e, 0x89, 0x83, 0x7a, 0xb7, 0x70, 0xb7, 0xeb, 0x5d, 0x13, 0x4a, 0x8e, 0x5f, 0xe8, 0x0e, 0x73, 0xf0, 0xc5, 0x43,
0x2f, 0x1e, 0x22, 0x67, 0x8b, 0x1a, 0x37, 0x10, 0x18, 0x54, 0xb7, 0x81, 0x90, 0xac, 0xba, 0xb6, 0xe4, 0x6c, 0x51, 0xe3, 0x06, 0x02, 0x83, 0xea, 0x36, 0x10, 0x92, 0x55, 0xd7, 0x16, 0x7b, 0xac,
0xdc, 0x67, 0x5d, 0xbb, 0x0a, 0x27, 0x6c, 0xb2, 0xa3, 0x32, 0x35, 0x2e, 0xab, 0x0e, 0x35, 0xed, 0x6b, 0x57, 0x61, 0xda, 0x26, 0x3b, 0x2a, 0x53, 0xe3, 0x92, 0xea, 0x50, 0xd3, 0xee, 0xae, 0xaa,
0xde, 0xaa, 0xaa, 0xab, 0x54, 0x94, 0x3d, 0xd5, 0xfd, 0xbd, 0xf9, 0x13, 0x38, 0x63, 0x1e, 0x67, 0xba, 0x4a, 0x45, 0xd9, 0x53, 0xd9, 0xdf, 0x9b, 0x9f, 0xc6, 0x19, 0xfd, 0x38, 0x93, 0x8b, 0x65,
0x72, 0xb1, 0xec, 0x6c, 0x29, 0xae, 0x43, 0x3a, 0x3c, 0xa5, 0x55, 0xc2, 0xec, 0xdc, 0xe0, 0xa3, 0x67, 0x4b, 0x71, 0x1d, 0xd2, 0xe6, 0x29, 0xad, 0x14, 0x66, 0xe7, 0x3a, 0x6f, 0xc5, 0xa2, 0x17,
0x58, 0xcc, 0x22, 0x3d, 0x16, 0xdc, 0x95, 0x7b, 0x11, 0xdc, 0x13, 0xf9, 0x81, 0x8d, 0x36, 0xe0, 0xe9, 0xb1, 0xe0, 0x2e, 0xdd, 0x8d, 0xe0, 0x1e, 0xcf, 0x0f, 0x6c, 0xb4, 0x01, 0x27, 0x2c, 0xdb,
0xa4, 0x65, 0x9b, 0x5d, 0x9b, 0x38, 0xce, 0x32, 0x51, 0x3a, 0x9a, 0x6a, 0x10, 0xdf, 0x5f, 0xa3, 0xec, 0xd8, 0xc4, 0x71, 0x96, 0x89, 0xd2, 0xd6, 0x54, 0x83, 0xf8, 0xfe, 0x1a, 0xe5, 0x76, 0x3e,
0xdc, 0xce, 0x87, 0xf6, 0xf7, 0xe6, 0x4f, 0x36, 0xb2, 0x49, 0x70, 0x1e, 0xaf, 0xfc, 0x59, 0x09, 0xb0, 0xbf, 0x37, 0x7f, 0xa2, 0x9e, 0x4d, 0x82, 0xf3, 0x78, 0xe5, 0x4f, 0x86, 0xe1, 0x78, 0x72,
0x8e, 0x27, 0x4f, 0xd9, 0x9c, 0xaa, 0x54, 0x1a, 0xa8, 0x2a, 0x7d, 0x32, 0xb2, 0x6d, 0xbc, 0x92, 0x95, 0xcd, 0xa9, 0x4a, 0xa5, 0xbe, 0xaa, 0xd2, 0xc7, 0x23, 0xd3, 0xc6, 0x2b, 0xd9, 0x83, 0x68,
0x3d, 0x88, 0x86, 0x8c, 0xad, 0xb3, 0x08, 0x93, 0x22, 0x8f, 0xf8, 0x93, 0xa2, 0x2e, 0x0f, 0xa2, 0xc8, 0x98, 0x3a, 0x8b, 0x30, 0x21, 0xf2, 0x88, 0xdf, 0x29, 0xea, 0xf2, 0x20, 0x1a, 0x36, 0xe2,
0x61, 0x23, 0x3e, 0x8d, 0x93, 0xf4, 0xac, 0xd6, 0x0c, 0x4b, 0x48, 0x1f, 0xa4, 0x14, 0xaf, 0x35, 0xdd, 0x38, 0x49, 0xcf, 0x6a, 0xcd, 0xb0, 0x84, 0xf4, 0x41, 0x86, 0xe3, 0xb5, 0xe6, 0x62, 0x92,
0x17, 0x93, 0x04, 0x38, 0xcd, 0x83, 0xd6, 0x60, 0xda, 0x35, 0xd2, 0x50, 0x5e, 0x74, 0x3e, 0x24, 0x00, 0xa7, 0x79, 0xd0, 0x1a, 0x4c, 0xb9, 0x46, 0x1a, 0xca, 0x8b, 0xce, 0x07, 0x04, 0xd4, 0xd4,
0xa0, 0xa6, 0x37, 0xd2, 0x24, 0x38, 0x8b, 0x0f, 0xed, 0x00, 0xb4, 0xfd, 0x82, 0xc0, 0xa9, 0x1e, 0x46, 0x9a, 0x04, 0x67, 0xf1, 0xa1, 0x1d, 0x80, 0x96, 0x5f, 0x10, 0x38, 0x95, 0xa3, 0x3c, 0x57,
0xe5, 0xb9, 0xba, 0x3e, 0xf0, 0xde, 0x0a, 0x6a, 0x8b, 0x30, 0x23, 0x06, 0x43, 0x0e, 0x8e, 0x48, 0xd7, 0xfa, 0x9e, 0x5b, 0x41, 0x6d, 0x11, 0x66, 0xc4, 0xa0, 0xc9, 0xc1, 0x11, 0x49, 0xe8, 0x39,
0x42, 0x2f, 0xc0, 0xb8, 0xcd, 0x2f, 0x1e, 0xbe, 0x01, 0x5e, 0xf1, 0xfe, 0x80, 0x60, 0x1b, 0xc7, 0x18, 0xb3, 0xf9, 0xc6, 0xc3, 0x37, 0xc0, 0x2b, 0xde, 0xef, 0x13, 0x6c, 0x63, 0x38, 0xda, 0x89,
0xd1, 0x49, 0x1c, 0xa7, 0x45, 0xe7, 0x60, 0xa2, 0xcd, 0x6a, 0x54, 0xa6, 0xc6, 0x92, 0xe9, 0x1a, 0xe3, 0xb4, 0xe8, 0x2c, 0x8c, 0xb7, 0x58, 0x8d, 0xca, 0xd4, 0x58, 0x32, 0x5d, 0x83, 0xf2, 0x40,
0x94, 0x07, 0x7a, 0xb1, 0x8e, 0x58, 0x9d, 0xb0, 0x14, 0x9b, 0xc1, 0x09, 0x4a, 0xf9, 0x8f, 0x52, 0x2f, 0xd4, 0x10, 0xab, 0x13, 0x96, 0x62, 0x3d, 0x38, 0x41, 0x29, 0xff, 0x45, 0x8a, 0x2e, 0x6f,
0xf4, 0x78, 0x0b, 0xca, 0xf4, 0x73, 0xb1, 0x92, 0xec, 0xb1, 0x44, 0x49, 0x36, 0x93, 0xe6, 0x88, 0x41, 0x99, 0x7e, 0x36, 0x56, 0x92, 0x3d, 0x92, 0x28, 0xc9, 0x66, 0xd2, 0x1c, 0x91, 0x8a, 0xec,
0x54, 0x64, 0xdf, 0xc9, 0xae, 0xd0, 0x2f, 0x1e, 0xaa, 0x42, 0x0f, 0x8f, 0xe9, 0x3b, 0x97, 0xe8, 0x7b, 0xd9, 0x15, 0xfa, 0x85, 0x43, 0x55, 0xe8, 0xe1, 0x32, 0x7d, 0xfb, 0x12, 0xfd, 0x43, 0x09,
0x1f, 0x4b, 0x30, 0x73, 0xb1, 0x79, 0xc9, 0x36, 0x5d, 0xcb, 0x57, 0xef, 0x8a, 0xe5, 0xf9, 0xf9, 0x66, 0x2e, 0x34, 0x2e, 0xda, 0xa6, 0x6b, 0xf9, 0xea, 0x5d, 0xb6, 0x3c, 0x3f, 0x7f, 0x03, 0x86,
0x6b, 0x50, 0xb2, 0x5d, 0xcd, 0xb7, 0xeb, 0xbf, 0x7c, 0xbb, 0xb0, 0xab, 0x31, 0xbb, 0xa6, 0x13, 0x6d, 0x57, 0xf3, 0xed, 0xfa, 0x92, 0x6f, 0x17, 0x76, 0x35, 0x66, 0xd7, 0x54, 0x82, 0xcb, 0x33,
0x5c, 0x9e, 0x51, 0x8c, 0x01, 0xbd, 0x05, 0x47, 0x6d, 0xc5, 0xe8, 0x12, 0xff, 0x00, 0x7f, 0xb6, 0x8a, 0x31, 0xa0, 0x37, 0xe0, 0xa8, 0xad, 0x18, 0x1d, 0xe2, 0x2f, 0xe0, 0x4f, 0xf7, 0x68, 0xcd,
0x4f, 0x6b, 0x56, 0x96, 0x31, 0x63, 0x8f, 0x94, 0x91, 0x1c, 0x0d, 0x0b, 0x54, 0xf9, 0xa7, 0x12, 0xca, 0x32, 0x66, 0xec, 0x91, 0x32, 0x92, 0xa3, 0x61, 0x81, 0x2a, 0xff, 0x42, 0x82, 0x89, 0x4b,
0x4c, 0x5e, 0x6e, 0xb5, 0x1a, 0x2b, 0x06, 0xcf, 0x00, 0x0d, 0x85, 0x6e, 0xb3, 0x1a, 0xc3, 0x52, 0xcd, 0x66, 0x7d, 0xc5, 0xe0, 0x19, 0xa0, 0xae, 0xd0, 0x6d, 0x56, 0x63, 0x58, 0x0a, 0xdd, 0x4e,
0xe8, 0x76, 0xb2, 0xc6, 0x60, 0x73, 0x98, 0xcf, 0xa0, 0x6d, 0x18, 0x61, 0x99, 0x87, 0x18, 0x9d, 0xd6, 0x18, 0xac, 0x0f, 0xf3, 0x1e, 0xb4, 0x0d, 0x23, 0x2c, 0xf3, 0x10, 0xa3, 0xdd, 0xe7, 0xf6,
0x01, 0xaf, 0x07, 0x42, 0x5c, 0xdd, 0x03, 0x09, 0x6b, 0x57, 0x31, 0x80, 0x7d, 0x78, 0xf9, 0x3d, 0x40, 0x88, 0xab, 0x79, 0x20, 0x61, 0xed, 0x2a, 0x1a, 0xb0, 0x0f, 0x2f, 0xbf, 0x03, 0xd3, 0x11,
0x38, 0x11, 0x51, 0x8f, 0xf9, 0x8b, 0xbf, 0x6c, 0xa2, 0x36, 0x94, 0x99, 0x26, 0xfe, 0xbb, 0x65, 0xf5, 0x98, 0xbf, 0xf8, 0xc9, 0x26, 0x6a, 0x41, 0x91, 0x69, 0xe2, 0x9f, 0x5b, 0xf6, 0x7a, 0xfc,
0xbf, 0xcf, 0x6f, 0x09, 0x93, 0xc3, 0x1a, 0x8c, 0xfd, 0x72, 0xb0, 0x87, 0x2d, 0xaf, 0xc1, 0xf8, 0x96, 0x30, 0x39, 0xac, 0xc1, 0xd8, 0x97, 0x83, 0x3d, 0x6c, 0x79, 0x0d, 0xc6, 0x2e, 0x99, 0x0e,
0x65, 0xd3, 0xa1, 0x0d, 0xd3, 0xa6, 0xdc, 0x6d, 0xe8, 0x11, 0x28, 0xea, 0xaa, 0x21, 0x4e, 0xf8, 0xad, 0x9b, 0x36, 0xe5, 0x6e, 0x43, 0x0f, 0x41, 0x41, 0x57, 0x0d, 0xb1, 0xc2, 0x97, 0x05, 0x4f,
0x31, 0xc1, 0x53, 0x64, 0x67, 0x10, 0x1b, 0xe7, 0xd3, 0xca, 0xae, 0xc8, 0x64, 0xe1, 0xb4, 0xb2, 0x81, 0xad, 0x41, 0xac, 0x9d, 0x77, 0x2b, 0xbb, 0x22, 0x93, 0x85, 0xdd, 0xca, 0x2e, 0x66, 0xed,
0x8b, 0xd9, 0xb8, 0x7c, 0x09, 0x46, 0xc4, 0x72, 0x44, 0x81, 0x8a, 0x07, 0x03, 0x15, 0x33, 0x80, 0xf2, 0x45, 0x18, 0x11, 0xc3, 0x11, 0x05, 0x2a, 0x1c, 0x0c, 0x54, 0xc8, 0x00, 0xfa, 0xcd, 0x10,
0x7e, 0x59, 0x80, 0x11, 0xa1, 0xfd, 0x10, 0x2e, 0x82, 0x6f, 0xc4, 0x2e, 0x82, 0xe7, 0x06, 0x5b, 0x8c, 0x08, 0xed, 0x07, 0xb0, 0x11, 0x7c, 0x2d, 0xb6, 0x11, 0x3c, 0xdb, 0xdf, 0x48, 0xe7, 0xee,
0xe9, 0xdc, 0x5b, 0x60, 0x27, 0x71, 0x0b, 0x7c, 0x71, 0x40, 0xfc, 0x83, 0xaf, 0x80, 0x1f, 0x49, 0x02, 0xdb, 0x89, 0x5d, 0xe0, 0xf3, 0x7d, 0xe2, 0x1f, 0xbc, 0x05, 0xfc, 0x40, 0x82, 0xf1, 0x78,
0x30, 0x11, 0x8f, 0x39, 0x74, 0x16, 0xc6, 0xd8, 0x79, 0xa4, 0xb6, 0xc9, 0x7a, 0x58, 0x50, 0x07, 0xcc, 0xa1, 0x33, 0x50, 0x66, 0xeb, 0x91, 0xda, 0x22, 0xeb, 0x61, 0x41, 0x1d, 0x1c, 0xca, 0x34,
0x8f, 0x32, 0xcd, 0x70, 0x0a, 0x47, 0xe9, 0x50, 0x37, 0x60, 0x63, 0x61, 0x21, 0x9c, 0x92, 0xef, 0xc2, 0x2e, 0x1c, 0xa5, 0x43, 0x9d, 0x80, 0x8d, 0x85, 0x85, 0x70, 0x4a, 0xbe, 0xcb, 0x5d, 0xaa,
0x72, 0x97, 0xaa, 0x5a, 0xcd, 0x6b, 0xf8, 0xd4, 0x56, 0x0c, 0x7a, 0xc5, 0x6e, 0x52, 0x5b, 0x35, 0x6a, 0x55, 0xef, 0xc2, 0xa7, 0xba, 0x62, 0xd0, 0xcb, 0x76, 0x83, 0xda, 0xaa, 0xd1, 0x49, 0x09,
0xba, 0x29, 0x41, 0x3c, 0xc6, 0xa2, 0xc8, 0xf2, 0x4d, 0x09, 0xc6, 0x84, 0xca, 0x43, 0xb8, 0xce, 0xe2, 0x31, 0x16, 0x45, 0x96, 0x6f, 0x48, 0x50, 0x16, 0x2a, 0x0f, 0x60, 0x3b, 0xf3, 0x6a, 0x7c,
0xbc, 0x1e, 0xbf, 0xce, 0x3c, 0x3b, 0xe0, 0x7e, 0xce, 0xbe, 0xcb, 0x7c, 0x12, 0x9a, 0xc2, 0x76, 0x3b, 0xf3, 0x74, 0x9f, 0xf3, 0x39, 0x7b, 0x2f, 0xf3, 0x51, 0x68, 0x0a, 0x9b, 0xc1, 0x2c, 0xc1,
0x30, 0x4b, 0x30, 0xdb, 0xa6, 0x43, 0x93, 0x09, 0x86, 0xed, 0x35, 0xcc, 0x67, 0xd0, 0xf7, 0x24, 0x6c, 0x9b, 0x0e, 0x4d, 0x26, 0x18, 0x36, 0xd7, 0x30, 0xef, 0x41, 0x3f, 0x90, 0xe0, 0xb8, 0x9a,
0x38, 0xae, 0x26, 0xf6, 0xbc, 0xf0, 0xf5, 0xcb, 0x83, 0xa9, 0x16, 0xc0, 0xd4, 0xab, 0x42, 0xde, 0x98, 0xf3, 0xc2, 0xd7, 0x2f, 0xf6, 0xa7, 0x5a, 0x00, 0x53, 0xab, 0x08, 0x79, 0xc7, 0x93, 0x3d,
0xf1, 0xe4, 0x0c, 0x4e, 0x89, 0x94, 0x5d, 0x48, 0x51, 0x21, 0x05, 0x4a, 0xdb, 0x94, 0x5a, 0x62, 0x38, 0x25, 0x52, 0x76, 0x21, 0x45, 0x85, 0x14, 0x18, 0xde, 0xa6, 0xd4, 0x12, 0x83, 0xb0, 0xd4,
0x11, 0x96, 0x06, 0xcf, 0x3c, 0xa1, 0x4a, 0x15, 0x6e, 0x7e, 0xab, 0xd5, 0xc0, 0x1c, 0x5a, 0xfe, 0x7f, 0xe6, 0x09, 0x55, 0x2a, 0x71, 0xf3, 0x9b, 0xcd, 0x3a, 0xe6, 0xd0, 0xf2, 0xaf, 0x87, 0x02,
0x45, 0x21, 0x70, 0x58, 0xd3, 0xdb, 0x24, 0x41, 0xbe, 0x95, 0xee, 0x45, 0xbe, 0x1d, 0xcb, 0xca, 0x87, 0x35, 0xbc, 0x49, 0x12, 0xe4, 0x5b, 0xe9, 0x6e, 0xe4, 0xdb, 0x72, 0x56, 0xae, 0x45, 0xdf,
0xb5, 0xe8, 0x1b, 0x50, 0xa4, 0xda, 0xa0, 0x17, 0x5a, 0x21, 0xa1, 0xb5, 0xda, 0x0c, 0x13, 0x56, 0x82, 0x02, 0xd5, 0xfa, 0xdd, 0xd0, 0x0a, 0x09, 0xcd, 0xd5, 0x46, 0x98, 0xb0, 0x9a, 0xab, 0x0d,
0x6b, 0xb5, 0x89, 0x19, 0x24, 0x7a, 0x1b, 0xca, 0xec, 0x34, 0x63, 0x7b, 0xbc, 0x38, 0x78, 0x0e, 0xcc, 0x20, 0xd1, 0x9b, 0x50, 0x64, 0xab, 0x19, 0x9b, 0xe3, 0x85, 0xfe, 0x73, 0x08, 0xf3, 0x57,
0x61, 0xfe, 0x0a, 0x23, 0x8c, 0xfd, 0x72, 0xb0, 0x87, 0x2b, 0xbf, 0x07, 0xe3, 0xb1, 0x44, 0x80, 0x18, 0x61, 0xec, 0xcb, 0xc1, 0x1e, 0xae, 0xfc, 0x0e, 0x8c, 0xc5, 0x12, 0x01, 0xba, 0x06, 0xc7,
0xae, 0xc3, 0x31, 0xcd, 0x54, 0x3a, 0x75, 0x45, 0x53, 0x8c, 0x36, 0xb1, 0x93, 0xa9, 0x31, 0xfb, 0x34, 0x53, 0x69, 0xd7, 0x14, 0x4d, 0x31, 0x5a, 0xc4, 0x4e, 0xa6, 0xc6, 0xec, 0xbd, 0xd0, 0x6a,
0x2e, 0xb4, 0x1a, 0xe1, 0x10, 0x09, 0x25, 0x68, 0x3e, 0x46, 0xe7, 0x70, 0x0c, 0x5b, 0x56, 0x00, 0x84, 0x43, 0x24, 0x94, 0xe0, 0xf2, 0x31, 0xda, 0x87, 0x63, 0xd8, 0xb2, 0x02, 0x10, 0x5a, 0x8f,
0x42, 0xeb, 0xd1, 0x3c, 0x94, 0x59, 0x08, 0x7b, 0x27, 0xd3, 0x68, 0x7d, 0x94, 0xe9, 0xca, 0x22, 0xe6, 0xa1, 0xc8, 0x42, 0xd8, 0x5b, 0x99, 0x46, 0x6b, 0xa3, 0x4c, 0x57, 0x16, 0xd9, 0x0e, 0xf6,
0xdb, 0xc1, 0xde, 0x38, 0x3a, 0x03, 0xe0, 0x90, 0xb6, 0x4d, 0x28, 0xcf, 0x3b, 0xde, 0xeb, 0x51, 0xda, 0xd1, 0x69, 0x00, 0x87, 0xb4, 0x6c, 0x42, 0x79, 0xde, 0xf1, 0x4e, 0x8f, 0x82, 0x0c, 0xdc,
0x90, 0x81, 0x9b, 0xc1, 0x0c, 0x8e, 0x50, 0xc9, 0x7f, 0x96, 0x60, 0x7c, 0x9d, 0xd0, 0x77, 0x4d, 0x08, 0x7a, 0x70, 0x84, 0x4a, 0xfe, 0x9b, 0x04, 0x63, 0xeb, 0x84, 0xbe, 0x6d, 0xda, 0xd7, 0xeb,
0xfb, 0x46, 0x83, 0x37, 0x77, 0x87, 0x90, 0xf7, 0x37, 0x63, 0x79, 0xff, 0x95, 0x3e, 0xd7, 0x2c, 0xfc, 0x72, 0x77, 0x00, 0x79, 0x7f, 0x33, 0x96, 0xf7, 0x5f, 0xea, 0x71, 0xcc, 0x62, 0xda, 0xe6,
0xa6, 0x6d, 0x5e, 0xf6, 0x97, 0xff, 0x2e, 0x41, 0x35, 0x46, 0x19, 0x4d, 0x13, 0x04, 0xca, 0x96, 0x65, 0x7f, 0xf9, 0x5f, 0x12, 0x54, 0x62, 0x94, 0xd1, 0x34, 0x41, 0xa0, 0x68, 0x99, 0x36, 0xf5,
0x69, 0x53, 0xff, 0x8c, 0x3f, 0x94, 0x06, 0x2c, 0xa5, 0x46, 0x4e, 0x79, 0x06, 0x8b, 0x3d, 0x74, 0xd7, 0xf8, 0x43, 0x69, 0xc0, 0x52, 0x6a, 0x64, 0x95, 0x67, 0xb0, 0xd8, 0x43, 0x67, 0x76, 0x6e,
0x66, 0xe7, 0x96, 0x6d, 0xea, 0x22, 0xee, 0x0f, 0x27, 0x85, 0x10, 0x3b, 0xb4, 0xf3, 0xa2, 0x6d, 0xd9, 0xa6, 0x2e, 0xe2, 0xfe, 0x70, 0x52, 0x08, 0xb1, 0x43, 0x3b, 0x2f, 0xd8, 0xa6, 0x8e, 0x39,
0xea, 0x98, 0x63, 0xcb, 0x7f, 0x92, 0x60, 0x2a, 0x46, 0x39, 0x84, 0x94, 0xae, 0xc4, 0x53, 0xfa, 0xb6, 0xfc, 0x57, 0x09, 0x26, 0x63, 0x94, 0x03, 0x48, 0xe9, 0x4a, 0x3c, 0xa5, 0x3f, 0x7f, 0x18,
0x8b, 0x87, 0x31, 0x2c, 0x27, 0xb1, 0x7f, 0x95, 0x34, 0x8b, 0x39, 0x00, 0x6d, 0xc1, 0x98, 0x65, 0xc3, 0x72, 0x12, 0xfb, 0x17, 0x49, 0xb3, 0x98, 0x03, 0xd0, 0x16, 0x94, 0x2d, 0xb3, 0xdd, 0xb8,
0x76, 0x9a, 0xf7, 0xa0, 0xab, 0x37, 0xc9, 0x4e, 0xc8, 0x46, 0x88, 0x85, 0xa3, 0xc0, 0x68, 0x17, 0x0b, 0xb7, 0x7a, 0x13, 0x6c, 0x85, 0xac, 0x87, 0x58, 0x38, 0x0a, 0x8c, 0x76, 0x61, 0xd2, 0x50,
0xa6, 0x0c, 0x45, 0x27, 0x8e, 0xa5, 0xb4, 0x49, 0xf3, 0x1e, 0xbc, 0xa9, 0x3c, 0xc0, 0x3b, 0x0d, 0x74, 0xe2, 0x58, 0x4a, 0x8b, 0x34, 0xee, 0xc2, 0x99, 0xca, 0x7d, 0xfc, 0xa6, 0x21, 0x89, 0x88,
0x49, 0x44, 0x9c, 0x16, 0x22, 0xff, 0x3a, 0x65, 0xb7, 0x69, 0x53, 0xf4, 0x2a, 0x54, 0xf8, 0x07, 0xd3, 0x42, 0xe4, 0xdf, 0xa5, 0xec, 0x36, 0x6d, 0x8a, 0x5e, 0x86, 0x12, 0x7f, 0x60, 0xd1, 0x32,
0x16, 0x6d, 0x53, 0x13, 0x47, 0xdb, 0x59, 0xb6, 0x34, 0x0d, 0x31, 0x76, 0x7b, 0x6f, 0xfe, 0xbf, 0x35, 0xb1, 0xb4, 0x9d, 0x61, 0x43, 0x53, 0x17, 0x6d, 0xb7, 0xf6, 0xe6, 0xbf, 0x7c, 0xe0, 0x91,
0x0f, 0x7c, 0x12, 0xf6, 0x09, 0x71, 0x00, 0x83, 0xd6, 0xa1, 0x64, 0x1d, 0xa6, 0xcc, 0xe0, 0x07, 0xb0, 0x4f, 0x88, 0x03, 0x18, 0xb4, 0x0e, 0xc3, 0xd6, 0x61, 0xca, 0x0c, 0xbe, 0xb0, 0xf0, 0xda,
0x0b, 0xaf, 0x2d, 0x38, 0x8e, 0xfc, 0x8f, 0xa4, 0xe2, 0xfc, 0x78, 0xb9, 0x7e, 0xcf, 0x16, 0x2c, 0x82, 0xe3, 0xc8, 0xff, 0x4e, 0x2a, 0xce, 0x97, 0x97, 0x6b, 0x77, 0x6d, 0xc0, 0x82, 0xb2, 0x26,
0x28, 0x6b, 0x72, 0x17, 0xcd, 0x86, 0x11, 0x71, 0xca, 0x8a, 0xb8, 0xbc, 0x74, 0x98, 0xb8, 0x8c, 0x77, 0xd0, 0x6c, 0x18, 0x11, 0xab, 0xac, 0x88, 0xcb, 0x8b, 0x87, 0x89, 0xcb, 0xe8, 0xca, 0x10,
0x9e, 0x0c, 0xc1, 0x25, 0xc2, 0x1f, 0xf4, 0x05, 0xc9, 0x7f, 0x95, 0x60, 0x8a, 0x2b, 0xd4, 0x76, 0x6c, 0x22, 0xfc, 0x46, 0x5f, 0x90, 0xfc, 0x0f, 0x09, 0x26, 0xb9, 0x42, 0x2d, 0xd7, 0x56, 0x69,
0x6d, 0x95, 0xf6, 0x86, 0x96, 0x41, 0xb7, 0x62, 0x19, 0x74, 0xb9, 0x4f, 0x43, 0x53, 0x1a, 0xe7, 0x77, 0x60, 0x19, 0x74, 0x2b, 0x96, 0x41, 0x97, 0x7b, 0x34, 0x34, 0xa5, 0x71, 0x6e, 0x16, 0xfd,
0x66, 0xd1, 0xcf, 0x25, 0x78, 0x20, 0x45, 0x3d, 0x84, 0x0c, 0x43, 0xe2, 0x19, 0xe6, 0x95, 0xc3, 0x54, 0x82, 0xfb, 0x52, 0xd4, 0x03, 0xc8, 0x30, 0x24, 0x9e, 0x61, 0x5e, 0x3a, 0xac, 0x81, 0x39,
0x1a, 0x98, 0x93, 0x65, 0x6e, 0x42, 0x86, 0x79, 0x3c, 0x70, 0xcf, 0x00, 0x58, 0xb6, 0xba, 0xa3, 0x59, 0xe6, 0x87, 0xe5, 0x0c, 0xf3, 0x78, 0xe0, 0x9e, 0x06, 0xb0, 0x6c, 0x75, 0x47, 0xd5, 0x48,
0x6a, 0xa4, 0x2b, 0x1a, 0xc9, 0x95, 0x70, 0x49, 0x1a, 0xc1, 0x0c, 0x8e, 0x50, 0xa1, 0x6f, 0xc1, 0x47, 0x5c, 0x24, 0x97, 0xc2, 0x21, 0xa9, 0x07, 0x3d, 0x38, 0x42, 0x85, 0xbe, 0x03, 0x33, 0x6d,
0x4c, 0x87, 0x6c, 0x29, 0xae, 0x46, 0x17, 0x3b, 0x9d, 0x25, 0xc5, 0x52, 0x36, 0x55, 0x4d, 0xa5, 0xb2, 0xa5, 0xb8, 0x1a, 0x5d, 0x6c, 0xb7, 0x97, 0x14, 0x4b, 0xd9, 0x54, 0x35, 0x95, 0xaa, 0x62,
0xaa, 0xb8, 0x61, 0x8f, 0xd6, 0x2f, 0x78, 0x0d, 0xde, 0x2c, 0x8a, 0xdb, 0x7b, 0xf3, 0x8f, 0x1f, 0x87, 0x3d, 0x5a, 0x3b, 0xef, 0x5d, 0xf0, 0x66, 0x51, 0xdc, 0xda, 0x9b, 0x7f, 0xf4, 0xe0, 0x4b,
0xdc, 0xd4, 0xf1, 0x89, 0x7b, 0x38, 0x47, 0x08, 0xfa, 0xae, 0x04, 0x55, 0x9b, 0xbc, 0xe3, 0xaa, 0x1d, 0x9f, 0xb8, 0x8b, 0x73, 0x84, 0xa0, 0xef, 0x4b, 0x50, 0xb1, 0xc9, 0x5b, 0xae, 0x6a, 0x93,
0x36, 0xe9, 0x2c, 0xdb, 0xa6, 0x15, 0xd3, 0xa0, 0xc8, 0x35, 0xb8, 0xb4, 0xbf, 0x37, 0x5f, 0xc5, 0xf6, 0xb2, 0x6d, 0x5a, 0x31, 0x0d, 0x0a, 0x5c, 0x83, 0x8b, 0xfb, 0x7b, 0xf3, 0x15, 0x9c, 0x43,
0x39, 0x34, 0xfd, 0xe8, 0x90, 0x2b, 0x08, 0x51, 0x98, 0x56, 0x34, 0xcd, 0x7c, 0x97, 0xc4, 0x3d, 0xd3, 0x8b, 0x0e, 0xb9, 0x82, 0x10, 0x85, 0x29, 0x45, 0xd3, 0xcc, 0xb7, 0x49, 0xdc, 0x03, 0xc3,
0x50, 0xe2, 0xf2, 0xeb, 0xfb, 0x7b, 0xf3, 0xd3, 0x8b, 0xe9, 0xe9, 0x7e, 0x44, 0x67, 0xc1, 0xa3, 0x5c, 0x7e, 0x6d, 0x7f, 0x6f, 0x7e, 0x6a, 0x31, 0xdd, 0xdd, 0x8b, 0xe8, 0x2c, 0x78, 0xb4, 0x00,
0x05, 0x18, 0xd9, 0x31, 0x35, 0x57, 0x27, 0x4e, 0xb5, 0xcc, 0x25, 0xb1, 0x8c, 0x3b, 0x72, 0xd5, 0x23, 0x3b, 0xa6, 0xe6, 0xea, 0xc4, 0xa9, 0x14, 0xb9, 0x24, 0x96, 0x71, 0x47, 0xae, 0x78, 0x4d,
0x1b, 0xba, 0xbd, 0x37, 0x7f, 0xf4, 0x62, 0x93, 0x3f, 0x7d, 0xf8, 0x54, 0xec, 0x8e, 0xc6, 0x6a, 0xb7, 0xf6, 0xe6, 0x8f, 0x5e, 0x68, 0xf0, 0xa3, 0x0f, 0x9f, 0x8a, 0xed, 0xd1, 0x58, 0xcd, 0x24,
0x26, 0xb1, 0xe5, 0xf9, 0x9b, 0x6d, 0x25, 0xcc, 0x31, 0x97, 0xc3, 0x29, 0x1c, 0xa5, 0x43, 0x3a, 0xa6, 0x3c, 0x3f, 0xb3, 0x2d, 0x85, 0x39, 0xe6, 0x52, 0xd8, 0x85, 0xa3, 0x74, 0x48, 0x87, 0xd1,
0x8c, 0x6e, 0x8b, 0x7b, 0xbb, 0x53, 0x1d, 0x19, 0xe8, 0xf4, 0x8b, 0xdd, 0xfb, 0xeb, 0x53, 0x42, 0x6d, 0xb1, 0x6f, 0x77, 0x2a, 0x23, 0x7d, 0xad, 0x7e, 0xb1, 0x7d, 0x7f, 0x6d, 0x52, 0x88, 0x1c,
0xe4, 0xa8, 0x3f, 0xec, 0xe0, 0x50, 0x02, 0x7a, 0x02, 0x46, 0xf8, 0x8f, 0x95, 0x65, 0xfe, 0x00, 0xf5, 0x9b, 0x1d, 0x1c, 0x4a, 0x40, 0x8f, 0xc1, 0x08, 0xff, 0x58, 0x59, 0xe6, 0x07, 0x60, 0xa5,
0x56, 0x09, 0x33, 0xd1, 0x65, 0x6f, 0x18, 0xfb, 0xf3, 0x3e, 0xe9, 0x4a, 0x63, 0x89, 0x3f, 0xcc, 0x30, 0x13, 0x5d, 0xf2, 0x9a, 0xb1, 0xdf, 0xef, 0x93, 0xae, 0xd4, 0x97, 0xf8, 0xc1, 0x6c, 0x82,
0x26, 0x48, 0x57, 0x1a, 0x4b, 0xd8, 0x9f, 0x47, 0x16, 0x8c, 0x38, 0x64, 0x55, 0x35, 0xdc, 0xdd, 0x74, 0xa5, 0xbe, 0x84, 0xfd, 0x7e, 0x64, 0xc1, 0x88, 0x43, 0x56, 0x55, 0xc3, 0xdd, 0xad, 0x40,
0x2a, 0x0c, 0xd4, 0x6a, 0x6e, 0x5e, 0xe0, 0xdc, 0x89, 0xa7, 0xa8, 0x50, 0xa2, 0x98, 0xc7, 0xbe, 0x5f, 0x57, 0xcd, 0x8d, 0xf3, 0x9c, 0x3b, 0x71, 0x14, 0x15, 0x4a, 0x14, 0xfd, 0xd8, 0x17, 0x83,
0x18, 0xb4, 0x0b, 0xa3, 0xb6, 0x6b, 0x2c, 0x3a, 0x1b, 0x0e, 0xb1, 0xab, 0x63, 0x5c, 0x66, 0xbf, 0x76, 0x61, 0xd4, 0x76, 0x8d, 0x45, 0x67, 0xc3, 0x21, 0x76, 0xa5, 0xcc, 0x65, 0xf6, 0x9a, 0x9c,
0xc9, 0x19, 0xfb, 0xfc, 0x49, 0xa9, 0x81, 0x07, 0x03, 0x0a, 0x1c, 0x0a, 0x43, 0x3f, 0x91, 0x00, 0xb1, 0xcf, 0x9f, 0x94, 0x1a, 0x78, 0x30, 0xa0, 0xc0, 0xa1, 0x30, 0xf4, 0x73, 0x09, 0x90, 0xe3,
0x39, 0xae, 0x65, 0x69, 0x44, 0x27, 0x06, 0x55, 0x34, 0xfe, 0x1a, 0xe6, 0x54, 0x8f, 0x71, 0x1d, 0x5a, 0x96, 0x46, 0x74, 0x62, 0x50, 0x45, 0xe3, 0xa7, 0x61, 0x4e, 0xe5, 0x18, 0xd7, 0xa1, 0xde,
0x1a, 0xfd, 0xda, 0x9d, 0x02, 0x4a, 0x2a, 0x13, 0x3c, 0x53, 0xa7, 0x49, 0x71, 0x86, 0x1e, 0x6c, 0xab, 0xdd, 0x29, 0xa0, 0xa4, 0x32, 0xc1, 0x31, 0x75, 0x9a, 0x14, 0x67, 0xe8, 0xc1, 0x86, 0x62,
0x29, 0xb6, 0x1c, 0xfe, 0x77, 0x75, 0x7c, 0xa0, 0xa5, 0xc8, 0x7e, 0x15, 0x0c, 0x97, 0x42, 0xcc, 0xcb, 0xe1, 0xbf, 0x2b, 0x63, 0x7d, 0x0d, 0x45, 0xf6, 0xa9, 0x60, 0x38, 0x14, 0xa2, 0x1f, 0xfb,
0x63, 0x5f, 0x0c, 0xba, 0x0a, 0x33, 0x36, 0x51, 0x3a, 0x57, 0x0c, 0xad, 0x87, 0x4d, 0x93, 0x5e, 0x62, 0xd0, 0x15, 0x98, 0xb1, 0x89, 0xd2, 0xbe, 0x6c, 0x68, 0x5d, 0x6c, 0x9a, 0xf4, 0x82, 0xaa,
0x54, 0x35, 0xe2, 0xf4, 0x1c, 0x4a, 0xf4, 0xea, 0x04, 0x0f, 0x9b, 0xe0, 0x73, 0x0d, 0x9c, 0x49, 0x11, 0xa7, 0xeb, 0x50, 0xa2, 0x57, 0xc6, 0x79, 0xd8, 0x04, 0xcf, 0x35, 0x70, 0x26, 0x15, 0xce,
0x85, 0x73, 0xb8, 0xf9, 0x57, 0x04, 0xe2, 0xfd, 0x76, 0x38, 0xdf, 0xe1, 0x1d, 0xee, 0x2b, 0x82, 0xe1, 0x46, 0x2f, 0xc1, 0x71, 0x31, 0x31, 0x79, 0x68, 0xf2, 0x13, 0xb4, 0x09, 0x3e, 0x15, 0xa7,
0x50, 0xd5, 0xfb, 0xf6, 0x15, 0x41, 0x44, 0xc4, 0xc1, 0x4f, 0x48, 0x5f, 0x15, 0x60, 0x3a, 0x24, 0xd9, 0x8e, 0x78, 0x31, 0xd1, 0x87, 0x53, 0xd4, 0xfc, 0x1d, 0x82, 0x38, 0x01, 0x1e, 0xcc, 0x4b,
0xbe, 0xeb, 0xaf, 0x08, 0x32, 0x58, 0x86, 0xf0, 0x15, 0x41, 0x76, 0x1b, 0xbe, 0x78, 0xbf, 0xdb, 0xbe, 0xc3, 0xbd, 0x43, 0x08, 0x55, 0xbd, 0x67, 0xef, 0x10, 0x22, 0x22, 0x0e, 0x3e, 0x84, 0xfa,
0xf0, 0xf7, 0xe1, 0xeb, 0x05, 0xde, 0xd9, 0x0f, 0x9d, 0xf8, 0xef, 0xdf, 0xd9, 0x0f, 0x75, 0xcd, 0x62, 0x08, 0xa6, 0x42, 0xe2, 0x3b, 0x7e, 0x87, 0x90, 0xc1, 0x32, 0x80, 0x77, 0x08, 0xd9, 0x17,
0x29, 0x67, 0x7e, 0x5b, 0x88, 0x1a, 0xf4, 0x1f, 0xd4, 0x3e, 0x3e, 0xfc, 0x57, 0x8a, 0xf2, 0xe7, 0xf9, 0x85, 0x7b, 0x7d, 0x91, 0x7f, 0x0f, 0xde, 0x3f, 0xf0, 0xb7, 0x01, 0xa1, 0x13, 0xff, 0xf7,
0x45, 0x38, 0x9e, 0xdc, 0xb1, 0xb1, 0x2e, 0xa2, 0x74, 0xc7, 0x2e, 0x62, 0x03, 0x4e, 0x6c, 0xb9, 0xdf, 0x06, 0x84, 0xba, 0xe6, 0x14, 0x44, 0x7f, 0x18, 0x8a, 0x1a, 0xf4, 0x7f, 0x74, 0x01, 0x7d,
0x9a, 0xd6, 0xe3, 0x0e, 0x89, 0xb4, 0x12, 0xbd, 0x57, 0xfb, 0x87, 0x05, 0xe7, 0x89, 0x8b, 0x19, 0xf8, 0x77, 0x8e, 0xf2, 0xa7, 0x05, 0x38, 0x9e, 0x9c, 0xb1, 0xb1, 0x7b, 0x48, 0xe9, 0xb6, 0xf7,
0x34, 0x38, 0x93, 0x33, 0xa7, 0x23, 0x5a, 0x1c, 0xa8, 0x23, 0x9a, 0x6a, 0xc8, 0x95, 0xfa, 0x68, 0x90, 0x75, 0x98, 0xde, 0x72, 0x35, 0xad, 0xcb, 0x1d, 0x12, 0xb9, 0x8c, 0xf4, 0xce, 0xfd, 0x1f,
0xc8, 0x65, 0x76, 0x37, 0xcb, 0x03, 0x74, 0x37, 0xef, 0x45, 0x3b, 0x32, 0x23, 0xf1, 0xdd, 0xa9, 0x14, 0x9c, 0xd3, 0x17, 0x32, 0x68, 0x70, 0x26, 0x67, 0xce, 0x9d, 0x6a, 0xa1, 0xaf, 0x3b, 0xd5,
0x1d, 0x29, 0x3f, 0x0c, 0xb3, 0x82, 0x8d, 0xf2, 0x4e, 0xa1, 0x41, 0x6d, 0x53, 0xd3, 0x88, 0xbd, 0xd4, 0x95, 0xde, 0x70, 0x0f, 0x57, 0x7a, 0x99, 0xf7, 0xa3, 0xc5, 0x3e, 0xee, 0x47, 0xef, 0xc6,
0xec, 0xea, 0x7a, 0x4f, 0x3e, 0x0f, 0x13, 0xf1, 0x9e, 0xb8, 0xb7, 0xf2, 0x5e, 0x9b, 0x5e, 0xf4, 0x85, 0x66, 0x46, 0xe2, 0xbb, 0xdd, 0x85, 0xa6, 0xfc, 0x20, 0xcc, 0x0a, 0x36, 0xca, 0xef, 0x1a,
0x52, 0x22, 0x2b, 0xef, 0x8d, 0xe3, 0x80, 0x42, 0xfe, 0x40, 0x82, 0x99, 0xec, 0xef, 0xef, 0x90, 0x0d, 0x6a, 0x9b, 0x9a, 0x46, 0xec, 0x65, 0x57, 0xd7, 0xbb, 0xf2, 0x39, 0x18, 0x8f, 0xdf, 0xaa,
0x06, 0x13, 0xba, 0xb2, 0x1b, 0xfd, 0x00, 0x51, 0x1a, 0xf0, 0xc6, 0xcd, 0x9b, 0x9f, 0x6b, 0x31, 0x7b, 0x23, 0xef, 0x5d, 0xf4, 0x8b, 0xdb, 0x98, 0xc8, 0xc8, 0x7b, 0xed, 0x38, 0xa0, 0x90, 0xdf,
0x2c, 0x9c, 0xc0, 0x96, 0xbf, 0x90, 0xe0, 0x64, 0x4e, 0x9b, 0x71, 0xb8, 0x9a, 0xa0, 0x6b, 0x50, 0x93, 0x60, 0x26, 0xfb, 0x05, 0x1f, 0xd2, 0x60, 0x5c, 0x57, 0x76, 0xa3, 0x4f, 0x18, 0xa5, 0x3e,
0xd1, 0x95, 0xdd, 0xa6, 0x6b, 0x77, 0xc9, 0xc0, 0x6f, 0x0c, 0x3c, 0x97, 0xac, 0x09, 0x14, 0x1c, 0xf7, 0xec, 0xfc, 0xfa, 0x74, 0x2d, 0x86, 0x85, 0x13, 0xd8, 0xf2, 0x67, 0x12, 0x9c, 0xc8, 0xb9,
0xe0, 0xc9, 0x1f, 0x4b, 0x50, 0xcd, 0xab, 0x07, 0xd1, 0xd9, 0x58, 0x43, 0xf4, 0xd1, 0x44, 0x43, 0xa8, 0x1c, 0xac, 0x26, 0xe8, 0x2a, 0x94, 0x74, 0x65, 0xb7, 0xe1, 0xda, 0x1d, 0xd2, 0xf7, 0x29,
0x74, 0x2a, 0xc5, 0x37, 0xa4, 0x76, 0xe8, 0x27, 0x12, 0xcc, 0x64, 0xd7, 0xcd, 0xe8, 0x99, 0x98, 0x05, 0xcf, 0x25, 0x6b, 0x02, 0x05, 0x07, 0x78, 0xf2, 0x87, 0x12, 0x54, 0xf2, 0x2a, 0x4a, 0x74,
0xc6, 0xf3, 0x09, 0x8d, 0x27, 0x13, 0x5c, 0x42, 0xdf, 0x6d, 0x98, 0x10, 0xd5, 0xb5, 0x80, 0x11, 0x26, 0x76, 0xa5, 0xfa, 0x70, 0xe2, 0x4a, 0x75, 0x32, 0xc5, 0x37, 0xa0, 0x0b, 0xd5, 0x8f, 0x24,
0x5e, 0x7e, 0xf2, 0xe0, 0xac, 0x2a, 0xc0, 0xfc, 0x3a, 0x91, 0xaf, 0x64, 0x7c, 0x0c, 0x27, 0x70, 0x98, 0xc9, 0xae, 0xbc, 0xd1, 0x53, 0x31, 0x8d, 0xe7, 0x13, 0x1a, 0x4f, 0x24, 0xb8, 0x84, 0xbe,
0xe5, 0x9f, 0x17, 0xa0, 0xdc, 0x6c, 0x2b, 0x1a, 0x19, 0x42, 0x51, 0x77, 0x2d, 0x56, 0xd4, 0xf5, 0xdb, 0x30, 0x2e, 0xea, 0x73, 0x01, 0x23, 0xbc, 0xfc, 0xf8, 0xc1, 0x59, 0x55, 0x80, 0xf9, 0x95,
0xfb, 0x3f, 0x02, 0x5c, 0xcb, 0xdc, 0x7a, 0x6e, 0x33, 0x51, 0xcf, 0x9d, 0x1b, 0x08, 0xfd, 0xe0, 0x26, 0x1f, 0xc9, 0x78, 0x1b, 0x4e, 0xe0, 0xca, 0xbf, 0x1a, 0x82, 0x62, 0xa3, 0xa5, 0x68, 0x64,
0x52, 0xee, 0x79, 0x18, 0x0d, 0x94, 0xe8, 0xef, 0xf4, 0x90, 0x3f, 0x2a, 0xc0, 0x58, 0x44, 0x44, 0x00, 0x45, 0xdd, 0xd5, 0x58, 0x51, 0xd7, 0xeb, 0xbf, 0x0c, 0xb8, 0x96, 0xb9, 0xf5, 0xdc, 0x66,
0x9f, 0x67, 0xcf, 0x4e, 0xec, 0xf4, 0x1e, 0xe4, 0xdf, 0x91, 0x22, 0xb2, 0x6b, 0xfe, 0xf9, 0xed, 0xa2, 0x9e, 0x3b, 0xdb, 0x17, 0xfa, 0xc1, 0xa5, 0xdc, 0xb3, 0x30, 0x1a, 0x28, 0xd1, 0xdb, 0xea,
0x7d, 0x7f, 0x17, 0x7e, 0x47, 0x95, 0x3e, 0xd6, 0xcf, 0xc3, 0x04, 0xe5, 0xff, 0x9d, 0x13, 0xbc, 0x21, 0x7f, 0x30, 0x04, 0xe5, 0x88, 0x88, 0x1e, 0xd7, 0x9e, 0x9d, 0xd8, 0xea, 0xdd, 0xcf, 0x1f,
0xf1, 0x15, 0x79, 0x14, 0x07, 0x5f, 0x75, 0xb6, 0x62, 0xb3, 0x38, 0x41, 0x3d, 0xfb, 0x02, 0x8c, 0x9a, 0x22, 0xb2, 0xab, 0xfe, 0xfa, 0xed, 0xbd, 0xe0, 0x0b, 0x5f, 0x62, 0xa5, 0x97, 0xf5, 0x73,
0xc7, 0x84, 0xf5, 0xf5, 0xb9, 0xdc, 0xef, 0x24, 0x78, 0xf4, 0x8e, 0x77, 0x32, 0x54, 0x8f, 0x6d, 0x30, 0x4e, 0xf9, 0xff, 0x7b, 0x82, 0x53, 0xc2, 0x02, 0x8f, 0xe2, 0xe0, 0x5d, 0x68, 0x33, 0xd6,
0xaf, 0x5a, 0x62, 0x7b, 0xcd, 0xe5, 0x03, 0x0c, 0xf1, 0x63, 0x89, 0x1f, 0x15, 0x00, 0xb5, 0xb6, 0x8b, 0x13, 0xd4, 0xb3, 0xcf, 0xc1, 0x58, 0x4c, 0x58, 0x4f, 0x0f, 0xee, 0xfe, 0x28, 0xc1, 0xc3,
0x55, 0xbb, 0xd3, 0x50, 0x6c, 0xda, 0xc3, 0xe2, 0x7f, 0xb0, 0x86, 0xb0, 0xe1, 0xce, 0xc2, 0x58, 0xb7, 0xdd, 0xd5, 0xa1, 0x5a, 0x6c, 0x7a, 0x55, 0x13, 0xd3, 0x6b, 0x2e, 0x1f, 0x60, 0x80, 0xcf,
0x87, 0x38, 0x6d, 0x5b, 0xe5, 0xce, 0x12, 0x77, 0x85, 0xe0, 0x1d, 0x64, 0x39, 0x9c, 0xc2, 0x51, 0x2d, 0x7e, 0x3a, 0x04, 0xa8, 0xb9, 0xad, 0xda, 0xed, 0xba, 0x62, 0xd3, 0x2e, 0x16, 0xff, 0xe2,
0x3a, 0xd4, 0x85, 0xca, 0x8e, 0xf7, 0x5f, 0x7e, 0x7e, 0xe7, 0xad, 0xdf, 0x62, 0x36, 0xfc, 0x3f, 0x1a, 0xc0, 0x84, 0x3b, 0x03, 0xe5, 0x36, 0x71, 0x5a, 0xb6, 0xca, 0x9d, 0x25, 0xf6, 0x0a, 0xc1,
0xc1, 0x30, 0xbe, 0xc4, 0x80, 0x83, 0x03, 0x70, 0xf9, 0x43, 0x09, 0x66, 0xd2, 0x8e, 0x59, 0x66, 0x49, 0xca, 0x72, 0xd8, 0x85, 0xa3, 0x74, 0xa8, 0x03, 0xa5, 0x1d, 0xef, 0x7f, 0x82, 0xfe, 0xdd,
0xaa, 0xdf, 0x7f, 0xe7, 0x3c, 0x0c, 0x25, 0x8e, 0xce, 0xbc, 0x72, 0xcc, 0x7b, 0xf1, 0x66, 0x92, 0x5d, 0xaf, 0xc5, 0x6c, 0xf8, 0x4f, 0xc3, 0x30, 0xbe, 0x44, 0x83, 0x83, 0x03, 0x70, 0xf9, 0x7d,
0x31, 0x1f, 0x95, 0xbf, 0x94, 0x60, 0x36, 0x5b, 0xb5, 0x21, 0x5c, 0x25, 0xae, 0xc7, 0xaf, 0x12, 0x09, 0x66, 0xd2, 0x8e, 0x59, 0x66, 0xaa, 0xdf, 0x7b, 0xe7, 0x3c, 0x08, 0xc3, 0x1c, 0x9d, 0x79,
0xfd, 0x3e, 0x1b, 0x64, 0xeb, 0x9d, 0x73, 0xad, 0xd8, 0xcb, 0x5c, 0x83, 0x21, 0x18, 0xb9, 0x15, 0xe5, 0x98, 0x77, 0x66, 0xce, 0x24, 0x63, 0xde, 0x2a, 0x7f, 0x2e, 0xc1, 0x6c, 0xb6, 0x6a, 0x03,
0x37, 0x72, 0xf1, 0xd0, 0x46, 0x66, 0x1b, 0x58, 0x7f, 0xe2, 0xe6, 0xad, 0xb9, 0x23, 0x9f, 0xde, 0xd8, 0x4a, 0x5c, 0x8b, 0x6f, 0x25, 0x7a, 0x3d, 0x78, 0xc8, 0xd6, 0x3b, 0x67, 0x5b, 0xb1, 0x97,
0x9a, 0x3b, 0xf2, 0xd9, 0xad, 0xb9, 0x23, 0xef, 0xef, 0xcf, 0x49, 0x37, 0xf7, 0xe7, 0xa4, 0x4f, 0x39, 0x06, 0x03, 0x30, 0x72, 0x2b, 0x6e, 0xe4, 0xe2, 0xa1, 0x8d, 0xcc, 0x36, 0xb0, 0xf6, 0xd8,
0xf7, 0xe7, 0xa4, 0xbf, 0xed, 0xcf, 0x49, 0x3f, 0xf8, 0x62, 0xee, 0xc8, 0xb5, 0x11, 0x81, 0xf9, 0x8d, 0x9b, 0x73, 0x47, 0x3e, 0xbe, 0x39, 0x77, 0xe4, 0x93, 0x9b, 0x73, 0x47, 0xde, 0xdd, 0x9f,
0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb6, 0x73, 0xfd, 0x6b, 0xf2, 0x3c, 0x00, 0x00, 0x93, 0x6e, 0xec, 0xcf, 0x49, 0x1f, 0xef, 0xcf, 0x49, 0xff, 0xdc, 0x9f, 0x93, 0x7e, 0xfc, 0xd9,
0xdc, 0x91, 0xab, 0x23, 0x02, 0xf3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x3f, 0x0c, 0xbe,
0x34, 0x3d, 0x00, 0x00,
} }

View File

@@ -710,6 +710,11 @@ message PodSecurityPolicySpec {
// will not be forced to. // will not be forced to.
// +optional // +optional
optional bool readOnlyRootFilesystem = 14; optional bool readOnlyRootFilesystem = 14;
// AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all
// host paths may be used.
// +optional
repeated string allowedHostPaths = 15;
} }
// ReplicaSet represents the configuration of a ReplicaSet. // ReplicaSet represents the configuration of a ReplicaSet.

View File

@@ -14595,7 +14595,7 @@ func (x *PodSecurityPolicySpec) CodecEncodeSelf(e *codec1978.Encoder) {
} else { } else {
yysep2 := !z.EncBinary() yysep2 := !z.EncBinary()
yy2arr2 := z.EncBasicHandle().StructToArray yy2arr2 := z.EncBasicHandle().StructToArray
var yyq2 [14]bool var yyq2 [15]bool
_, _, _ = yysep2, yyq2, yy2arr2 _, _, _ = yysep2, yyq2, yy2arr2
const yyr2 bool = false const yyr2 bool = false
yyq2[0] = x.Privileged != false yyq2[0] = x.Privileged != false
@@ -14608,9 +14608,10 @@ func (x *PodSecurityPolicySpec) CodecEncodeSelf(e *codec1978.Encoder) {
yyq2[7] = x.HostPID != false yyq2[7] = x.HostPID != false
yyq2[8] = x.HostIPC != false yyq2[8] = x.HostIPC != false
yyq2[13] = x.ReadOnlyRootFilesystem != false yyq2[13] = x.ReadOnlyRootFilesystem != false
yyq2[14] = len(x.AllowedHostPaths) != 0
var yynn2 int var yynn2 int
if yyr2 || yy2arr2 { if yyr2 || yy2arr2 {
r.EncodeArrayStart(14) r.EncodeArrayStart(15)
} else { } else {
yynn2 = 4 yynn2 = 4
for _, b := range yyq2 { for _, b := range yyq2 {
@@ -14955,6 +14956,39 @@ func (x *PodSecurityPolicySpec) CodecEncodeSelf(e *codec1978.Encoder) {
} }
} }
} }
if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayElem1234)
if yyq2[14] {
if x.AllowedHostPaths == nil {
r.EncodeNil()
} else {
yym54 := z.EncBinary()
_ = yym54
if false {
} else {
z.F.EncSliceStringV(x.AllowedHostPaths, false, e)
}
}
} else {
r.EncodeNil()
}
} else {
if yyq2[14] {
z.EncSendContainerState(codecSelfer_containerMapKey1234)
r.EncodeString(codecSelferC_UTF81234, string("allowedHostPaths"))
z.EncSendContainerState(codecSelfer_containerMapValue1234)
if x.AllowedHostPaths == nil {
r.EncodeNil()
} else {
yym55 := z.EncBinary()
_ = yym55
if false {
} else {
z.F.EncSliceStringV(x.AllowedHostPaths, false, e)
}
}
}
}
if yyr2 || yy2arr2 { if yyr2 || yy2arr2 {
z.EncSendContainerState(codecSelfer_containerArrayEnd1234) z.EncSendContainerState(codecSelfer_containerArrayEnd1234)
} else { } else {
@@ -15164,6 +15198,18 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromMap(l int, d *codec1978.Decod
*((*bool)(yyv26)) = r.DecodeBool() *((*bool)(yyv26)) = r.DecodeBool()
} }
} }
case "allowedHostPaths":
if r.TryDecodeAsNil() {
x.AllowedHostPaths = nil
} else {
yyv28 := &x.AllowedHostPaths
yym29 := z.DecBinary()
_ = yym29
if false {
} else {
z.F.DecSliceStringX(yyv28, false, d)
}
}
default: default:
z.DecStructFieldNotFound(-1, yys3) z.DecStructFieldNotFound(-1, yys3)
} // end switch yys3 } // end switch yys3
@@ -15175,16 +15221,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
var h codecSelfer1234 var h codecSelfer1234
z, r := codec1978.GenHelperDecoder(d) z, r := codec1978.GenHelperDecoder(d)
_, _, _ = h, z, r _, _, _ = h, z, r
var yyj28 int var yyj30 int
var yyb28 bool var yyb30 bool
var yyhl28 bool = l >= 0 var yyhl30 bool = l >= 0
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15192,21 +15238,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Privileged = false x.Privileged = false
} else { } else {
yyv29 := &x.Privileged yyv31 := &x.Privileged
yym30 := z.DecBinary() yym32 := z.DecBinary()
_ = yym30 _ = yym32
if false { if false {
} else { } else {
*((*bool)(yyv29)) = r.DecodeBool() *((*bool)(yyv31)) = r.DecodeBool()
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15214,29 +15260,7 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.DefaultAddCapabilities = nil x.DefaultAddCapabilities = nil
} else { } else {
yyv31 := &x.DefaultAddCapabilities yyv33 := &x.DefaultAddCapabilities
yym32 := z.DecBinary()
_ = yym32
if false {
} else {
h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv31), d)
}
}
yyj28++
if yyhl28 {
yyb28 = yyj28 > l
} else {
yyb28 = r.CheckBreak()
}
if yyb28 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.RequiredDropCapabilities = nil
} else {
yyv33 := &x.RequiredDropCapabilities
yym34 := z.DecBinary() yym34 := z.DecBinary()
_ = yym34 _ = yym34
if false { if false {
@@ -15244,21 +15268,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv33), d) h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv33), d)
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
z.DecSendContainerState(codecSelfer_containerArrayElem1234) z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.AllowedCapabilities = nil x.RequiredDropCapabilities = nil
} else { } else {
yyv35 := &x.AllowedCapabilities yyv35 := &x.RequiredDropCapabilities
yym36 := z.DecBinary() yym36 := z.DecBinary()
_ = yym36 _ = yym36
if false { if false {
@@ -15266,13 +15290,35 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv35), d) h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv35), d)
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.AllowedCapabilities = nil
} else {
yyv37 := &x.AllowedCapabilities
yym38 := z.DecBinary()
_ = yym38
if false {
} else {
h.decSlicev1_Capability((*[]pkg4_v1.Capability)(yyv37), d)
}
}
yyj30++
if yyhl30 {
yyb30 = yyj30 > l
} else {
yyb30 = r.CheckBreak()
}
if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15280,21 +15326,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.Volumes = nil x.Volumes = nil
} else { } else {
yyv37 := &x.Volumes yyv39 := &x.Volumes
yym38 := z.DecBinary() yym40 := z.DecBinary()
_ = yym38 _ = yym40
if false { if false {
} else { } else {
h.decSliceFSType((*[]FSType)(yyv37), d) h.decSliceFSType((*[]FSType)(yyv39), d)
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15302,21 +15348,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.HostNetwork = false x.HostNetwork = false
} else { } else {
yyv39 := &x.HostNetwork yyv41 := &x.HostNetwork
yym40 := z.DecBinary() yym42 := z.DecBinary()
_ = yym40 _ = yym42
if false { if false {
} else { } else {
*((*bool)(yyv39)) = r.DecodeBool() *((*bool)(yyv41)) = r.DecodeBool()
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15324,21 +15370,21 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.HostPorts = nil x.HostPorts = nil
} else { } else {
yyv41 := &x.HostPorts yyv43 := &x.HostPorts
yym42 := z.DecBinary() yym44 := z.DecBinary()
_ = yym42 _ = yym44
if false { if false {
} else { } else {
h.decSliceHostPortRange((*[]HostPortRange)(yyv41), d) h.decSliceHostPortRange((*[]HostPortRange)(yyv43), d)
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15346,29 +15392,7 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.HostPID = false x.HostPID = false
} else { } else {
yyv43 := &x.HostPID yyv45 := &x.HostPID
yym44 := z.DecBinary()
_ = yym44
if false {
} else {
*((*bool)(yyv43)) = r.DecodeBool()
}
}
yyj28++
if yyhl28 {
yyb28 = yyj28 > l
} else {
yyb28 = r.CheckBreak()
}
if yyb28 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.HostIPC = false
} else {
yyv45 := &x.HostIPC
yym46 := z.DecBinary() yym46 := z.DecBinary()
_ = yym46 _ = yym46
if false { if false {
@@ -15376,13 +15400,35 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
*((*bool)(yyv45)) = r.DecodeBool() *((*bool)(yyv45)) = r.DecodeBool()
} }
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.HostIPC = false
} else {
yyv47 := &x.HostIPC
yym48 := z.DecBinary()
_ = yym48
if false {
} else {
*((*bool)(yyv47)) = r.DecodeBool()
}
}
yyj30++
if yyhl30 {
yyb30 = yyj30 > l
} else {
yyb30 = r.CheckBreak()
}
if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15390,16 +15436,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.SELinux = SELinuxStrategyOptions{} x.SELinux = SELinuxStrategyOptions{}
} else { } else {
yyv47 := &x.SELinux yyv49 := &x.SELinux
yyv47.CodecDecodeSelf(d) yyv49.CodecDecodeSelf(d)
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15407,16 +15453,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.RunAsUser = RunAsUserStrategyOptions{} x.RunAsUser = RunAsUserStrategyOptions{}
} else { } else {
yyv48 := &x.RunAsUser yyv50 := &x.RunAsUser
yyv48.CodecDecodeSelf(d) yyv50.CodecDecodeSelf(d)
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15424,16 +15470,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.SupplementalGroups = SupplementalGroupsStrategyOptions{} x.SupplementalGroups = SupplementalGroupsStrategyOptions{}
} else { } else {
yyv49 := &x.SupplementalGroups yyv51 := &x.SupplementalGroups
yyv49.CodecDecodeSelf(d) yyv51.CodecDecodeSelf(d)
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15441,16 +15487,16 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.FSGroup = FSGroupStrategyOptions{} x.FSGroup = FSGroupStrategyOptions{}
} else { } else {
yyv50 := &x.FSGroup yyv52 := &x.FSGroup
yyv50.CodecDecodeSelf(d) yyv52.CodecDecodeSelf(d)
} }
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return return
} }
@@ -15458,26 +15504,48 @@ func (x *PodSecurityPolicySpec) codecDecodeSelfFromArray(l int, d *codec1978.Dec
if r.TryDecodeAsNil() { if r.TryDecodeAsNil() {
x.ReadOnlyRootFilesystem = false x.ReadOnlyRootFilesystem = false
} else { } else {
yyv51 := &x.ReadOnlyRootFilesystem yyv53 := &x.ReadOnlyRootFilesystem
yym52 := z.DecBinary() yym54 := z.DecBinary()
_ = yym52 _ = yym54
if false { if false {
} else { } else {
*((*bool)(yyv51)) = r.DecodeBool() *((*bool)(yyv53)) = r.DecodeBool()
}
}
yyj30++
if yyhl30 {
yyb30 = yyj30 > l
} else {
yyb30 = r.CheckBreak()
}
if yyb30 {
z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
return
}
z.DecSendContainerState(codecSelfer_containerArrayElem1234)
if r.TryDecodeAsNil() {
x.AllowedHostPaths = nil
} else {
yyv55 := &x.AllowedHostPaths
yym56 := z.DecBinary()
_ = yym56
if false {
} else {
z.F.DecSliceStringX(yyv55, false, d)
} }
} }
for { for {
yyj28++ yyj30++
if yyhl28 { if yyhl30 {
yyb28 = yyj28 > l yyb30 = yyj30 > l
} else { } else {
yyb28 = r.CheckBreak() yyb30 = r.CheckBreak()
} }
if yyb28 { if yyb30 {
break break
} }
z.DecSendContainerState(codecSelfer_containerArrayElem1234) z.DecSendContainerState(codecSelfer_containerArrayElem1234)
z.DecStructFieldNotFound(yyj28-1, "") z.DecStructFieldNotFound(yyj30-1, "")
} }
z.DecSendContainerState(codecSelfer_containerArrayEnd1234) z.DecSendContainerState(codecSelfer_containerArrayEnd1234)
} }
@@ -21266,7 +21334,7 @@ func (x codecSelfer1234) decSlicePodSecurityPolicy(v *[]PodSecurityPolicy, d *co
yyrg1 := len(yyv1) > 0 yyrg1 := len(yyv1) > 0
yyv21 := yyv1 yyv21 := yyv1
yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 560) yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 584)
if yyrt1 { if yyrt1 {
if yyrl1 <= cap(yyv1) { if yyrl1 <= cap(yyv1) {
yyv1 = yyv1[:yyrl1] yyv1 = yyv1[:yyrl1]

View File

@@ -909,6 +909,10 @@ type PodSecurityPolicySpec struct {
// will not be forced to. // will not be forced to.
// +optional // +optional
ReadOnlyRootFilesystem bool `json:"readOnlyRootFilesystem,omitempty" protobuf:"varint,14,opt,name=readOnlyRootFilesystem"` ReadOnlyRootFilesystem bool `json:"readOnlyRootFilesystem,omitempty" protobuf:"varint,14,opt,name=readOnlyRootFilesystem"`
// AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all
// host paths may be used.
// +optional
AllowedHostPaths []string `json:"allowedHostPaths,omitempty" protobuf:"bytes,15,opt,name=allowedHostPaths"`
} }
// FS Type gives strong typing to different file systems that are used by volumes. // FS Type gives strong typing to different file systems that are used by volumes.

View File

@@ -423,6 +423,7 @@ var map_PodSecurityPolicySpec = map[string]string{
"supplementalGroups": "SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext.", "supplementalGroups": "SupplementalGroups is the strategy that will dictate what supplemental groups are used by the SecurityContext.",
"fsGroup": "FSGroup is the strategy that will dictate what fs group is used by the SecurityContext.", "fsGroup": "FSGroup is the strategy that will dictate what fs group is used by the SecurityContext.",
"readOnlyRootFilesystem": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.", "readOnlyRootFilesystem": "ReadOnlyRootFilesystem when set to true will force containers to run with a read only root file system. If the container specifically requests to run with a non-read only root file system the PSP should deny the pod. If set to false the container may run with a read only root file system if it wishes but it will not be forced to.",
"allowedHostPaths": "AllowedHostPaths is a white list of allowed host path prefixes. Empty indicates that all host paths may be used.",
} }
func (PodSecurityPolicySpec) SwaggerDoc() map[string]string { func (PodSecurityPolicySpec) SwaggerDoc() map[string]string {

View File

@@ -1215,6 +1215,7 @@ func autoConvert_v1beta1_PodSecurityPolicySpec_To_extensions_PodSecurityPolicySp
return err return err
} }
out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem
out.AllowedHostPaths = *(*[]string)(unsafe.Pointer(&in.AllowedHostPaths))
return nil return nil
} }
@@ -1256,6 +1257,7 @@ func autoConvert_extensions_PodSecurityPolicySpec_To_v1beta1_PodSecurityPolicySp
return err return err
} }
out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem out.ReadOnlyRootFilesystem = in.ReadOnlyRootFilesystem
out.AllowedHostPaths = *(*[]string)(unsafe.Pointer(&in.AllowedHostPaths))
return nil return nil
} }

View File

@@ -826,6 +826,11 @@ func DeepCopy_v1beta1_PodSecurityPolicySpec(in interface{}, out interface{}, c *
if err := DeepCopy_v1beta1_FSGroupStrategyOptions(&in.FSGroup, &out.FSGroup, c); err != nil { if err := DeepCopy_v1beta1_FSGroupStrategyOptions(&in.FSGroup, &out.FSGroup, c); err != nil {
return err return err
} }
if in.AllowedHostPaths != nil {
in, out := &in.AllowedHostPaths, &out.AllowedHostPaths
*out = make([]string, len(*in))
copy(*out, *in)
}
return nil return nil
} }
} }

View File

@@ -818,6 +818,11 @@ func DeepCopy_extensions_PodSecurityPolicySpec(in interface{}, out interface{},
if err := DeepCopy_extensions_FSGroupStrategyOptions(&in.FSGroup, &out.FSGroup, c); err != nil { if err := DeepCopy_extensions_FSGroupStrategyOptions(&in.FSGroup, &out.FSGroup, c); err != nil {
return err return err
} }
if in.AllowedHostPaths != nil {
in, out := &in.AllowedHostPaths, &out.AllowedHostPaths
*out = make([]string, len(*in))
copy(*out, *in)
}
return nil return nil
} }
} }