Merge pull request #1248 from adamreese/feat/rollback-version

feat(*): add rollback to a release version
pull/1249/head
Adam Reese 8 years ago committed by GitHub
commit 6860c47dea

@ -183,7 +183,6 @@ message UpdateReleaseRequest {
hapi.chart.Config values = 3; hapi.chart.Config values = 3;
// dry_run, if true, will run through the release logic, but neither create // dry_run, if true, will run through the release logic, but neither create
bool dry_run = 4; bool dry_run = 4;
// DisableHooks causes the server to skip running any hooks for the upgrade. // DisableHooks causes the server to skip running any hooks for the upgrade.
bool disable_hooks = 5; bool disable_hooks = 5;
} }
@ -200,6 +199,8 @@ message RollbackReleaseRequest {
bool dry_run = 2; bool dry_run = 2;
// DisableHooks causes the server to skip running any hooks for the rollback // DisableHooks causes the server to skip running any hooks for the rollback
bool disable_hooks = 3; bool disable_hooks = 3;
// Version is the version of the release to deploy.
int32 version = 4;
} }
// RollbackReleaseResponse is the response to an update request. // RollbackReleaseResponse is the response to an update request.

@ -73,7 +73,7 @@ func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command {
}, },
} }
cmd.PersistentFlags().Int32Var(&get.version, "version", 0, "get the named release with version") cmd.PersistentFlags().Int32Var(&get.version, "revision", 0, "get the named release with revision")
cmd.AddCommand(newGetValuesCmd(nil, out)) cmd.AddCommand(newGetValuesCmd(nil, out))
cmd.AddCommand(newGetManifestCmd(nil, out)) cmd.AddCommand(newGetManifestCmd(nil, out))
@ -81,7 +81,7 @@ func newGetCmd(client helm.Interface, out io.Writer) *cobra.Command {
return cmd return cmd
} }
var getTemplate = `VERSION: {{.Release.Version}} var getTemplate = `REVISION: {{.Release.Version}}
RELEASED: {{.ReleaseDate}} RELEASED: {{.ReleaseDate}}
CHART: {{.Release.Chart.Metadata.Name}}-{{.Release.Chart.Metadata.Version}} CHART: {{.Release.Chart.Metadata.Name}}-{{.Release.Chart.Metadata.Version}}
USER-SUPPLIED VALUES: USER-SUPPLIED VALUES:

