Added support for list all packages flag in client (#1032)

* Added support for list all packages flag in client

This commit is to support --list-all_pkgs argument in client command
Example command: trivy -d client --list-all-pkgs --remote http://localhost:8080 ubuntu:18.04.

* Updated argument in client.md

* Fixed all format issues
This commit is contained in:
tonaim
2021-06-04 01:17:48 +05:30
committed by GitHub
parent fb19abd09a
commit e4c32cdb77
10 changed files with 94 additions and 62 deletions

View File

@@ -21,6 +21,7 @@ OPTIONS:
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
--token value for authentication [$TRIVY_TOKEN]
--token-header value specify a header name for token (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER]
--remote value server address (default: "http://localhost:4954") [$TRIVY_REMOTE]

View File

@@ -484,7 +484,7 @@ func NewClientCommand() *cli.Command {
&ignoreFileFlag,
&timeoutFlag,
&ignorePolicy,
&listAllPackages,
// original flags
&token,
&tokenHeader,

View File

@@ -14,14 +14,13 @@ import (
type Option struct {
option.GlobalOption
option.ArtifactOption
ListAllPkgs bool
option.ImageOption
option.ReportOption
RemoteAddr string
token string
tokenHeader string
customHeaders []string
// this field is populated in Init()
CustomHeaders http.Header
}
@@ -42,6 +41,7 @@ func NewOption(c *cli.Context) (Option, error) {
token: c.String("token"),
tokenHeader: c.String("token-header"),
customHeaders: c.StringSlice("custom-headers"),
ListAllPkgs: c.Bool("list-all-pkgs"),
}, nil
}

View File

@@ -55,6 +55,7 @@ func runWithTimeout(ctx context.Context, opt Option) error {
VulnType: opt.VulnType,
SecurityChecks: opt.SecurityChecks,
ScanRemovedPackages: opt.ScanRemovedPkgs,
ListAllPackages: opt.ListAllPkgs,
}
log.Logger.Debugf("Vulnerability type: %s", scanOptions.VulnType)

View File

@@ -58,6 +58,7 @@ func (s Scanner) Scan(target string, imageID string, layerIDs []string, options
Options: &rpc.ScanOptions{
VulnType: options.VulnType,
SecurityChecks: options.SecurityChecks,
ListAllPackages: options.ListAllPackages,
},
})
return err

View File

@@ -145,6 +145,7 @@ func ConvertFromRPCResults(rpcResults []*scanner.Result) []report.Result {
Target: result.Target,
Vulnerabilities: ConvertFromRPCVulns(result.Vulnerabilities),
Type: result.Type,
Packages: ConvertFromRPCPkgs(result.Packages),
})
}
return results
@@ -363,6 +364,7 @@ func ConvertToRPCScanResponse(results report.Results, os *ftypes.OS, eosl bool)
Target: result.Target,
Type: result.Type,
Vulnerabilities: ConvertToRPCVulns(result.Vulnerabilities),
Packages: ConvertToRPCPkgs(result.Packages),
})
}

View File

@@ -41,6 +41,7 @@ func (s *ScanServer) Scan(_ context.Context, in *rpcScanner.ScanRequest) (*rpcSc
options := types.ScanOptions{
VulnType: in.Options.VulnType,
SecurityChecks: in.Options.SecurityChecks,
ListAllPackages: in.Options.ListAllPackages,
}
results, os, eosl, err := s.localScanner.Scan(in.Target, in.ArtifactId, in.BlobIds, options)
if err != nil {

View File

@@ -87,6 +87,7 @@ func (m *ScanRequest) GetOptions() *ScanOptions {
type ScanOptions struct {
VulnType []string `protobuf:"bytes,1,rep,name=vuln_type,json=vulnType,proto3" json:"vuln_type,omitempty"`
SecurityChecks []string `protobuf:"bytes,2,rep,name=security_checks,json=securityChecks,proto3" json:"security_checks,omitempty"`
ListAllPackages bool `protobuf:"varint,3,opt,name=list_all_packages,json=listAllPackages,proto3" json:"list_all_packages,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -131,6 +132,13 @@ func (m *ScanOptions) GetSecurityChecks() []string {
return nil
}
func (m *ScanOptions) GetListAllPackages() bool {
if m != nil {
return m.ListAllPackages
}
return false
}
type ScanResponse struct {
Os *common.OS `protobuf:"bytes,1,opt,name=os,proto3" json:"os,omitempty"`
Eosl bool `protobuf:"varint,2,opt,name=eosl,proto3" json:"eosl,omitempty"`
@@ -191,6 +199,7 @@ type Result struct {
Target string `protobuf:"bytes,1,opt,name=target,proto3" json:"target,omitempty"`
Vulnerabilities []*common.Vulnerability `protobuf:"bytes,2,rep,name=vulnerabilities,proto3" json:"vulnerabilities,omitempty"`
Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"`
Packages []*common.Package `protobuf:"bytes,4,rep,name=packages,proto3" json:"packages,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -242,6 +251,13 @@ func (m *Result) GetType() string {
return ""
}
func (m *Result) GetPackages() []*common.Package {
if m != nil {
return m.Packages
}
return nil
}
func init() {
proto.RegisterType((*ScanRequest)(nil), "trivy.scanner.v1.ScanRequest")
proto.RegisterType((*ScanOptions)(nil), "trivy.scanner.v1.ScanOptions")
@@ -249,33 +265,38 @@ func init() {
proto.RegisterType((*Result)(nil), "trivy.scanner.v1.Result")
}
func init() { proto.RegisterFile("rpc/scanner/service.proto", fileDescriptor_60d0e837512b18d4) }
func init() {
proto.RegisterFile("rpc/scanner/service.proto", fileDescriptor_60d0e837512b18d4)
}
var fileDescriptor_60d0e837512b18d4 = []byte{
// 395 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x41, 0x8f, 0x9b, 0x30,
0x10, 0x85, 0x05, 0x89, 0x42, 0x18, 0xaa, 0xee, 0xca, 0x87, 0x8a, 0xdd, 0x55, 0x5b, 0xc4, 0xa5,
0x39, 0x81, 0x4a, 0xa5, 0xf6, 0xde, 0x2a, 0x87, 0x9c, 0x52, 0x99, 0xaa, 0x87, 0x5e, 0x90, 0x31,
0x6e, 0x62, 0x95, 0x60, 0x62, 0x1b, 0x54, 0xd4, 0x7f, 0xd2, 0x5f, 0x5b, 0x61, 0x83, 0xd4, 0x64,
0x95, 0xdb, 0xf8, 0xcd, 0x63, 0x78, 0xdf, 0xd8, 0xf0, 0x20, 0x5b, 0x9a, 0x2a, 0x4a, 0x9a, 0x86,
0xc9, 0x54, 0x31, 0xd9, 0x73, 0xca, 0x92, 0x56, 0x0a, 0x2d, 0xd0, 0xbd, 0x96, 0xbc, 0x1f, 0x92,
0xa9, 0x99, 0xf4, 0xef, 0x1f, 0x3f, 0x1e, 0xb8, 0x3e, 0x76, 0x65, 0x42, 0xc5, 0x29, 0x25, 0xe7,
0x8e, 0x28, 0x46, 0x3b, 0xc9, 0xf5, 0x90, 0x1a, 0x67, 0x3a, 0x8e, 0xa2, 0xe2, 0x74, 0x12, 0xcd,
0xe5, 0xa4, 0xf8, 0xaf, 0x03, 0x41, 0x4e, 0x49, 0x83, 0xd9, 0xb9, 0x63, 0x4a, 0xa3, 0x57, 0xb0,
0xd2, 0x44, 0x1e, 0x98, 0x0e, 0x9d, 0xc8, 0xd9, 0xf8, 0x78, 0x3a, 0xa1, 0xb7, 0x10, 0x10, 0xa9,
0xf9, 0x4f, 0x42, 0x75, 0xc1, 0xab, 0xd0, 0x35, 0x4d, 0x98, 0xa5, 0x5d, 0x85, 0x1e, 0x60, 0x5d,
0xd6, 0xa2, 0x2c, 0x78, 0xa5, 0xc2, 0x45, 0xb4, 0xd8, 0xf8, 0xd8, 0x1b, 0xcf, 0xbb, 0x4a, 0xa1,
0x4f, 0xe0, 0x89, 0x56, 0x73, 0xd1, 0xa8, 0x70, 0x19, 0x39, 0x9b, 0x20, 0x7b, 0x9d, 0x5c, 0xe7,
0x4f, 0xc6, 0x0c, 0x7b, 0x6b, 0xc2, 0xb3, 0x3b, 0xce, 0x6d, 0xb6, 0x49, 0x47, 0x4f, 0xe0, 0xf7,
0x5d, 0xdd, 0x14, 0x7a, 0x68, 0x59, 0xe8, 0x98, 0x7f, 0xac, 0x47, 0xe1, 0xdb, 0xd0, 0x32, 0xf4,
0x0e, 0xee, 0x66, 0xe6, 0x82, 0x1e, 0x19, 0xfd, 0xa5, 0x42, 0xd7, 0x58, 0x5e, 0xce, 0xf2, 0x17,
0xa3, 0xc6, 0xbf, 0xe1, 0x85, 0x05, 0x56, 0xad, 0x68, 0x14, 0x43, 0x11, 0xb8, 0x42, 0x19, 0xda,
0x20, 0xbb, 0x9f, 0x82, 0xd9, 0x55, 0x25, 0xfb, 0x1c, 0xbb, 0x42, 0x21, 0x04, 0x4b, 0x26, 0x54,
0x6d, 0xa0, 0xd7, 0xd8, 0xd4, 0x28, 0x03, 0x4f, 0x32, 0xd5, 0xd5, 0xda, 0xd2, 0x06, 0x59, 0xf8,
0x9c, 0x09, 0x1b, 0x03, 0x9e, 0x8d, 0xf1, 0x1f, 0x58, 0x59, 0xe9, 0xe6, 0x96, 0xb7, 0x70, 0x37,
0x02, 0x31, 0x49, 0x4a, 0x5e, 0x73, 0xcd, 0x99, 0x85, 0x08, 0xb2, 0xa7, 0xcb, 0x60, 0xdf, 0xff,
0x33, 0x0d, 0xf8, 0xfa, 0x9b, 0x31, 0xb0, 0xd9, 0xd1, 0xc2, 0x0c, 0x37, 0x75, 0xf6, 0x15, 0xbc,
0xdc, 0x46, 0x43, 0x5b, 0x58, 0x8e, 0x25, 0xba, 0x71, 0x0d, 0xd3, 0x53, 0x78, 0x7c, 0x73, 0xab,
0x6d, 0x17, 0xf7, 0xd9, 0xff, 0xe1, 0x4d, 0xad, 0x72, 0x65, 0x1e, 0xd3, 0x87, 0x7f, 0x01, 0x00,
0x00, 0xff, 0xff, 0xfd, 0x72, 0xf0, 0x54, 0xb3, 0x02, 0x00, 0x00,
// 443 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0x4f, 0x6f, 0xd3, 0x30,
0x1c, 0x55, 0xda, 0xaa, 0x49, 0x7f, 0x41, 0x74, 0x58, 0x02, 0x65, 0x9b, 0x80, 0xaa, 0x17, 0x2a,
0x0e, 0x89, 0x16, 0x24, 0x38, 0x03, 0xda, 0x61, 0xa7, 0x4d, 0x2e, 0xe2, 0xc0, 0x25, 0x72, 0x5c,
0xd3, 0x59, 0x73, 0xe3, 0xcc, 0x76, 0x2a, 0x72, 0xe2, 0x7b, 0xf0, 0x21, 0xf8, 0x8c, 0xc8, 0x7f,
0x32, 0xd1, 0x4d, 0xbd, 0xfd, 0xfc, 0x7e, 0x2f, 0x2f, 0xef, 0x3d, 0x1b, 0x4e, 0x55, 0x4b, 0x0b,
0x4d, 0x49, 0xd3, 0x30, 0x55, 0x68, 0xa6, 0xf6, 0x9c, 0xb2, 0xbc, 0x55, 0xd2, 0x48, 0x74, 0x62,
0x14, 0xdf, 0xf7, 0x79, 0x58, 0xe6, 0xfb, 0x8b, 0xb3, 0x8f, 0x5b, 0x6e, 0x6e, 0xbb, 0x3a, 0xa7,
0x72, 0x57, 0x90, 0xfb, 0x8e, 0x68, 0x46, 0x3b, 0xc5, 0x4d, 0x5f, 0x38, 0x66, 0x61, 0xa5, 0xa8,
0xdc, 0xed, 0x64, 0x73, 0xa8, 0xb4, 0xfc, 0x13, 0x41, 0xba, 0xa6, 0xa4, 0xc1, 0xec, 0xbe, 0x63,
0xda, 0xa0, 0x57, 0x30, 0x35, 0x44, 0x6d, 0x99, 0xc9, 0xa2, 0x45, 0xb4, 0x9a, 0xe1, 0x70, 0x42,
0x6f, 0x21, 0x25, 0xca, 0xf0, 0x9f, 0x84, 0x9a, 0x8a, 0x6f, 0xb2, 0x91, 0x5b, 0xc2, 0x00, 0x5d,
0x6d, 0xd0, 0x29, 0x24, 0xb5, 0x90, 0x75, 0xc5, 0x37, 0x3a, 0x1b, 0x2f, 0xc6, 0xab, 0x19, 0x8e,
0xed, 0xf9, 0x6a, 0xa3, 0xd1, 0x27, 0x88, 0x65, 0x6b, 0xb8, 0x6c, 0x74, 0x36, 0x59, 0x44, 0xab,
0xb4, 0x7c, 0x9d, 0x3f, 0xf6, 0x9f, 0x5b, 0x0f, 0xd7, 0x9e, 0x84, 0x07, 0xf6, 0xf2, 0xb7, 0xf7,
0x16, 0x70, 0x74, 0x0e, 0xb3, 0x7d, 0x27, 0x9a, 0xca, 0xf4, 0x2d, 0xcb, 0x22, 0xf7, 0x8f, 0xc4,
0x02, 0xdf, 0xfa, 0x96, 0xa1, 0x77, 0x30, 0x1f, 0x32, 0x57, 0xf4, 0x96, 0xd1, 0x3b, 0x9d, 0x8d,
0x1c, 0xe5, 0xf9, 0x00, 0x7f, 0x75, 0x28, 0x7a, 0x0f, 0x2f, 0x04, 0xd7, 0xa6, 0x22, 0x42, 0x54,
0x2d, 0xa1, 0x77, 0x64, 0xcb, 0xac, 0xe3, 0x68, 0x95, 0xe0, 0xb9, 0x5d, 0x7c, 0x16, 0xe2, 0x26,
0xc0, 0xcb, 0x5f, 0xf0, 0xcc, 0x97, 0xa3, 0x5b, 0xd9, 0x68, 0x86, 0x16, 0x30, 0x92, 0xda, 0x35,
0x93, 0x96, 0x27, 0x21, 0x84, 0xaf, 0x35, 0xbf, 0x5e, 0xe3, 0x91, 0xd4, 0x08, 0xc1, 0x84, 0x49,
0x2d, 0x5c, 0x41, 0x09, 0x76, 0x33, 0x2a, 0x21, 0x56, 0x4c, 0x77, 0xc2, 0xf8, 0x66, 0xd2, 0x32,
0x7b, 0x9a, 0x1f, 0x3b, 0x02, 0x1e, 0x88, 0xcb, 0xbf, 0x11, 0x4c, 0x3d, 0x76, 0xf4, 0x4a, 0x2e,
0x61, 0x6e, 0xd3, 0x33, 0x45, 0x6a, 0x2e, 0xb8, 0xe1, 0xcc, 0x27, 0x4e, 0xcb, 0xf3, 0x43, 0x67,
0xdf, 0xff, 0x23, 0xf5, 0xf8, 0xf1, 0x37, 0xd6, 0xb1, 0x2b, 0x74, 0xec, 0xc4, 0xdd, 0x8c, 0x2e,
0x20, 0x79, 0xa8, 0x66, 0xe2, 0x34, 0x5f, 0x1e, 0x6a, 0x86, 0x86, 0xf0, 0x03, 0xad, 0xbc, 0x81,
0x78, 0xed, 0xe3, 0xa0, 0x4b, 0x98, 0xd8, 0x11, 0x1d, 0xb9, 0xe6, 0xf0, 0xd4, 0xce, 0xde, 0x1c,
0x5b, 0xfb, 0xb2, 0xbf, 0xcc, 0x7e, 0xc4, 0x61, 0x55, 0x4f, 0xdd, 0x63, 0xfd, 0xf0, 0x2f, 0x00,
0x00, 0xff, 0xff, 0x3a, 0xe6, 0x57, 0xdd, 0x13, 0x03, 0x00, 0x00,
}

View File

@@ -19,6 +19,7 @@ message ScanRequest {
message ScanOptions {
repeated string vuln_type = 1;
repeated string security_checks = 2;
bool list_all_packages = 3;
}
message ScanResponse {
@@ -32,4 +33,5 @@ message Result {
string target = 1;
repeated common.Vulnerability vulnerabilities = 2;
string type = 3;
repeated common.Package packages = 4;
}

View File

@@ -857,30 +857,33 @@ func callClientError(ctx context.Context, h *twirp.ClientHooks, err twirp.Error)
}
var twirpFileDescriptor0 = []byte{
// 395 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0x41, 0x8f, 0x9b, 0x30,
0x10, 0x85, 0x05, 0x89, 0x42, 0x18, 0xaa, 0xee, 0xca, 0x87, 0x8a, 0xdd, 0x55, 0x5b, 0xc4, 0xa5,
0x39, 0x81, 0x4a, 0xa5, 0xf6, 0xde, 0x2a, 0x87, 0x9c, 0x52, 0x99, 0xaa, 0x87, 0x5e, 0x90, 0x31,
0x6e, 0x62, 0x95, 0x60, 0x62, 0x1b, 0x54, 0xd4, 0x7f, 0xd2, 0x5f, 0x5b, 0x61, 0x83, 0xd4, 0x64,
0x95, 0xdb, 0xf8, 0xcd, 0x63, 0x78, 0xdf, 0xd8, 0xf0, 0x20, 0x5b, 0x9a, 0x2a, 0x4a, 0x9a, 0x86,
0xc9, 0x54, 0x31, 0xd9, 0x73, 0xca, 0x92, 0x56, 0x0a, 0x2d, 0xd0, 0xbd, 0x96, 0xbc, 0x1f, 0x92,
0xa9, 0x99, 0xf4, 0xef, 0x1f, 0x3f, 0x1e, 0xb8, 0x3e, 0x76, 0x65, 0x42, 0xc5, 0x29, 0x25, 0xe7,
0x8e, 0x28, 0x46, 0x3b, 0xc9, 0xf5, 0x90, 0x1a, 0x67, 0x3a, 0x8e, 0xa2, 0xe2, 0x74, 0x12, 0xcd,
0xe5, 0xa4, 0xf8, 0xaf, 0x03, 0x41, 0x4e, 0x49, 0x83, 0xd9, 0xb9, 0x63, 0x4a, 0xa3, 0x57, 0xb0,
0xd2, 0x44, 0x1e, 0x98, 0x0e, 0x9d, 0xc8, 0xd9, 0xf8, 0x78, 0x3a, 0xa1, 0xb7, 0x10, 0x10, 0xa9,
0xf9, 0x4f, 0x42, 0x75, 0xc1, 0xab, 0xd0, 0x35, 0x4d, 0x98, 0xa5, 0x5d, 0x85, 0x1e, 0x60, 0x5d,
0xd6, 0xa2, 0x2c, 0x78, 0xa5, 0xc2, 0x45, 0xb4, 0xd8, 0xf8, 0xd8, 0x1b, 0xcf, 0xbb, 0x4a, 0xa1,
0x4f, 0xe0, 0x89, 0x56, 0x73, 0xd1, 0xa8, 0x70, 0x19, 0x39, 0x9b, 0x20, 0x7b, 0x9d, 0x5c, 0xe7,
0x4f, 0xc6, 0x0c, 0x7b, 0x6b, 0xc2, 0xb3, 0x3b, 0xce, 0x6d, 0xb6, 0x49, 0x47, 0x4f, 0xe0, 0xf7,
0x5d, 0xdd, 0x14, 0x7a, 0x68, 0x59, 0xe8, 0x98, 0x7f, 0xac, 0x47, 0xe1, 0xdb, 0xd0, 0x32, 0xf4,
0x0e, 0xee, 0x66, 0xe6, 0x82, 0x1e, 0x19, 0xfd, 0xa5, 0x42, 0xd7, 0x58, 0x5e, 0xce, 0xf2, 0x17,
0xa3, 0xc6, 0xbf, 0xe1, 0x85, 0x05, 0x56, 0xad, 0x68, 0x14, 0x43, 0x11, 0xb8, 0x42, 0x19, 0xda,
0x20, 0xbb, 0x9f, 0x82, 0xd9, 0x55, 0x25, 0xfb, 0x1c, 0xbb, 0x42, 0x21, 0x04, 0x4b, 0x26, 0x54,
0x6d, 0xa0, 0xd7, 0xd8, 0xd4, 0x28, 0x03, 0x4f, 0x32, 0xd5, 0xd5, 0xda, 0xd2, 0x06, 0x59, 0xf8,
0x9c, 0x09, 0x1b, 0x03, 0x9e, 0x8d, 0xf1, 0x1f, 0x58, 0x59, 0xe9, 0xe6, 0x96, 0xb7, 0x70, 0x37,
0x02, 0x31, 0x49, 0x4a, 0x5e, 0x73, 0xcd, 0x99, 0x85, 0x08, 0xb2, 0xa7, 0xcb, 0x60, 0xdf, 0xff,
0x33, 0x0d, 0xf8, 0xfa, 0x9b, 0x31, 0xb0, 0xd9, 0xd1, 0xc2, 0x0c, 0x37, 0x75, 0xf6, 0x15, 0xbc,
0xdc, 0x46, 0x43, 0x5b, 0x58, 0x8e, 0x25, 0xba, 0x71, 0x0d, 0xd3, 0x53, 0x78, 0x7c, 0x73, 0xab,
0x6d, 0x17, 0xf7, 0xd9, 0xff, 0xe1, 0x4d, 0xad, 0x72, 0x65, 0x1e, 0xd3, 0x87, 0x7f, 0x01, 0x00,
0x00, 0xff, 0xff, 0xfd, 0x72, 0xf0, 0x54, 0xb3, 0x02, 0x00, 0x00,
// 443 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x52, 0x4f, 0x6f, 0xd3, 0x30,
0x1c, 0x55, 0xda, 0xaa, 0x49, 0x7f, 0x41, 0x74, 0x58, 0x02, 0x65, 0x9b, 0x80, 0xaa, 0x17, 0x2a,
0x0e, 0x89, 0x16, 0x24, 0x38, 0x03, 0xda, 0x61, 0xa7, 0x4d, 0x2e, 0xe2, 0xc0, 0x25, 0x72, 0x5c,
0xd3, 0x59, 0x73, 0xe3, 0xcc, 0x76, 0x2a, 0x72, 0xe2, 0x7b, 0xf0, 0x21, 0xf8, 0x8c, 0xc8, 0x7f,
0x32, 0xd1, 0x4d, 0xbd, 0xfd, 0xfc, 0x7e, 0x2f, 0x2f, 0xef, 0x3d, 0x1b, 0x4e, 0x55, 0x4b, 0x0b,
0x4d, 0x49, 0xd3, 0x30, 0x55, 0x68, 0xa6, 0xf6, 0x9c, 0xb2, 0xbc, 0x55, 0xd2, 0x48, 0x74, 0x62,
0x14, 0xdf, 0xf7, 0x79, 0x58, 0xe6, 0xfb, 0x8b, 0xb3, 0x8f, 0x5b, 0x6e, 0x6e, 0xbb, 0x3a, 0xa7,
0x72, 0x57, 0x90, 0xfb, 0x8e, 0x68, 0x46, 0x3b, 0xc5, 0x4d, 0x5f, 0x38, 0x66, 0x61, 0xa5, 0xa8,
0xdc, 0xed, 0x64, 0x73, 0xa8, 0xb4, 0xfc, 0x13, 0x41, 0xba, 0xa6, 0xa4, 0xc1, 0xec, 0xbe, 0x63,
0xda, 0xa0, 0x57, 0x30, 0x35, 0x44, 0x6d, 0x99, 0xc9, 0xa2, 0x45, 0xb4, 0x9a, 0xe1, 0x70, 0x42,
0x6f, 0x21, 0x25, 0xca, 0xf0, 0x9f, 0x84, 0x9a, 0x8a, 0x6f, 0xb2, 0x91, 0x5b, 0xc2, 0x00, 0x5d,
0x6d, 0xd0, 0x29, 0x24, 0xb5, 0x90, 0x75, 0xc5, 0x37, 0x3a, 0x1b, 0x2f, 0xc6, 0xab, 0x19, 0x8e,
0xed, 0xf9, 0x6a, 0xa3, 0xd1, 0x27, 0x88, 0x65, 0x6b, 0xb8, 0x6c, 0x74, 0x36, 0x59, 0x44, 0xab,
0xb4, 0x7c, 0x9d, 0x3f, 0xf6, 0x9f, 0x5b, 0x0f, 0xd7, 0x9e, 0x84, 0x07, 0xf6, 0xf2, 0xb7, 0xf7,
0x16, 0x70, 0x74, 0x0e, 0xb3, 0x7d, 0x27, 0x9a, 0xca, 0xf4, 0x2d, 0xcb, 0x22, 0xf7, 0x8f, 0xc4,
0x02, 0xdf, 0xfa, 0x96, 0xa1, 0x77, 0x30, 0x1f, 0x32, 0x57, 0xf4, 0x96, 0xd1, 0x3b, 0x9d, 0x8d,
0x1c, 0xe5, 0xf9, 0x00, 0x7f, 0x75, 0x28, 0x7a, 0x0f, 0x2f, 0x04, 0xd7, 0xa6, 0x22, 0x42, 0x54,
0x2d, 0xa1, 0x77, 0x64, 0xcb, 0xac, 0xe3, 0x68, 0x95, 0xe0, 0xb9, 0x5d, 0x7c, 0x16, 0xe2, 0x26,
0xc0, 0xcb, 0x5f, 0xf0, 0xcc, 0x97, 0xa3, 0x5b, 0xd9, 0x68, 0x86, 0x16, 0x30, 0x92, 0xda, 0x35,
0x93, 0x96, 0x27, 0x21, 0x84, 0xaf, 0x35, 0xbf, 0x5e, 0xe3, 0x91, 0xd4, 0x08, 0xc1, 0x84, 0x49,
0x2d, 0x5c, 0x41, 0x09, 0x76, 0x33, 0x2a, 0x21, 0x56, 0x4c, 0x77, 0xc2, 0xf8, 0x66, 0xd2, 0x32,
0x7b, 0x9a, 0x1f, 0x3b, 0x02, 0x1e, 0x88, 0xcb, 0xbf, 0x11, 0x4c, 0x3d, 0x76, 0xf4, 0x4a, 0x2e,
0x61, 0x6e, 0xd3, 0x33, 0x45, 0x6a, 0x2e, 0xb8, 0xe1, 0xcc, 0x27, 0x4e, 0xcb, 0xf3, 0x43, 0x67,
0xdf, 0xff, 0x23, 0xf5, 0xf8, 0xf1, 0x37, 0xd6, 0xb1, 0x2b, 0x74, 0xec, 0xc4, 0xdd, 0x8c, 0x2e,
0x20, 0x79, 0xa8, 0x66, 0xe2, 0x34, 0x5f, 0x1e, 0x6a, 0x86, 0x86, 0xf0, 0x03, 0xad, 0xbc, 0x81,
0x78, 0xed, 0xe3, 0xa0, 0x4b, 0x98, 0xd8, 0x11, 0x1d, 0xb9, 0xe6, 0xf0, 0xd4, 0xce, 0xde, 0x1c,
0x5b, 0xfb, 0xb2, 0xbf, 0xcc, 0x7e, 0xc4, 0x61, 0x55, 0x4f, 0xdd, 0x63, 0xfd, 0xf0, 0x2f, 0x00,
0x00, 0xff, 0xff, 0x3a, 0xe6, 0x57, 0xdd, 0x13, 0x03, 0x00, 0x00,
}