@ -29,7 +29,7 @@ func TestGetCmd(t *testing.T) {
name: "get with a release", name: "get with a release",
resp: releaseMock(&releaseOptions{name: "thomas-guide"}), resp: releaseMock(&releaseOptions{name: "thomas-guide"}),
args: []string{"thomas-guide"}, args: []string{"thomas-guide"},
expected: "VERSION: 1\nRELEASED: (.*)\nCHART: foo-0.1.0-beta.1\nUSER-SUPPLIED VALUES:\nname: \"value\"\nCOMPUTED VALUES:\nname: value\n\nHOOKS:\n---\n# pre-install-hook\n" + mockHookTemplate + "\nMANIFEST:", expected: "REVISION: 1\nRELEASED: (.*)\nCHART: foo-0.1.0-beta.1\nUSER-SUPPLIED VALUES:\nname: \"value\"\nCOMPUTED VALUES:\nname: value\n\nHOOKS:\n---\n# pre-install-hook\n" + mockHookTemplate + "\nMANIFEST:",
}, },
{ {
name: "get requires release name arg", name: "get requires release name arg",

@ -191,7 +191,7 @@ func (l *listCmd) statusCodes() []release.Status_Code {
func formatList(rels []*release.Release) string { func formatList(rels []*release.Release) string {
table := uitable.New() table := uitable.New()
table.MaxColWidth = 30 table.MaxColWidth = 30
table.AddRow("NAME", "VERSION", "UPDATED", "STATUS", "CHART") table.AddRow("NAME", "REVISION", "UPDATED", "STATUS", "CHART")
for _, r := range rels { for _, r := range rels {
c := fmt.Sprintf("%s-%s", r.Chart.Metadata.Name, r.Chart.Metadata.Version) c := fmt.Sprintf("%s-%s", r.Chart.Metadata.Name, r.Chart.Metadata.Version)
t := timeconv.String(r.Info.LastDeployed) t := timeconv.String(r.Info.LastDeployed)

@ -45,7 +45,7 @@ func TestListCmd(t *testing.T) {
resp: []*release.Release{ resp: []*release.Release{
releaseMock(&releaseOptions{name: "atlas"}), releaseMock(&releaseOptions{name: "atlas"}),
}, },
expected: "NAME \tVERSION\tUPDATED \tSTATUS \tCHART \natlas\t1 \t(.*)\tDEPLOYED\tfoo-0.1.0-beta.1\n", expected: "NAME \tREVISION\tUPDATED \tSTATUS \tCHART \natlas\t1 \t(.*)\tDEPLOYED\tfoo-0.1.0-beta.1\n",
}, },
{ {
name: "with a release, multiple flags", name: "with a release, multiple flags",

@ -26,12 +26,13 @@ import (
) )
const rollbackDesc = ` const rollbackDesc = `
This command rolls back a release to the previous version. This command rolls back a release to the previous revision.
The argument of the rollback command is the name of a release. The argument of the rollback command is the name of a release.
` `
type rollbackCmd struct { type rollbackCmd struct {
name string name string
version int32
dryRun bool dryRun bool
disableHooks bool disableHooks bool
out io.Writer out io.Writer
@ -46,7 +47,7 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command {
cmd := &cobra.Command{ cmd := &cobra.Command{
Use: "rollback [RELEASE]", Use: "rollback [RELEASE]",
Short: "roll back a release to the previous version", Short: "roll back a release to a previous revision",
Long: rollbackDesc, Long: rollbackDesc,
PersistentPreRunE: setupConnection, PersistentPreRunE: setupConnection,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
@ -60,13 +61,19 @@ func newRollbackCmd(c helm.Interface, out io.Writer) *cobra.Command {
} }
f := cmd.Flags() f := cmd.Flags()
f.Int32Var(&rollback.version, "revision", 0, "revision to deploy")
f.BoolVar(&rollback.dryRun, "dry-run", false, "simulate a rollback") f.BoolVar(&rollback.dryRun, "dry-run", false, "simulate a rollback")
f.BoolVar(&rollback.disableHooks, "no-hooks", false, "prevent hooks from running during rollback") f.BoolVar(&rollback.disableHooks, "no-hooks", false, "prevent hooks from running during rollback")
return cmd return cmd
} }
func (r *rollbackCmd) run() error { func (r *rollbackCmd) run() error {
_, err := r.client.RollbackRelease(r.name, helm.RollbackDryRun(r.dryRun), helm.RollbackDisableHooks(r.disableHooks)) _, err := r.client.RollbackRelease(
r.name,
helm.RollbackDryRun(r.dryRun),
helm.RollbackDisableHooks(r.disableHooks),
helm.RollbackVersion(r.version),
)
if err != nil { if err != nil {
return prettyError(err) return prettyError(err)
} }

@ -29,7 +29,12 @@ func TestRollbackCmd(t *testing.T) {
{ {
name: "rollback a release", name: "rollback a release",
args: []string{"funny-honey"}, args: []string{"funny-honey"},
resp: nil, flags: []string{"revision", "1"},
expected: "Rollback was a success! Happy Helming!",
},
{
name: "rollback a release without version",
args: []string{"funny-honey"},
expected: "Rollback was a success! Happy Helming!", expected: "Rollback was a success! Happy Helming!",
}, },
} }

@ -60,7 +60,7 @@ func newStatusCmd(client helm.Interface, out io.Writer) *cobra.Command {
}, },
} }
cmd.PersistentFlags().Int32Var(&status.version, "version", 0, "If set, display the status of the named release with version") cmd.PersistentFlags().Int32Var(&status.version, "revision", 0, "If set, display the status of the named release with revision")
return cmd return cmd
} }

@ -461,7 +461,17 @@ func (s *releaseServer) prepareRollback(req *services.RollbackReleaseRequest) (*
return nil, nil, err return nil, nil, err
} }
previousRelease, err := s.env.Releases.Get(req.Name, currentRelease.Version-1) v := req.Version
if v == 0 {
v = currentRelease.Version - 1
}
if v < 1 {
return nil, nil, errors.New("cannot rollback to version < 1")
}
log.Printf("rolling back %s to version %d", req.Name, v)
previousRelease, err := s.env.Releases.Get(req.Name, v)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }

@ -664,6 +664,27 @@ func TestRollbackReleaseNoHooks(t *testing.T) {
} }
} }
func TestRollbackWithReleaseVersion(t *testing.T) {
c := helm.NewContext()
rs := rsFixture()
rel := releaseStub()
rs.env.Releases.Create(rel)
upgradedRel := upgradeReleaseVersion(rel)
rs.env.Releases.Update(rel)
rs.env.Releases.Create(upgradedRel)
req := &services.RollbackReleaseRequest{
Name: rel.Name,
DisableHooks: true,
Version: 1,
}
_, err := rs.RollbackRelease(c, req)
if err != nil {
t.Fatalf("Failed rollback: %s", err)
}
}
func TestRollbackRelease(t *testing.T) { func TestRollbackRelease(t *testing.T) {
c := helm.NewContext() c := helm.NewContext()
rs := rsFixture() rs := rsFixture()

@ -196,6 +196,13 @@ func RollbackDryRun(dry bool) RollbackOption {
} }
} }
// RollbackVersion sets the version of the release to deploy.
func RollbackVersion(ver int32) RollbackOption {
return func(opts *options) {
opts.rollbackReq.Version = ver
}
}
// UpgradeDisableHooks will disable hooks for an upgrade operation. // UpgradeDisableHooks will disable hooks for an upgrade operation.
func UpgradeDisableHooks(disable bool) UpdateOption { func UpgradeDisableHooks(disable bool) UpdateOption {
return func(opts *options) { return func(opts *options) {
@ -333,7 +340,7 @@ func (o *options) rpcRollbackRelease(rlsName string, rlc rls.ReleaseServiceClien
o.rollbackReq.DryRun = o.dryRun o.rollbackReq.DryRun = o.dryRun
o.rollbackReq.Name = rlsName o.rollbackReq.Name = rlsName
return rlc.RollbackRelease(context.TODO(), &o.rollbackReq) return rlc.RollbackRelease(NewContext(), &o.rollbackReq)
} }
// Executes tiller.GetReleaseStatus RPC. // Executes tiller.GetReleaseStatus RPC.

@ -289,6 +289,8 @@ type RollbackReleaseRequest struct {
DryRun bool `protobuf:"varint,2,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"` DryRun bool `protobuf:"varint,2,opt,name=dry_run,json=dryRun" json:"dry_run,omitempty"`
// DisableHooks causes the server to skip running any hooks for the rollback // DisableHooks causes the server to skip running any hooks for the rollback
DisableHooks bool `protobuf:"varint,3,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"` DisableHooks bool `protobuf:"varint,3,opt,name=disable_hooks,json=disableHooks" json:"disable_hooks,omitempty"`
// Version is the version of the release to deploy.
Version int32 `protobuf:"varint,4,opt,name=version" json:"version,omitempty"`
} }
func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} } func (m *RollbackReleaseRequest) Reset() { *m = RollbackReleaseRequest{} }
@ -807,64 +809,65 @@ var _ReleaseService_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) } func init() { proto.RegisterFile("hapi/services/tiller.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 944 bytes of a gzipped FileDescriptorProto // 951 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x56, 0xdd, 0x6e, 0xe3, 0x44, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x9c, 0x56, 0x5f, 0x6f, 0xe3, 0x44,
0x14, 0xae, 0xf3, 0x9f, 0xd3, 0x1f, 0xd2, 0xb3, 0x69, 0xe3, 0x5a, 0x80, 0x22, 0x23, 0xd8, 0xb0, 0x10, 0xaf, 0xf3, 0x3f, 0xd3, 0x3f, 0xa4, 0x73, 0x69, 0xe3, 0x5a, 0x80, 0x22, 0x23, 0xb8, 0x70,
0xb0, 0x29, 0x84, 0x5b, 0x84, 0xd4, 0xcd, 0x46, 0x6d, 0xd9, 0x92, 0x95, 0x26, 0x14, 0x24, 0x2e, 0x70, 0x29, 0x84, 0x57, 0x84, 0xd4, 0xcb, 0x45, 0x6d, 0xb9, 0x92, 0x93, 0x36, 0x14, 0x24, 0x1e,
0x88, 0xdc, 0x64, 0xb2, 0xf5, 0xae, 0xe3, 0x09, 0x9e, 0x49, 0x45, 0x1f, 0x81, 0x0b, 0x5e, 0x82, 0x88, 0xdc, 0x64, 0x73, 0x35, 0xe7, 0x78, 0x83, 0x77, 0x53, 0xd1, 0x77, 0x5e, 0x78, 0xe0, 0x4b,
0xf7, 0xe0, 0xc9, 0xb8, 0x41, 0x9e, 0xf1, 0xb8, 0x71, 0x62, 0x6f, 0xbd, 0xb9, 0x89, 0x3d, 0x73, 0xf0, 0x3d, 0xf8, 0x64, 0xbc, 0x20, 0xef, 0x7a, 0xdd, 0x38, 0xb1, 0xaf, 0xbe, 0xbc, 0xc4, 0xde,
0x3e, 0x7f, 0xe7, 0x9b, 0xef, 0xcc, 0x9c, 0x09, 0x58, 0xb7, 0xce, 0xc2, 0x3d, 0xe5, 0x34, 0xb8, 0x9d, 0x9f, 0x7f, 0x33, 0xf3, 0x9b, 0x9d, 0xd9, 0x80, 0x75, 0xeb, 0x2c, 0xdc, 0x53, 0x4e, 0x83,
0x73, 0x27, 0x94, 0x9f, 0x0a, 0xd7, 0xf3, 0x68, 0xd0, 0x5d, 0x04, 0x4c, 0x30, 0x6c, 0x86, 0xb1, 0x3b, 0x77, 0x42, 0xf9, 0xa9, 0x70, 0x3d, 0x8f, 0x06, 0xdd, 0x45, 0xc0, 0x04, 0xc3, 0x66, 0x68,
0xae, 0x8e, 0x75, 0x55, 0xcc, 0x3a, 0x96, 0x5f, 0x4c, 0x6e, 0x9d, 0x40, 0xa8, 0x5f, 0x85, 0xb6, 0xeb, 0x6a, 0x5b, 0x57, 0xd9, 0xac, 0x63, 0xf9, 0xc5, 0xe4, 0xd6, 0x09, 0x84, 0xfa, 0x55, 0x68,
0x5a, 0xab, 0xf3, 0xcc, 0x9f, 0xb9, 0x6f, 0xa2, 0x80, 0x4a, 0x11, 0x50, 0x8f, 0x3a, 0x9c, 0xea, 0xab, 0xb5, 0xba, 0xcf, 0xfc, 0x99, 0xfb, 0x26, 0x32, 0x28, 0x17, 0x01, 0xf5, 0xa8, 0xc3, 0xa9,
0x67, 0xe2, 0x23, 0x1d, 0x73, 0xfd, 0x19, 0x8b, 0x02, 0x27, 0x89, 0x00, 0x17, 0x8e, 0x58, 0xf2, 0x7e, 0x26, 0x3e, 0xd2, 0x36, 0xd7, 0x9f, 0xb1, 0xc8, 0x70, 0x92, 0x30, 0x70, 0xe1, 0x88, 0x25,
0x04, 0xdf, 0x1d, 0x0d, 0xb8, 0xcb, 0x7c, 0xfd, 0x54, 0x31, 0xfb, 0x9f, 0x02, 0x3c, 0xb9, 0x72, 0x4f, 0xf0, 0xdd, 0xd1, 0x80, 0xbb, 0xcc, 0xd7, 0x4f, 0x65, 0xb3, 0xff, 0x29, 0xc0, 0x93, 0x2b,
0xb9, 0x20, 0xea, 0x43, 0x4e, 0xe8, 0x1f, 0x4b, 0xca, 0x05, 0x36, 0xa1, 0xec, 0xb9, 0x73, 0x57, 0x97, 0x0b, 0xa2, 0x3e, 0xe4, 0x84, 0xfe, 0xbe, 0xa4, 0x5c, 0x60, 0x13, 0xca, 0x9e, 0x3b, 0x77,
0x98, 0x46, 0xdb, 0xe8, 0x14, 0x89, 0x1a, 0xe0, 0x31, 0x54, 0xd8, 0x6c, 0xc6, 0xa9, 0x30, 0x0b, 0x85, 0x69, 0xb4, 0x8d, 0x4e, 0x91, 0xa8, 0x05, 0x1e, 0x43, 0x85, 0xcd, 0x66, 0x9c, 0x0a, 0xb3,
0x6d, 0xa3, 0x53, 0x27, 0xd1, 0x08, 0x7f, 0x80, 0x2a, 0x67, 0x81, 0x18, 0xdf, 0xdc, 0x9b, 0xc5, 0xd0, 0x36, 0x3a, 0x75, 0x12, 0xad, 0xf0, 0x3b, 0xa8, 0x72, 0x16, 0x88, 0xf1, 0xcd, 0xbd, 0x59,
0xb6, 0xd1, 0x39, 0xe8, 0x7d, 0xde, 0x4d, 0xb3, 0xa2, 0x1b, 0x66, 0x1a, 0xb1, 0x40, 0x74, 0xc3, 0x6c, 0x1b, 0x9d, 0x83, 0xde, 0xa7, 0xdd, 0x34, 0x29, 0xba, 0xa1, 0xa7, 0x11, 0x0b, 0x44, 0x37,
0x9f, 0x17, 0xf7, 0xa4, 0xc2, 0xe5, 0x33, 0xe4, 0x9d, 0xb9, 0x9e, 0xa0, 0x81, 0x59, 0x52, 0xbc, 0xfc, 0x79, 0x71, 0x4f, 0x2a, 0x5c, 0x3e, 0x43, 0xde, 0x99, 0xeb, 0x09, 0x1a, 0x98, 0x25, 0xc5,
0x6a, 0x84, 0xe7, 0x00, 0x92, 0x97, 0x05, 0x53, 0x1a, 0x98, 0x65, 0x49, 0xdd, 0xc9, 0x41, 0xfd, 0xab, 0x56, 0x78, 0x0e, 0x20, 0x79, 0x59, 0x30, 0xa5, 0x81, 0x59, 0x96, 0xd4, 0x9d, 0x1c, 0xd4,
0x3a, 0xc4, 0x93, 0x3a, 0xd7, 0xaf, 0xf8, 0x3d, 0xec, 0x29, 0x4b, 0xc6, 0x13, 0x36, 0xa5, 0xdc, 0xaf, 0x43, 0x3c, 0xa9, 0x73, 0xfd, 0x8a, 0xdf, 0xc2, 0x9e, 0x92, 0x64, 0x3c, 0x61, 0x53, 0xca,
0xac, 0xb4, 0x8b, 0x9d, 0x83, 0xde, 0x89, 0xa2, 0xd2, 0x0e, 0x8f, 0x94, 0x69, 0x7d, 0x36, 0xa5, 0xcd, 0x4a, 0xbb, 0xd8, 0x39, 0xe8, 0x9d, 0x28, 0x2a, 0xad, 0xf0, 0x48, 0x89, 0xd6, 0x67, 0x53,
0x64, 0x57, 0xc1, 0xc3, 0x77, 0x6e, 0xff, 0x0e, 0x35, 0x4d, 0x6f, 0xf7, 0xa0, 0xa2, 0xc4, 0xe3, 0x4a, 0x76, 0x15, 0x3c, 0x7c, 0xe7, 0xf6, 0xaf, 0x50, 0xd3, 0xf4, 0x76, 0x0f, 0x2a, 0x2a, 0x78,
0x2e, 0x54, 0xaf, 0x87, 0xaf, 0x86, 0xaf, 0x7f, 0x1d, 0x36, 0x76, 0xb0, 0x06, 0xa5, 0xe1, 0xd9, 0xdc, 0x85, 0xea, 0xf5, 0xf0, 0xd5, 0xf0, 0xf5, 0xcf, 0xc3, 0xc6, 0x0e, 0xd6, 0xa0, 0x34, 0x3c,
0x4f, 0x83, 0x86, 0x81, 0x87, 0xb0, 0x7f, 0x75, 0x36, 0xfa, 0x79, 0x4c, 0x06, 0x57, 0x83, 0xb3, 0xfb, 0x61, 0xd0, 0x30, 0xf0, 0x10, 0xf6, 0xaf, 0xce, 0x46, 0x3f, 0x8e, 0xc9, 0xe0, 0x6a, 0x70,
0xd1, 0xe0, 0x65, 0xa3, 0x60, 0x7f, 0x0a, 0xf5, 0x58, 0x15, 0x56, 0xa1, 0x78, 0x36, 0xea, 0xab, 0x36, 0x1a, 0xbc, 0x6c, 0x14, 0xec, 0x8f, 0xa1, 0x1e, 0x47, 0x85, 0x55, 0x28, 0x9e, 0x8d, 0xfa,
0x4f, 0x5e, 0x0e, 0x46, 0xfd, 0x86, 0x61, 0xff, 0x65, 0x40, 0x33, 0x59, 0x04, 0xbe, 0x60, 0x3e, 0xea, 0x93, 0x97, 0x83, 0x51, 0xbf, 0x61, 0xd8, 0x7f, 0x19, 0xd0, 0x4c, 0x16, 0x81, 0x2f, 0x98,
0xa7, 0x61, 0x15, 0x26, 0x6c, 0xe9, 0xc7, 0x55, 0x90, 0x03, 0x44, 0x28, 0xf9, 0xf4, 0x4f, 0x5d, 0xcf, 0x69, 0x58, 0x85, 0x09, 0x5b, 0xfa, 0x71, 0x15, 0xe4, 0x02, 0x11, 0x4a, 0x3e, 0xfd, 0x43,
0x03, 0xf9, 0x1e, 0x22, 0x05, 0x13, 0x8e, 0x27, 0xfd, 0x2f, 0x12, 0x35, 0xc0, 0x6f, 0xa1, 0x16, 0xd7, 0x40, 0xbe, 0x87, 0x48, 0xc1, 0x84, 0xe3, 0x49, 0xfd, 0x8b, 0x44, 0x2d, 0xf0, 0x6b, 0xa8,
0x2d, 0x8e, 0x9b, 0xa5, 0x76, 0xb1, 0xb3, 0xdb, 0x3b, 0x4a, 0x2e, 0x39, 0xca, 0x48, 0x62, 0x98, 0x45, 0xc9, 0x71, 0xb3, 0xd4, 0x2e, 0x76, 0x76, 0x7b, 0x47, 0xc9, 0x94, 0x23, 0x8f, 0x24, 0x86,
0x7d, 0x0e, 0xad, 0x73, 0xaa, 0x95, 0x28, 0x47, 0xf4, 0x9e, 0x08, 0xf3, 0x3a, 0x73, 0x2a, 0xc5, 0xd9, 0xe7, 0xd0, 0x3a, 0xa7, 0x3a, 0x12, 0xa5, 0x88, 0x3e, 0x13, 0xa1, 0x5f, 0x67, 0x4e, 0x65,
0x84, 0x79, 0x9d, 0x39, 0x45, 0x13, 0xaa, 0xd1, 0x86, 0x92, 0x72, 0xca, 0x44, 0x0f, 0x6d, 0x01, 0x30, 0xa1, 0x5f, 0x67, 0x4e, 0xd1, 0x84, 0x6a, 0x74, 0xa0, 0x64, 0x38, 0x65, 0xa2, 0x97, 0xb6,
0xe6, 0x26, 0x51, 0xb4, 0xae, 0x34, 0xa6, 0x2f, 0xa0, 0x14, 0x6e, 0x67, 0x49, 0xb3, 0xdb, 0xc3, 0x00, 0x73, 0x93, 0x28, 0xca, 0x2b, 0x8d, 0xe9, 0x33, 0x28, 0x85, 0xc7, 0x59, 0xd2, 0xec, 0xf6,
0xa4, 0xce, 0x4b, 0x7f, 0xc6, 0x88, 0x8c, 0xe3, 0xc7, 0x50, 0x0f, 0xf1, 0x7c, 0xe1, 0x4c, 0xa8, 0x30, 0x19, 0xe7, 0xa5, 0x3f, 0x63, 0x44, 0xda, 0xf1, 0x43, 0xa8, 0x87, 0x78, 0xbe, 0x70, 0x26,
0x5c, 0x6d, 0x9d, 0x3c, 0x4c, 0xd8, 0x17, 0xab, 0x59, 0xfb, 0xcc, 0x17, 0xd4, 0x17, 0xdb, 0xe9, 0x54, 0x66, 0x5b, 0x27, 0x0f, 0x1b, 0xf6, 0xc5, 0xaa, 0xd7, 0x3e, 0xf3, 0x05, 0xf5, 0xc5, 0x76,
0xbf, 0x82, 0x93, 0x14, 0xa6, 0x68, 0x01, 0xa7, 0x50, 0x8d, 0xa4, 0x49, 0xb6, 0x4c, 0x5f, 0x35, 0xf1, 0x5f, 0xc1, 0x49, 0x0a, 0x53, 0x94, 0xc0, 0x29, 0x54, 0xa3, 0xd0, 0x24, 0x5b, 0xa6, 0xae,
0xca, 0xfe, 0xd7, 0x80, 0xe6, 0xf5, 0x62, 0xea, 0x08, 0xaa, 0x43, 0xef, 0x11, 0xf5, 0x14, 0xca, 0x1a, 0x65, 0xff, 0x6b, 0x40, 0xf3, 0x7a, 0x31, 0x75, 0x04, 0xd5, 0xa6, 0x77, 0x04, 0xf5, 0x14,
0xb2, 0x2d, 0x44, 0x5e, 0x1c, 0x2a, 0x6e, 0xd5, 0x3b, 0xfa, 0xe1, 0x2f, 0x51, 0x71, 0x7c, 0x06, 0xca, 0x72, 0x2c, 0x44, 0x5a, 0x1c, 0x2a, 0x6e, 0x35, 0x3b, 0xfa, 0xe1, 0x2f, 0x51, 0x76, 0x7c,
0x95, 0x3b, 0xc7, 0x5b, 0x52, 0x2e, 0x8d, 0x88, 0x5d, 0x8b, 0x90, 0xb2, 0xa7, 0x90, 0x08, 0x81, 0x06, 0x95, 0x3b, 0xc7, 0x5b, 0x52, 0x2e, 0x85, 0x88, 0x55, 0x8b, 0x90, 0x72, 0xa6, 0x90, 0x08,
0x2d, 0xa8, 0x4e, 0x83, 0xfb, 0x71, 0xb0, 0xf4, 0xe5, 0x21, 0xab, 0x91, 0xca, 0x34, 0xb8, 0x27, 0x81, 0x2d, 0xa8, 0x4e, 0x83, 0xfb, 0x71, 0xb0, 0xf4, 0x65, 0x93, 0xd5, 0x48, 0x65, 0x1a, 0xdc,
0x4b, 0x1f, 0x3f, 0x83, 0xfd, 0xa9, 0xcb, 0x9d, 0x1b, 0x8f, 0x8e, 0x6f, 0x19, 0x7b, 0xc7, 0xe5, 0x93, 0xa5, 0x8f, 0x9f, 0xc0, 0xfe, 0xd4, 0xe5, 0xce, 0x8d, 0x47, 0xc7, 0xb7, 0x8c, 0xbd, 0xe5,
0x39, 0xab, 0x91, 0xbd, 0x68, 0xf2, 0x22, 0x9c, 0xb3, 0x2f, 0xe0, 0x68, 0x4d, 0xfe, 0xb6, 0x4e, 0xb2, 0xcf, 0x6a, 0x64, 0x2f, 0xda, 0xbc, 0x08, 0xf7, 0xec, 0x0b, 0x38, 0x5a, 0x0b, 0x7f, 0x5b,
0xbc, 0x85, 0x63, 0xc2, 0x3c, 0xef, 0xc6, 0x99, 0xbc, 0xcb, 0x61, 0xc5, 0x8a, 0xea, 0xc2, 0xfb, 0x25, 0xfe, 0x34, 0xe0, 0x98, 0x30, 0xcf, 0xbb, 0x71, 0x26, 0x6f, 0x73, 0x68, 0xb1, 0x12, 0x76,
0x55, 0x17, 0x53, 0x54, 0xff, 0x08, 0xad, 0x8d, 0x5c, 0xdb, 0xea, 0xfe, 0xcf, 0x80, 0xa3, 0x4b, 0xe1, 0xdd, 0x61, 0x17, 0x37, 0xc3, 0x5e, 0x2d, 0x6f, 0x29, 0x59, 0xde, 0xef, 0xa1, 0xb5, 0x11,
0x9f, 0x0b, 0xc7, 0xf3, 0xd6, 0x74, 0xc7, 0xe5, 0x32, 0x72, 0x97, 0xab, 0xf0, 0x21, 0xe5, 0x2a, 0xc5, 0xb6, 0x29, 0xfd, 0x67, 0xc0, 0xd1, 0xa5, 0xcf, 0x85, 0xe3, 0x79, 0x6b, 0x19, 0xc5, 0x95,
0x26, 0x16, 0xae, 0x5d, 0x2a, 0xad, 0xb8, 0x94, 0xa7, 0x84, 0xc9, 0x83, 0x53, 0x59, 0x3b, 0x38, 0x34, 0x72, 0x57, 0xb2, 0xf0, 0x3e, 0x95, 0x2c, 0x26, 0x24, 0xd1, 0xfa, 0x95, 0x56, 0xf4, 0xcb,
0xf8, 0x09, 0x40, 0x40, 0x97, 0x9c, 0x8e, 0x25, 0x79, 0x55, 0x7e, 0x5f, 0x97, 0x33, 0x43, 0x67, 0x53, 0xdd, 0x64, 0x4f, 0x55, 0xd6, 0x7a, 0x0a, 0x3f, 0x02, 0x08, 0xe8, 0x92, 0xd3, 0xb1, 0x24,
0x4e, 0xed, 0x4b, 0x38, 0x5e, 0x5f, 0xfc, 0xb6, 0x46, 0xde, 0x42, 0xeb, 0xda, 0x77, 0x53, 0x9d, 0xaf, 0xca, 0xef, 0xeb, 0x72, 0x67, 0xe8, 0xcc, 0xa9, 0x7d, 0x09, 0xc7, 0xeb, 0xc9, 0x6f, 0x2b,
0x4c, 0xdb, 0x01, 0x1b, 0x6b, 0x2b, 0xa4, 0xac, 0xad, 0x09, 0xe5, 0xc5, 0x32, 0x78, 0x43, 0x23, 0xe4, 0x2d, 0xb4, 0xae, 0x7d, 0x37, 0x55, 0xc9, 0xb4, 0xb3, 0xb1, 0x91, 0x5b, 0x21, 0x25, 0xb7,
0xaf, 0xd4, 0xc0, 0x7e, 0x05, 0xe6, 0x66, 0xa6, 0x6d, 0x65, 0x3f, 0x81, 0xc3, 0x73, 0x2a, 0x7e, 0x26, 0x94, 0x17, 0xcb, 0xe0, 0x0d, 0x8d, 0xb4, 0x52, 0x0b, 0xfb, 0x15, 0x98, 0x9b, 0x9e, 0xb6,
0x51, 0xdd, 0x21, 0x12, 0x6c, 0x0f, 0x00, 0x57, 0x27, 0x1f, 0xb8, 0xa3, 0xa9, 0x24, 0xb7, 0xbe, 0x0d, 0xfb, 0x09, 0x1c, 0x9e, 0x53, 0xf1, 0x93, 0x3a, 0x59, 0x51, 0xc0, 0xf6, 0x00, 0x70, 0x75,
0x7a, 0x35, 0x5e, 0xa3, 0x7a, 0x7f, 0x57, 0xe1, 0x40, 0x77, 0x4a, 0x75, 0xaf, 0xa1, 0x0b, 0x7b, 0xf3, 0x81, 0x3b, 0xda, 0x4a, 0x72, 0xeb, 0x5b, 0x59, 0xe3, 0x35, 0xaa, 0xf7, 0x77, 0x15, 0x0e,
0xab, 0x57, 0x02, 0x7e, 0x99, 0x7d, 0xed, 0xad, 0xdd, 0xdd, 0xd6, 0xb3, 0x3c, 0x50, 0x25, 0xd5, 0xf4, 0x10, 0x55, 0x57, 0x1e, 0xba, 0xb0, 0xb7, 0x7a, 0x5b, 0xe0, 0xe7, 0xd9, 0x37, 0xe2, 0xda,
0xde, 0xf9, 0xc6, 0x40, 0x0e, 0x8d, 0xf5, 0x4e, 0x8d, 0xcf, 0xd3, 0x39, 0x32, 0xae, 0x06, 0xab, 0xb5, 0x6e, 0x3d, 0xcb, 0x03, 0x55, 0xa1, 0xda, 0x3b, 0x5f, 0x19, 0xc8, 0xa1, 0xb1, 0x3e, 0xc4,
0x9b, 0x17, 0xae, 0xd3, 0xe2, 0x9d, 0xb4, 0x33, 0xd9, 0x5e, 0xf1, 0x51, 0x9a, 0x64, 0x47, 0xb7, 0xf1, 0x79, 0x3a, 0x47, 0xc6, 0xad, 0x61, 0x75, 0xf3, 0xc2, 0xb5, 0x5b, 0xbc, 0x93, 0x72, 0x26,
0x4e, 0x73, 0xe3, 0xe3, 0xbc, 0x6f, 0x61, 0x3f, 0xd1, 0xc8, 0x30, 0xc3, 0xad, 0xb4, 0x66, 0x6d, 0x27, 0x2f, 0x3e, 0x4a, 0x93, 0x1c, 0xf6, 0xd6, 0x69, 0x6e, 0x7c, 0xec, 0xf7, 0x37, 0xd8, 0x4f,
0x7d, 0x95, 0x0b, 0x1b, 0xe7, 0x9a, 0xc3, 0x41, 0xf2, 0xd0, 0x60, 0x06, 0x41, 0x6a, 0x5f, 0xb1, 0xcc, 0x38, 0xcc, 0x50, 0x2b, 0x6d, 0x8e, 0x5b, 0x5f, 0xe4, 0xc2, 0xc6, 0xbe, 0xe6, 0x70, 0x90,
0xbe, 0xce, 0x07, 0x8e, 0xd3, 0x71, 0x68, 0xac, 0x6f, 0xf7, 0xac, 0x3a, 0x66, 0x1c, 0xc0, 0xac, 0x6c, 0x1a, 0xcc, 0x20, 0x48, 0x9d, 0x2b, 0xd6, 0x97, 0xf9, 0xc0, 0xb1, 0x3b, 0x0e, 0x8d, 0xf5,
0x3a, 0x66, 0x9d, 0x22, 0x7b, 0x07, 0x1d, 0x80, 0x87, 0x13, 0x80, 0x4f, 0x33, 0x0b, 0x92, 0x3c, 0xe3, 0x9e, 0x55, 0xc7, 0x8c, 0x06, 0xcc, 0xaa, 0x63, 0x56, 0x17, 0xd9, 0x3b, 0xe8, 0x00, 0x3c,
0x38, 0x56, 0xe7, 0x71, 0x60, 0x9c, 0x62, 0x01, 0x1f, 0xad, 0x75, 0x71, 0xcc, 0xb0, 0x26, 0xfd, 0x74, 0x00, 0x3e, 0xcd, 0x2c, 0x48, 0xb2, 0x71, 0xac, 0xce, 0xe3, 0xc0, 0xd8, 0xc5, 0x02, 0x3e,
0x62, 0xb1, 0x9e, 0xe7, 0x44, 0xeb, 0x8c, 0x2f, 0xe0, 0xb7, 0x9a, 0x06, 0xdf, 0x54, 0xe4, 0x1f, 0x58, 0x9b, 0xe2, 0x98, 0x21, 0x4d, 0xfa, 0x95, 0x63, 0x3d, 0xcf, 0x89, 0xd6, 0x1e, 0x5f, 0xc0,
0xe5, 0xef, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x37, 0x7c, 0x73, 0xf9, 0x0b, 0x00, 0x00, 0x2f, 0x35, 0x0d, 0xbe, 0xa9, 0xc8, 0xff, 0xd0, 0xdf, 0xfc, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x76,
0x9b, 0x44, 0xa7, 0x14, 0x0c, 0x00, 0x00,
} }

Loading…
Cancel
Save