Upgrade dependencies
This commit is contained in:
		
							
								
								
									
										18
									
								
								vendor/github.com/cyrilix/robocar-base/cli/cli.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/cyrilix/robocar-base/cli/cli.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -61,16 +61,20 @@ func HandleExit(p service.Part) {
 | 
			
		||||
	}()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InitMqttFlags(defaultClientId string, mqttBroker, username, password, clientId *string, mqttQos *int, mqttRetain *bool) {
 | 
			
		||||
func InitMqttFlagSet(flagSet *flag.FlagSet, defaultClientId string, mqttBroker, username, password, clientId *string, mqttQos *int, mqttRetain *bool) {
 | 
			
		||||
	SetDefaultValueFromEnv(clientId, "MQTT_CLIENT_ID", defaultClientId)
 | 
			
		||||
	SetDefaultValueFromEnv(mqttBroker, "MQTT_BROKER", "tcp://127.0.0.1:1883")
 | 
			
		||||
 | 
			
		||||
	flag.StringVar(mqttBroker, "mqtt-broker", *mqttBroker, "Broker Uri, use MQTT_BROKER env if arg not set")
 | 
			
		||||
	flag.StringVar(username, "mqtt-username", os.Getenv("MQTT_USERNAME"), "Broker Username, use MQTT_USERNAME env if arg not set")
 | 
			
		||||
	flag.StringVar(password, "mqtt-password", os.Getenv("MQTT_PASSWORD"), "Broker Password, MQTT_PASSWORD env if args not set")
 | 
			
		||||
	flag.StringVar(clientId, "mqtt-client-id", *clientId, "Mqtt client id, use MQTT_CLIENT_ID env if args not set")
 | 
			
		||||
	flag.IntVar(mqttQos, "mqtt-qos", *mqttQos, "Qos to pusblish message, use MQTT_QOS env if arg not set")
 | 
			
		||||
	flag.BoolVar(mqttRetain, "mqtt-retain", *mqttRetain, "Retain mqtt message, if not set, true if MQTT_RETAIN env variable is set")
 | 
			
		||||
	flagSet.StringVar(mqttBroker, "mqtt-broker", *mqttBroker, "Broker Uri, use MQTT_BROKER env if arg not set")
 | 
			
		||||
	flagSet.StringVar(username, "mqtt-username", os.Getenv("MQTT_USERNAME"), "Broker Username, use MQTT_USERNAME env if arg not set")
 | 
			
		||||
	flagSet.StringVar(password, "mqtt-password", os.Getenv("MQTT_PASSWORD"), "Broker Password, MQTT_PASSWORD env if args not set")
 | 
			
		||||
	flagSet.StringVar(clientId, "mqtt-client-id", *clientId, "Mqtt client id, use MQTT_CLIENT_ID env if args not set")
 | 
			
		||||
	flagSet.IntVar(mqttQos, "mqtt-qos", *mqttQos, "Qos to pusblish message, use MQTT_QOS env if arg not set")
 | 
			
		||||
	flagSet.BoolVar(mqttRetain, "mqtt-retain", *mqttRetain, "Retain mqtt message, if not set, true if MQTT_RETAIN env variable is set")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InitMqttFlags(defaultClientId string, mqttBroker, username, password, clientId *string, mqttQos *int, mqttRetain *bool) {
 | 
			
		||||
	InitMqttFlagSet(flag.CommandLine, defaultClientId, mqttBroker, username, password, clientId, mqttQos, mqttRetain)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func InitIntFlag(key string, defValue int) int {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										98
									
								
								vendor/github.com/cyrilix/robocar-protobuf/go/events/events.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										98
									
								
								vendor/github.com/cyrilix/robocar-protobuf/go/events/events.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -675,6 +675,7 @@ func (m *Ellipse) GetConfidence() float32 {
 | 
			
		||||
type RecordMessage struct {
 | 
			
		||||
	Frame                *FrameMessage    `protobuf:"bytes,1,opt,name=frame,proto3" json:"frame,omitempty"`
 | 
			
		||||
	Steering             *SteeringMessage `protobuf:"bytes,2,opt,name=steering,proto3" json:"steering,omitempty"`
 | 
			
		||||
	RecordSet            string           `protobuf:"bytes,3,opt,name=recordSet,proto3" json:"recordSet,omitempty"`
 | 
			
		||||
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
 | 
			
		||||
	XXX_unrecognized     []byte           `json:"-"`
 | 
			
		||||
	XXX_sizecache        int32            `json:"-"`
 | 
			
		||||
@@ -719,6 +720,13 @@ func (m *RecordMessage) GetSteering() *SteeringMessage {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *RecordMessage) GetRecordSet() string {
 | 
			
		||||
	if m != nil {
 | 
			
		||||
		return m.RecordSet
 | 
			
		||||
	}
 | 
			
		||||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterEnum("robocar.events.DriveMode", DriveMode_name, DriveMode_value)
 | 
			
		||||
	proto.RegisterEnum("robocar.events.TypeObject", TypeObject_name, TypeObject_value)
 | 
			
		||||
@@ -739,49 +747,49 @@ func init() {
 | 
			
		||||
func init() { proto.RegisterFile("events/events.proto", fileDescriptor_8ec31f2d2a3db598) }
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_8ec31f2d2a3db598 = []byte{
 | 
			
		||||
	// 689 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x54, 0x4b, 0x6f, 0xd3, 0x5a,
 | 
			
		||||
	0x10, 0xee, 0x71, 0xe2, 0x3c, 0x26, 0xbd, 0xb9, 0xd1, 0xe9, 0xbd, 0xbd, 0xbe, 0x11, 0xa2, 0x95,
 | 
			
		||||
	0xd9, 0x44, 0x95, 0xea, 0x40, 0x10, 0x12, 0x88, 0x55, 0x4a, 0x8b, 0x54, 0xa9, 0x8f, 0xe8, 0x34,
 | 
			
		||||
	0x45, 0x82, 0x4d, 0xe5, 0xd8, 0xe3, 0xc4, 0xc8, 0xf1, 0x89, 0xec, 0xd3, 0x47, 0x76, 0x2c, 0xf8,
 | 
			
		||||
	0x19, 0xfc, 0x00, 0x16, 0xfc, 0x48, 0xe4, 0xf3, 0x48, 0x5b, 0x43, 0x25, 0x84, 0xc4, 0x2a, 0xf3,
 | 
			
		||||
	0x4d, 0x66, 0xbe, 0xf9, 0x66, 0xe6, 0x78, 0x60, 0x03, 0xaf, 0x30, 0x15, 0x79, 0x5f, 0xfd, 0x78,
 | 
			
		||||
	0x8b, 0x8c, 0x0b, 0x4e, 0xdb, 0x19, 0x9f, 0xf0, 0xc0, 0xcf, 0x3c, 0xe5, 0xed, 0x6e, 0x4d, 0x39,
 | 
			
		||||
	0x9f, 0x26, 0xd8, 0x97, 0xff, 0x4e, 0x2e, 0xa3, 0xbe, 0x88, 0xe7, 0x98, 0x0b, 0x7f, 0xbe, 0x50,
 | 
			
		||||
	0x09, 0x6e, 0x0c, 0x8d, 0xb7, 0x99, 0x3f, 0x47, 0x86, 0x11, 0xa5, 0x50, 0x4d, 0xfd, 0x39, 0x3a,
 | 
			
		||||
	0x64, 0x9b, 0xf4, 0x9a, 0x4c, 0xda, 0xb4, 0x0d, 0x56, 0x1c, 0x3a, 0x96, 0xf4, 0x58, 0x71, 0x48,
 | 
			
		||||
	0x5f, 0x01, 0x04, 0x19, 0xfa, 0x02, 0xc3, 0x0b, 0x5f, 0x38, 0x95, 0x6d, 0xd2, 0x6b, 0x0d, 0xba,
 | 
			
		||||
	0x9e, 0xaa, 0xe2, 0x99, 0x2a, 0xde, 0xd8, 0x54, 0x61, 0x4d, 0x1d, 0x3d, 0x14, 0xee, 0x09, 0xac,
 | 
			
		||||
	0xcb, 0x52, 0xc7, 0x98, 0xe7, 0xfe, 0x14, 0x69, 0x4f, 0x52, 0x13, 0x49, 0xe1, 0x78, 0xf7, 0x85,
 | 
			
		||||
	0x7b, 0x46, 0x94, 0x2c, 0xfa, 0x0f, 0xd8, 0x51, 0x81, 0xa5, 0x8e, 0x75, 0xa6, 0x80, 0xfb, 0x99,
 | 
			
		||||
	0xc0, 0xdf, 0x67, 0x02, 0x31, 0x8b, 0xd3, 0xa9, 0xe1, 0xec, 0x42, 0x23, 0xd7, 0x2e, 0xc9, 0x6c,
 | 
			
		||||
	0xb1, 0x15, 0xa6, 0x8f, 0x01, 0x02, 0x9e, 0x46, 0x71, 0x88, 0x69, 0xa0, 0xa8, 0x2c, 0x76, 0xc7,
 | 
			
		||||
	0x43, 0x5f, 0x40, 0x53, 0x12, 0x5f, 0x64, 0x18, 0xe9, 0xce, 0x1e, 0x96, 0xd5, 0x88, 0xb4, 0x25,
 | 
			
		||||
	0x65, 0x8c, 0x67, 0x19, 0x17, 0x22, 0xc1, 0x3b, 0x32, 0x84, 0x76, 0x19, 0x19, 0x06, 0xff, 0x29,
 | 
			
		||||
	0x19, 0x47, 0xd0, 0xd9, 0xcf, 0xe2, 0x2b, 0x3c, 0xe6, 0xe1, 0x4a, 0xc6, 0x4b, 0x80, 0xb0, 0xf0,
 | 
			
		||||
	0x5d, 0xcc, 0x79, 0xa8, 0x84, 0xb4, 0x07, 0xff, 0x97, 0xb9, 0x56, 0x59, 0xac, 0x19, 0x1a, 0xd3,
 | 
			
		||||
	0x5d, 0x42, 0xfb, 0x74, 0xf2, 0x11, 0x03, 0x91, 0x1b, 0xae, 0xa7, 0x50, 0xe7, 0xca, 0xe3, 0x90,
 | 
			
		||||
	0xed, 0x4a, 0xaf, 0x35, 0xd8, 0x2c, 0x13, 0xa9, 0x04, 0x66, 0xc2, 0xee, 0x37, 0x62, 0xfd, 0x72,
 | 
			
		||||
	0x23, 0xdf, 0x08, 0xd4, 0x14, 0x15, 0xf5, 0xa0, 0x2a, 0x96, 0x0b, 0xa3, 0xbc, 0x5b, 0x4e, 0x1e,
 | 
			
		||||
	0x2f, 0x17, 0xa8, 0x8b, 0xca, 0xb8, 0xe2, 0x01, 0x27, 0x18, 0x09, 0x59, 0xcc, 0x66, 0xd2, 0xa6,
 | 
			
		||||
	0x1d, 0xa8, 0x08, 0xbe, 0x90, 0x83, 0xb4, 0x59, 0x61, 0x16, 0xaf, 0x29, 0x8b, 0xa7, 0x33, 0xe1,
 | 
			
		||||
	0x54, 0xa5, 0x4f, 0x01, 0xba, 0x09, 0xb5, 0x09, 0x17, 0x82, 0xcf, 0x1d, 0x5b, 0xba, 0x35, 0x2a,
 | 
			
		||||
	0xad, 0xab, 0x56, 0x5e, 0x97, 0xdb, 0x87, 0x8d, 0xb3, 0xeb, 0x58, 0x04, 0x33, 0x86, 0x01, 0xcf,
 | 
			
		||||
	0x42, 0x33, 0x2e, 0x07, 0xea, 0x98, 0xfa, 0x93, 0x04, 0xd5, 0x0b, 0x6f, 0x30, 0x03, 0xdd, 0xaf,
 | 
			
		||||
	0x04, 0x5a, 0x8c, 0xfb, 0xab, 0xc8, 0x3e, 0xd4, 0x03, 0x9e, 0x0a, 0x7e, 0x99, 0xe9, 0xc1, 0xfe,
 | 
			
		||||
	0x5b, 0xee, 0x73, 0xc4, 0xe3, 0x54, 0x30, 0x13, 0x45, 0x9f, 0x41, 0x1d, 0x93, 0x24, 0x5e, 0xe4,
 | 
			
		||||
	0xa8, 0xa7, 0xfa, 0x5f, 0x39, 0xe1, 0x40, 0xfd, 0xcd, 0x4c, 0xdc, 0xef, 0xbe, 0xa9, 0x27, 0x60,
 | 
			
		||||
	0xcb, 0xda, 0x74, 0x1d, 0xc8, 0x8d, 0xec, 0xc3, 0x66, 0xe4, 0xa6, 0x40, 0x4b, 0x3d, 0x63, 0xb2,
 | 
			
		||||
	0x74, 0xbf, 0x10, 0xa8, 0xeb, 0x82, 0x74, 0x17, 0x6a, 0x01, 0xa6, 0x02, 0x33, 0xfd, 0x59, 0x3f,
 | 
			
		||||
	0xd0, 0x8a, 0x0e, 0x2a, 0x36, 0x71, 0x1d, 0x87, 0x62, 0xa6, 0xc9, 0x14, 0x28, 0x36, 0x31, 0x43,
 | 
			
		||||
	0xb9, 0x20, 0xb5, 0x34, 0x8d, 0x8a, 0x68, 0x3f, 0x9d, 0x26, 0x28, 0xf7, 0x66, 0x31, 0x05, 0x4a,
 | 
			
		||||
	0xfb, 0xb1, 0x7f, 0xd8, 0xcf, 0x27, 0x02, 0x7f, 0xdd, 0x5f, 0xcd, 0xc0, 0x5c, 0x13, 0xa5, 0xf1,
 | 
			
		||||
	0xd1, 0x4f, 0x07, 0xa1, 0x83, 0xf5, 0xad, 0xa1, 0xaf, 0xef, 0xdc, 0x15, 0x35, 0xf4, 0xad, 0x72,
 | 
			
		||||
	0x5a, 0xe9, 0x14, 0xdd, 0x1e, 0x9e, 0x9d, 0x5d, 0x68, 0xae, 0x3e, 0x32, 0xda, 0x82, 0xfa, 0xe1,
 | 
			
		||||
	0xc9, 0xbb, 0xe1, 0xd1, 0xe1, 0x7e, 0x67, 0x8d, 0x36, 0xa0, 0x7a, 0x7e, 0x76, 0xc0, 0x3a, 0x84,
 | 
			
		||||
	0x36, 0xc1, 0x1e, 0x1d, 0x1e, 0x9d, 0x8e, 0x3b, 0xd6, 0xce, 0x00, 0xe0, 0xf6, 0x65, 0xd3, 0x3a,
 | 
			
		||||
	0x54, 0x86, 0x27, 0xef, 0x3b, 0x6b, 0x85, 0xf1, 0x66, 0x58, 0x84, 0x36, 0xa0, 0xba, 0x77, 0x7e,
 | 
			
		||||
	0x3c, 0xea, 0x58, 0x85, 0x35, 0x2a, 0x72, 0x2a, 0x7b, 0x8d, 0x0f, 0x35, 0x25, 0x63, 0x52, 0x93,
 | 
			
		||||
	0x47, 0xf8, 0xf9, 0xf7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x97, 0x5e, 0xa7, 0x9f, 0x1f, 0x06, 0x00,
 | 
			
		||||
	0x00,
 | 
			
		||||
	// 696 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x54, 0x5b, 0x6f, 0x12, 0x51,
 | 
			
		||||
	0x10, 0xee, 0x2e, 0x2c, 0xb0, 0x43, 0x45, 0x72, 0xaa, 0x75, 0x25, 0x8d, 0x6d, 0xf0, 0x85, 0x34,
 | 
			
		||||
	0xe9, 0xa2, 0x18, 0x13, 0x8d, 0x4f, 0xd4, 0xd6, 0xa4, 0x49, 0x2f, 0xe4, 0x40, 0x4d, 0xf4, 0xa5,
 | 
			
		||||
	0x59, 0x76, 0x07, 0x58, 0x03, 0x7b, 0xc8, 0xd9, 0xd3, 0x0b, 0xef, 0xfe, 0x0c, 0xe3, 0xb3, 0x0f,
 | 
			
		||||
	0xfe, 0x48, 0xb3, 0xe7, 0x42, 0xe9, 0x6a, 0x13, 0x63, 0xe2, 0x13, 0xf3, 0x0d, 0x33, 0xdf, 0x7c,
 | 
			
		||||
	0x33, 0x73, 0x76, 0x60, 0x03, 0xaf, 0x30, 0x11, 0x69, 0x5b, 0xfd, 0xf8, 0x73, 0xce, 0x04, 0x23,
 | 
			
		||||
	0x35, 0xce, 0x86, 0x2c, 0x0c, 0xb8, 0xaf, 0xbc, 0x8d, 0xed, 0x31, 0x63, 0xe3, 0x29, 0xb6, 0xe5,
 | 
			
		||||
	0xbf, 0xc3, 0xcb, 0x51, 0x5b, 0xc4, 0x33, 0x4c, 0x45, 0x30, 0x9b, 0xab, 0x84, 0x66, 0x0c, 0x95,
 | 
			
		||||
	0x0f, 0x3c, 0x98, 0x21, 0xc5, 0x11, 0x21, 0x50, 0x4c, 0x82, 0x19, 0x7a, 0xd6, 0x8e, 0xd5, 0x72,
 | 
			
		||||
	0xa9, 0xb4, 0x49, 0x0d, 0xec, 0x38, 0xf2, 0x6c, 0xe9, 0xb1, 0xe3, 0x88, 0xbc, 0x05, 0x08, 0x39,
 | 
			
		||||
	0x06, 0x02, 0xa3, 0x8b, 0x40, 0x78, 0x85, 0x1d, 0xab, 0x55, 0xed, 0x34, 0x7c, 0x55, 0xc5, 0x37,
 | 
			
		||||
	0x55, 0xfc, 0x81, 0xa9, 0x42, 0x5d, 0x1d, 0xdd, 0x15, 0xcd, 0x53, 0x58, 0x97, 0xa5, 0x4e, 0x30,
 | 
			
		||||
	0x4d, 0x83, 0x31, 0x92, 0x96, 0xa4, 0xb6, 0x24, 0x85, 0xe7, 0xdf, 0x15, 0xee, 0x1b, 0x51, 0xb2,
 | 
			
		||||
	0xe8, 0x23, 0x70, 0x46, 0x19, 0x96, 0x3a, 0xd6, 0xa9, 0x02, 0xcd, 0xaf, 0x16, 0x3c, 0xec, 0x0b,
 | 
			
		||||
	0x44, 0x1e, 0x27, 0x63, 0xc3, 0xd9, 0x80, 0x4a, 0xaa, 0x5d, 0x92, 0xd9, 0xa6, 0x4b, 0x4c, 0x9e,
 | 
			
		||||
	0x01, 0x84, 0x2c, 0x19, 0xc5, 0x11, 0x26, 0xa1, 0xa2, 0xb2, 0xe9, 0x8a, 0x87, 0xbc, 0x06, 0x57,
 | 
			
		||||
	0x12, 0x5f, 0x70, 0x1c, 0xe9, 0xce, 0xee, 0x97, 0x55, 0x19, 0x69, 0x4b, 0xca, 0x18, 0x4c, 0x38,
 | 
			
		||||
	0x13, 0x62, 0x8a, 0x2b, 0x32, 0x84, 0x76, 0x19, 0x19, 0x06, 0xff, 0x2f, 0x19, 0xc7, 0x50, 0x3f,
 | 
			
		||||
	0xe0, 0xf1, 0x15, 0x9e, 0xb0, 0x68, 0x29, 0xe3, 0x0d, 0x40, 0x94, 0xf9, 0x2e, 0x66, 0x2c, 0x52,
 | 
			
		||||
	0x42, 0x6a, 0x9d, 0xa7, 0x79, 0xae, 0x65, 0x16, 0x75, 0x23, 0x63, 0x36, 0x17, 0x50, 0x3b, 0x1b,
 | 
			
		||||
	0x7e, 0xc1, 0x50, 0xa4, 0x86, 0xeb, 0x05, 0x94, 0x99, 0xf2, 0x78, 0xd6, 0x4e, 0xa1, 0x55, 0xed,
 | 
			
		||||
	0x6c, 0xe6, 0x89, 0x54, 0x02, 0x35, 0x61, 0x77, 0x1b, 0xb1, 0xff, 0xba, 0x91, 0x9f, 0x16, 0x94,
 | 
			
		||||
	0x14, 0x15, 0xf1, 0xa1, 0x28, 0x16, 0x73, 0xa3, 0xbc, 0x91, 0x4f, 0x1e, 0x2c, 0xe6, 0xa8, 0x8b,
 | 
			
		||||
	0xca, 0xb8, 0xec, 0x01, 0x4f, 0x71, 0x24, 0x64, 0x31, 0x87, 0x4a, 0x9b, 0xd4, 0xa1, 0x20, 0xd8,
 | 
			
		||||
	0x5c, 0x0e, 0xd2, 0xa1, 0x99, 0x99, 0xbd, 0x26, 0x1e, 0x8f, 0x27, 0xc2, 0x2b, 0x4a, 0x9f, 0x02,
 | 
			
		||||
	0x64, 0x13, 0x4a, 0x43, 0x26, 0x04, 0x9b, 0x79, 0x8e, 0x74, 0x6b, 0x94, 0x5b, 0x57, 0x29, 0xbf,
 | 
			
		||||
	0xae, 0x66, 0x1b, 0x36, 0xfa, 0xd7, 0xb1, 0x08, 0x27, 0x14, 0x43, 0xc6, 0x23, 0x33, 0x2e, 0x0f,
 | 
			
		||||
	0xca, 0x98, 0x04, 0xc3, 0x29, 0xaa, 0x17, 0x5e, 0xa1, 0x06, 0x36, 0x7f, 0x58, 0x50, 0xa5, 0x2c,
 | 
			
		||||
	0x58, 0x46, 0xb6, 0xa1, 0x1c, 0xb2, 0x44, 0xb0, 0x4b, 0xae, 0x07, 0xfb, 0x38, 0xdf, 0x67, 0x8f,
 | 
			
		||||
	0xc5, 0x89, 0xa0, 0x26, 0x8a, 0xbc, 0x84, 0x32, 0x4e, 0xa7, 0xf1, 0x3c, 0x45, 0x3d, 0xd5, 0x27,
 | 
			
		||||
	0xf9, 0x84, 0x43, 0xf5, 0x37, 0x35, 0x71, 0xff, 0xfa, 0xa6, 0x9e, 0x83, 0x23, 0x6b, 0x93, 0x75,
 | 
			
		||||
	0xb0, 0x6e, 0x64, 0x1f, 0x0e, 0xb5, 0x6e, 0x32, 0xb4, 0xd0, 0x33, 0xb6, 0x16, 0xcd, 0x6f, 0x16,
 | 
			
		||||
	0x94, 0x75, 0x41, 0xb2, 0x07, 0xa5, 0x10, 0x13, 0x81, 0x5c, 0x7f, 0xd6, 0xf7, 0xb4, 0xa2, 0x83,
 | 
			
		||||
	0xb2, 0x4d, 0x5c, 0xc7, 0x91, 0x98, 0x68, 0x32, 0x05, 0xb2, 0x4d, 0x4c, 0x50, 0x2e, 0x48, 0x2d,
 | 
			
		||||
	0x4d, 0xa3, 0x2c, 0x3a, 0x48, 0xc6, 0x53, 0x94, 0x7b, 0xb3, 0xa9, 0x02, 0xb9, 0xfd, 0x38, 0xbf,
 | 
			
		||||
	0xed, 0xe7, 0xbb, 0x05, 0x0f, 0xee, 0xae, 0xa6, 0x63, 0xae, 0x89, 0xd2, 0xb8, 0xf5, 0xc7, 0x41,
 | 
			
		||||
	0xe8, 0x60, 0x7d, 0x6b, 0xc8, 0xbb, 0x95, 0xbb, 0xa2, 0x86, 0xbe, 0x9d, 0x4f, 0xcb, 0x9d, 0xa2,
 | 
			
		||||
	0x95, 0xc3, 0xb3, 0x05, 0x2e, 0x97, 0x0a, 0xfa, 0xa8, 0x7a, 0x72, 0xe9, 0xad, 0x63, 0x77, 0x0f,
 | 
			
		||||
	0xdc, 0xe5, 0x27, 0x48, 0xaa, 0x50, 0x3e, 0x3a, 0xfd, 0xd8, 0x3d, 0x3e, 0x3a, 0xa8, 0xaf, 0x91,
 | 
			
		||||
	0x0a, 0x14, 0xcf, 0xfb, 0x87, 0xb4, 0x6e, 0x11, 0x17, 0x9c, 0xde, 0xd1, 0xf1, 0xd9, 0xa0, 0x6e,
 | 
			
		||||
	0xef, 0x76, 0x00, 0x6e, 0xdf, 0x3d, 0x29, 0x43, 0xa1, 0x7b, 0xfa, 0xa9, 0xbe, 0x96, 0x19, 0xef,
 | 
			
		||||
	0xbb, 0x59, 0x68, 0x05, 0x8a, 0xfb, 0xe7, 0x27, 0xbd, 0xba, 0x9d, 0x59, 0xbd, 0x2c, 0xa7, 0xb0,
 | 
			
		||||
	0x5f, 0xf9, 0x5c, 0x52, 0x22, 0x87, 0x25, 0x79, 0xa2, 0x5f, 0xfd, 0x0a, 0x00, 0x00, 0xff, 0xff,
 | 
			
		||||
	0x5d, 0x6e, 0x23, 0x4e, 0x3d, 0x06, 0x00, 0x00,
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/golang/protobuf/proto/lib.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/golang/protobuf/proto/lib.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -393,7 +393,7 @@ func (p *Buffer) Bytes() []byte { return p.buf }
 | 
			
		||||
// than relying on this API.
 | 
			
		||||
//
 | 
			
		||||
// If deterministic serialization is requested, map entries will be sorted
 | 
			
		||||
// by keys in lexographical order. This is an implementation detail and
 | 
			
		||||
// by keys in lexicographical order. This is an implementation detail and
 | 
			
		||||
// subject to change.
 | 
			
		||||
func (p *Buffer) SetDeterministic(deterministic bool) {
 | 
			
		||||
	p.deterministic = deterministic
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/github.com/golang/protobuf/proto/text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/golang/protobuf/proto/text.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -456,6 +456,8 @@ func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
 | 
			
		||||
 | 
			
		||||
// writeAny writes an arbitrary field.
 | 
			
		||||
func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error {
 | 
			
		||||
	v = reflect.Indirect(v)
 | 
			
		||||
@@ -519,8 +521,8 @@ func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Propert
 | 
			
		||||
			// mutating this value.
 | 
			
		||||
			v = v.Addr()
 | 
			
		||||
		}
 | 
			
		||||
		if etm, ok := v.Interface().(encoding.TextMarshaler); ok {
 | 
			
		||||
			text, err := etm.MarshalText()
 | 
			
		||||
		if v.Type().Implements(textMarshalerType) {
 | 
			
		||||
			text, err := v.Interface().(encoding.TextMarshaler).MarshalText()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										40
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										40
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -20,17 +20,19 @@ var _ = math.Inf
 | 
			
		||||
// proto package needs to be updated.
 | 
			
		||||
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
 | 
			
		||||
// A Timestamp represents a point in time independent of any time zone
 | 
			
		||||
// or calendar, represented as seconds and fractions of seconds at
 | 
			
		||||
// nanosecond resolution in UTC Epoch time. It is encoded using the
 | 
			
		||||
// Proleptic Gregorian Calendar which extends the Gregorian calendar
 | 
			
		||||
// backwards to year one. It is encoded assuming all minutes are 60
 | 
			
		||||
// seconds long, i.e. leap seconds are "smeared" so that no leap second
 | 
			
		||||
// table is needed for interpretation. Range is from
 | 
			
		||||
// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
 | 
			
		||||
// By restricting to that range, we ensure that we can convert to
 | 
			
		||||
// and from  RFC 3339 date strings.
 | 
			
		||||
// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
 | 
			
		||||
// A Timestamp represents a point in time independent of any time zone or local
 | 
			
		||||
// calendar, encoded as a count of seconds and fractions of seconds at
 | 
			
		||||
// nanosecond resolution. The count is relative to an epoch at UTC midnight on
 | 
			
		||||
// January 1, 1970, in the proleptic Gregorian calendar which extends the
 | 
			
		||||
// Gregorian calendar backwards to year one.
 | 
			
		||||
//
 | 
			
		||||
// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
 | 
			
		||||
// second table is needed for interpretation, using a [24-hour linear
 | 
			
		||||
// smear](https://developers.google.com/time/smear).
 | 
			
		||||
//
 | 
			
		||||
// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
 | 
			
		||||
// restricting to that range, we ensure that we can convert to and from [RFC
 | 
			
		||||
// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
 | 
			
		||||
//
 | 
			
		||||
// # Examples
 | 
			
		||||
//
 | 
			
		||||
@@ -91,12 +93,14 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
 | 
			
		||||
// 01:30 UTC on January 15, 2017.
 | 
			
		||||
//
 | 
			
		||||
// In JavaScript, one can convert a Date object to this format using the
 | 
			
		||||
// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString]
 | 
			
		||||
// standard
 | 
			
		||||
// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
 | 
			
		||||
// method. In Python, a standard `datetime.datetime` object can be converted
 | 
			
		||||
// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime)
 | 
			
		||||
// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one
 | 
			
		||||
// can use the Joda Time's [`ISODateTimeFormat.dateTime()`](
 | 
			
		||||
// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--
 | 
			
		||||
// to this format using
 | 
			
		||||
// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
 | 
			
		||||
// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
 | 
			
		||||
// the Joda Time's [`ISODateTimeFormat.dateTime()`](
 | 
			
		||||
// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D
 | 
			
		||||
// ) to obtain a formatter capable of generating timestamps in this format.
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
@@ -160,7 +164,9 @@ func init() {
 | 
			
		||||
	proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func init() { proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e) }
 | 
			
		||||
func init() {
 | 
			
		||||
	proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_292007bbfe81227e)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var fileDescriptor_292007bbfe81227e = []byte{
 | 
			
		||||
	// 191 bytes of a gzipped FileDescriptorProto
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -40,17 +40,19 @@ option java_outer_classname = "TimestampProto";
 | 
			
		||||
option java_multiple_files = true;
 | 
			
		||||
option objc_class_prefix = "GPB";
 | 
			
		||||
 | 
			
		||||
// A Timestamp represents a point in time independent of any time zone
 | 
			
		||||
// or calendar, represented as seconds and fractions of seconds at
 | 
			
		||||
// nanosecond resolution in UTC Epoch time. It is encoded using the
 | 
			
		||||
// Proleptic Gregorian Calendar which extends the Gregorian calendar
 | 
			
		||||
// backwards to year one. It is encoded assuming all minutes are 60
 | 
			
		||||
// seconds long, i.e. leap seconds are "smeared" so that no leap second
 | 
			
		||||
// table is needed for interpretation. Range is from
 | 
			
		||||
// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
 | 
			
		||||
// By restricting to that range, we ensure that we can convert to
 | 
			
		||||
// and from  RFC 3339 date strings.
 | 
			
		||||
// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
 | 
			
		||||
// A Timestamp represents a point in time independent of any time zone or local
 | 
			
		||||
// calendar, encoded as a count of seconds and fractions of seconds at
 | 
			
		||||
// nanosecond resolution. The count is relative to an epoch at UTC midnight on
 | 
			
		||||
// January 1, 1970, in the proleptic Gregorian calendar which extends the
 | 
			
		||||
// Gregorian calendar backwards to year one.
 | 
			
		||||
//
 | 
			
		||||
// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap
 | 
			
		||||
// second table is needed for interpretation, using a [24-hour linear
 | 
			
		||||
// smear](https://developers.google.com/time/smear).
 | 
			
		||||
//
 | 
			
		||||
// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By
 | 
			
		||||
// restricting to that range, we ensure that we can convert to and from [RFC
 | 
			
		||||
// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.
 | 
			
		||||
//
 | 
			
		||||
// # Examples
 | 
			
		||||
//
 | 
			
		||||
@@ -111,17 +113,18 @@ option objc_class_prefix = "GPB";
 | 
			
		||||
// 01:30 UTC on January 15, 2017.
 | 
			
		||||
//
 | 
			
		||||
// In JavaScript, one can convert a Date object to this format using the
 | 
			
		||||
// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString]
 | 
			
		||||
// standard
 | 
			
		||||
// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
 | 
			
		||||
// method. In Python, a standard `datetime.datetime` object can be converted
 | 
			
		||||
// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime)
 | 
			
		||||
// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one
 | 
			
		||||
// can use the Joda Time's [`ISODateTimeFormat.dateTime()`](
 | 
			
		||||
// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--
 | 
			
		||||
// to this format using
 | 
			
		||||
// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with
 | 
			
		||||
// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use
 | 
			
		||||
// the Joda Time's [`ISODateTimeFormat.dateTime()`](
 | 
			
		||||
// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime%2D%2D
 | 
			
		||||
// ) to obtain a formatter capable of generating timestamps in this format.
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
message Timestamp {
 | 
			
		||||
 | 
			
		||||
  // Represents seconds of UTC time since Unix epoch
 | 
			
		||||
  // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
 | 
			
		||||
  // 9999-12-31T23:59:59Z inclusive.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										66
									
								
								vendor/github.com/sirupsen/logrus/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								vendor/github.com/sirupsen/logrus/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,51 +1,25 @@
 | 
			
		||||
language: go
 | 
			
		||||
go_import_path: github.com/sirupsen/logrus
 | 
			
		||||
git:
 | 
			
		||||
  depth: 1
 | 
			
		||||
env:
 | 
			
		||||
  - GOMAXPROCS=4 GORACE=halt_on_error=1
 | 
			
		||||
  - GO111MODULE=on
 | 
			
		||||
  - GO111MODULE=off
 | 
			
		||||
go: [ 1.11.x, 1.12.x ]
 | 
			
		||||
os: [ linux, osx ]
 | 
			
		||||
matrix:
 | 
			
		||||
  include:
 | 
			
		||||
    - go: 1.10.x
 | 
			
		||||
      install:
 | 
			
		||||
        - go get github.com/stretchr/testify/assert
 | 
			
		||||
        - go get golang.org/x/crypto/ssh/terminal
 | 
			
		||||
        - go get golang.org/x/sys/unix
 | 
			
		||||
        - go get golang.org/x/sys/windows
 | 
			
		||||
      script:
 | 
			
		||||
        - go test -race -v ./...
 | 
			
		||||
    - go: 1.11.x
 | 
			
		||||
      env: GO111MODULE=on
 | 
			
		||||
      install:
 | 
			
		||||
        - go mod download
 | 
			
		||||
      script:
 | 
			
		||||
        - go test -race -v ./...
 | 
			
		||||
    - go: 1.11.x
 | 
			
		||||
  exclude:
 | 
			
		||||
    - go: 1.12.x
 | 
			
		||||
      env: GO111MODULE=off
 | 
			
		||||
      install:
 | 
			
		||||
        - go get github.com/stretchr/testify/assert
 | 
			
		||||
        - go get golang.org/x/crypto/ssh/terminal
 | 
			
		||||
        - go get golang.org/x/sys/unix
 | 
			
		||||
        - go get golang.org/x/sys/windows
 | 
			
		||||
      script:
 | 
			
		||||
        - go test -race -v ./...
 | 
			
		||||
    - go: 1.10.x
 | 
			
		||||
      install:
 | 
			
		||||
        - go get github.com/stretchr/testify/assert
 | 
			
		||||
        - go get golang.org/x/crypto/ssh/terminal
 | 
			
		||||
        - go get golang.org/x/sys/unix
 | 
			
		||||
        - go get golang.org/x/sys/windows
 | 
			
		||||
      script:
 | 
			
		||||
        - go test -race -v -tags appengine ./...
 | 
			
		||||
    - go: 1.11.x
 | 
			
		||||
      env: GO111MODULE=on
 | 
			
		||||
      install:
 | 
			
		||||
        - go mod download
 | 
			
		||||
      script:
 | 
			
		||||
        - go test -race -v -tags appengine ./...
 | 
			
		||||
    - go: 1.11.x
 | 
			
		||||
      env: GO111MODULE=off
 | 
			
		||||
      install:
 | 
			
		||||
        - go get github.com/stretchr/testify/assert
 | 
			
		||||
        - go get golang.org/x/crypto/ssh/terminal
 | 
			
		||||
        - go get golang.org/x/sys/unix
 | 
			
		||||
        - go get golang.org/x/sys/windows
 | 
			
		||||
      script:
 | 
			
		||||
        - go test -race -v -tags appengine ./...
 | 
			
		||||
      os: osx
 | 
			
		||||
install:
 | 
			
		||||
  - ./travis/install.sh
 | 
			
		||||
  - if [[ "$GO111MODULE" ==  "on" ]]; then go mod download; fi
 | 
			
		||||
  - if [[ "$GO111MODULE" == "off" ]]; then go get github.com/stretchr/testify/assert golang.org/x/sys/unix github.com/konsorten/go-windows-terminal-sequences; fi
 | 
			
		||||
script:
 | 
			
		||||
  - ./travis/cross_build.sh
 | 
			
		||||
  - export GOMAXPROCS=4
 | 
			
		||||
  - export GORACE=halt_on_error=1
 | 
			
		||||
  - go test -race -v ./...
 | 
			
		||||
  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then go test -race -v -tags appengine ./... ; fi
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								vendor/github.com/sirupsen/logrus/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/sirupsen/logrus/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +1,38 @@
 | 
			
		||||
# 1.4.2
 | 
			
		||||
  * Fixes build break for plan9, nacl, solaris
 | 
			
		||||
# 1.4.1
 | 
			
		||||
This new release introduces:
 | 
			
		||||
  * Enhance TextFormatter to not print caller information when they are empty (#944)
 | 
			
		||||
  * Remove dependency on golang.org/x/crypto (#932, #943) 
 | 
			
		||||
 | 
			
		||||
Fixes:
 | 
			
		||||
  * Fix Entry.WithContext method to return a copy of the initial entry (#941)
 | 
			
		||||
 | 
			
		||||
# 1.4.0
 | 
			
		||||
This new release introduces:
 | 
			
		||||
  * Add `DeferExitHandler`, similar to `RegisterExitHandler` but prepending the handler to the list of handlers (semantically like `defer`) (#848).
 | 
			
		||||
  * Add `CallerPrettyfier` to `JSONFormatter` and `TextFormatter (#909, #911)
 | 
			
		||||
  * Add `Entry.WithContext()` and `Entry.Context`, to set a context on entries to be used e.g. in hooks (#919).
 | 
			
		||||
 | 
			
		||||
Fixes:
 | 
			
		||||
  * Fix wrong method calls `Logger.Print` and `Logger.Warningln` (#893).
 | 
			
		||||
  * Update `Entry.Logf` to not do string formatting unless the log level is enabled (#903)
 | 
			
		||||
  * Fix infinite recursion on unknown `Level.String()` (#907)
 | 
			
		||||
  * Fix race condition in `getCaller` (#916).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# 1.3.0
 | 
			
		||||
This new release introduces:
 | 
			
		||||
  * Log, Logf, Logln functions for Logger and Entry that take a Level
 | 
			
		||||
 | 
			
		||||
Fixes:
 | 
			
		||||
  * Building prometheus node_exporter on AIX (#840)
 | 
			
		||||
  * Race condition in TextFormatter (#468)
 | 
			
		||||
  * Travis CI import path (#868)
 | 
			
		||||
  * Remove coloured output on Windows (#862)
 | 
			
		||||
  * Pointer to func as field in JSONFormatter (#870)
 | 
			
		||||
  * Properly marshal Levels (#873)
 | 
			
		||||
 | 
			
		||||
# 1.2.0
 | 
			
		||||
This new release introduces:
 | 
			
		||||
  * A new method `SetReportCaller` in the `Logger` to enable the file, line and calling function from which the trace has been issued
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								vendor/github.com/sirupsen/logrus/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/sirupsen/logrus/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -361,9 +361,11 @@ The built-in logging formatters are:
 | 
			
		||||
Third party logging formatters:
 | 
			
		||||
 | 
			
		||||
* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine.
 | 
			
		||||
* [`GELF`](https://github.com/fabienm/go-logrus-formatters). Formats entries so they comply to Graylog's [GELF 1.1 specification](http://docs.graylog.org/en/2.4/pages/gelf.html).
 | 
			
		||||
* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events.
 | 
			
		||||
* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout.
 | 
			
		||||
* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦.
 | 
			
		||||
* [`nested-logrus-formatter`](https://github.com/antonfisher/nested-logrus-formatter). Converts logrus fields to a nested structure.
 | 
			
		||||
 | 
			
		||||
You can define your formatter by implementing the `Formatter` interface,
 | 
			
		||||
requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/sirupsen/logrus/alt_exit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/sirupsen/logrus/alt_exit.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -51,9 +51,9 @@ func Exit(code int) {
 | 
			
		||||
	os.Exit(code)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke
 | 
			
		||||
// all handlers. The handlers will also be invoked when any Fatal log entry is
 | 
			
		||||
// made.
 | 
			
		||||
// RegisterExitHandler appends a Logrus Exit handler to the list of handlers,
 | 
			
		||||
// call logrus.Exit to invoke all handlers. The handlers will also be invoked when
 | 
			
		||||
// any Fatal log entry is made.
 | 
			
		||||
//
 | 
			
		||||
// This method is useful when a caller wishes to use logrus to log a fatal
 | 
			
		||||
// message but also needs to gracefully shutdown. An example usecase could be
 | 
			
		||||
@@ -62,3 +62,15 @@ func Exit(code int) {
 | 
			
		||||
func RegisterExitHandler(handler func()) {
 | 
			
		||||
	handlers = append(handlers, handler)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DeferExitHandler prepends a Logrus Exit handler to the list of handlers,
 | 
			
		||||
// call logrus.Exit to invoke all handlers. The handlers will also be invoked when
 | 
			
		||||
// any Fatal log entry is made.
 | 
			
		||||
//
 | 
			
		||||
// This method is useful when a caller wishes to use logrus to log a fatal
 | 
			
		||||
// message but also needs to gracefully shutdown. An example usecase could be
 | 
			
		||||
// closing database connections, or sending a alert that the application is
 | 
			
		||||
// closing.
 | 
			
		||||
func DeferExitHandler(handler func()) {
 | 
			
		||||
	handlers = append([]func(){handler}, handlers...)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										157
									
								
								vendor/github.com/sirupsen/logrus/entry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										157
									
								
								vendor/github.com/sirupsen/logrus/entry.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@ package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"reflect"
 | 
			
		||||
@@ -69,6 +70,9 @@ type Entry struct {
 | 
			
		||||
	// When formatter is called in entry.log(), a Buffer may be set to entry
 | 
			
		||||
	Buffer *bytes.Buffer
 | 
			
		||||
 | 
			
		||||
	// Contains the context set by the user. Useful for hook processing etc.
 | 
			
		||||
	Context context.Context
 | 
			
		||||
 | 
			
		||||
	// err may contain a field formatting error
 | 
			
		||||
	err string
 | 
			
		||||
}
 | 
			
		||||
@@ -97,6 +101,11 @@ func (entry *Entry) WithError(err error) *Entry {
 | 
			
		||||
	return entry.WithField(ErrorKey, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Add a context to the Entry.
 | 
			
		||||
func (entry *Entry) WithContext(ctx context.Context) *Entry {
 | 
			
		||||
	return &Entry{Logger: entry.Logger, Data: entry.Data, Time: entry.Time, err: entry.err, Context: ctx}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Add a single field to the Entry.
 | 
			
		||||
func (entry *Entry) WithField(key string, value interface{}) *Entry {
 | 
			
		||||
	return entry.WithFields(Fields{key: value})
 | 
			
		||||
@@ -108,23 +117,34 @@ func (entry *Entry) WithFields(fields Fields) *Entry {
 | 
			
		||||
	for k, v := range entry.Data {
 | 
			
		||||
		data[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	var field_err string
 | 
			
		||||
	fieldErr := entry.err
 | 
			
		||||
	for k, v := range fields {
 | 
			
		||||
		if t := reflect.TypeOf(v); t != nil && t.Kind() == reflect.Func {
 | 
			
		||||
			field_err = fmt.Sprintf("can not add field %q", k)
 | 
			
		||||
			if entry.err != "" {
 | 
			
		||||
				field_err = entry.err + ", " + field_err
 | 
			
		||||
		isErrField := false
 | 
			
		||||
		if t := reflect.TypeOf(v); t != nil {
 | 
			
		||||
			switch t.Kind() {
 | 
			
		||||
			case reflect.Func:
 | 
			
		||||
				isErrField = true
 | 
			
		||||
			case reflect.Ptr:
 | 
			
		||||
				isErrField = t.Elem().Kind() == reflect.Func
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if isErrField {
 | 
			
		||||
			tmp := fmt.Sprintf("can not add field %q", k)
 | 
			
		||||
			if fieldErr != "" {
 | 
			
		||||
				fieldErr = entry.err + ", " + tmp
 | 
			
		||||
			} else {
 | 
			
		||||
				fieldErr = tmp
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			data[k] = v
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, err: field_err}
 | 
			
		||||
	return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, err: fieldErr, Context: entry.Context}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Overrides the time of the Entry.
 | 
			
		||||
func (entry *Entry) WithTime(t time.Time) *Entry {
 | 
			
		||||
	return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t}
 | 
			
		||||
	return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t, err: entry.err, Context: entry.Context}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// getPackageName reduces a fully qualified function name to the package name
 | 
			
		||||
@@ -145,20 +165,23 @@ func getPackageName(f string) string {
 | 
			
		||||
 | 
			
		||||
// getCaller retrieves the name of the first non-logrus calling function
 | 
			
		||||
func getCaller() *runtime.Frame {
 | 
			
		||||
 | 
			
		||||
	// cache this package's fully-qualified name
 | 
			
		||||
	callerInitOnce.Do(func() {
 | 
			
		||||
		pcs := make([]uintptr, 2)
 | 
			
		||||
		_ = runtime.Callers(0, pcs)
 | 
			
		||||
		logrusPackage = getPackageName(runtime.FuncForPC(pcs[1]).Name())
 | 
			
		||||
 | 
			
		||||
		// now that we have the cache, we can skip a minimum count of known-logrus functions
 | 
			
		||||
		// XXX this is dubious, the number of frames may vary
 | 
			
		||||
		minimumCallerDepth = knownLogrusFrames
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	// Restrict the lookback frames to avoid runaway lookups
 | 
			
		||||
	pcs := make([]uintptr, maximumCallerDepth)
 | 
			
		||||
	depth := runtime.Callers(minimumCallerDepth, pcs)
 | 
			
		||||
	frames := runtime.CallersFrames(pcs[:depth])
 | 
			
		||||
 | 
			
		||||
	// cache this package's fully-qualified name
 | 
			
		||||
	callerInitOnce.Do(func() {
 | 
			
		||||
		logrusPackage = getPackageName(runtime.FuncForPC(pcs[0]).Name())
 | 
			
		||||
 | 
			
		||||
		// now that we have the cache, we can skip a minimum count of known-logrus functions
 | 
			
		||||
		// XXX this is dubious, the number of frames may vary store an entry in a logger interface
 | 
			
		||||
		minimumCallerDepth = knownLogrusFrames
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	for f, again := frames.Next(); again; f, again = frames.Next() {
 | 
			
		||||
		pkg := getPackageName(f.Function)
 | 
			
		||||
 | 
			
		||||
@@ -240,16 +263,18 @@ func (entry *Entry) write() {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Trace(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(TraceLevel) {
 | 
			
		||||
		entry.log(TraceLevel, fmt.Sprint(args...))
 | 
			
		||||
func (entry *Entry) Log(level Level, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry.log(level, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Trace(args ...interface{}) {
 | 
			
		||||
	entry.Log(TraceLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Debug(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(DebugLevel) {
 | 
			
		||||
		entry.log(DebugLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(DebugLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Print(args ...interface{}) {
 | 
			
		||||
@@ -257,15 +282,11 @@ func (entry *Entry) Print(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Info(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(InfoLevel) {
 | 
			
		||||
		entry.log(InfoLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(InfoLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warn(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry.log(WarnLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(WarnLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warning(args ...interface{}) {
 | 
			
		||||
@@ -273,43 +294,37 @@ func (entry *Entry) Warning(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Error(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(ErrorLevel) {
 | 
			
		||||
		entry.log(ErrorLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(ErrorLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Fatal(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(FatalLevel) {
 | 
			
		||||
		entry.log(FatalLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(FatalLevel, args...)
 | 
			
		||||
	entry.Logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Panic(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(PanicLevel) {
 | 
			
		||||
		entry.log(PanicLevel, fmt.Sprint(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Log(PanicLevel, args...)
 | 
			
		||||
	panic(fmt.Sprint(args...))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Entry Printf family functions
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Tracef(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(TraceLevel) {
 | 
			
		||||
		entry.Trace(fmt.Sprintf(format, args...))
 | 
			
		||||
func (entry *Entry) Logf(level Level, format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry.Log(level, fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Tracef(format string, args ...interface{}) {
 | 
			
		||||
	entry.Logf(TraceLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Debugf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(DebugLevel) {
 | 
			
		||||
		entry.Debug(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(DebugLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Infof(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(InfoLevel) {
 | 
			
		||||
		entry.Info(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(InfoLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Printf(format string, args ...interface{}) {
 | 
			
		||||
@@ -317,9 +332,7 @@ func (entry *Entry) Printf(format string, args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warnf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry.Warn(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(WarnLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warningf(format string, args ...interface{}) {
 | 
			
		||||
@@ -327,42 +340,36 @@ func (entry *Entry) Warningf(format string, args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Errorf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(ErrorLevel) {
 | 
			
		||||
		entry.Error(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(ErrorLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Fatalf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(FatalLevel) {
 | 
			
		||||
		entry.Fatal(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(FatalLevel, format, args...)
 | 
			
		||||
	entry.Logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Panicf(format string, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(PanicLevel) {
 | 
			
		||||
		entry.Panic(fmt.Sprintf(format, args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logf(PanicLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Entry Println family functions
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Traceln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(TraceLevel) {
 | 
			
		||||
		entry.Trace(entry.sprintlnn(args...))
 | 
			
		||||
func (entry *Entry) Logln(level Level, args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry.Log(level, entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Traceln(args ...interface{}) {
 | 
			
		||||
	entry.Logln(TraceLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Debugln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(DebugLevel) {
 | 
			
		||||
		entry.Debug(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(DebugLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Infoln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(InfoLevel) {
 | 
			
		||||
		entry.Info(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(InfoLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Println(args ...interface{}) {
 | 
			
		||||
@@ -370,9 +377,7 @@ func (entry *Entry) Println(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warnln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry.Warn(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(WarnLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Warningln(args ...interface{}) {
 | 
			
		||||
@@ -380,22 +385,16 @@ func (entry *Entry) Warningln(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Errorln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(ErrorLevel) {
 | 
			
		||||
		entry.Error(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(ErrorLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Fatalln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(FatalLevel) {
 | 
			
		||||
		entry.Fatal(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(FatalLevel, args...)
 | 
			
		||||
	entry.Logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (entry *Entry) Panicln(args ...interface{}) {
 | 
			
		||||
	if entry.Logger.IsLevelEnabled(PanicLevel) {
 | 
			
		||||
		entry.Panic(entry.sprintlnn(args...))
 | 
			
		||||
	}
 | 
			
		||||
	entry.Logln(PanicLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sprintlnn => Sprint no newline. This is to get the behavior of how
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/github.com/sirupsen/logrus/exported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/sirupsen/logrus/exported.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,7 @@
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"io"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
@@ -55,6 +56,11 @@ func WithError(err error) *Entry {
 | 
			
		||||
	return std.WithField(ErrorKey, err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithContext creates an entry from the standard logger and adds a context to it.
 | 
			
		||||
func WithContext(ctx context.Context) *Entry {
 | 
			
		||||
	return std.WithContext(ctx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithField creates an entry from the standard logger and adds a field to
 | 
			
		||||
// it. If you want multiple fields, use `WithFields`.
 | 
			
		||||
//
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/github.com/sirupsen/logrus/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/github.com/sirupsen/logrus/go.mod
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -6,6 +6,5 @@ require (
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
			
		||||
	github.com/stretchr/objx v0.1.1 // indirect
 | 
			
		||||
	github.com/stretchr/testify v1.2.2
 | 
			
		||||
	golang.org/x/crypto v0.0.0-20180904163835-0709b304e793
 | 
			
		||||
	golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33
 | 
			
		||||
	golang.org/x/sys v0.0.0-20190422165155-953cdadca894
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								vendor/github.com/sirupsen/logrus/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								vendor/github.com/sirupsen/logrus/go.sum
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -2,6 +2,7 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe h1:CHRGQ8V7OlCYtwaKPJi3iA7J+YdNKdo8j7nG5IgDhjs=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
@@ -9,7 +10,7 @@ github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
 | 
			
		||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 | 
			
		||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/github.com/sirupsen/logrus/json_formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/sirupsen/logrus/json_formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"runtime"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type fieldKey string
 | 
			
		||||
@@ -42,6 +43,12 @@ type JSONFormatter struct {
 | 
			
		||||
	// }
 | 
			
		||||
	FieldMap FieldMap
 | 
			
		||||
 | 
			
		||||
	// CallerPrettyfier can be set by the user to modify the content
 | 
			
		||||
	// of the function and file keys in the json data when ReportCaller is
 | 
			
		||||
	// activated. If any of the returned value is the empty string the
 | 
			
		||||
	// corresponding key will be removed from json fields.
 | 
			
		||||
	CallerPrettyfier func(*runtime.Frame) (function string, file string)
 | 
			
		||||
 | 
			
		||||
	// PrettyPrint will indent all json logs
 | 
			
		||||
	PrettyPrint bool
 | 
			
		||||
}
 | 
			
		||||
@@ -82,8 +89,17 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
	data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message
 | 
			
		||||
	data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String()
 | 
			
		||||
	if entry.HasCaller() {
 | 
			
		||||
		data[f.FieldMap.resolve(FieldKeyFunc)] = entry.Caller.Function
 | 
			
		||||
		data[f.FieldMap.resolve(FieldKeyFile)] = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
 | 
			
		||||
		funcVal := entry.Caller.Function
 | 
			
		||||
		fileVal := fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
 | 
			
		||||
		if f.CallerPrettyfier != nil {
 | 
			
		||||
			funcVal, fileVal = f.CallerPrettyfier(entry.Caller)
 | 
			
		||||
		}
 | 
			
		||||
		if funcVal != "" {
 | 
			
		||||
			data[f.FieldMap.resolve(FieldKeyFunc)] = funcVal
 | 
			
		||||
		}
 | 
			
		||||
		if fileVal != "" {
 | 
			
		||||
			data[f.FieldMap.resolve(FieldKeyFile)] = fileVal
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var b *bytes.Buffer
 | 
			
		||||
@@ -98,7 +114,7 @@ func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
		encoder.SetIndent("", "  ")
 | 
			
		||||
	}
 | 
			
		||||
	if err := encoder.Encode(data); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
 | 
			
		||||
		return nil, fmt.Errorf("failed to marshal fields to JSON, %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return b.Bytes(), nil
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										162
									
								
								vendor/github.com/sirupsen/logrus/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										162
									
								
								vendor/github.com/sirupsen/logrus/logger.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,7 @@
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"sync"
 | 
			
		||||
@@ -124,6 +125,13 @@ func (logger *Logger) WithError(err error) *Entry {
 | 
			
		||||
	return entry.WithError(err)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Add a context to the log entry.
 | 
			
		||||
func (logger *Logger) WithContext(ctx context.Context) *Entry {
 | 
			
		||||
	entry := logger.newEntry()
 | 
			
		||||
	defer logger.releaseEntry(entry)
 | 
			
		||||
	return entry.WithContext(ctx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Overrides the time of the log entry.
 | 
			
		||||
func (logger *Logger) WithTime(t time.Time) *Entry {
 | 
			
		||||
	entry := logger.newEntry()
 | 
			
		||||
@@ -131,28 +139,24 @@ func (logger *Logger) WithTime(t time.Time) *Entry {
 | 
			
		||||
	return entry.WithTime(t)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Tracef(format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(TraceLevel) {
 | 
			
		||||
func (logger *Logger) Logf(level Level, format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Tracef(format, args...)
 | 
			
		||||
		entry.Logf(level, format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Tracef(format string, args ...interface{}) {
 | 
			
		||||
	logger.Logf(TraceLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Debugf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(DebugLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Debugf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logf(DebugLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Infof(format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(InfoLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Infof(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logf(InfoLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Printf(format string, args ...interface{}) {
 | 
			
		||||
@@ -162,139 +166,91 @@ func (logger *Logger) Printf(format string, args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warnf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warnf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logf(WarnLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warningf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warnf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Warnf(format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Errorf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(ErrorLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Errorf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logf(ErrorLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Fatalf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(FatalLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Fatalf(format, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logf(FatalLevel, format, args...)
 | 
			
		||||
	logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Panicf(format string, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(PanicLevel) {
 | 
			
		||||
	logger.Logf(PanicLevel, format, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Log(level Level, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Panicf(format, args...)
 | 
			
		||||
		entry.Log(level, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Trace(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(TraceLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Trace(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(TraceLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Debug(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(DebugLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Debug(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(DebugLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Info(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(InfoLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Info(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(InfoLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Print(args ...interface{}) {
 | 
			
		||||
	entry := logger.newEntry()
 | 
			
		||||
	entry.Info(args...)
 | 
			
		||||
	entry.Print(args...)
 | 
			
		||||
	logger.releaseEntry(entry)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warn(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warn(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(WarnLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warning(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warn(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Warn(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Error(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(ErrorLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Error(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(ErrorLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Fatal(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(FatalLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Fatal(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Log(FatalLevel, args...)
 | 
			
		||||
	logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Panic(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(PanicLevel) {
 | 
			
		||||
	logger.Log(PanicLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Logln(level Level, args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(level) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Panic(args...)
 | 
			
		||||
		entry.Logln(level, args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Traceln(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(TraceLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Traceln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(TraceLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Debugln(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(DebugLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Debugln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(DebugLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Infoln(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(InfoLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Infoln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(InfoLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Println(args ...interface{}) {
 | 
			
		||||
@@ -304,44 +260,24 @@ func (logger *Logger) Println(args ...interface{}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warnln(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warnln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(WarnLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Warningln(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(WarnLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Warnln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Warnln(args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Errorln(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(ErrorLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Errorln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(ErrorLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Fatalln(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(FatalLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Fatalln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(FatalLevel, args...)
 | 
			
		||||
	logger.Exit(1)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Panicln(args ...interface{}) {
 | 
			
		||||
	if logger.IsLevelEnabled(PanicLevel) {
 | 
			
		||||
		entry := logger.newEntry()
 | 
			
		||||
		entry.Panicln(args...)
 | 
			
		||||
		logger.releaseEntry(entry)
 | 
			
		||||
	}
 | 
			
		||||
	logger.Logln(PanicLevel, args...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (logger *Logger) Exit(code int) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										42
									
								
								vendor/github.com/sirupsen/logrus/logrus.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/sirupsen/logrus/logrus.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -14,24 +14,11 @@ type Level uint32
 | 
			
		||||
 | 
			
		||||
// Convert the Level to a string. E.g. PanicLevel becomes "panic".
 | 
			
		||||
func (level Level) String() string {
 | 
			
		||||
	switch level {
 | 
			
		||||
	case TraceLevel:
 | 
			
		||||
		return "trace"
 | 
			
		||||
	case DebugLevel:
 | 
			
		||||
		return "debug"
 | 
			
		||||
	case InfoLevel:
 | 
			
		||||
		return "info"
 | 
			
		||||
	case WarnLevel:
 | 
			
		||||
		return "warning"
 | 
			
		||||
	case ErrorLevel:
 | 
			
		||||
		return "error"
 | 
			
		||||
	case FatalLevel:
 | 
			
		||||
		return "fatal"
 | 
			
		||||
	case PanicLevel:
 | 
			
		||||
		return "panic"
 | 
			
		||||
	if b, err := level.MarshalText(); err == nil {
 | 
			
		||||
		return string(b)
 | 
			
		||||
	} else {
 | 
			
		||||
		return "unknown"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return "unknown"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseLevel takes a string level and returns the Logrus log level constant.
 | 
			
		||||
@@ -69,6 +56,27 @@ func (level *Level) UnmarshalText(text []byte) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (level Level) MarshalText() ([]byte, error) {
 | 
			
		||||
	switch level {
 | 
			
		||||
	case TraceLevel:
 | 
			
		||||
		return []byte("trace"), nil
 | 
			
		||||
	case DebugLevel:
 | 
			
		||||
		return []byte("debug"), nil
 | 
			
		||||
	case InfoLevel:
 | 
			
		||||
		return []byte("info"), nil
 | 
			
		||||
	case WarnLevel:
 | 
			
		||||
		return []byte("warning"), nil
 | 
			
		||||
	case ErrorLevel:
 | 
			
		||||
		return []byte("error"), nil
 | 
			
		||||
	case FatalLevel:
 | 
			
		||||
		return []byte("fatal"), nil
 | 
			
		||||
	case PanicLevel:
 | 
			
		||||
		return []byte("panic"), nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil, fmt.Errorf("not a valid logrus level %d", level)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A constant exposing all logging levels
 | 
			
		||||
var AllLevels = []Level{
 | 
			
		||||
	PanicLevel,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
// +build darwin dragonfly freebsd netbsd openbsd
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/sys/unix"
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = unix.TIOCGETA
 | 
			
		||||
 | 
			
		||||
func isTerminal(fd int) bool {
 | 
			
		||||
	_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
// +build js
 | 
			
		||||
// +build js nacl plan9
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,18 +1,16 @@
 | 
			
		||||
// +build !appengine,!js,!windows
 | 
			
		||||
// +build !appengine,!js,!windows,!nacl,!plan9
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/crypto/ssh/terminal"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func checkIfTerminal(w io.Writer) bool {
 | 
			
		||||
	switch v := w.(type) {
 | 
			
		||||
	case *os.File:
 | 
			
		||||
		return terminal.IsTerminal(int(v.Fd()))
 | 
			
		||||
		return isTerminal(int(v.Fd()))
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"golang.org/x/sys/unix"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// IsTerminal returns true if the given file descriptor is a terminal.
 | 
			
		||||
func isTerminal(fd int) bool {
 | 
			
		||||
	_, err := unix.IoctlGetTermio(fd, unix.TCGETA)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_unix.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
// +build linux aix
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/sys/unix"
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = unix.TCGETS
 | 
			
		||||
 | 
			
		||||
func isTerminal(fd int) bool {
 | 
			
		||||
	_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/sirupsen/logrus/terminal_check_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -6,15 +6,29 @@ import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"syscall"
 | 
			
		||||
 | 
			
		||||
	sequences "github.com/konsorten/go-windows-terminal-sequences"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func initTerminal(w io.Writer) {
 | 
			
		||||
	switch v := w.(type) {
 | 
			
		||||
	case *os.File:
 | 
			
		||||
		sequences.EnableVirtualTerminalProcessing(syscall.Handle(v.Fd()), true)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkIfTerminal(w io.Writer) bool {
 | 
			
		||||
	var ret bool
 | 
			
		||||
	switch v := w.(type) {
 | 
			
		||||
	case *os.File:
 | 
			
		||||
		var mode uint32
 | 
			
		||||
		err := syscall.GetConsoleMode(syscall.Handle(v.Fd()), &mode)
 | 
			
		||||
		return err == nil
 | 
			
		||||
		ret = (err == nil)
 | 
			
		||||
	default:
 | 
			
		||||
		return false
 | 
			
		||||
		ret = false
 | 
			
		||||
	}
 | 
			
		||||
	if ret {
 | 
			
		||||
		initTerminal(w)
 | 
			
		||||
	}
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/github.com/sirupsen/logrus/terminal_notwindows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/sirupsen/logrus/terminal_notwindows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +0,0 @@
 | 
			
		||||
// +build !windows
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import "io"
 | 
			
		||||
 | 
			
		||||
func initTerminal(w io.Writer) {
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								vendor/github.com/sirupsen/logrus/terminal_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								vendor/github.com/sirupsen/logrus/terminal_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,18 +0,0 @@
 | 
			
		||||
// +build !appengine,!js,windows
 | 
			
		||||
 | 
			
		||||
package logrus
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"syscall"
 | 
			
		||||
 | 
			
		||||
	sequences "github.com/konsorten/go-windows-terminal-sequences"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func initTerminal(w io.Writer) {
 | 
			
		||||
	switch v := w.(type) {
 | 
			
		||||
	case *os.File:
 | 
			
		||||
		sequences.EnableVirtualTerminalProcessing(syscall.Handle(v.Fd()), true)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										88
									
								
								vendor/github.com/sirupsen/logrus/text_formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										88
									
								
								vendor/github.com/sirupsen/logrus/text_formatter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
@@ -11,18 +12,13 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	nocolor = 0
 | 
			
		||||
	red     = 31
 | 
			
		||||
	green   = 32
 | 
			
		||||
	yellow  = 33
 | 
			
		||||
	blue    = 36
 | 
			
		||||
	gray    = 37
 | 
			
		||||
	red    = 31
 | 
			
		||||
	yellow = 33
 | 
			
		||||
	blue   = 36
 | 
			
		||||
	gray   = 37
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	baseTimestamp time.Time
 | 
			
		||||
	emptyFieldMap FieldMap
 | 
			
		||||
)
 | 
			
		||||
var baseTimestamp time.Time
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	baseTimestamp = time.Now()
 | 
			
		||||
@@ -76,21 +72,23 @@ type TextFormatter struct {
 | 
			
		||||
	//         FieldKeyMsg:   "@message"}}
 | 
			
		||||
	FieldMap FieldMap
 | 
			
		||||
 | 
			
		||||
	// CallerPrettyfier can be set by the user to modify the content
 | 
			
		||||
	// of the function and file keys in the data when ReportCaller is
 | 
			
		||||
	// activated. If any of the returned value is the empty string the
 | 
			
		||||
	// corresponding key will be removed from fields.
 | 
			
		||||
	CallerPrettyfier func(*runtime.Frame) (function string, file string)
 | 
			
		||||
 | 
			
		||||
	terminalInitOnce sync.Once
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *TextFormatter) init(entry *Entry) {
 | 
			
		||||
	if entry.Logger != nil {
 | 
			
		||||
		f.isTerminal = checkIfTerminal(entry.Logger.Out)
 | 
			
		||||
 | 
			
		||||
		if f.isTerminal {
 | 
			
		||||
			initTerminal(entry.Logger.Out)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *TextFormatter) isColored() bool {
 | 
			
		||||
	isColored := f.ForceColors || f.isTerminal
 | 
			
		||||
	isColored := f.ForceColors || (f.isTerminal && (runtime.GOOS != "windows"))
 | 
			
		||||
 | 
			
		||||
	if f.EnvironmentOverrideColors {
 | 
			
		||||
		if force, ok := os.LookupEnv("CLICOLOR_FORCE"); ok && force != "0" {
 | 
			
		||||
@@ -107,14 +105,19 @@ func (f *TextFormatter) isColored() bool {
 | 
			
		||||
 | 
			
		||||
// Format renders a single log entry
 | 
			
		||||
func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
	prefixFieldClashes(entry.Data, f.FieldMap, entry.HasCaller())
 | 
			
		||||
 | 
			
		||||
	keys := make([]string, 0, len(entry.Data))
 | 
			
		||||
	for k := range entry.Data {
 | 
			
		||||
	data := make(Fields)
 | 
			
		||||
	for k, v := range entry.Data {
 | 
			
		||||
		data[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	prefixFieldClashes(data, f.FieldMap, entry.HasCaller())
 | 
			
		||||
	keys := make([]string, 0, len(data))
 | 
			
		||||
	for k := range data {
 | 
			
		||||
		keys = append(keys, k)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fixedKeys := make([]string, 0, 4+len(entry.Data))
 | 
			
		||||
	var funcVal, fileVal string
 | 
			
		||||
 | 
			
		||||
	fixedKeys := make([]string, 0, 4+len(data))
 | 
			
		||||
	if !f.DisableTimestamp {
 | 
			
		||||
		fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime))
 | 
			
		||||
	}
 | 
			
		||||
@@ -126,8 +129,19 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
		fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLogrusError))
 | 
			
		||||
	}
 | 
			
		||||
	if entry.HasCaller() {
 | 
			
		||||
		fixedKeys = append(fixedKeys,
 | 
			
		||||
			f.FieldMap.resolve(FieldKeyFunc), f.FieldMap.resolve(FieldKeyFile))
 | 
			
		||||
		if f.CallerPrettyfier != nil {
 | 
			
		||||
			funcVal, fileVal = f.CallerPrettyfier(entry.Caller)
 | 
			
		||||
		} else {
 | 
			
		||||
			funcVal = entry.Caller.Function
 | 
			
		||||
			fileVal = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if funcVal != "" {
 | 
			
		||||
			fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyFunc))
 | 
			
		||||
		}
 | 
			
		||||
		if fileVal != "" {
 | 
			
		||||
			fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyFile))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !f.DisableSorting {
 | 
			
		||||
@@ -160,8 +174,9 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
		timestampFormat = defaultTimestampFormat
 | 
			
		||||
	}
 | 
			
		||||
	if f.isColored() {
 | 
			
		||||
		f.printColored(b, entry, keys, timestampFormat)
 | 
			
		||||
		f.printColored(b, entry, keys, data, timestampFormat)
 | 
			
		||||
	} else {
 | 
			
		||||
 | 
			
		||||
		for _, key := range fixedKeys {
 | 
			
		||||
			var value interface{}
 | 
			
		||||
			switch {
 | 
			
		||||
@@ -174,11 +189,11 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyLogrusError):
 | 
			
		||||
				value = entry.err
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyFunc) && entry.HasCaller():
 | 
			
		||||
				value = entry.Caller.Function
 | 
			
		||||
				value = funcVal
 | 
			
		||||
			case key == f.FieldMap.resolve(FieldKeyFile) && entry.HasCaller():
 | 
			
		||||
				value = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
 | 
			
		||||
				value = fileVal
 | 
			
		||||
			default:
 | 
			
		||||
				value = entry.Data[key]
 | 
			
		||||
				value = data[key]
 | 
			
		||||
			}
 | 
			
		||||
			f.appendKeyValue(b, key, value)
 | 
			
		||||
		}
 | 
			
		||||
@@ -188,7 +203,7 @@ func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
 | 
			
		||||
	return b.Bytes(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) {
 | 
			
		||||
func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, data Fields, timestampFormat string) {
 | 
			
		||||
	var levelColor int
 | 
			
		||||
	switch entry.Level {
 | 
			
		||||
	case DebugLevel, TraceLevel:
 | 
			
		||||
@@ -211,10 +226,21 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []strin
 | 
			
		||||
	entry.Message = strings.TrimSuffix(entry.Message, "\n")
 | 
			
		||||
 | 
			
		||||
	caller := ""
 | 
			
		||||
 | 
			
		||||
	if entry.HasCaller() {
 | 
			
		||||
		caller = fmt.Sprintf("%s:%d %s()",
 | 
			
		||||
			entry.Caller.File, entry.Caller.Line, entry.Caller.Function)
 | 
			
		||||
		funcVal := fmt.Sprintf("%s()", entry.Caller.Function)
 | 
			
		||||
		fileVal := fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line)
 | 
			
		||||
 | 
			
		||||
		if f.CallerPrettyfier != nil {
 | 
			
		||||
			funcVal, fileVal = f.CallerPrettyfier(entry.Caller)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if fileVal == "" {
 | 
			
		||||
			caller = funcVal
 | 
			
		||||
		} else if funcVal == "" {
 | 
			
		||||
			caller = fileVal
 | 
			
		||||
		} else {
 | 
			
		||||
			caller = fileVal + " " + funcVal
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if f.DisableTimestamp {
 | 
			
		||||
@@ -225,7 +251,7 @@ func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []strin
 | 
			
		||||
		fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s]%s %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), caller, entry.Message)
 | 
			
		||||
	}
 | 
			
		||||
	for _, k := range keys {
 | 
			
		||||
		v := entry.Data[k]
 | 
			
		||||
		v := data[k]
 | 
			
		||||
		fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k)
 | 
			
		||||
		f.appendValue(b, v)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/crypto/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/crypto/AUTHORS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
			
		||||
# This source code refers to The Go Authors for copyright purposes.
 | 
			
		||||
# The master list of authors is in the main Go distribution,
 | 
			
		||||
# visible at https://tip.golang.org/AUTHORS.
 | 
			
		||||
							
								
								
									
										3
									
								
								vendor/golang.org/x/crypto/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								vendor/golang.org/x/crypto/CONTRIBUTORS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,3 +0,0 @@
 | 
			
		||||
# This source code was written by the Go contributors.
 | 
			
		||||
# The master list of contributors is in the main Go distribution,
 | 
			
		||||
# visible at https://tip.golang.org/CONTRIBUTORS.
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/crypto/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/crypto/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,27 +0,0 @@
 | 
			
		||||
Copyright (c) 2009 The Go Authors. All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are
 | 
			
		||||
met:
 | 
			
		||||
 | 
			
		||||
   * Redistributions of source code must retain the above copyright
 | 
			
		||||
notice, this list of conditions and the following disclaimer.
 | 
			
		||||
   * Redistributions in binary form must reproduce the above
 | 
			
		||||
copyright notice, this list of conditions and the following disclaimer
 | 
			
		||||
in the documentation and/or other materials provided with the
 | 
			
		||||
distribution.
 | 
			
		||||
   * Neither the name of Google Inc. nor the names of its
 | 
			
		||||
contributors may be used to endorse or promote products derived from
 | 
			
		||||
this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/crypto/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/crypto/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,22 +0,0 @@
 | 
			
		||||
Additional IP Rights Grant (Patents)
 | 
			
		||||
 | 
			
		||||
"This implementation" means the copyrightable works distributed by
 | 
			
		||||
Google as part of the Go project.
 | 
			
		||||
 | 
			
		||||
Google hereby grants to You a perpetual, worldwide, non-exclusive,
 | 
			
		||||
no-charge, royalty-free, irrevocable (except as stated in this section)
 | 
			
		||||
patent license to make, have made, use, offer to sell, sell, import,
 | 
			
		||||
transfer and otherwise run, modify and propagate the contents of this
 | 
			
		||||
implementation of Go, where such license applies only to those patent
 | 
			
		||||
claims, both currently owned or controlled by Google and acquired in
 | 
			
		||||
the future, licensable by Google that are necessarily infringed by this
 | 
			
		||||
implementation of Go.  This grant does not include claims that would be
 | 
			
		||||
infringed only as a consequence of further modification of this
 | 
			
		||||
implementation.  If you or your agent or exclusive licensee institute or
 | 
			
		||||
order or agree to the institution of patent litigation against any
 | 
			
		||||
entity (including a cross-claim or counterclaim in a lawsuit) alleging
 | 
			
		||||
that this implementation of Go or any code incorporated within this
 | 
			
		||||
implementation of Go constitutes direct or contributory patent
 | 
			
		||||
infringement, or inducement of patent infringement, then any patent
 | 
			
		||||
rights granted to you under this License for this implementation of Go
 | 
			
		||||
shall terminate as of the date such litigation is filed.
 | 
			
		||||
							
								
								
									
										955
									
								
								vendor/golang.org/x/crypto/ssh/terminal/terminal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										955
									
								
								vendor/golang.org/x/crypto/ssh/terminal/terminal.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,955 +0,0 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package terminal
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"io"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// EscapeCodes contains escape sequences that can be written to the terminal in
 | 
			
		||||
// order to achieve different styles of text.
 | 
			
		||||
type EscapeCodes struct {
 | 
			
		||||
	// Foreground colors
 | 
			
		||||
	Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte
 | 
			
		||||
 | 
			
		||||
	// Reset all attributes
 | 
			
		||||
	Reset []byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var vt100EscapeCodes = EscapeCodes{
 | 
			
		||||
	Black:   []byte{keyEscape, '[', '3', '0', 'm'},
 | 
			
		||||
	Red:     []byte{keyEscape, '[', '3', '1', 'm'},
 | 
			
		||||
	Green:   []byte{keyEscape, '[', '3', '2', 'm'},
 | 
			
		||||
	Yellow:  []byte{keyEscape, '[', '3', '3', 'm'},
 | 
			
		||||
	Blue:    []byte{keyEscape, '[', '3', '4', 'm'},
 | 
			
		||||
	Magenta: []byte{keyEscape, '[', '3', '5', 'm'},
 | 
			
		||||
	Cyan:    []byte{keyEscape, '[', '3', '6', 'm'},
 | 
			
		||||
	White:   []byte{keyEscape, '[', '3', '7', 'm'},
 | 
			
		||||
 | 
			
		||||
	Reset: []byte{keyEscape, '[', '0', 'm'},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Terminal contains the state for running a VT100 terminal that is capable of
 | 
			
		||||
// reading lines of input.
 | 
			
		||||
type Terminal struct {
 | 
			
		||||
	// AutoCompleteCallback, if non-null, is called for each keypress with
 | 
			
		||||
	// the full input line and the current position of the cursor (in
 | 
			
		||||
	// bytes, as an index into |line|). If it returns ok=false, the key
 | 
			
		||||
	// press is processed normally. Otherwise it returns a replacement line
 | 
			
		||||
	// and the new cursor position.
 | 
			
		||||
	AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool)
 | 
			
		||||
 | 
			
		||||
	// Escape contains a pointer to the escape codes for this terminal.
 | 
			
		||||
	// It's always a valid pointer, although the escape codes themselves
 | 
			
		||||
	// may be empty if the terminal doesn't support them.
 | 
			
		||||
	Escape *EscapeCodes
 | 
			
		||||
 | 
			
		||||
	// lock protects the terminal and the state in this object from
 | 
			
		||||
	// concurrent processing of a key press and a Write() call.
 | 
			
		||||
	lock sync.Mutex
 | 
			
		||||
 | 
			
		||||
	c      io.ReadWriter
 | 
			
		||||
	prompt []rune
 | 
			
		||||
 | 
			
		||||
	// line is the current line being entered.
 | 
			
		||||
	line []rune
 | 
			
		||||
	// pos is the logical position of the cursor in line
 | 
			
		||||
	pos int
 | 
			
		||||
	// echo is true if local echo is enabled
 | 
			
		||||
	echo bool
 | 
			
		||||
	// pasteActive is true iff there is a bracketed paste operation in
 | 
			
		||||
	// progress.
 | 
			
		||||
	pasteActive bool
 | 
			
		||||
 | 
			
		||||
	// cursorX contains the current X value of the cursor where the left
 | 
			
		||||
	// edge is 0. cursorY contains the row number where the first row of
 | 
			
		||||
	// the current line is 0.
 | 
			
		||||
	cursorX, cursorY int
 | 
			
		||||
	// maxLine is the greatest value of cursorY so far.
 | 
			
		||||
	maxLine int
 | 
			
		||||
 | 
			
		||||
	termWidth, termHeight int
 | 
			
		||||
 | 
			
		||||
	// outBuf contains the terminal data to be sent.
 | 
			
		||||
	outBuf []byte
 | 
			
		||||
	// remainder contains the remainder of any partial key sequences after
 | 
			
		||||
	// a read. It aliases into inBuf.
 | 
			
		||||
	remainder []byte
 | 
			
		||||
	inBuf     [256]byte
 | 
			
		||||
 | 
			
		||||
	// history contains previously entered commands so that they can be
 | 
			
		||||
	// accessed with the up and down keys.
 | 
			
		||||
	history stRingBuffer
 | 
			
		||||
	// historyIndex stores the currently accessed history entry, where zero
 | 
			
		||||
	// means the immediately previous entry.
 | 
			
		||||
	historyIndex int
 | 
			
		||||
	// When navigating up and down the history it's possible to return to
 | 
			
		||||
	// the incomplete, initial line. That value is stored in
 | 
			
		||||
	// historyPending.
 | 
			
		||||
	historyPending string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is
 | 
			
		||||
// a local terminal, that terminal must first have been put into raw mode.
 | 
			
		||||
// prompt is a string that is written at the start of each input line (i.e.
 | 
			
		||||
// "> ").
 | 
			
		||||
func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
 | 
			
		||||
	return &Terminal{
 | 
			
		||||
		Escape:       &vt100EscapeCodes,
 | 
			
		||||
		c:            c,
 | 
			
		||||
		prompt:       []rune(prompt),
 | 
			
		||||
		termWidth:    80,
 | 
			
		||||
		termHeight:   24,
 | 
			
		||||
		echo:         true,
 | 
			
		||||
		historyIndex: -1,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	keyCtrlD     = 4
 | 
			
		||||
	keyCtrlU     = 21
 | 
			
		||||
	keyEnter     = '\r'
 | 
			
		||||
	keyEscape    = 27
 | 
			
		||||
	keyBackspace = 127
 | 
			
		||||
	keyUnknown   = 0xd800 /* UTF-16 surrogate area */ + iota
 | 
			
		||||
	keyUp
 | 
			
		||||
	keyDown
 | 
			
		||||
	keyLeft
 | 
			
		||||
	keyRight
 | 
			
		||||
	keyAltLeft
 | 
			
		||||
	keyAltRight
 | 
			
		||||
	keyHome
 | 
			
		||||
	keyEnd
 | 
			
		||||
	keyDeleteWord
 | 
			
		||||
	keyDeleteLine
 | 
			
		||||
	keyClearScreen
 | 
			
		||||
	keyPasteStart
 | 
			
		||||
	keyPasteEnd
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	crlf       = []byte{'\r', '\n'}
 | 
			
		||||
	pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
 | 
			
		||||
	pasteEnd   = []byte{keyEscape, '[', '2', '0', '1', '~'}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// bytesToKey tries to parse a key sequence from b. If successful, it returns
 | 
			
		||||
// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
 | 
			
		||||
func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
 | 
			
		||||
	if len(b) == 0 {
 | 
			
		||||
		return utf8.RuneError, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !pasteActive {
 | 
			
		||||
		switch b[0] {
 | 
			
		||||
		case 1: // ^A
 | 
			
		||||
			return keyHome, b[1:]
 | 
			
		||||
		case 5: // ^E
 | 
			
		||||
			return keyEnd, b[1:]
 | 
			
		||||
		case 8: // ^H
 | 
			
		||||
			return keyBackspace, b[1:]
 | 
			
		||||
		case 11: // ^K
 | 
			
		||||
			return keyDeleteLine, b[1:]
 | 
			
		||||
		case 12: // ^L
 | 
			
		||||
			return keyClearScreen, b[1:]
 | 
			
		||||
		case 23: // ^W
 | 
			
		||||
			return keyDeleteWord, b[1:]
 | 
			
		||||
		case 14: // ^N
 | 
			
		||||
			return keyDown, b[1:]
 | 
			
		||||
		case 16: // ^P
 | 
			
		||||
			return keyUp, b[1:]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if b[0] != keyEscape {
 | 
			
		||||
		if !utf8.FullRune(b) {
 | 
			
		||||
			return utf8.RuneError, b
 | 
			
		||||
		}
 | 
			
		||||
		r, l := utf8.DecodeRune(b)
 | 
			
		||||
		return r, b[l:]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
 | 
			
		||||
		switch b[2] {
 | 
			
		||||
		case 'A':
 | 
			
		||||
			return keyUp, b[3:]
 | 
			
		||||
		case 'B':
 | 
			
		||||
			return keyDown, b[3:]
 | 
			
		||||
		case 'C':
 | 
			
		||||
			return keyRight, b[3:]
 | 
			
		||||
		case 'D':
 | 
			
		||||
			return keyLeft, b[3:]
 | 
			
		||||
		case 'H':
 | 
			
		||||
			return keyHome, b[3:]
 | 
			
		||||
		case 'F':
 | 
			
		||||
			return keyEnd, b[3:]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {
 | 
			
		||||
		switch b[5] {
 | 
			
		||||
		case 'C':
 | 
			
		||||
			return keyAltRight, b[6:]
 | 
			
		||||
		case 'D':
 | 
			
		||||
			return keyAltLeft, b[6:]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {
 | 
			
		||||
		return keyPasteStart, b[6:]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) {
 | 
			
		||||
		return keyPasteEnd, b[6:]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If we get here then we have a key that we don't recognise, or a
 | 
			
		||||
	// partial sequence. It's not clear how one should find the end of a
 | 
			
		||||
	// sequence without knowing them all, but it seems that [a-zA-Z~] only
 | 
			
		||||
	// appears at the end of a sequence.
 | 
			
		||||
	for i, c := range b[0:] {
 | 
			
		||||
		if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' {
 | 
			
		||||
			return keyUnknown, b[i+1:]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return utf8.RuneError, b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// queue appends data to the end of t.outBuf
 | 
			
		||||
func (t *Terminal) queue(data []rune) {
 | 
			
		||||
	t.outBuf = append(t.outBuf, []byte(string(data))...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'}
 | 
			
		||||
var space = []rune{' '}
 | 
			
		||||
 | 
			
		||||
func isPrintable(key rune) bool {
 | 
			
		||||
	isInSurrogateArea := key >= 0xd800 && key <= 0xdbff
 | 
			
		||||
	return key >= 32 && !isInSurrogateArea
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// moveCursorToPos appends data to t.outBuf which will move the cursor to the
 | 
			
		||||
// given, logical position in the text.
 | 
			
		||||
func (t *Terminal) moveCursorToPos(pos int) {
 | 
			
		||||
	if !t.echo {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	x := visualLength(t.prompt) + pos
 | 
			
		||||
	y := x / t.termWidth
 | 
			
		||||
	x = x % t.termWidth
 | 
			
		||||
 | 
			
		||||
	up := 0
 | 
			
		||||
	if y < t.cursorY {
 | 
			
		||||
		up = t.cursorY - y
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	down := 0
 | 
			
		||||
	if y > t.cursorY {
 | 
			
		||||
		down = y - t.cursorY
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	left := 0
 | 
			
		||||
	if x < t.cursorX {
 | 
			
		||||
		left = t.cursorX - x
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	right := 0
 | 
			
		||||
	if x > t.cursorX {
 | 
			
		||||
		right = x - t.cursorX
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t.cursorX = x
 | 
			
		||||
	t.cursorY = y
 | 
			
		||||
	t.move(up, down, left, right)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) move(up, down, left, right int) {
 | 
			
		||||
	movement := make([]rune, 3*(up+down+left+right))
 | 
			
		||||
	m := movement
 | 
			
		||||
	for i := 0; i < up; i++ {
 | 
			
		||||
		m[0] = keyEscape
 | 
			
		||||
		m[1] = '['
 | 
			
		||||
		m[2] = 'A'
 | 
			
		||||
		m = m[3:]
 | 
			
		||||
	}
 | 
			
		||||
	for i := 0; i < down; i++ {
 | 
			
		||||
		m[0] = keyEscape
 | 
			
		||||
		m[1] = '['
 | 
			
		||||
		m[2] = 'B'
 | 
			
		||||
		m = m[3:]
 | 
			
		||||
	}
 | 
			
		||||
	for i := 0; i < left; i++ {
 | 
			
		||||
		m[0] = keyEscape
 | 
			
		||||
		m[1] = '['
 | 
			
		||||
		m[2] = 'D'
 | 
			
		||||
		m = m[3:]
 | 
			
		||||
	}
 | 
			
		||||
	for i := 0; i < right; i++ {
 | 
			
		||||
		m[0] = keyEscape
 | 
			
		||||
		m[1] = '['
 | 
			
		||||
		m[2] = 'C'
 | 
			
		||||
		m = m[3:]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t.queue(movement)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) clearLineToRight() {
 | 
			
		||||
	op := []rune{keyEscape, '[', 'K'}
 | 
			
		||||
	t.queue(op)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const maxLineLength = 4096
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) setLine(newLine []rune, newPos int) {
 | 
			
		||||
	if t.echo {
 | 
			
		||||
		t.moveCursorToPos(0)
 | 
			
		||||
		t.writeLine(newLine)
 | 
			
		||||
		for i := len(newLine); i < len(t.line); i++ {
 | 
			
		||||
			t.writeLine(space)
 | 
			
		||||
		}
 | 
			
		||||
		t.moveCursorToPos(newPos)
 | 
			
		||||
	}
 | 
			
		||||
	t.line = newLine
 | 
			
		||||
	t.pos = newPos
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) advanceCursor(places int) {
 | 
			
		||||
	t.cursorX += places
 | 
			
		||||
	t.cursorY += t.cursorX / t.termWidth
 | 
			
		||||
	if t.cursorY > t.maxLine {
 | 
			
		||||
		t.maxLine = t.cursorY
 | 
			
		||||
	}
 | 
			
		||||
	t.cursorX = t.cursorX % t.termWidth
 | 
			
		||||
 | 
			
		||||
	if places > 0 && t.cursorX == 0 {
 | 
			
		||||
		// Normally terminals will advance the current position
 | 
			
		||||
		// when writing a character. But that doesn't happen
 | 
			
		||||
		// for the last character in a line. However, when
 | 
			
		||||
		// writing a character (except a new line) that causes
 | 
			
		||||
		// a line wrap, the position will be advanced two
 | 
			
		||||
		// places.
 | 
			
		||||
		//
 | 
			
		||||
		// So, if we are stopping at the end of a line, we
 | 
			
		||||
		// need to write a newline so that our cursor can be
 | 
			
		||||
		// advanced to the next line.
 | 
			
		||||
		t.outBuf = append(t.outBuf, '\r', '\n')
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) eraseNPreviousChars(n int) {
 | 
			
		||||
	if n == 0 {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if t.pos < n {
 | 
			
		||||
		n = t.pos
 | 
			
		||||
	}
 | 
			
		||||
	t.pos -= n
 | 
			
		||||
	t.moveCursorToPos(t.pos)
 | 
			
		||||
 | 
			
		||||
	copy(t.line[t.pos:], t.line[n+t.pos:])
 | 
			
		||||
	t.line = t.line[:len(t.line)-n]
 | 
			
		||||
	if t.echo {
 | 
			
		||||
		t.writeLine(t.line[t.pos:])
 | 
			
		||||
		for i := 0; i < n; i++ {
 | 
			
		||||
			t.queue(space)
 | 
			
		||||
		}
 | 
			
		||||
		t.advanceCursor(n)
 | 
			
		||||
		t.moveCursorToPos(t.pos)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// countToLeftWord returns then number of characters from the cursor to the
 | 
			
		||||
// start of the previous word.
 | 
			
		||||
func (t *Terminal) countToLeftWord() int {
 | 
			
		||||
	if t.pos == 0 {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pos := t.pos - 1
 | 
			
		||||
	for pos > 0 {
 | 
			
		||||
		if t.line[pos] != ' ' {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		pos--
 | 
			
		||||
	}
 | 
			
		||||
	for pos > 0 {
 | 
			
		||||
		if t.line[pos] == ' ' {
 | 
			
		||||
			pos++
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		pos--
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return t.pos - pos
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// countToRightWord returns then number of characters from the cursor to the
 | 
			
		||||
// start of the next word.
 | 
			
		||||
func (t *Terminal) countToRightWord() int {
 | 
			
		||||
	pos := t.pos
 | 
			
		||||
	for pos < len(t.line) {
 | 
			
		||||
		if t.line[pos] == ' ' {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		pos++
 | 
			
		||||
	}
 | 
			
		||||
	for pos < len(t.line) {
 | 
			
		||||
		if t.line[pos] != ' ' {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		pos++
 | 
			
		||||
	}
 | 
			
		||||
	return pos - t.pos
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// visualLength returns the number of visible glyphs in s.
 | 
			
		||||
func visualLength(runes []rune) int {
 | 
			
		||||
	inEscapeSeq := false
 | 
			
		||||
	length := 0
 | 
			
		||||
 | 
			
		||||
	for _, r := range runes {
 | 
			
		||||
		switch {
 | 
			
		||||
		case inEscapeSeq:
 | 
			
		||||
			if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {
 | 
			
		||||
				inEscapeSeq = false
 | 
			
		||||
			}
 | 
			
		||||
		case r == '\x1b':
 | 
			
		||||
			inEscapeSeq = true
 | 
			
		||||
		default:
 | 
			
		||||
			length++
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return length
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// handleKey processes the given key and, optionally, returns a line of text
 | 
			
		||||
// that the user has entered.
 | 
			
		||||
func (t *Terminal) handleKey(key rune) (line string, ok bool) {
 | 
			
		||||
	if t.pasteActive && key != keyEnter {
 | 
			
		||||
		t.addKeyToLine(key)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	switch key {
 | 
			
		||||
	case keyBackspace:
 | 
			
		||||
		if t.pos == 0 {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		t.eraseNPreviousChars(1)
 | 
			
		||||
	case keyAltLeft:
 | 
			
		||||
		// move left by a word.
 | 
			
		||||
		t.pos -= t.countToLeftWord()
 | 
			
		||||
		t.moveCursorToPos(t.pos)
 | 
			
		||||
	case keyAltRight:
 | 
			
		||||
		// move right by a word.
 | 
			
		||||
		t.pos += t.countToRightWord()
 | 
			
		||||
		t.moveCursorToPos(t.pos)
 | 
			
		||||
	case keyLeft:
 | 
			
		||||
		if t.pos == 0 {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		t.pos--
 | 
			
		||||
		t.moveCursorToPos(t.pos)
 | 
			
		||||
	case keyRight:
 | 
			
		||||
		if t.pos == len(t.line) {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		t.pos++
 | 
			
		||||
		t.moveCursorToPos(t.pos)
 | 
			
		||||
	case keyHome:
 | 
			
		||||
		if t.pos == 0 {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		t.pos = 0
 | 
			
		||||
		t.moveCursorToPos(t.pos)
 | 
			
		||||
	case keyEnd:
 | 
			
		||||
		if t.pos == len(t.line) {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		t.pos = len(t.line)
 | 
			
		||||
		t.moveCursorToPos(t.pos)
 | 
			
		||||
	case keyUp:
 | 
			
		||||
		entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1)
 | 
			
		||||
		if !ok {
 | 
			
		||||
			return "", false
 | 
			
		||||
		}
 | 
			
		||||
		if t.historyIndex == -1 {
 | 
			
		||||
			t.historyPending = string(t.line)
 | 
			
		||||
		}
 | 
			
		||||
		t.historyIndex++
 | 
			
		||||
		runes := []rune(entry)
 | 
			
		||||
		t.setLine(runes, len(runes))
 | 
			
		||||
	case keyDown:
 | 
			
		||||
		switch t.historyIndex {
 | 
			
		||||
		case -1:
 | 
			
		||||
			return
 | 
			
		||||
		case 0:
 | 
			
		||||
			runes := []rune(t.historyPending)
 | 
			
		||||
			t.setLine(runes, len(runes))
 | 
			
		||||
			t.historyIndex--
 | 
			
		||||
		default:
 | 
			
		||||
			entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1)
 | 
			
		||||
			if ok {
 | 
			
		||||
				t.historyIndex--
 | 
			
		||||
				runes := []rune(entry)
 | 
			
		||||
				t.setLine(runes, len(runes))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case keyEnter:
 | 
			
		||||
		t.moveCursorToPos(len(t.line))
 | 
			
		||||
		t.queue([]rune("\r\n"))
 | 
			
		||||
		line = string(t.line)
 | 
			
		||||
		ok = true
 | 
			
		||||
		t.line = t.line[:0]
 | 
			
		||||
		t.pos = 0
 | 
			
		||||
		t.cursorX = 0
 | 
			
		||||
		t.cursorY = 0
 | 
			
		||||
		t.maxLine = 0
 | 
			
		||||
	case keyDeleteWord:
 | 
			
		||||
		// Delete zero or more spaces and then one or more characters.
 | 
			
		||||
		t.eraseNPreviousChars(t.countToLeftWord())
 | 
			
		||||
	case keyDeleteLine:
 | 
			
		||||
		// Delete everything from the current cursor position to the
 | 
			
		||||
		// end of line.
 | 
			
		||||
		for i := t.pos; i < len(t.line); i++ {
 | 
			
		||||
			t.queue(space)
 | 
			
		||||
			t.advanceCursor(1)
 | 
			
		||||
		}
 | 
			
		||||
		t.line = t.line[:t.pos]
 | 
			
		||||
		t.moveCursorToPos(t.pos)
 | 
			
		||||
	case keyCtrlD:
 | 
			
		||||
		// Erase the character under the current position.
 | 
			
		||||
		// The EOF case when the line is empty is handled in
 | 
			
		||||
		// readLine().
 | 
			
		||||
		if t.pos < len(t.line) {
 | 
			
		||||
			t.pos++
 | 
			
		||||
			t.eraseNPreviousChars(1)
 | 
			
		||||
		}
 | 
			
		||||
	case keyCtrlU:
 | 
			
		||||
		t.eraseNPreviousChars(t.pos)
 | 
			
		||||
	case keyClearScreen:
 | 
			
		||||
		// Erases the screen and moves the cursor to the home position.
 | 
			
		||||
		t.queue([]rune("\x1b[2J\x1b[H"))
 | 
			
		||||
		t.queue(t.prompt)
 | 
			
		||||
		t.cursorX, t.cursorY = 0, 0
 | 
			
		||||
		t.advanceCursor(visualLength(t.prompt))
 | 
			
		||||
		t.setLine(t.line, t.pos)
 | 
			
		||||
	default:
 | 
			
		||||
		if t.AutoCompleteCallback != nil {
 | 
			
		||||
			prefix := string(t.line[:t.pos])
 | 
			
		||||
			suffix := string(t.line[t.pos:])
 | 
			
		||||
 | 
			
		||||
			t.lock.Unlock()
 | 
			
		||||
			newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key)
 | 
			
		||||
			t.lock.Lock()
 | 
			
		||||
 | 
			
		||||
			if completeOk {
 | 
			
		||||
				t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos]))
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if !isPrintable(key) {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if len(t.line) == maxLineLength {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		t.addKeyToLine(key)
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// addKeyToLine inserts the given key at the current position in the current
 | 
			
		||||
// line.
 | 
			
		||||
func (t *Terminal) addKeyToLine(key rune) {
 | 
			
		||||
	if len(t.line) == cap(t.line) {
 | 
			
		||||
		newLine := make([]rune, len(t.line), 2*(1+len(t.line)))
 | 
			
		||||
		copy(newLine, t.line)
 | 
			
		||||
		t.line = newLine
 | 
			
		||||
	}
 | 
			
		||||
	t.line = t.line[:len(t.line)+1]
 | 
			
		||||
	copy(t.line[t.pos+1:], t.line[t.pos:])
 | 
			
		||||
	t.line[t.pos] = key
 | 
			
		||||
	if t.echo {
 | 
			
		||||
		t.writeLine(t.line[t.pos:])
 | 
			
		||||
	}
 | 
			
		||||
	t.pos++
 | 
			
		||||
	t.moveCursorToPos(t.pos)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) writeLine(line []rune) {
 | 
			
		||||
	for len(line) != 0 {
 | 
			
		||||
		remainingOnLine := t.termWidth - t.cursorX
 | 
			
		||||
		todo := len(line)
 | 
			
		||||
		if todo > remainingOnLine {
 | 
			
		||||
			todo = remainingOnLine
 | 
			
		||||
		}
 | 
			
		||||
		t.queue(line[:todo])
 | 
			
		||||
		t.advanceCursor(visualLength(line[:todo]))
 | 
			
		||||
		line = line[todo:]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n.
 | 
			
		||||
func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) {
 | 
			
		||||
	for len(buf) > 0 {
 | 
			
		||||
		i := bytes.IndexByte(buf, '\n')
 | 
			
		||||
		todo := len(buf)
 | 
			
		||||
		if i >= 0 {
 | 
			
		||||
			todo = i
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var nn int
 | 
			
		||||
		nn, err = w.Write(buf[:todo])
 | 
			
		||||
		n += nn
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return n, err
 | 
			
		||||
		}
 | 
			
		||||
		buf = buf[todo:]
 | 
			
		||||
 | 
			
		||||
		if i >= 0 {
 | 
			
		||||
			if _, err = w.Write(crlf); err != nil {
 | 
			
		||||
				return n, err
 | 
			
		||||
			}
 | 
			
		||||
			n++
 | 
			
		||||
			buf = buf[1:]
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return n, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) Write(buf []byte) (n int, err error) {
 | 
			
		||||
	t.lock.Lock()
 | 
			
		||||
	defer t.lock.Unlock()
 | 
			
		||||
 | 
			
		||||
	if t.cursorX == 0 && t.cursorY == 0 {
 | 
			
		||||
		// This is the easy case: there's nothing on the screen that we
 | 
			
		||||
		// have to move out of the way.
 | 
			
		||||
		return writeWithCRLF(t.c, buf)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We have a prompt and possibly user input on the screen. We
 | 
			
		||||
	// have to clear it first.
 | 
			
		||||
	t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */)
 | 
			
		||||
	t.cursorX = 0
 | 
			
		||||
	t.clearLineToRight()
 | 
			
		||||
 | 
			
		||||
	for t.cursorY > 0 {
 | 
			
		||||
		t.move(1 /* up */, 0, 0, 0)
 | 
			
		||||
		t.cursorY--
 | 
			
		||||
		t.clearLineToRight()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, err = t.c.Write(t.outBuf); err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	t.outBuf = t.outBuf[:0]
 | 
			
		||||
 | 
			
		||||
	if n, err = writeWithCRLF(t.c, buf); err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t.writeLine(t.prompt)
 | 
			
		||||
	if t.echo {
 | 
			
		||||
		t.writeLine(t.line)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t.moveCursorToPos(t.pos)
 | 
			
		||||
 | 
			
		||||
	if _, err = t.c.Write(t.outBuf); err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	t.outBuf = t.outBuf[:0]
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadPassword temporarily changes the prompt and reads a password, without
 | 
			
		||||
// echo, from the terminal.
 | 
			
		||||
func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
 | 
			
		||||
	t.lock.Lock()
 | 
			
		||||
	defer t.lock.Unlock()
 | 
			
		||||
 | 
			
		||||
	oldPrompt := t.prompt
 | 
			
		||||
	t.prompt = []rune(prompt)
 | 
			
		||||
	t.echo = false
 | 
			
		||||
 | 
			
		||||
	line, err = t.readLine()
 | 
			
		||||
 | 
			
		||||
	t.prompt = oldPrompt
 | 
			
		||||
	t.echo = true
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadLine returns a line of input from the terminal.
 | 
			
		||||
func (t *Terminal) ReadLine() (line string, err error) {
 | 
			
		||||
	t.lock.Lock()
 | 
			
		||||
	defer t.lock.Unlock()
 | 
			
		||||
 | 
			
		||||
	return t.readLine()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) readLine() (line string, err error) {
 | 
			
		||||
	// t.lock must be held at this point
 | 
			
		||||
 | 
			
		||||
	if t.cursorX == 0 && t.cursorY == 0 {
 | 
			
		||||
		t.writeLine(t.prompt)
 | 
			
		||||
		t.c.Write(t.outBuf)
 | 
			
		||||
		t.outBuf = t.outBuf[:0]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	lineIsPasted := t.pasteActive
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		rest := t.remainder
 | 
			
		||||
		lineOk := false
 | 
			
		||||
		for !lineOk {
 | 
			
		||||
			var key rune
 | 
			
		||||
			key, rest = bytesToKey(rest, t.pasteActive)
 | 
			
		||||
			if key == utf8.RuneError {
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			if !t.pasteActive {
 | 
			
		||||
				if key == keyCtrlD {
 | 
			
		||||
					if len(t.line) == 0 {
 | 
			
		||||
						return "", io.EOF
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if key == keyPasteStart {
 | 
			
		||||
					t.pasteActive = true
 | 
			
		||||
					if len(t.line) == 0 {
 | 
			
		||||
						lineIsPasted = true
 | 
			
		||||
					}
 | 
			
		||||
					continue
 | 
			
		||||
				}
 | 
			
		||||
			} else if key == keyPasteEnd {
 | 
			
		||||
				t.pasteActive = false
 | 
			
		||||
				continue
 | 
			
		||||
			}
 | 
			
		||||
			if !t.pasteActive {
 | 
			
		||||
				lineIsPasted = false
 | 
			
		||||
			}
 | 
			
		||||
			line, lineOk = t.handleKey(key)
 | 
			
		||||
		}
 | 
			
		||||
		if len(rest) > 0 {
 | 
			
		||||
			n := copy(t.inBuf[:], rest)
 | 
			
		||||
			t.remainder = t.inBuf[:n]
 | 
			
		||||
		} else {
 | 
			
		||||
			t.remainder = nil
 | 
			
		||||
		}
 | 
			
		||||
		t.c.Write(t.outBuf)
 | 
			
		||||
		t.outBuf = t.outBuf[:0]
 | 
			
		||||
		if lineOk {
 | 
			
		||||
			if t.echo {
 | 
			
		||||
				t.historyIndex = -1
 | 
			
		||||
				t.history.Add(line)
 | 
			
		||||
			}
 | 
			
		||||
			if lineIsPasted {
 | 
			
		||||
				err = ErrPasteIndicator
 | 
			
		||||
			}
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// t.remainder is a slice at the beginning of t.inBuf
 | 
			
		||||
		// containing a partial key sequence
 | 
			
		||||
		readBuf := t.inBuf[len(t.remainder):]
 | 
			
		||||
		var n int
 | 
			
		||||
 | 
			
		||||
		t.lock.Unlock()
 | 
			
		||||
		n, err = t.c.Read(readBuf)
 | 
			
		||||
		t.lock.Lock()
 | 
			
		||||
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		t.remainder = t.inBuf[:n+len(t.remainder)]
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetPrompt sets the prompt to be used when reading subsequent lines.
 | 
			
		||||
func (t *Terminal) SetPrompt(prompt string) {
 | 
			
		||||
	t.lock.Lock()
 | 
			
		||||
	defer t.lock.Unlock()
 | 
			
		||||
 | 
			
		||||
	t.prompt = []rune(prompt)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) {
 | 
			
		||||
	// Move cursor to column zero at the start of the line.
 | 
			
		||||
	t.move(t.cursorY, 0, t.cursorX, 0)
 | 
			
		||||
	t.cursorX, t.cursorY = 0, 0
 | 
			
		||||
	t.clearLineToRight()
 | 
			
		||||
	for t.cursorY < numPrevLines {
 | 
			
		||||
		// Move down a line
 | 
			
		||||
		t.move(0, 1, 0, 0)
 | 
			
		||||
		t.cursorY++
 | 
			
		||||
		t.clearLineToRight()
 | 
			
		||||
	}
 | 
			
		||||
	// Move back to beginning.
 | 
			
		||||
	t.move(t.cursorY, 0, 0, 0)
 | 
			
		||||
	t.cursorX, t.cursorY = 0, 0
 | 
			
		||||
 | 
			
		||||
	t.queue(t.prompt)
 | 
			
		||||
	t.advanceCursor(visualLength(t.prompt))
 | 
			
		||||
	t.writeLine(t.line)
 | 
			
		||||
	t.moveCursorToPos(t.pos)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (t *Terminal) SetSize(width, height int) error {
 | 
			
		||||
	t.lock.Lock()
 | 
			
		||||
	defer t.lock.Unlock()
 | 
			
		||||
 | 
			
		||||
	if width == 0 {
 | 
			
		||||
		width = 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oldWidth := t.termWidth
 | 
			
		||||
	t.termWidth, t.termHeight = width, height
 | 
			
		||||
 | 
			
		||||
	switch {
 | 
			
		||||
	case width == oldWidth:
 | 
			
		||||
		// If the width didn't change then nothing else needs to be
 | 
			
		||||
		// done.
 | 
			
		||||
		return nil
 | 
			
		||||
	case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0:
 | 
			
		||||
		// If there is nothing on current line and no prompt printed,
 | 
			
		||||
		// just do nothing
 | 
			
		||||
		return nil
 | 
			
		||||
	case width < oldWidth:
 | 
			
		||||
		// Some terminals (e.g. xterm) will truncate lines that were
 | 
			
		||||
		// too long when shinking. Others, (e.g. gnome-terminal) will
 | 
			
		||||
		// attempt to wrap them. For the former, repainting t.maxLine
 | 
			
		||||
		// works great, but that behaviour goes badly wrong in the case
 | 
			
		||||
		// of the latter because they have doubled every full line.
 | 
			
		||||
 | 
			
		||||
		// We assume that we are working on a terminal that wraps lines
 | 
			
		||||
		// and adjust the cursor position based on every previous line
 | 
			
		||||
		// wrapping and turning into two. This causes the prompt on
 | 
			
		||||
		// xterms to move upwards, which isn't great, but it avoids a
 | 
			
		||||
		// huge mess with gnome-terminal.
 | 
			
		||||
		if t.cursorX >= t.termWidth {
 | 
			
		||||
			t.cursorX = t.termWidth - 1
 | 
			
		||||
		}
 | 
			
		||||
		t.cursorY *= 2
 | 
			
		||||
		t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2)
 | 
			
		||||
	case width > oldWidth:
 | 
			
		||||
		// If the terminal expands then our position calculations will
 | 
			
		||||
		// be wrong in the future because we think the cursor is
 | 
			
		||||
		// |t.pos| chars into the string, but there will be a gap at
 | 
			
		||||
		// the end of any wrapped line.
 | 
			
		||||
		//
 | 
			
		||||
		// But the position will actually be correct until we move, so
 | 
			
		||||
		// we can move back to the beginning and repaint everything.
 | 
			
		||||
		t.clearAndRepaintLinePlusNPrevious(t.maxLine)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_, err := t.c.Write(t.outBuf)
 | 
			
		||||
	t.outBuf = t.outBuf[:0]
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type pasteIndicatorError struct{}
 | 
			
		||||
 | 
			
		||||
func (pasteIndicatorError) Error() string {
 | 
			
		||||
	return "terminal: ErrPasteIndicator not correctly handled"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ErrPasteIndicator may be returned from ReadLine as the error, in addition
 | 
			
		||||
// to valid line data. It indicates that bracketed paste mode is enabled and
 | 
			
		||||
// that the returned line consists only of pasted data. Programs may wish to
 | 
			
		||||
// interpret pasted data more literally than typed data.
 | 
			
		||||
var ErrPasteIndicator = pasteIndicatorError{}
 | 
			
		||||
 | 
			
		||||
// SetBracketedPasteMode requests that the terminal bracket paste operations
 | 
			
		||||
// with markers. Not all terminals support this but, if it is supported, then
 | 
			
		||||
// enabling this mode will stop any autocomplete callback from running due to
 | 
			
		||||
// pastes. Additionally, any lines that are completely pasted will be returned
 | 
			
		||||
// from ReadLine with the error set to ErrPasteIndicator.
 | 
			
		||||
func (t *Terminal) SetBracketedPasteMode(on bool) {
 | 
			
		||||
	if on {
 | 
			
		||||
		io.WriteString(t.c, "\x1b[?2004h")
 | 
			
		||||
	} else {
 | 
			
		||||
		io.WriteString(t.c, "\x1b[?2004l")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// stRingBuffer is a ring buffer of strings.
 | 
			
		||||
type stRingBuffer struct {
 | 
			
		||||
	// entries contains max elements.
 | 
			
		||||
	entries []string
 | 
			
		||||
	max     int
 | 
			
		||||
	// head contains the index of the element most recently added to the ring.
 | 
			
		||||
	head int
 | 
			
		||||
	// size contains the number of elements in the ring.
 | 
			
		||||
	size int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *stRingBuffer) Add(a string) {
 | 
			
		||||
	if s.entries == nil {
 | 
			
		||||
		const defaultNumEntries = 100
 | 
			
		||||
		s.entries = make([]string, defaultNumEntries)
 | 
			
		||||
		s.max = defaultNumEntries
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s.head = (s.head + 1) % s.max
 | 
			
		||||
	s.entries[s.head] = a
 | 
			
		||||
	if s.size < s.max {
 | 
			
		||||
		s.size++
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NthPreviousEntry returns the value passed to the nth previous call to Add.
 | 
			
		||||
// If n is zero then the immediately prior value is returned, if one, then the
 | 
			
		||||
// next most recent, and so on. If such an element doesn't exist then ok is
 | 
			
		||||
// false.
 | 
			
		||||
func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) {
 | 
			
		||||
	if n >= s.size {
 | 
			
		||||
		return "", false
 | 
			
		||||
	}
 | 
			
		||||
	index := s.head - n
 | 
			
		||||
	if index < 0 {
 | 
			
		||||
		index += s.max
 | 
			
		||||
	}
 | 
			
		||||
	return s.entries[index], true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// readPasswordLine reads from reader until it finds \n or io.EOF.
 | 
			
		||||
// The slice returned does not include the \n.
 | 
			
		||||
// readPasswordLine also ignores any \r it finds.
 | 
			
		||||
func readPasswordLine(reader io.Reader) ([]byte, error) {
 | 
			
		||||
	var buf [1]byte
 | 
			
		||||
	var ret []byte
 | 
			
		||||
 | 
			
		||||
	for {
 | 
			
		||||
		n, err := reader.Read(buf[:])
 | 
			
		||||
		if n > 0 {
 | 
			
		||||
			switch buf[0] {
 | 
			
		||||
			case '\n':
 | 
			
		||||
				return ret, nil
 | 
			
		||||
			case '\r':
 | 
			
		||||
				// remove \r from passwords on Windows
 | 
			
		||||
			default:
 | 
			
		||||
				ret = append(ret, buf[0])
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if err == io.EOF && len(ret) > 0 {
 | 
			
		||||
				return ret, nil
 | 
			
		||||
			}
 | 
			
		||||
			return ret, err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										114
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										114
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,114 +0,0 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build aix darwin dragonfly freebsd linux,!appengine netbsd openbsd
 | 
			
		||||
 | 
			
		||||
// Package terminal provides support functions for dealing with terminals, as
 | 
			
		||||
// commonly found on UNIX systems.
 | 
			
		||||
//
 | 
			
		||||
// Putting a terminal into raw mode is the most common requirement:
 | 
			
		||||
//
 | 
			
		||||
// 	oldState, err := terminal.MakeRaw(0)
 | 
			
		||||
// 	if err != nil {
 | 
			
		||||
// 	        panic(err)
 | 
			
		||||
// 	}
 | 
			
		||||
// 	defer terminal.Restore(0, oldState)
 | 
			
		||||
package terminal // import "golang.org/x/crypto/ssh/terminal"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"golang.org/x/sys/unix"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// State contains the state of a terminal.
 | 
			
		||||
type State struct {
 | 
			
		||||
	termios unix.Termios
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsTerminal returns whether the given file descriptor is a terminal.
 | 
			
		||||
func IsTerminal(fd int) bool {
 | 
			
		||||
	_, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MakeRaw put the terminal connected to the given file descriptor into raw
 | 
			
		||||
// mode and returns the previous state of the terminal so that it can be
 | 
			
		||||
// restored.
 | 
			
		||||
func MakeRaw(fd int) (*State, error) {
 | 
			
		||||
	termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oldState := State{termios: *termios}
 | 
			
		||||
 | 
			
		||||
	// This attempts to replicate the behaviour documented for cfmakeraw in
 | 
			
		||||
	// the termios(3) manpage.
 | 
			
		||||
	termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
 | 
			
		||||
	termios.Oflag &^= unix.OPOST
 | 
			
		||||
	termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
 | 
			
		||||
	termios.Cflag &^= unix.CSIZE | unix.PARENB
 | 
			
		||||
	termios.Cflag |= unix.CS8
 | 
			
		||||
	termios.Cc[unix.VMIN] = 1
 | 
			
		||||
	termios.Cc[unix.VTIME] = 0
 | 
			
		||||
	if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &oldState, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetState returns the current state of a terminal which may be useful to
 | 
			
		||||
// restore the terminal after a signal.
 | 
			
		||||
func GetState(fd int) (*State, error) {
 | 
			
		||||
	termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &State{termios: *termios}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Restore restores the terminal connected to the given file descriptor to a
 | 
			
		||||
// previous state.
 | 
			
		||||
func Restore(fd int, state *State) error {
 | 
			
		||||
	return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSize returns the dimensions of the given terminal.
 | 
			
		||||
func GetSize(fd int) (width, height int, err error) {
 | 
			
		||||
	ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return -1, -1, err
 | 
			
		||||
	}
 | 
			
		||||
	return int(ws.Col), int(ws.Row), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// passwordReader is an io.Reader that reads from a specific file descriptor.
 | 
			
		||||
type passwordReader int
 | 
			
		||||
 | 
			
		||||
func (r passwordReader) Read(buf []byte) (int, error) {
 | 
			
		||||
	return unix.Read(int(r), buf)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadPassword reads a line of input from a terminal without local echo.  This
 | 
			
		||||
// is commonly used for inputting passwords and other sensitive data. The slice
 | 
			
		||||
// returned does not include the \n.
 | 
			
		||||
func ReadPassword(fd int) ([]byte, error) {
 | 
			
		||||
	termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newState := *termios
 | 
			
		||||
	newState.Lflag &^= unix.ECHO
 | 
			
		||||
	newState.Lflag |= unix.ICANON | unix.ISIG
 | 
			
		||||
	newState.Iflag |= unix.ICRNL
 | 
			
		||||
	if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios)
 | 
			
		||||
 | 
			
		||||
	return readPasswordLine(passwordReader(fd))
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_aix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_aix.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,12 +0,0 @@
 | 
			
		||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build aix
 | 
			
		||||
 | 
			
		||||
package terminal
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/sys/unix"
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = unix.TCGETS
 | 
			
		||||
const ioctlWriteTermios = unix.TCSETS
 | 
			
		||||
							
								
								
									
										12
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,12 +0,0 @@
 | 
			
		||||
// Copyright 2013 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build darwin dragonfly freebsd netbsd openbsd
 | 
			
		||||
 | 
			
		||||
package terminal
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/sys/unix"
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = unix.TIOCGETA
 | 
			
		||||
const ioctlWriteTermios = unix.TIOCSETA
 | 
			
		||||
							
								
								
									
										10
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_linux.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,10 +0,0 @@
 | 
			
		||||
// Copyright 2013 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package terminal
 | 
			
		||||
 | 
			
		||||
import "golang.org/x/sys/unix"
 | 
			
		||||
 | 
			
		||||
const ioctlReadTermios = unix.TCGETS
 | 
			
		||||
const ioctlWriteTermios = unix.TCSETS
 | 
			
		||||
							
								
								
									
										58
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										58
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,58 +0,0 @@
 | 
			
		||||
// Copyright 2016 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Package terminal provides support functions for dealing with terminals, as
 | 
			
		||||
// commonly found on UNIX systems.
 | 
			
		||||
//
 | 
			
		||||
// Putting a terminal into raw mode is the most common requirement:
 | 
			
		||||
//
 | 
			
		||||
// 	oldState, err := terminal.MakeRaw(0)
 | 
			
		||||
// 	if err != nil {
 | 
			
		||||
// 	        panic(err)
 | 
			
		||||
// 	}
 | 
			
		||||
// 	defer terminal.Restore(0, oldState)
 | 
			
		||||
package terminal
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"runtime"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type State struct{}
 | 
			
		||||
 | 
			
		||||
// IsTerminal returns whether the given file descriptor is a terminal.
 | 
			
		||||
func IsTerminal(fd int) bool {
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MakeRaw put the terminal connected to the given file descriptor into raw
 | 
			
		||||
// mode and returns the previous state of the terminal so that it can be
 | 
			
		||||
// restored.
 | 
			
		||||
func MakeRaw(fd int) (*State, error) {
 | 
			
		||||
	return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetState returns the current state of a terminal which may be useful to
 | 
			
		||||
// restore the terminal after a signal.
 | 
			
		||||
func GetState(fd int) (*State, error) {
 | 
			
		||||
	return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Restore restores the terminal connected to the given file descriptor to a
 | 
			
		||||
// previous state.
 | 
			
		||||
func Restore(fd int, state *State) error {
 | 
			
		||||
	return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSize returns the dimensions of the given terminal.
 | 
			
		||||
func GetSize(fd int) (width, height int, err error) {
 | 
			
		||||
	return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadPassword reads a line of input from a terminal without local echo.  This
 | 
			
		||||
// is commonly used for inputting passwords and other sensitive data. The slice
 | 
			
		||||
// returned does not include the \n.
 | 
			
		||||
func ReadPassword(fd int) ([]byte, error) {
 | 
			
		||||
	return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										124
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										124
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,124 +0,0 @@
 | 
			
		||||
// Copyright 2015 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build solaris
 | 
			
		||||
 | 
			
		||||
package terminal // import "golang.org/x/crypto/ssh/terminal"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"golang.org/x/sys/unix"
 | 
			
		||||
	"io"
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// State contains the state of a terminal.
 | 
			
		||||
type State struct {
 | 
			
		||||
	termios unix.Termios
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsTerminal returns whether the given file descriptor is a terminal.
 | 
			
		||||
func IsTerminal(fd int) bool {
 | 
			
		||||
	_, err := unix.IoctlGetTermio(fd, unix.TCGETA)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadPassword reads a line of input from a terminal without local echo.  This
 | 
			
		||||
// is commonly used for inputting passwords and other sensitive data. The slice
 | 
			
		||||
// returned does not include the \n.
 | 
			
		||||
func ReadPassword(fd int) ([]byte, error) {
 | 
			
		||||
	// see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c
 | 
			
		||||
	val, err := unix.IoctlGetTermios(fd, unix.TCGETS)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	oldState := *val
 | 
			
		||||
 | 
			
		||||
	newState := oldState
 | 
			
		||||
	newState.Lflag &^= syscall.ECHO
 | 
			
		||||
	newState.Lflag |= syscall.ICANON | syscall.ISIG
 | 
			
		||||
	newState.Iflag |= syscall.ICRNL
 | 
			
		||||
	err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState)
 | 
			
		||||
 | 
			
		||||
	var buf [16]byte
 | 
			
		||||
	var ret []byte
 | 
			
		||||
	for {
 | 
			
		||||
		n, err := syscall.Read(fd, buf[:])
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		}
 | 
			
		||||
		if n == 0 {
 | 
			
		||||
			if len(ret) == 0 {
 | 
			
		||||
				return nil, io.EOF
 | 
			
		||||
			}
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		if buf[n-1] == '\n' {
 | 
			
		||||
			n--
 | 
			
		||||
		}
 | 
			
		||||
		ret = append(ret, buf[:n]...)
 | 
			
		||||
		if n < len(buf) {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MakeRaw puts the terminal connected to the given file descriptor into raw
 | 
			
		||||
// mode and returns the previous state of the terminal so that it can be
 | 
			
		||||
// restored.
 | 
			
		||||
// see http://cr.illumos.org/~webrev/andy_js/1060/
 | 
			
		||||
func MakeRaw(fd int) (*State, error) {
 | 
			
		||||
	termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	oldState := State{termios: *termios}
 | 
			
		||||
 | 
			
		||||
	termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
 | 
			
		||||
	termios.Oflag &^= unix.OPOST
 | 
			
		||||
	termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
 | 
			
		||||
	termios.Cflag &^= unix.CSIZE | unix.PARENB
 | 
			
		||||
	termios.Cflag |= unix.CS8
 | 
			
		||||
	termios.Cc[unix.VMIN] = 1
 | 
			
		||||
	termios.Cc[unix.VTIME] = 0
 | 
			
		||||
 | 
			
		||||
	if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &oldState, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Restore restores the terminal connected to the given file descriptor to a
 | 
			
		||||
// previous state.
 | 
			
		||||
func Restore(fd int, oldState *State) error {
 | 
			
		||||
	return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetState returns the current state of a terminal which may be useful to
 | 
			
		||||
// restore the terminal after a signal.
 | 
			
		||||
func GetState(fd int) (*State, error) {
 | 
			
		||||
	termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &State{termios: *termios}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSize returns the dimensions of the given terminal.
 | 
			
		||||
func GetSize(fd int) (width, height int, err error) {
 | 
			
		||||
	ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, 0, err
 | 
			
		||||
	}
 | 
			
		||||
	return int(ws.Col), int(ws.Row), nil
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										105
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										105
									
								
								vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,105 +0,0 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
// Package terminal provides support functions for dealing with terminals, as
 | 
			
		||||
// commonly found on UNIX systems.
 | 
			
		||||
//
 | 
			
		||||
// Putting a terminal into raw mode is the most common requirement:
 | 
			
		||||
//
 | 
			
		||||
// 	oldState, err := terminal.MakeRaw(0)
 | 
			
		||||
// 	if err != nil {
 | 
			
		||||
// 	        panic(err)
 | 
			
		||||
// 	}
 | 
			
		||||
// 	defer terminal.Restore(0, oldState)
 | 
			
		||||
package terminal
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"golang.org/x/sys/windows"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type State struct {
 | 
			
		||||
	mode uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsTerminal returns whether the given file descriptor is a terminal.
 | 
			
		||||
func IsTerminal(fd int) bool {
 | 
			
		||||
	var st uint32
 | 
			
		||||
	err := windows.GetConsoleMode(windows.Handle(fd), &st)
 | 
			
		||||
	return err == nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MakeRaw put the terminal connected to the given file descriptor into raw
 | 
			
		||||
// mode and returns the previous state of the terminal so that it can be
 | 
			
		||||
// restored.
 | 
			
		||||
func MakeRaw(fd int) (*State, error) {
 | 
			
		||||
	var st uint32
 | 
			
		||||
	if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
 | 
			
		||||
	if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &State{st}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetState returns the current state of a terminal which may be useful to
 | 
			
		||||
// restore the terminal after a signal.
 | 
			
		||||
func GetState(fd int) (*State, error) {
 | 
			
		||||
	var st uint32
 | 
			
		||||
	if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &State{st}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Restore restores the terminal connected to the given file descriptor to a
 | 
			
		||||
// previous state.
 | 
			
		||||
func Restore(fd int, state *State) error {
 | 
			
		||||
	return windows.SetConsoleMode(windows.Handle(fd), state.mode)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetSize returns the visible dimensions of the given terminal.
 | 
			
		||||
//
 | 
			
		||||
// These dimensions don't include any scrollback buffer height.
 | 
			
		||||
func GetSize(fd int) (width, height int, err error) {
 | 
			
		||||
	var info windows.ConsoleScreenBufferInfo
 | 
			
		||||
	if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil {
 | 
			
		||||
		return 0, 0, err
 | 
			
		||||
	}
 | 
			
		||||
	return int(info.Window.Right - info.Window.Left + 1), int(info.Window.Bottom - info.Window.Top + 1), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ReadPassword reads a line of input from a terminal without local echo.  This
 | 
			
		||||
// is commonly used for inputting passwords and other sensitive data. The slice
 | 
			
		||||
// returned does not include the \n.
 | 
			
		||||
func ReadPassword(fd int) ([]byte, error) {
 | 
			
		||||
	var st uint32
 | 
			
		||||
	if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	old := st
 | 
			
		||||
 | 
			
		||||
	st &^= (windows.ENABLE_ECHO_INPUT)
 | 
			
		||||
	st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
 | 
			
		||||
	if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	defer windows.SetConsoleMode(windows.Handle(fd), old)
 | 
			
		||||
 | 
			
		||||
	var h windows.Handle
 | 
			
		||||
	p, _ := windows.GetCurrentProcess()
 | 
			
		||||
	if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	f := os.NewFile(uintptr(h), "stdin")
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
	return readPasswordLine(f)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/golang.org/x/sys/windows/aliases.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/golang.org/x/sys/windows/aliases.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,13 +0,0 @@
 | 
			
		||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows
 | 
			
		||||
// +build go1.9
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
import "syscall"
 | 
			
		||||
 | 
			
		||||
type Errno = syscall.Errno
 | 
			
		||||
type SysProcAttr = syscall.SysProcAttr
 | 
			
		||||
							
								
								
									
										386
									
								
								vendor/golang.org/x/sys/windows/dll_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										386
									
								
								vendor/golang.org/x/sys/windows/dll_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,386 +0,0 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sync"
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// We need to use LoadLibrary and GetProcAddress from the Go runtime, because
 | 
			
		||||
// the these symbols are loaded by the system linker and are required to
 | 
			
		||||
// dynamically load additional symbols. Note that in the Go runtime, these
 | 
			
		||||
// return syscall.Handle and syscall.Errno, but these are the same, in fact,
 | 
			
		||||
// as windows.Handle and windows.Errno, and we intend to keep these the same.
 | 
			
		||||
 | 
			
		||||
//go:linkname syscall_loadlibrary syscall.loadlibrary
 | 
			
		||||
func syscall_loadlibrary(filename *uint16) (handle Handle, err Errno)
 | 
			
		||||
 | 
			
		||||
//go:linkname syscall_getprocaddress syscall.getprocaddress
 | 
			
		||||
func syscall_getprocaddress(handle Handle, procname *uint8) (proc uintptr, err Errno)
 | 
			
		||||
 | 
			
		||||
// DLLError describes reasons for DLL load failures.
 | 
			
		||||
type DLLError struct {
 | 
			
		||||
	Err     error
 | 
			
		||||
	ObjName string
 | 
			
		||||
	Msg     string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (e *DLLError) Error() string { return e.Msg }
 | 
			
		||||
 | 
			
		||||
// A DLL implements access to a single DLL.
 | 
			
		||||
type DLL struct {
 | 
			
		||||
	Name   string
 | 
			
		||||
	Handle Handle
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadDLL loads DLL file into memory.
 | 
			
		||||
//
 | 
			
		||||
// Warning: using LoadDLL without an absolute path name is subject to
 | 
			
		||||
// DLL preloading attacks. To safely load a system DLL, use LazyDLL
 | 
			
		||||
// with System set to true, or use LoadLibraryEx directly.
 | 
			
		||||
func LoadDLL(name string) (dll *DLL, err error) {
 | 
			
		||||
	namep, err := UTF16PtrFromString(name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	h, e := syscall_loadlibrary(namep)
 | 
			
		||||
	if e != 0 {
 | 
			
		||||
		return nil, &DLLError{
 | 
			
		||||
			Err:     e,
 | 
			
		||||
			ObjName: name,
 | 
			
		||||
			Msg:     "Failed to load " + name + ": " + e.Error(),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	d := &DLL{
 | 
			
		||||
		Name:   name,
 | 
			
		||||
		Handle: h,
 | 
			
		||||
	}
 | 
			
		||||
	return d, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MustLoadDLL is like LoadDLL but panics if load operation failes.
 | 
			
		||||
func MustLoadDLL(name string) *DLL {
 | 
			
		||||
	d, e := LoadDLL(name)
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		panic(e)
 | 
			
		||||
	}
 | 
			
		||||
	return d
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindProc searches DLL d for procedure named name and returns *Proc
 | 
			
		||||
// if found. It returns an error if search fails.
 | 
			
		||||
func (d *DLL) FindProc(name string) (proc *Proc, err error) {
 | 
			
		||||
	namep, err := BytePtrFromString(name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	a, e := syscall_getprocaddress(d.Handle, namep)
 | 
			
		||||
	if e != 0 {
 | 
			
		||||
		return nil, &DLLError{
 | 
			
		||||
			Err:     e,
 | 
			
		||||
			ObjName: name,
 | 
			
		||||
			Msg:     "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(),
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	p := &Proc{
 | 
			
		||||
		Dll:  d,
 | 
			
		||||
		Name: name,
 | 
			
		||||
		addr: a,
 | 
			
		||||
	}
 | 
			
		||||
	return p, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// MustFindProc is like FindProc but panics if search fails.
 | 
			
		||||
func (d *DLL) MustFindProc(name string) *Proc {
 | 
			
		||||
	p, e := d.FindProc(name)
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		panic(e)
 | 
			
		||||
	}
 | 
			
		||||
	return p
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Release unloads DLL d from memory.
 | 
			
		||||
func (d *DLL) Release() (err error) {
 | 
			
		||||
	return FreeLibrary(d.Handle)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A Proc implements access to a procedure inside a DLL.
 | 
			
		||||
type Proc struct {
 | 
			
		||||
	Dll  *DLL
 | 
			
		||||
	Name string
 | 
			
		||||
	addr uintptr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Addr returns the address of the procedure represented by p.
 | 
			
		||||
// The return value can be passed to Syscall to run the procedure.
 | 
			
		||||
func (p *Proc) Addr() uintptr {
 | 
			
		||||
	return p.addr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//go:uintptrescapes
 | 
			
		||||
 | 
			
		||||
// Call executes procedure p with arguments a. It will panic, if more than 15 arguments
 | 
			
		||||
// are supplied.
 | 
			
		||||
//
 | 
			
		||||
// The returned error is always non-nil, constructed from the result of GetLastError.
 | 
			
		||||
// Callers must inspect the primary return value to decide whether an error occurred
 | 
			
		||||
// (according to the semantics of the specific function being called) before consulting
 | 
			
		||||
// the error. The error will be guaranteed to contain windows.Errno.
 | 
			
		||||
func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
 | 
			
		||||
	switch len(a) {
 | 
			
		||||
	case 0:
 | 
			
		||||
		return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0)
 | 
			
		||||
	case 1:
 | 
			
		||||
		return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0)
 | 
			
		||||
	case 2:
 | 
			
		||||
		return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0)
 | 
			
		||||
	case 3:
 | 
			
		||||
		return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2])
 | 
			
		||||
	case 4:
 | 
			
		||||
		return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0)
 | 
			
		||||
	case 5:
 | 
			
		||||
		return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0)
 | 
			
		||||
	case 6:
 | 
			
		||||
		return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5])
 | 
			
		||||
	case 7:
 | 
			
		||||
		return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0)
 | 
			
		||||
	case 8:
 | 
			
		||||
		return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0)
 | 
			
		||||
	case 9:
 | 
			
		||||
		return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8])
 | 
			
		||||
	case 10:
 | 
			
		||||
		return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0)
 | 
			
		||||
	case 11:
 | 
			
		||||
		return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0)
 | 
			
		||||
	case 12:
 | 
			
		||||
		return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11])
 | 
			
		||||
	case 13:
 | 
			
		||||
		return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0)
 | 
			
		||||
	case 14:
 | 
			
		||||
		return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0)
 | 
			
		||||
	case 15:
 | 
			
		||||
		return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14])
 | 
			
		||||
	default:
 | 
			
		||||
		panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A LazyDLL implements access to a single DLL.
 | 
			
		||||
// It will delay the load of the DLL until the first
 | 
			
		||||
// call to its Handle method or to one of its
 | 
			
		||||
// LazyProc's Addr method.
 | 
			
		||||
type LazyDLL struct {
 | 
			
		||||
	Name string
 | 
			
		||||
 | 
			
		||||
	// System determines whether the DLL must be loaded from the
 | 
			
		||||
	// Windows System directory, bypassing the normal DLL search
 | 
			
		||||
	// path.
 | 
			
		||||
	System bool
 | 
			
		||||
 | 
			
		||||
	mu  sync.Mutex
 | 
			
		||||
	dll *DLL // non nil once DLL is loaded
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Load loads DLL file d.Name into memory. It returns an error if fails.
 | 
			
		||||
// Load will not try to load DLL, if it is already loaded into memory.
 | 
			
		||||
func (d *LazyDLL) Load() error {
 | 
			
		||||
	// Non-racy version of:
 | 
			
		||||
	// if d.dll != nil {
 | 
			
		||||
	if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	d.mu.Lock()
 | 
			
		||||
	defer d.mu.Unlock()
 | 
			
		||||
	if d.dll != nil {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// kernel32.dll is special, since it's where LoadLibraryEx comes from.
 | 
			
		||||
	// The kernel already special-cases its name, so it's always
 | 
			
		||||
	// loaded from system32.
 | 
			
		||||
	var dll *DLL
 | 
			
		||||
	var err error
 | 
			
		||||
	if d.Name == "kernel32.dll" {
 | 
			
		||||
		dll, err = LoadDLL(d.Name)
 | 
			
		||||
	} else {
 | 
			
		||||
		dll, err = loadLibraryEx(d.Name, d.System)
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Non-racy version of:
 | 
			
		||||
	// d.dll = dll
 | 
			
		||||
	atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll))
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mustLoad is like Load but panics if search fails.
 | 
			
		||||
func (d *LazyDLL) mustLoad() {
 | 
			
		||||
	e := d.Load()
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		panic(e)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Handle returns d's module handle.
 | 
			
		||||
func (d *LazyDLL) Handle() uintptr {
 | 
			
		||||
	d.mustLoad()
 | 
			
		||||
	return uintptr(d.dll.Handle)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewProc returns a LazyProc for accessing the named procedure in the DLL d.
 | 
			
		||||
func (d *LazyDLL) NewProc(name string) *LazyProc {
 | 
			
		||||
	return &LazyProc{l: d, Name: name}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewLazyDLL creates new LazyDLL associated with DLL file.
 | 
			
		||||
func NewLazyDLL(name string) *LazyDLL {
 | 
			
		||||
	return &LazyDLL{Name: name}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewLazySystemDLL is like NewLazyDLL, but will only
 | 
			
		||||
// search Windows System directory for the DLL if name is
 | 
			
		||||
// a base name (like "advapi32.dll").
 | 
			
		||||
func NewLazySystemDLL(name string) *LazyDLL {
 | 
			
		||||
	return &LazyDLL{Name: name, System: true}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A LazyProc implements access to a procedure inside a LazyDLL.
 | 
			
		||||
// It delays the lookup until the Addr method is called.
 | 
			
		||||
type LazyProc struct {
 | 
			
		||||
	Name string
 | 
			
		||||
 | 
			
		||||
	mu   sync.Mutex
 | 
			
		||||
	l    *LazyDLL
 | 
			
		||||
	proc *Proc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Find searches DLL for procedure named p.Name. It returns
 | 
			
		||||
// an error if search fails. Find will not search procedure,
 | 
			
		||||
// if it is already found and loaded into memory.
 | 
			
		||||
func (p *LazyProc) Find() error {
 | 
			
		||||
	// Non-racy version of:
 | 
			
		||||
	// if p.proc == nil {
 | 
			
		||||
	if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil {
 | 
			
		||||
		p.mu.Lock()
 | 
			
		||||
		defer p.mu.Unlock()
 | 
			
		||||
		if p.proc == nil {
 | 
			
		||||
			e := p.l.Load()
 | 
			
		||||
			if e != nil {
 | 
			
		||||
				return e
 | 
			
		||||
			}
 | 
			
		||||
			proc, e := p.l.dll.FindProc(p.Name)
 | 
			
		||||
			if e != nil {
 | 
			
		||||
				return e
 | 
			
		||||
			}
 | 
			
		||||
			// Non-racy version of:
 | 
			
		||||
			// p.proc = proc
 | 
			
		||||
			atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// mustFind is like Find but panics if search fails.
 | 
			
		||||
func (p *LazyProc) mustFind() {
 | 
			
		||||
	e := p.Find()
 | 
			
		||||
	if e != nil {
 | 
			
		||||
		panic(e)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Addr returns the address of the procedure represented by p.
 | 
			
		||||
// The return value can be passed to Syscall to run the procedure.
 | 
			
		||||
// It will panic if the procedure cannot be found.
 | 
			
		||||
func (p *LazyProc) Addr() uintptr {
 | 
			
		||||
	p.mustFind()
 | 
			
		||||
	return p.proc.Addr()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//go:uintptrescapes
 | 
			
		||||
 | 
			
		||||
// Call executes procedure p with arguments a. It will panic, if more than 15 arguments
 | 
			
		||||
// are supplied. It will also panic if the procedure cannot be found.
 | 
			
		||||
//
 | 
			
		||||
// The returned error is always non-nil, constructed from the result of GetLastError.
 | 
			
		||||
// Callers must inspect the primary return value to decide whether an error occurred
 | 
			
		||||
// (according to the semantics of the specific function being called) before consulting
 | 
			
		||||
// the error. The error will be guaranteed to contain windows.Errno.
 | 
			
		||||
func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
 | 
			
		||||
	p.mustFind()
 | 
			
		||||
	return p.proc.Call(a...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var canDoSearchSystem32Once struct {
 | 
			
		||||
	sync.Once
 | 
			
		||||
	v bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func initCanDoSearchSystem32() {
 | 
			
		||||
	// https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says:
 | 
			
		||||
	// "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows
 | 
			
		||||
	// Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on
 | 
			
		||||
	// systems that have KB2533623 installed. To determine whether the
 | 
			
		||||
	// flags are available, use GetProcAddress to get the address of the
 | 
			
		||||
	// AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories
 | 
			
		||||
	// function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_*
 | 
			
		||||
	// flags can be used with LoadLibraryEx."
 | 
			
		||||
	canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func canDoSearchSystem32() bool {
 | 
			
		||||
	canDoSearchSystem32Once.Do(initCanDoSearchSystem32)
 | 
			
		||||
	return canDoSearchSystem32Once.v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func isBaseName(name string) bool {
 | 
			
		||||
	for _, c := range name {
 | 
			
		||||
		if c == ':' || c == '/' || c == '\\' {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// loadLibraryEx wraps the Windows LoadLibraryEx function.
 | 
			
		||||
//
 | 
			
		||||
// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
 | 
			
		||||
//
 | 
			
		||||
// If name is not an absolute path, LoadLibraryEx searches for the DLL
 | 
			
		||||
// in a variety of automatic locations unless constrained by flags.
 | 
			
		||||
// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx
 | 
			
		||||
func loadLibraryEx(name string, system bool) (*DLL, error) {
 | 
			
		||||
	loadDLL := name
 | 
			
		||||
	var flags uintptr
 | 
			
		||||
	if system {
 | 
			
		||||
		if canDoSearchSystem32() {
 | 
			
		||||
			const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800
 | 
			
		||||
			flags = LOAD_LIBRARY_SEARCH_SYSTEM32
 | 
			
		||||
		} else if isBaseName(name) {
 | 
			
		||||
			// WindowsXP or unpatched Windows machine
 | 
			
		||||
			// trying to load "foo.dll" out of the system
 | 
			
		||||
			// folder, but LoadLibraryEx doesn't support
 | 
			
		||||
			// that yet on their system, so emulate it.
 | 
			
		||||
			systemdir, err := GetSystemDirectory()
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
			loadDLL = systemdir + "\\" + name
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	h, err := LoadLibraryEx(loadDLL, 0, flags)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &DLL{Name: name, Handle: h}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type errString string
 | 
			
		||||
 | 
			
		||||
func (s errString) Error() string { return string(s) }
 | 
			
		||||
							
								
								
									
										8
									
								
								vendor/golang.org/x/sys/windows/empty.s
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/golang.org/x/sys/windows/empty.s
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,8 +0,0 @@
 | 
			
		||||
// Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build !go1.12
 | 
			
		||||
 | 
			
		||||
// This file is here to allow bodyless functions with go:linkname for Go 1.11
 | 
			
		||||
// and earlier (see https://golang.org/issue/23311).
 | 
			
		||||
							
								
								
									
										61
									
								
								vendor/golang.org/x/sys/windows/env_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										61
									
								
								vendor/golang.org/x/sys/windows/env_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,61 +0,0 @@
 | 
			
		||||
// Copyright 2010 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Windows environment variables.
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"unicode/utf16"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func Getenv(key string) (value string, found bool) {
 | 
			
		||||
	return syscall.Getenv(key)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Setenv(key, value string) error {
 | 
			
		||||
	return syscall.Setenv(key, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Clearenv() {
 | 
			
		||||
	syscall.Clearenv()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Environ() []string {
 | 
			
		||||
	return syscall.Environ()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a default environment associated with the token, rather than the current
 | 
			
		||||
// process. If inheritExisting is true, then this environment also inherits the
 | 
			
		||||
// environment of the current process.
 | 
			
		||||
func (token Token) Environ(inheritExisting bool) (env []string, err error) {
 | 
			
		||||
	var block *uint16
 | 
			
		||||
	err = CreateEnvironmentBlock(&block, token, inheritExisting)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer DestroyEnvironmentBlock(block)
 | 
			
		||||
	blockp := uintptr(unsafe.Pointer(block))
 | 
			
		||||
	for {
 | 
			
		||||
		entry := (*[(1 << 30) - 1]uint16)(unsafe.Pointer(blockp))[:]
 | 
			
		||||
		for i, v := range entry {
 | 
			
		||||
			if v == 0 {
 | 
			
		||||
				entry = entry[:i]
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if len(entry) == 0 {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		env = append(env, string(utf16.Decode(entry)))
 | 
			
		||||
		blockp += 2 * (uintptr(len(entry)) + 1)
 | 
			
		||||
	}
 | 
			
		||||
	return env, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func Unsetenv(key string) error {
 | 
			
		||||
	return syscall.Unsetenv(key)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								vendor/golang.org/x/sys/windows/eventlog.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								vendor/golang.org/x/sys/windows/eventlog.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,20 +0,0 @@
 | 
			
		||||
// Copyright 2012 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	EVENTLOG_SUCCESS          = 0
 | 
			
		||||
	EVENTLOG_ERROR_TYPE       = 1
 | 
			
		||||
	EVENTLOG_WARNING_TYPE     = 2
 | 
			
		||||
	EVENTLOG_INFORMATION_TYPE = 4
 | 
			
		||||
	EVENTLOG_AUDIT_SUCCESS    = 8
 | 
			
		||||
	EVENTLOG_AUDIT_FAILURE    = 16
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//sys	RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW
 | 
			
		||||
//sys	DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource
 | 
			
		||||
//sys	ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW
 | 
			
		||||
							
								
								
									
										97
									
								
								vendor/golang.org/x/sys/windows/exec_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										97
									
								
								vendor/golang.org/x/sys/windows/exec_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,97 +0,0 @@
 | 
			
		||||
// Copyright 2009 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// Fork, exec, wait, etc.
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
// EscapeArg rewrites command line argument s as prescribed
 | 
			
		||||
// in http://msdn.microsoft.com/en-us/library/ms880421.
 | 
			
		||||
// This function returns "" (2 double quotes) if s is empty.
 | 
			
		||||
// Alternatively, these transformations are done:
 | 
			
		||||
// - every back slash (\) is doubled, but only if immediately
 | 
			
		||||
//   followed by double quote (");
 | 
			
		||||
// - every double quote (") is escaped by back slash (\);
 | 
			
		||||
// - finally, s is wrapped with double quotes (arg -> "arg"),
 | 
			
		||||
//   but only if there is space or tab inside s.
 | 
			
		||||
func EscapeArg(s string) string {
 | 
			
		||||
	if len(s) == 0 {
 | 
			
		||||
		return "\"\""
 | 
			
		||||
	}
 | 
			
		||||
	n := len(s)
 | 
			
		||||
	hasSpace := false
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		switch s[i] {
 | 
			
		||||
		case '"', '\\':
 | 
			
		||||
			n++
 | 
			
		||||
		case ' ', '\t':
 | 
			
		||||
			hasSpace = true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if hasSpace {
 | 
			
		||||
		n += 2
 | 
			
		||||
	}
 | 
			
		||||
	if n == len(s) {
 | 
			
		||||
		return s
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	qs := make([]byte, n)
 | 
			
		||||
	j := 0
 | 
			
		||||
	if hasSpace {
 | 
			
		||||
		qs[j] = '"'
 | 
			
		||||
		j++
 | 
			
		||||
	}
 | 
			
		||||
	slashes := 0
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		switch s[i] {
 | 
			
		||||
		default:
 | 
			
		||||
			slashes = 0
 | 
			
		||||
			qs[j] = s[i]
 | 
			
		||||
		case '\\':
 | 
			
		||||
			slashes++
 | 
			
		||||
			qs[j] = s[i]
 | 
			
		||||
		case '"':
 | 
			
		||||
			for ; slashes > 0; slashes-- {
 | 
			
		||||
				qs[j] = '\\'
 | 
			
		||||
				j++
 | 
			
		||||
			}
 | 
			
		||||
			qs[j] = '\\'
 | 
			
		||||
			j++
 | 
			
		||||
			qs[j] = s[i]
 | 
			
		||||
		}
 | 
			
		||||
		j++
 | 
			
		||||
	}
 | 
			
		||||
	if hasSpace {
 | 
			
		||||
		for ; slashes > 0; slashes-- {
 | 
			
		||||
			qs[j] = '\\'
 | 
			
		||||
			j++
 | 
			
		||||
		}
 | 
			
		||||
		qs[j] = '"'
 | 
			
		||||
		j++
 | 
			
		||||
	}
 | 
			
		||||
	return string(qs[:j])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CloseOnExec(fd Handle) {
 | 
			
		||||
	SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FullPath retrieves the full path of the specified file.
 | 
			
		||||
func FullPath(name string) (path string, err error) {
 | 
			
		||||
	p, err := UTF16PtrFromString(name)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
	}
 | 
			
		||||
	n := uint32(100)
 | 
			
		||||
	for {
 | 
			
		||||
		buf := make([]uint16, n)
 | 
			
		||||
		n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return "", err
 | 
			
		||||
		}
 | 
			
		||||
		if n <= uint32(len(buf)) {
 | 
			
		||||
			return UTF16ToString(buf[:n]), nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										26
									
								
								vendor/golang.org/x/sys/windows/memory_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								vendor/golang.org/x/sys/windows/memory_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,26 +0,0 @@
 | 
			
		||||
// Copyright 2017 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	MEM_COMMIT      = 0x00001000
 | 
			
		||||
	MEM_RESERVE     = 0x00002000
 | 
			
		||||
	MEM_DECOMMIT    = 0x00004000
 | 
			
		||||
	MEM_RELEASE     = 0x00008000
 | 
			
		||||
	MEM_RESET       = 0x00080000
 | 
			
		||||
	MEM_TOP_DOWN    = 0x00100000
 | 
			
		||||
	MEM_WRITE_WATCH = 0x00200000
 | 
			
		||||
	MEM_PHYSICAL    = 0x00400000
 | 
			
		||||
	MEM_RESET_UNDO  = 0x01000000
 | 
			
		||||
	MEM_LARGE_PAGES = 0x20000000
 | 
			
		||||
 | 
			
		||||
	PAGE_NOACCESS          = 0x01
 | 
			
		||||
	PAGE_READONLY          = 0x02
 | 
			
		||||
	PAGE_READWRITE         = 0x04
 | 
			
		||||
	PAGE_WRITECOPY         = 0x08
 | 
			
		||||
	PAGE_EXECUTE_READ      = 0x20
 | 
			
		||||
	PAGE_EXECUTE_READWRITE = 0x40
 | 
			
		||||
	PAGE_EXECUTE_WRITECOPY = 0x80
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										63
									
								
								vendor/golang.org/x/sys/windows/mkerrors.bash
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										63
									
								
								vendor/golang.org/x/sys/windows/mkerrors.bash
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,63 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
# Use of this source code is governed by a BSD-style
 | 
			
		||||
# license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
shopt -s nullglob
 | 
			
		||||
 | 
			
		||||
winerror="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/shared/winerror.h | sort -Vr | head -n 1)"
 | 
			
		||||
[[ -n $winerror ]] || { echo "Unable to find winerror.h" >&2; exit 1; }
 | 
			
		||||
 | 
			
		||||
declare -A errors
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
	echo "// Code generated by 'mkerrors.bash'; DO NOT EDIT."
 | 
			
		||||
	echo
 | 
			
		||||
	echo "package windows"
 | 
			
		||||
	echo "import \"syscall\""
 | 
			
		||||
	echo "const ("
 | 
			
		||||
 | 
			
		||||
	while read -r line; do
 | 
			
		||||
		unset vtype
 | 
			
		||||
		if [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +([A-Z0-9_]+\()?([A-Z][A-Z0-9_]+k?)\)? ]]; then
 | 
			
		||||
			key="${BASH_REMATCH[1]}"
 | 
			
		||||
			value="${BASH_REMATCH[3]}"
 | 
			
		||||
		elif [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +([A-Z0-9_]+\()?((0x)?[0-9A-Fa-f]+)L?\)? ]]; then
 | 
			
		||||
			key="${BASH_REMATCH[1]}"
 | 
			
		||||
			value="${BASH_REMATCH[3]}"
 | 
			
		||||
			vtype="${BASH_REMATCH[2]}"
 | 
			
		||||
		elif [[ $line =~ ^#define\ +([A-Z0-9_]+k?)\ +\(\(([A-Z]+)\)((0x)?[0-9A-Fa-f]+)L?\) ]]; then
 | 
			
		||||
			key="${BASH_REMATCH[1]}"
 | 
			
		||||
			value="${BASH_REMATCH[3]}"
 | 
			
		||||
			vtype="${BASH_REMATCH[2]}"
 | 
			
		||||
		else
 | 
			
		||||
			continue
 | 
			
		||||
		fi
 | 
			
		||||
		[[ -n $key && -n $value ]] || continue
 | 
			
		||||
		[[ -z ${errors["$key"]} ]] || continue
 | 
			
		||||
		errors["$key"]="$value"
 | 
			
		||||
		if [[ -v vtype ]]; then
 | 
			
		||||
			if [[ $key == FACILITY_* || $key == NO_ERROR ]]; then
 | 
			
		||||
				vtype=""
 | 
			
		||||
			elif [[ $vtype == *HANDLE* || $vtype == *HRESULT* ]]; then
 | 
			
		||||
				vtype="Handle"
 | 
			
		||||
			else
 | 
			
		||||
				vtype="syscall.Errno"
 | 
			
		||||
			fi
 | 
			
		||||
			last_vtype="$vtype"
 | 
			
		||||
		else
 | 
			
		||||
			vtype=""
 | 
			
		||||
			if [[ $last_vtype == Handle && $value == NO_ERROR ]]; then
 | 
			
		||||
				value="S_OK"
 | 
			
		||||
			elif [[ $last_vtype == syscall.Errno && $value == NO_ERROR ]]; then
 | 
			
		||||
				value="ERROR_SUCCESS"
 | 
			
		||||
			fi
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		echo "$key $vtype = $value"
 | 
			
		||||
	done < "$winerror"
 | 
			
		||||
 | 
			
		||||
	echo ")"
 | 
			
		||||
} | gofmt > "zerrors_windows.go"
 | 
			
		||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/sys/windows/mkknownfolderids.bash
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/sys/windows/mkknownfolderids.bash
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,27 +0,0 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# Copyright 2019 The Go Authors. All rights reserved.
 | 
			
		||||
# Use of this source code is governed by a BSD-style
 | 
			
		||||
# license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
shopt -s nullglob
 | 
			
		||||
 | 
			
		||||
knownfolders="$(printf '%s\n' "/mnt/c/Program Files (x86)/Windows Kits/"/*/Include/*/um/KnownFolders.h | sort -Vr | head -n 1)"
 | 
			
		||||
[[ -n $knownfolders ]] || { echo "Unable to find KnownFolders.h" >&2; exit 1; }
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
	echo "// Code generated by 'mkknownfolderids.bash'; DO NOT EDIT."
 | 
			
		||||
	echo
 | 
			
		||||
	echo "package windows"
 | 
			
		||||
	echo "type KNOWNFOLDERID GUID"
 | 
			
		||||
	echo "var ("
 | 
			
		||||
	while read -r line; do
 | 
			
		||||
		[[ $line =~ DEFINE_KNOWN_FOLDER\((FOLDERID_[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+),[\t\ ]*(0x[^,]+)\) ]] || continue
 | 
			
		||||
		printf "%s = &KNOWNFOLDERID{0x%08x, 0x%04x, 0x%04x, [8]byte{0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x}}\n" \
 | 
			
		||||
			"${BASH_REMATCH[1]}" $(( "${BASH_REMATCH[2]}" )) $(( "${BASH_REMATCH[3]}" )) $(( "${BASH_REMATCH[4]}" )) \
 | 
			
		||||
			$(( "${BASH_REMATCH[5]}" )) $(( "${BASH_REMATCH[6]}" )) $(( "${BASH_REMATCH[7]}" )) $(( "${BASH_REMATCH[8]}" )) \
 | 
			
		||||
			$(( "${BASH_REMATCH[9]}" )) $(( "${BASH_REMATCH[10]}" )) $(( "${BASH_REMATCH[11]}" )) $(( "${BASH_REMATCH[12]}" ))
 | 
			
		||||
	done < "$knownfolders"
 | 
			
		||||
	echo ")"
 | 
			
		||||
} | gofmt > "zknownfolderids_windows.go"
 | 
			
		||||
							
								
								
									
										9
									
								
								vendor/golang.org/x/sys/windows/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								vendor/golang.org/x/sys/windows/mksyscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,9 +0,0 @@
 | 
			
		||||
// Copyright 2009 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build generate
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
 | 
			
		||||
							
								
								
									
										30
									
								
								vendor/golang.org/x/sys/windows/race.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										30
									
								
								vendor/golang.org/x/sys/windows/race.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,30 +0,0 @@
 | 
			
		||||
// Copyright 2012 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows,race
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const raceenabled = true
 | 
			
		||||
 | 
			
		||||
func raceAcquire(addr unsafe.Pointer) {
 | 
			
		||||
	runtime.RaceAcquire(addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func raceReleaseMerge(addr unsafe.Pointer) {
 | 
			
		||||
	runtime.RaceReleaseMerge(addr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func raceReadRange(addr unsafe.Pointer, len int) {
 | 
			
		||||
	runtime.RaceReadRange(addr, len)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func raceWriteRange(addr unsafe.Pointer, len int) {
 | 
			
		||||
	runtime.RaceWriteRange(addr, len)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										25
									
								
								vendor/golang.org/x/sys/windows/race0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								vendor/golang.org/x/sys/windows/race0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,25 +0,0 @@
 | 
			
		||||
// Copyright 2012 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows,!race
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"unsafe"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const raceenabled = false
 | 
			
		||||
 | 
			
		||||
func raceAcquire(addr unsafe.Pointer) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func raceReleaseMerge(addr unsafe.Pointer) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func raceReadRange(addr unsafe.Pointer, len int) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func raceWriteRange(addr unsafe.Pointer, len int) {
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1396
									
								
								vendor/golang.org/x/sys/windows/security_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1396
									
								
								vendor/golang.org/x/sys/windows/security_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										229
									
								
								vendor/golang.org/x/sys/windows/service.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										229
									
								
								vendor/golang.org/x/sys/windows/service.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,229 +0,0 @@
 | 
			
		||||
// Copyright 2012 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	SC_MANAGER_CONNECT            = 1
 | 
			
		||||
	SC_MANAGER_CREATE_SERVICE     = 2
 | 
			
		||||
	SC_MANAGER_ENUMERATE_SERVICE  = 4
 | 
			
		||||
	SC_MANAGER_LOCK               = 8
 | 
			
		||||
	SC_MANAGER_QUERY_LOCK_STATUS  = 16
 | 
			
		||||
	SC_MANAGER_MODIFY_BOOT_CONFIG = 32
 | 
			
		||||
	SC_MANAGER_ALL_ACCESS         = 0xf003f
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//sys	OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	SERVICE_KERNEL_DRIVER       = 1
 | 
			
		||||
	SERVICE_FILE_SYSTEM_DRIVER  = 2
 | 
			
		||||
	SERVICE_ADAPTER             = 4
 | 
			
		||||
	SERVICE_RECOGNIZER_DRIVER   = 8
 | 
			
		||||
	SERVICE_WIN32_OWN_PROCESS   = 16
 | 
			
		||||
	SERVICE_WIN32_SHARE_PROCESS = 32
 | 
			
		||||
	SERVICE_WIN32               = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS
 | 
			
		||||
	SERVICE_INTERACTIVE_PROCESS = 256
 | 
			
		||||
	SERVICE_DRIVER              = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER
 | 
			
		||||
	SERVICE_TYPE_ALL            = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS
 | 
			
		||||
 | 
			
		||||
	SERVICE_BOOT_START   = 0
 | 
			
		||||
	SERVICE_SYSTEM_START = 1
 | 
			
		||||
	SERVICE_AUTO_START   = 2
 | 
			
		||||
	SERVICE_DEMAND_START = 3
 | 
			
		||||
	SERVICE_DISABLED     = 4
 | 
			
		||||
 | 
			
		||||
	SERVICE_ERROR_IGNORE   = 0
 | 
			
		||||
	SERVICE_ERROR_NORMAL   = 1
 | 
			
		||||
	SERVICE_ERROR_SEVERE   = 2
 | 
			
		||||
	SERVICE_ERROR_CRITICAL = 3
 | 
			
		||||
 | 
			
		||||
	SC_STATUS_PROCESS_INFO = 0
 | 
			
		||||
 | 
			
		||||
	SC_ACTION_NONE        = 0
 | 
			
		||||
	SC_ACTION_RESTART     = 1
 | 
			
		||||
	SC_ACTION_REBOOT      = 2
 | 
			
		||||
	SC_ACTION_RUN_COMMAND = 3
 | 
			
		||||
 | 
			
		||||
	SERVICE_STOPPED          = 1
 | 
			
		||||
	SERVICE_START_PENDING    = 2
 | 
			
		||||
	SERVICE_STOP_PENDING     = 3
 | 
			
		||||
	SERVICE_RUNNING          = 4
 | 
			
		||||
	SERVICE_CONTINUE_PENDING = 5
 | 
			
		||||
	SERVICE_PAUSE_PENDING    = 6
 | 
			
		||||
	SERVICE_PAUSED           = 7
 | 
			
		||||
	SERVICE_NO_CHANGE        = 0xffffffff
 | 
			
		||||
 | 
			
		||||
	SERVICE_ACCEPT_STOP                  = 1
 | 
			
		||||
	SERVICE_ACCEPT_PAUSE_CONTINUE        = 2
 | 
			
		||||
	SERVICE_ACCEPT_SHUTDOWN              = 4
 | 
			
		||||
	SERVICE_ACCEPT_PARAMCHANGE           = 8
 | 
			
		||||
	SERVICE_ACCEPT_NETBINDCHANGE         = 16
 | 
			
		||||
	SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32
 | 
			
		||||
	SERVICE_ACCEPT_POWEREVENT            = 64
 | 
			
		||||
	SERVICE_ACCEPT_SESSIONCHANGE         = 128
 | 
			
		||||
 | 
			
		||||
	SERVICE_CONTROL_STOP                  = 1
 | 
			
		||||
	SERVICE_CONTROL_PAUSE                 = 2
 | 
			
		||||
	SERVICE_CONTROL_CONTINUE              = 3
 | 
			
		||||
	SERVICE_CONTROL_INTERROGATE           = 4
 | 
			
		||||
	SERVICE_CONTROL_SHUTDOWN              = 5
 | 
			
		||||
	SERVICE_CONTROL_PARAMCHANGE           = 6
 | 
			
		||||
	SERVICE_CONTROL_NETBINDADD            = 7
 | 
			
		||||
	SERVICE_CONTROL_NETBINDREMOVE         = 8
 | 
			
		||||
	SERVICE_CONTROL_NETBINDENABLE         = 9
 | 
			
		||||
	SERVICE_CONTROL_NETBINDDISABLE        = 10
 | 
			
		||||
	SERVICE_CONTROL_DEVICEEVENT           = 11
 | 
			
		||||
	SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12
 | 
			
		||||
	SERVICE_CONTROL_POWEREVENT            = 13
 | 
			
		||||
	SERVICE_CONTROL_SESSIONCHANGE         = 14
 | 
			
		||||
 | 
			
		||||
	SERVICE_ACTIVE    = 1
 | 
			
		||||
	SERVICE_INACTIVE  = 2
 | 
			
		||||
	SERVICE_STATE_ALL = 3
 | 
			
		||||
 | 
			
		||||
	SERVICE_QUERY_CONFIG         = 1
 | 
			
		||||
	SERVICE_CHANGE_CONFIG        = 2
 | 
			
		||||
	SERVICE_QUERY_STATUS         = 4
 | 
			
		||||
	SERVICE_ENUMERATE_DEPENDENTS = 8
 | 
			
		||||
	SERVICE_START                = 16
 | 
			
		||||
	SERVICE_STOP                 = 32
 | 
			
		||||
	SERVICE_PAUSE_CONTINUE       = 64
 | 
			
		||||
	SERVICE_INTERROGATE          = 128
 | 
			
		||||
	SERVICE_USER_DEFINED_CONTROL = 256
 | 
			
		||||
	SERVICE_ALL_ACCESS           = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL
 | 
			
		||||
 | 
			
		||||
	SERVICE_RUNS_IN_SYSTEM_PROCESS = 1
 | 
			
		||||
 | 
			
		||||
	SERVICE_CONFIG_DESCRIPTION              = 1
 | 
			
		||||
	SERVICE_CONFIG_FAILURE_ACTIONS          = 2
 | 
			
		||||
	SERVICE_CONFIG_DELAYED_AUTO_START_INFO  = 3
 | 
			
		||||
	SERVICE_CONFIG_FAILURE_ACTIONS_FLAG     = 4
 | 
			
		||||
	SERVICE_CONFIG_SERVICE_SID_INFO         = 5
 | 
			
		||||
	SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO = 6
 | 
			
		||||
	SERVICE_CONFIG_PRESHUTDOWN_INFO         = 7
 | 
			
		||||
	SERVICE_CONFIG_TRIGGER_INFO             = 8
 | 
			
		||||
	SERVICE_CONFIG_PREFERRED_NODE           = 9
 | 
			
		||||
	SERVICE_CONFIG_LAUNCH_PROTECTED         = 12
 | 
			
		||||
 | 
			
		||||
	SERVICE_SID_TYPE_NONE         = 0
 | 
			
		||||
	SERVICE_SID_TYPE_UNRESTRICTED = 1
 | 
			
		||||
	SERVICE_SID_TYPE_RESTRICTED   = 2 | SERVICE_SID_TYPE_UNRESTRICTED
 | 
			
		||||
 | 
			
		||||
	SC_ENUM_PROCESS_INFO = 0
 | 
			
		||||
 | 
			
		||||
	SERVICE_NOTIFY_STATUS_CHANGE    = 2
 | 
			
		||||
	SERVICE_NOTIFY_STOPPED          = 0x00000001
 | 
			
		||||
	SERVICE_NOTIFY_START_PENDING    = 0x00000002
 | 
			
		||||
	SERVICE_NOTIFY_STOP_PENDING     = 0x00000004
 | 
			
		||||
	SERVICE_NOTIFY_RUNNING          = 0x00000008
 | 
			
		||||
	SERVICE_NOTIFY_CONTINUE_PENDING = 0x00000010
 | 
			
		||||
	SERVICE_NOTIFY_PAUSE_PENDING    = 0x00000020
 | 
			
		||||
	SERVICE_NOTIFY_PAUSED           = 0x00000040
 | 
			
		||||
	SERVICE_NOTIFY_CREATED          = 0x00000080
 | 
			
		||||
	SERVICE_NOTIFY_DELETED          = 0x00000100
 | 
			
		||||
	SERVICE_NOTIFY_DELETE_PENDING   = 0x00000200
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type SERVICE_STATUS struct {
 | 
			
		||||
	ServiceType             uint32
 | 
			
		||||
	CurrentState            uint32
 | 
			
		||||
	ControlsAccepted        uint32
 | 
			
		||||
	Win32ExitCode           uint32
 | 
			
		||||
	ServiceSpecificExitCode uint32
 | 
			
		||||
	CheckPoint              uint32
 | 
			
		||||
	WaitHint                uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SERVICE_TABLE_ENTRY struct {
 | 
			
		||||
	ServiceName *uint16
 | 
			
		||||
	ServiceProc uintptr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type QUERY_SERVICE_CONFIG struct {
 | 
			
		||||
	ServiceType      uint32
 | 
			
		||||
	StartType        uint32
 | 
			
		||||
	ErrorControl     uint32
 | 
			
		||||
	BinaryPathName   *uint16
 | 
			
		||||
	LoadOrderGroup   *uint16
 | 
			
		||||
	TagId            uint32
 | 
			
		||||
	Dependencies     *uint16
 | 
			
		||||
	ServiceStartName *uint16
 | 
			
		||||
	DisplayName      *uint16
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SERVICE_DESCRIPTION struct {
 | 
			
		||||
	Description *uint16
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SERVICE_DELAYED_AUTO_START_INFO struct {
 | 
			
		||||
	IsDelayedAutoStartUp uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SERVICE_STATUS_PROCESS struct {
 | 
			
		||||
	ServiceType             uint32
 | 
			
		||||
	CurrentState            uint32
 | 
			
		||||
	ControlsAccepted        uint32
 | 
			
		||||
	Win32ExitCode           uint32
 | 
			
		||||
	ServiceSpecificExitCode uint32
 | 
			
		||||
	CheckPoint              uint32
 | 
			
		||||
	WaitHint                uint32
 | 
			
		||||
	ProcessId               uint32
 | 
			
		||||
	ServiceFlags            uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ENUM_SERVICE_STATUS_PROCESS struct {
 | 
			
		||||
	ServiceName          *uint16
 | 
			
		||||
	DisplayName          *uint16
 | 
			
		||||
	ServiceStatusProcess SERVICE_STATUS_PROCESS
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SERVICE_NOTIFY struct {
 | 
			
		||||
	Version               uint32
 | 
			
		||||
	NotifyCallback        uintptr
 | 
			
		||||
	Context               uintptr
 | 
			
		||||
	NotificationStatus    uint32
 | 
			
		||||
	ServiceStatus         SERVICE_STATUS_PROCESS
 | 
			
		||||
	NotificationTriggered uint32
 | 
			
		||||
	ServiceNames          *uint16
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SERVICE_FAILURE_ACTIONS struct {
 | 
			
		||||
	ResetPeriod  uint32
 | 
			
		||||
	RebootMsg    *uint16
 | 
			
		||||
	Command      *uint16
 | 
			
		||||
	ActionsCount uint32
 | 
			
		||||
	Actions      *SC_ACTION
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type SC_ACTION struct {
 | 
			
		||||
	Type  uint32
 | 
			
		||||
	Delay uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type QUERY_SERVICE_LOCK_STATUS struct {
 | 
			
		||||
	IsLocked     uint32
 | 
			
		||||
	LockOwner    *uint16
 | 
			
		||||
	LockDuration uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//sys	CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle
 | 
			
		||||
//sys	CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW
 | 
			
		||||
//sys	OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW
 | 
			
		||||
//sys	DeleteService(service Handle) (err error) = advapi32.DeleteService
 | 
			
		||||
//sys	StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW
 | 
			
		||||
//sys	QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus
 | 
			
		||||
//sys	QueryServiceLockStatus(mgr Handle, lockStatus *QUERY_SERVICE_LOCK_STATUS, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceLockStatusW
 | 
			
		||||
//sys	ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService
 | 
			
		||||
//sys	StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW
 | 
			
		||||
//sys	SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus
 | 
			
		||||
//sys	ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW
 | 
			
		||||
//sys	QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW
 | 
			
		||||
//sys	ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W
 | 
			
		||||
//sys	QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W
 | 
			
		||||
//sys	EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW
 | 
			
		||||
//sys	QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx
 | 
			
		||||
//sys	NotifyServiceStatusChange(service Handle, notifyMask uint32, notifier *SERVICE_NOTIFY) (ret error) = advapi32.NotifyServiceStatusChangeW
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/windows/str.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/windows/str.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,22 +0,0 @@
 | 
			
		||||
// Copyright 2009 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
func itoa(val int) string { // do it here rather than with fmt to avoid dependency
 | 
			
		||||
	if val < 0 {
 | 
			
		||||
		return "-" + itoa(-val)
 | 
			
		||||
	}
 | 
			
		||||
	var buf [32]byte // big enough for int64
 | 
			
		||||
	i := len(buf) - 1
 | 
			
		||||
	for val >= 10 {
 | 
			
		||||
		buf[i] = byte(val%10 + '0')
 | 
			
		||||
		i--
 | 
			
		||||
		val /= 10
 | 
			
		||||
	}
 | 
			
		||||
	buf[i] = byte(val + '0')
 | 
			
		||||
	return string(buf[i:])
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								vendor/golang.org/x/sys/windows/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										74
									
								
								vendor/golang.org/x/sys/windows/syscall.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,74 +0,0 @@
 | 
			
		||||
// Copyright 2009 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
// Package windows contains an interface to the low-level operating system
 | 
			
		||||
// primitives. OS details vary depending on the underlying system, and
 | 
			
		||||
// by default, godoc will display the OS-specific documentation for the current
 | 
			
		||||
// system. If you want godoc to display syscall documentation for another
 | 
			
		||||
// system, set $GOOS and $GOARCH to the desired system. For example, if
 | 
			
		||||
// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS
 | 
			
		||||
// to freebsd and $GOARCH to arm.
 | 
			
		||||
//
 | 
			
		||||
// The primary use of this package is inside other packages that provide a more
 | 
			
		||||
// portable interface to the system, such as "os", "time" and "net".  Use
 | 
			
		||||
// those packages rather than this one if you can.
 | 
			
		||||
//
 | 
			
		||||
// For details of the functions and data types in this package consult
 | 
			
		||||
// the manuals for the appropriate operating system.
 | 
			
		||||
//
 | 
			
		||||
// These calls return err == nil to indicate success; otherwise
 | 
			
		||||
// err represents an operating system error describing the failure and
 | 
			
		||||
// holds a value of type syscall.Errno.
 | 
			
		||||
package windows // import "golang.org/x/sys/windows"
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ByteSliceFromString returns a NUL-terminated slice of bytes
 | 
			
		||||
// containing the text of s. If s contains a NUL byte at any
 | 
			
		||||
// location, it returns (nil, syscall.EINVAL).
 | 
			
		||||
func ByteSliceFromString(s string) ([]byte, error) {
 | 
			
		||||
	for i := 0; i < len(s); i++ {
 | 
			
		||||
		if s[i] == 0 {
 | 
			
		||||
			return nil, syscall.EINVAL
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	a := make([]byte, len(s)+1)
 | 
			
		||||
	copy(a, s)
 | 
			
		||||
	return a, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BytePtrFromString returns a pointer to a NUL-terminated array of
 | 
			
		||||
// bytes containing the text of s. If s contains a NUL byte at any
 | 
			
		||||
// location, it returns (nil, syscall.EINVAL).
 | 
			
		||||
func BytePtrFromString(s string) (*byte, error) {
 | 
			
		||||
	a, err := ByteSliceFromString(s)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return &a[0], nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Single-word zero for use when we need a valid pointer to 0 bytes.
 | 
			
		||||
// See mksyscall.pl.
 | 
			
		||||
var _zero uintptr
 | 
			
		||||
 | 
			
		||||
func (ts *Timespec) Unix() (sec int64, nsec int64) {
 | 
			
		||||
	return int64(ts.Sec), int64(ts.Nsec)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tv *Timeval) Unix() (sec int64, nsec int64) {
 | 
			
		||||
	return int64(tv.Sec), int64(tv.Usec) * 1000
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (ts *Timespec) Nano() int64 {
 | 
			
		||||
	return int64(ts.Sec)*1e9 + int64(ts.Nsec)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tv *Timeval) Nano() int64 {
 | 
			
		||||
	return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1453
									
								
								vendor/golang.org/x/sys/windows/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1453
									
								
								vendor/golang.org/x/sys/windows/syscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1777
									
								
								vendor/golang.org/x/sys/windows/types_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1777
									
								
								vendor/golang.org/x/sys/windows/types_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_386.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,22 +0,0 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
type WSAData struct {
 | 
			
		||||
	Version      uint16
 | 
			
		||||
	HighVersion  uint16
 | 
			
		||||
	Description  [WSADESCRIPTION_LEN + 1]byte
 | 
			
		||||
	SystemStatus [WSASYS_STATUS_LEN + 1]byte
 | 
			
		||||
	MaxSockets   uint16
 | 
			
		||||
	MaxUdpDg     uint16
 | 
			
		||||
	VendorInfo   *byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Servent struct {
 | 
			
		||||
	Name    *byte
 | 
			
		||||
	Aliases **byte
 | 
			
		||||
	Port    uint16
 | 
			
		||||
	Proto   *byte
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_amd64.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,22 +0,0 @@
 | 
			
		||||
// Copyright 2011 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
type WSAData struct {
 | 
			
		||||
	Version      uint16
 | 
			
		||||
	HighVersion  uint16
 | 
			
		||||
	MaxSockets   uint16
 | 
			
		||||
	MaxUdpDg     uint16
 | 
			
		||||
	VendorInfo   *byte
 | 
			
		||||
	Description  [WSADESCRIPTION_LEN + 1]byte
 | 
			
		||||
	SystemStatus [WSASYS_STATUS_LEN + 1]byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Servent struct {
 | 
			
		||||
	Name    *byte
 | 
			
		||||
	Aliases **byte
 | 
			
		||||
	Proto   *byte
 | 
			
		||||
	Port    uint16
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/sys/windows/types_windows_arm.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,22 +0,0 @@
 | 
			
		||||
// Copyright 2018 The Go Authors. All rights reserved.
 | 
			
		||||
// Use of this source code is governed by a BSD-style
 | 
			
		||||
// license that can be found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
type WSAData struct {
 | 
			
		||||
	Version      uint16
 | 
			
		||||
	HighVersion  uint16
 | 
			
		||||
	Description  [WSADESCRIPTION_LEN + 1]byte
 | 
			
		||||
	SystemStatus [WSASYS_STATUS_LEN + 1]byte
 | 
			
		||||
	MaxSockets   uint16
 | 
			
		||||
	MaxUdpDg     uint16
 | 
			
		||||
	VendorInfo   *byte
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type Servent struct {
 | 
			
		||||
	Name    *byte
 | 
			
		||||
	Aliases **byte
 | 
			
		||||
	Port    uint16
 | 
			
		||||
	Proto   *byte
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6853
									
								
								vendor/golang.org/x/sys/windows/zerrors_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6853
									
								
								vendor/golang.org/x/sys/windows/zerrors_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										149
									
								
								vendor/golang.org/x/sys/windows/zknownfolderids_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										149
									
								
								vendor/golang.org/x/sys/windows/zknownfolderids_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,149 +0,0 @@
 | 
			
		||||
// Code generated by 'mkknownfolderids.bash'; DO NOT EDIT.
 | 
			
		||||
 | 
			
		||||
package windows
 | 
			
		||||
 | 
			
		||||
type KNOWNFOLDERID GUID
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	FOLDERID_NetworkFolder          = &KNOWNFOLDERID{0xd20beec4, 0x5ca8, 0x4905, [8]byte{0xae, 0x3b, 0xbf, 0x25, 0x1e, 0xa0, 0x9b, 0x53}}
 | 
			
		||||
	FOLDERID_ComputerFolder         = &KNOWNFOLDERID{0x0ac0837c, 0xbbf8, 0x452a, [8]byte{0x85, 0x0d, 0x79, 0xd0, 0x8e, 0x66, 0x7c, 0xa7}}
 | 
			
		||||
	FOLDERID_InternetFolder         = &KNOWNFOLDERID{0x4d9f7874, 0x4e0c, 0x4904, [8]byte{0x96, 0x7b, 0x40, 0xb0, 0xd2, 0x0c, 0x3e, 0x4b}}
 | 
			
		||||
	FOLDERID_ControlPanelFolder     = &KNOWNFOLDERID{0x82a74aeb, 0xaeb4, 0x465c, [8]byte{0xa0, 0x14, 0xd0, 0x97, 0xee, 0x34, 0x6d, 0x63}}
 | 
			
		||||
	FOLDERID_PrintersFolder         = &KNOWNFOLDERID{0x76fc4e2d, 0xd6ad, 0x4519, [8]byte{0xa6, 0x63, 0x37, 0xbd, 0x56, 0x06, 0x81, 0x85}}
 | 
			
		||||
	FOLDERID_SyncManagerFolder      = &KNOWNFOLDERID{0x43668bf8, 0xc14e, 0x49b2, [8]byte{0x97, 0xc9, 0x74, 0x77, 0x84, 0xd7, 0x84, 0xb7}}
 | 
			
		||||
	FOLDERID_SyncSetupFolder        = &KNOWNFOLDERID{0x0f214138, 0xb1d3, 0x4a90, [8]byte{0xbb, 0xa9, 0x27, 0xcb, 0xc0, 0xc5, 0x38, 0x9a}}
 | 
			
		||||
	FOLDERID_ConflictFolder         = &KNOWNFOLDERID{0x4bfefb45, 0x347d, 0x4006, [8]byte{0xa5, 0xbe, 0xac, 0x0c, 0xb0, 0x56, 0x71, 0x92}}
 | 
			
		||||
	FOLDERID_SyncResultsFolder      = &KNOWNFOLDERID{0x289a9a43, 0xbe44, 0x4057, [8]byte{0xa4, 0x1b, 0x58, 0x7a, 0x76, 0xd7, 0xe7, 0xf9}}
 | 
			
		||||
	FOLDERID_RecycleBinFolder       = &KNOWNFOLDERID{0xb7534046, 0x3ecb, 0x4c18, [8]byte{0xbe, 0x4e, 0x64, 0xcd, 0x4c, 0xb7, 0xd6, 0xac}}
 | 
			
		||||
	FOLDERID_ConnectionsFolder      = &KNOWNFOLDERID{0x6f0cd92b, 0x2e97, 0x45d1, [8]byte{0x88, 0xff, 0xb0, 0xd1, 0x86, 0xb8, 0xde, 0xdd}}
 | 
			
		||||
	FOLDERID_Fonts                  = &KNOWNFOLDERID{0xfd228cb7, 0xae11, 0x4ae3, [8]byte{0x86, 0x4c, 0x16, 0xf3, 0x91, 0x0a, 0xb8, 0xfe}}
 | 
			
		||||
	FOLDERID_Desktop                = &KNOWNFOLDERID{0xb4bfcc3a, 0xdb2c, 0x424c, [8]byte{0xb0, 0x29, 0x7f, 0xe9, 0x9a, 0x87, 0xc6, 0x41}}
 | 
			
		||||
	FOLDERID_Startup                = &KNOWNFOLDERID{0xb97d20bb, 0xf46a, 0x4c97, [8]byte{0xba, 0x10, 0x5e, 0x36, 0x08, 0x43, 0x08, 0x54}}
 | 
			
		||||
	FOLDERID_Programs               = &KNOWNFOLDERID{0xa77f5d77, 0x2e2b, 0x44c3, [8]byte{0xa6, 0xa2, 0xab, 0xa6, 0x01, 0x05, 0x4a, 0x51}}
 | 
			
		||||
	FOLDERID_StartMenu              = &KNOWNFOLDERID{0x625b53c3, 0xab48, 0x4ec1, [8]byte{0xba, 0x1f, 0xa1, 0xef, 0x41, 0x46, 0xfc, 0x19}}
 | 
			
		||||
	FOLDERID_Recent                 = &KNOWNFOLDERID{0xae50c081, 0xebd2, 0x438a, [8]byte{0x86, 0x55, 0x8a, 0x09, 0x2e, 0x34, 0x98, 0x7a}}
 | 
			
		||||
	FOLDERID_SendTo                 = &KNOWNFOLDERID{0x8983036c, 0x27c0, 0x404b, [8]byte{0x8f, 0x08, 0x10, 0x2d, 0x10, 0xdc, 0xfd, 0x74}}
 | 
			
		||||
	FOLDERID_Documents              = &KNOWNFOLDERID{0xfdd39ad0, 0x238f, 0x46af, [8]byte{0xad, 0xb4, 0x6c, 0x85, 0x48, 0x03, 0x69, 0xc7}}
 | 
			
		||||
	FOLDERID_Favorites              = &KNOWNFOLDERID{0x1777f761, 0x68ad, 0x4d8a, [8]byte{0x87, 0xbd, 0x30, 0xb7, 0x59, 0xfa, 0x33, 0xdd}}
 | 
			
		||||
	FOLDERID_NetHood                = &KNOWNFOLDERID{0xc5abbf53, 0xe17f, 0x4121, [8]byte{0x89, 0x00, 0x86, 0x62, 0x6f, 0xc2, 0xc9, 0x73}}
 | 
			
		||||
	FOLDERID_PrintHood              = &KNOWNFOLDERID{0x9274bd8d, 0xcfd1, 0x41c3, [8]byte{0xb3, 0x5e, 0xb1, 0x3f, 0x55, 0xa7, 0x58, 0xf4}}
 | 
			
		||||
	FOLDERID_Templates              = &KNOWNFOLDERID{0xa63293e8, 0x664e, 0x48db, [8]byte{0xa0, 0x79, 0xdf, 0x75, 0x9e, 0x05, 0x09, 0xf7}}
 | 
			
		||||
	FOLDERID_CommonStartup          = &KNOWNFOLDERID{0x82a5ea35, 0xd9cd, 0x47c5, [8]byte{0x96, 0x29, 0xe1, 0x5d, 0x2f, 0x71, 0x4e, 0x6e}}
 | 
			
		||||
	FOLDERID_CommonPrograms         = &KNOWNFOLDERID{0x0139d44e, 0x6afe, 0x49f2, [8]byte{0x86, 0x90, 0x3d, 0xaf, 0xca, 0xe6, 0xff, 0xb8}}
 | 
			
		||||
	FOLDERID_CommonStartMenu        = &KNOWNFOLDERID{0xa4115719, 0xd62e, 0x491d, [8]byte{0xaa, 0x7c, 0xe7, 0x4b, 0x8b, 0xe3, 0xb0, 0x67}}
 | 
			
		||||
	FOLDERID_PublicDesktop          = &KNOWNFOLDERID{0xc4aa340d, 0xf20f, 0x4863, [8]byte{0xaf, 0xef, 0xf8, 0x7e, 0xf2, 0xe6, 0xba, 0x25}}
 | 
			
		||||
	FOLDERID_ProgramData            = &KNOWNFOLDERID{0x62ab5d82, 0xfdc1, 0x4dc3, [8]byte{0xa9, 0xdd, 0x07, 0x0d, 0x1d, 0x49, 0x5d, 0x97}}
 | 
			
		||||
	FOLDERID_CommonTemplates        = &KNOWNFOLDERID{0xb94237e7, 0x57ac, 0x4347, [8]byte{0x91, 0x51, 0xb0, 0x8c, 0x6c, 0x32, 0xd1, 0xf7}}
 | 
			
		||||
	FOLDERID_PublicDocuments        = &KNOWNFOLDERID{0xed4824af, 0xdce4, 0x45a8, [8]byte{0x81, 0xe2, 0xfc, 0x79, 0x65, 0x08, 0x36, 0x34}}
 | 
			
		||||
	FOLDERID_RoamingAppData         = &KNOWNFOLDERID{0x3eb685db, 0x65f9, 0x4cf6, [8]byte{0xa0, 0x3a, 0xe3, 0xef, 0x65, 0x72, 0x9f, 0x3d}}
 | 
			
		||||
	FOLDERID_LocalAppData           = &KNOWNFOLDERID{0xf1b32785, 0x6fba, 0x4fcf, [8]byte{0x9d, 0x55, 0x7b, 0x8e, 0x7f, 0x15, 0x70, 0x91}}
 | 
			
		||||
	FOLDERID_LocalAppDataLow        = &KNOWNFOLDERID{0xa520a1a4, 0x1780, 0x4ff6, [8]byte{0xbd, 0x18, 0x16, 0x73, 0x43, 0xc5, 0xaf, 0x16}}
 | 
			
		||||
	FOLDERID_InternetCache          = &KNOWNFOLDERID{0x352481e8, 0x33be, 0x4251, [8]byte{0xba, 0x85, 0x60, 0x07, 0xca, 0xed, 0xcf, 0x9d}}
 | 
			
		||||
	FOLDERID_Cookies                = &KNOWNFOLDERID{0x2b0f765d, 0xc0e9, 0x4171, [8]byte{0x90, 0x8e, 0x08, 0xa6, 0x11, 0xb8, 0x4f, 0xf6}}
 | 
			
		||||
	FOLDERID_History                = &KNOWNFOLDERID{0xd9dc8a3b, 0xb784, 0x432e, [8]byte{0xa7, 0x81, 0x5a, 0x11, 0x30, 0xa7, 0x59, 0x63}}
 | 
			
		||||
	FOLDERID_System                 = &KNOWNFOLDERID{0x1ac14e77, 0x02e7, 0x4e5d, [8]byte{0xb7, 0x44, 0x2e, 0xb1, 0xae, 0x51, 0x98, 0xb7}}
 | 
			
		||||
	FOLDERID_SystemX86              = &KNOWNFOLDERID{0xd65231b0, 0xb2f1, 0x4857, [8]byte{0xa4, 0xce, 0xa8, 0xe7, 0xc6, 0xea, 0x7d, 0x27}}
 | 
			
		||||
	FOLDERID_Windows                = &KNOWNFOLDERID{0xf38bf404, 0x1d43, 0x42f2, [8]byte{0x93, 0x05, 0x67, 0xde, 0x0b, 0x28, 0xfc, 0x23}}
 | 
			
		||||
	FOLDERID_Profile                = &KNOWNFOLDERID{0x5e6c858f, 0x0e22, 0x4760, [8]byte{0x9a, 0xfe, 0xea, 0x33, 0x17, 0xb6, 0x71, 0x73}}
 | 
			
		||||
	FOLDERID_Pictures               = &KNOWNFOLDERID{0x33e28130, 0x4e1e, 0x4676, [8]byte{0x83, 0x5a, 0x98, 0x39, 0x5c, 0x3b, 0xc3, 0xbb}}
 | 
			
		||||
	FOLDERID_ProgramFilesX86        = &KNOWNFOLDERID{0x7c5a40ef, 0xa0fb, 0x4bfc, [8]byte{0x87, 0x4a, 0xc0, 0xf2, 0xe0, 0xb9, 0xfa, 0x8e}}
 | 
			
		||||
	FOLDERID_ProgramFilesCommonX86  = &KNOWNFOLDERID{0xde974d24, 0xd9c6, 0x4d3e, [8]byte{0xbf, 0x91, 0xf4, 0x45, 0x51, 0x20, 0xb9, 0x17}}
 | 
			
		||||
	FOLDERID_ProgramFilesX64        = &KNOWNFOLDERID{0x6d809377, 0x6af0, 0x444b, [8]byte{0x89, 0x57, 0xa3, 0x77, 0x3f, 0x02, 0x20, 0x0e}}
 | 
			
		||||
	FOLDERID_ProgramFilesCommonX64  = &KNOWNFOLDERID{0x6365d5a7, 0x0f0d, 0x45e5, [8]byte{0x87, 0xf6, 0x0d, 0xa5, 0x6b, 0x6a, 0x4f, 0x7d}}
 | 
			
		||||
	FOLDERID_ProgramFiles           = &KNOWNFOLDERID{0x905e63b6, 0xc1bf, 0x494e, [8]byte{0xb2, 0x9c, 0x65, 0xb7, 0x32, 0xd3, 0xd2, 0x1a}}
 | 
			
		||||
	FOLDERID_ProgramFilesCommon     = &KNOWNFOLDERID{0xf7f1ed05, 0x9f6d, 0x47a2, [8]byte{0xaa, 0xae, 0x29, 0xd3, 0x17, 0xc6, 0xf0, 0x66}}
 | 
			
		||||
	FOLDERID_UserProgramFiles       = &KNOWNFOLDERID{0x5cd7aee2, 0x2219, 0x4a67, [8]byte{0xb8, 0x5d, 0x6c, 0x9c, 0xe1, 0x56, 0x60, 0xcb}}
 | 
			
		||||
	FOLDERID_UserProgramFilesCommon = &KNOWNFOLDERID{0xbcbd3057, 0xca5c, 0x4622, [8]byte{0xb4, 0x2d, 0xbc, 0x56, 0xdb, 0x0a, 0xe5, 0x16}}
 | 
			
		||||
	FOLDERID_AdminTools             = &KNOWNFOLDERID{0x724ef170, 0xa42d, 0x4fef, [8]byte{0x9f, 0x26, 0xb6, 0x0e, 0x84, 0x6f, 0xba, 0x4f}}
 | 
			
		||||
	FOLDERID_CommonAdminTools       = &KNOWNFOLDERID{0xd0384e7d, 0xbac3, 0x4797, [8]byte{0x8f, 0x14, 0xcb, 0xa2, 0x29, 0xb3, 0x92, 0xb5}}
 | 
			
		||||
	FOLDERID_Music                  = &KNOWNFOLDERID{0x4bd8d571, 0x6d19, 0x48d3, [8]byte{0xbe, 0x97, 0x42, 0x22, 0x20, 0x08, 0x0e, 0x43}}
 | 
			
		||||
	FOLDERID_Videos                 = &KNOWNFOLDERID{0x18989b1d, 0x99b5, 0x455b, [8]byte{0x84, 0x1c, 0xab, 0x7c, 0x74, 0xe4, 0xdd, 0xfc}}
 | 
			
		||||
	FOLDERID_Ringtones              = &KNOWNFOLDERID{0xc870044b, 0xf49e, 0x4126, [8]byte{0xa9, 0xc3, 0xb5, 0x2a, 0x1f, 0xf4, 0x11, 0xe8}}
 | 
			
		||||
	FOLDERID_PublicPictures         = &KNOWNFOLDERID{0xb6ebfb86, 0x6907, 0x413c, [8]byte{0x9a, 0xf7, 0x4f, 0xc2, 0xab, 0xf0, 0x7c, 0xc5}}
 | 
			
		||||
	FOLDERID_PublicMusic            = &KNOWNFOLDERID{0x3214fab5, 0x9757, 0x4298, [8]byte{0xbb, 0x61, 0x92, 0xa9, 0xde, 0xaa, 0x44, 0xff}}
 | 
			
		||||
	FOLDERID_PublicVideos           = &KNOWNFOLDERID{0x2400183a, 0x6185, 0x49fb, [8]byte{0xa2, 0xd8, 0x4a, 0x39, 0x2a, 0x60, 0x2b, 0xa3}}
 | 
			
		||||
	FOLDERID_PublicRingtones        = &KNOWNFOLDERID{0xe555ab60, 0x153b, 0x4d17, [8]byte{0x9f, 0x04, 0xa5, 0xfe, 0x99, 0xfc, 0x15, 0xec}}
 | 
			
		||||
	FOLDERID_ResourceDir            = &KNOWNFOLDERID{0x8ad10c31, 0x2adb, 0x4296, [8]byte{0xa8, 0xf7, 0xe4, 0x70, 0x12, 0x32, 0xc9, 0x72}}
 | 
			
		||||
	FOLDERID_LocalizedResourcesDir  = &KNOWNFOLDERID{0x2a00375e, 0x224c, 0x49de, [8]byte{0xb8, 0xd1, 0x44, 0x0d, 0xf7, 0xef, 0x3d, 0xdc}}
 | 
			
		||||
	FOLDERID_CommonOEMLinks         = &KNOWNFOLDERID{0xc1bae2d0, 0x10df, 0x4334, [8]byte{0xbe, 0xdd, 0x7a, 0xa2, 0x0b, 0x22, 0x7a, 0x9d}}
 | 
			
		||||
	FOLDERID_CDBurning              = &KNOWNFOLDERID{0x9e52ab10, 0xf80d, 0x49df, [8]byte{0xac, 0xb8, 0x43, 0x30, 0xf5, 0x68, 0x78, 0x55}}
 | 
			
		||||
	FOLDERID_UserProfiles           = &KNOWNFOLDERID{0x0762d272, 0xc50a, 0x4bb0, [8]byte{0xa3, 0x82, 0x69, 0x7d, 0xcd, 0x72, 0x9b, 0x80}}
 | 
			
		||||
	FOLDERID_Playlists              = &KNOWNFOLDERID{0xde92c1c7, 0x837f, 0x4f69, [8]byte{0xa3, 0xbb, 0x86, 0xe6, 0x31, 0x20, 0x4a, 0x23}}
 | 
			
		||||
	FOLDERID_SamplePlaylists        = &KNOWNFOLDERID{0x15ca69b3, 0x30ee, 0x49c1, [8]byte{0xac, 0xe1, 0x6b, 0x5e, 0xc3, 0x72, 0xaf, 0xb5}}
 | 
			
		||||
	FOLDERID_SampleMusic            = &KNOWNFOLDERID{0xb250c668, 0xf57d, 0x4ee1, [8]byte{0xa6, 0x3c, 0x29, 0x0e, 0xe7, 0xd1, 0xaa, 0x1f}}
 | 
			
		||||
	FOLDERID_SamplePictures         = &KNOWNFOLDERID{0xc4900540, 0x2379, 0x4c75, [8]byte{0x84, 0x4b, 0x64, 0xe6, 0xfa, 0xf8, 0x71, 0x6b}}
 | 
			
		||||
	FOLDERID_SampleVideos           = &KNOWNFOLDERID{0x859ead94, 0x2e85, 0x48ad, [8]byte{0xa7, 0x1a, 0x09, 0x69, 0xcb, 0x56, 0xa6, 0xcd}}
 | 
			
		||||
	FOLDERID_PhotoAlbums            = &KNOWNFOLDERID{0x69d2cf90, 0xfc33, 0x4fb7, [8]byte{0x9a, 0x0c, 0xeb, 0xb0, 0xf0, 0xfc, 0xb4, 0x3c}}
 | 
			
		||||
	FOLDERID_Public                 = &KNOWNFOLDERID{0xdfdf76a2, 0xc82a, 0x4d63, [8]byte{0x90, 0x6a, 0x56, 0x44, 0xac, 0x45, 0x73, 0x85}}
 | 
			
		||||
	FOLDERID_ChangeRemovePrograms   = &KNOWNFOLDERID{0xdf7266ac, 0x9274, 0x4867, [8]byte{0x8d, 0x55, 0x3b, 0xd6, 0x61, 0xde, 0x87, 0x2d}}
 | 
			
		||||
	FOLDERID_AppUpdates             = &KNOWNFOLDERID{0xa305ce99, 0xf527, 0x492b, [8]byte{0x8b, 0x1a, 0x7e, 0x76, 0xfa, 0x98, 0xd6, 0xe4}}
 | 
			
		||||
	FOLDERID_AddNewPrograms         = &KNOWNFOLDERID{0xde61d971, 0x5ebc, 0x4f02, [8]byte{0xa3, 0xa9, 0x6c, 0x82, 0x89, 0x5e, 0x5c, 0x04}}
 | 
			
		||||
	FOLDERID_Downloads              = &KNOWNFOLDERID{0x374de290, 0x123f, 0x4565, [8]byte{0x91, 0x64, 0x39, 0xc4, 0x92, 0x5e, 0x46, 0x7b}}
 | 
			
		||||
	FOLDERID_PublicDownloads        = &KNOWNFOLDERID{0x3d644c9b, 0x1fb8, 0x4f30, [8]byte{0x9b, 0x45, 0xf6, 0x70, 0x23, 0x5f, 0x79, 0xc0}}
 | 
			
		||||
	FOLDERID_SavedSearches          = &KNOWNFOLDERID{0x7d1d3a04, 0xdebb, 0x4115, [8]byte{0x95, 0xcf, 0x2f, 0x29, 0xda, 0x29, 0x20, 0xda}}
 | 
			
		||||
	FOLDERID_QuickLaunch            = &KNOWNFOLDERID{0x52a4f021, 0x7b75, 0x48a9, [8]byte{0x9f, 0x6b, 0x4b, 0x87, 0xa2, 0x10, 0xbc, 0x8f}}
 | 
			
		||||
	FOLDERID_Contacts               = &KNOWNFOLDERID{0x56784854, 0xc6cb, 0x462b, [8]byte{0x81, 0x69, 0x88, 0xe3, 0x50, 0xac, 0xb8, 0x82}}
 | 
			
		||||
	FOLDERID_SidebarParts           = &KNOWNFOLDERID{0xa75d362e, 0x50fc, 0x4fb7, [8]byte{0xac, 0x2c, 0xa8, 0xbe, 0xaa, 0x31, 0x44, 0x93}}
 | 
			
		||||
	FOLDERID_SidebarDefaultParts    = &KNOWNFOLDERID{0x7b396e54, 0x9ec5, 0x4300, [8]byte{0xbe, 0x0a, 0x24, 0x82, 0xeb, 0xae, 0x1a, 0x26}}
 | 
			
		||||
	FOLDERID_PublicGameTasks        = &KNOWNFOLDERID{0xdebf2536, 0xe1a8, 0x4c59, [8]byte{0xb6, 0xa2, 0x41, 0x45, 0x86, 0x47, 0x6a, 0xea}}
 | 
			
		||||
	FOLDERID_GameTasks              = &KNOWNFOLDERID{0x054fae61, 0x4dd8, 0x4787, [8]byte{0x80, 0xb6, 0x09, 0x02, 0x20, 0xc4, 0xb7, 0x00}}
 | 
			
		||||
	FOLDERID_SavedGames             = &KNOWNFOLDERID{0x4c5c32ff, 0xbb9d, 0x43b0, [8]byte{0xb5, 0xb4, 0x2d, 0x72, 0xe5, 0x4e, 0xaa, 0xa4}}
 | 
			
		||||
	FOLDERID_Games                  = &KNOWNFOLDERID{0xcac52c1a, 0xb53d, 0x4edc, [8]byte{0x92, 0xd7, 0x6b, 0x2e, 0x8a, 0xc1, 0x94, 0x34}}
 | 
			
		||||
	FOLDERID_SEARCH_MAPI            = &KNOWNFOLDERID{0x98ec0e18, 0x2098, 0x4d44, [8]byte{0x86, 0x44, 0x66, 0x97, 0x93, 0x15, 0xa2, 0x81}}
 | 
			
		||||
	FOLDERID_SEARCH_CSC             = &KNOWNFOLDERID{0xee32e446, 0x31ca, 0x4aba, [8]byte{0x81, 0x4f, 0xa5, 0xeb, 0xd2, 0xfd, 0x6d, 0x5e}}
 | 
			
		||||
	FOLDERID_Links                  = &KNOWNFOLDERID{0xbfb9d5e0, 0xc6a9, 0x404c, [8]byte{0xb2, 0xb2, 0xae, 0x6d, 0xb6, 0xaf, 0x49, 0x68}}
 | 
			
		||||
	FOLDERID_UsersFiles             = &KNOWNFOLDERID{0xf3ce0f7c, 0x4901, 0x4acc, [8]byte{0x86, 0x48, 0xd5, 0xd4, 0x4b, 0x04, 0xef, 0x8f}}
 | 
			
		||||
	FOLDERID_UsersLibraries         = &KNOWNFOLDERID{0xa302545d, 0xdeff, 0x464b, [8]byte{0xab, 0xe8, 0x61, 0xc8, 0x64, 0x8d, 0x93, 0x9b}}
 | 
			
		||||
	FOLDERID_SearchHome             = &KNOWNFOLDERID{0x190337d1, 0xb8ca, 0x4121, [8]byte{0xa6, 0x39, 0x6d, 0x47, 0x2d, 0x16, 0x97, 0x2a}}
 | 
			
		||||
	FOLDERID_OriginalImages         = &KNOWNFOLDERID{0x2c36c0aa, 0x5812, 0x4b87, [8]byte{0xbf, 0xd0, 0x4c, 0xd0, 0xdf, 0xb1, 0x9b, 0x39}}
 | 
			
		||||
	FOLDERID_DocumentsLibrary       = &KNOWNFOLDERID{0x7b0db17d, 0x9cd2, 0x4a93, [8]byte{0x97, 0x33, 0x46, 0xcc, 0x89, 0x02, 0x2e, 0x7c}}
 | 
			
		||||
	FOLDERID_MusicLibrary           = &KNOWNFOLDERID{0x2112ab0a, 0xc86a, 0x4ffe, [8]byte{0xa3, 0x68, 0x0d, 0xe9, 0x6e, 0x47, 0x01, 0x2e}}
 | 
			
		||||
	FOLDERID_PicturesLibrary        = &KNOWNFOLDERID{0xa990ae9f, 0xa03b, 0x4e80, [8]byte{0x94, 0xbc, 0x99, 0x12, 0xd7, 0x50, 0x41, 0x04}}
 | 
			
		||||
	FOLDERID_VideosLibrary          = &KNOWNFOLDERID{0x491e922f, 0x5643, 0x4af4, [8]byte{0xa7, 0xeb, 0x4e, 0x7a, 0x13, 0x8d, 0x81, 0x74}}
 | 
			
		||||
	FOLDERID_RecordedTVLibrary      = &KNOWNFOLDERID{0x1a6fdba2, 0xf42d, 0x4358, [8]byte{0xa7, 0x98, 0xb7, 0x4d, 0x74, 0x59, 0x26, 0xc5}}
 | 
			
		||||
	FOLDERID_HomeGroup              = &KNOWNFOLDERID{0x52528a6b, 0xb9e3, 0x4add, [8]byte{0xb6, 0x0d, 0x58, 0x8c, 0x2d, 0xba, 0x84, 0x2d}}
 | 
			
		||||
	FOLDERID_HomeGroupCurrentUser   = &KNOWNFOLDERID{0x9b74b6a3, 0x0dfd, 0x4f11, [8]byte{0x9e, 0x78, 0x5f, 0x78, 0x00, 0xf2, 0xe7, 0x72}}
 | 
			
		||||
	FOLDERID_DeviceMetadataStore    = &KNOWNFOLDERID{0x5ce4a5e9, 0xe4eb, 0x479d, [8]byte{0xb8, 0x9f, 0x13, 0x0c, 0x02, 0x88, 0x61, 0x55}}
 | 
			
		||||
	FOLDERID_Libraries              = &KNOWNFOLDERID{0x1b3ea5dc, 0xb587, 0x4786, [8]byte{0xb4, 0xef, 0xbd, 0x1d, 0xc3, 0x32, 0xae, 0xae}}
 | 
			
		||||
	FOLDERID_PublicLibraries        = &KNOWNFOLDERID{0x48daf80b, 0xe6cf, 0x4f4e, [8]byte{0xb8, 0x00, 0x0e, 0x69, 0xd8, 0x4e, 0xe3, 0x84}}
 | 
			
		||||
	FOLDERID_UserPinned             = &KNOWNFOLDERID{0x9e3995ab, 0x1f9c, 0x4f13, [8]byte{0xb8, 0x27, 0x48, 0xb2, 0x4b, 0x6c, 0x71, 0x74}}
 | 
			
		||||
	FOLDERID_ImplicitAppShortcuts   = &KNOWNFOLDERID{0xbcb5256f, 0x79f6, 0x4cee, [8]byte{0xb7, 0x25, 0xdc, 0x34, 0xe4, 0x02, 0xfd, 0x46}}
 | 
			
		||||
	FOLDERID_AccountPictures        = &KNOWNFOLDERID{0x008ca0b1, 0x55b4, 0x4c56, [8]byte{0xb8, 0xa8, 0x4d, 0xe4, 0xb2, 0x99, 0xd3, 0xbe}}
 | 
			
		||||
	FOLDERID_PublicUserTiles        = &KNOWNFOLDERID{0x0482af6c, 0x08f1, 0x4c34, [8]byte{0x8c, 0x90, 0xe1, 0x7e, 0xc9, 0x8b, 0x1e, 0x17}}
 | 
			
		||||
	FOLDERID_AppsFolder             = &KNOWNFOLDERID{0x1e87508d, 0x89c2, 0x42f0, [8]byte{0x8a, 0x7e, 0x64, 0x5a, 0x0f, 0x50, 0xca, 0x58}}
 | 
			
		||||
	FOLDERID_StartMenuAllPrograms   = &KNOWNFOLDERID{0xf26305ef, 0x6948, 0x40b9, [8]byte{0xb2, 0x55, 0x81, 0x45, 0x3d, 0x09, 0xc7, 0x85}}
 | 
			
		||||
	FOLDERID_CommonStartMenuPlaces  = &KNOWNFOLDERID{0xa440879f, 0x87a0, 0x4f7d, [8]byte{0xb7, 0x00, 0x02, 0x07, 0xb9, 0x66, 0x19, 0x4a}}
 | 
			
		||||
	FOLDERID_ApplicationShortcuts   = &KNOWNFOLDERID{0xa3918781, 0xe5f2, 0x4890, [8]byte{0xb3, 0xd9, 0xa7, 0xe5, 0x43, 0x32, 0x32, 0x8c}}
 | 
			
		||||
	FOLDERID_RoamingTiles           = &KNOWNFOLDERID{0x00bcfc5a, 0xed94, 0x4e48, [8]byte{0x96, 0xa1, 0x3f, 0x62, 0x17, 0xf2, 0x19, 0x90}}
 | 
			
		||||
	FOLDERID_RoamedTileImages       = &KNOWNFOLDERID{0xaaa8d5a5, 0xf1d6, 0x4259, [8]byte{0xba, 0xa8, 0x78, 0xe7, 0xef, 0x60, 0x83, 0x5e}}
 | 
			
		||||
	FOLDERID_Screenshots            = &KNOWNFOLDERID{0xb7bede81, 0xdf94, 0x4682, [8]byte{0xa7, 0xd8, 0x57, 0xa5, 0x26, 0x20, 0xb8, 0x6f}}
 | 
			
		||||
	FOLDERID_CameraRoll             = &KNOWNFOLDERID{0xab5fb87b, 0x7ce2, 0x4f83, [8]byte{0x91, 0x5d, 0x55, 0x08, 0x46, 0xc9, 0x53, 0x7b}}
 | 
			
		||||
	FOLDERID_SkyDrive               = &KNOWNFOLDERID{0xa52bba46, 0xe9e1, 0x435f, [8]byte{0xb3, 0xd9, 0x28, 0xda, 0xa6, 0x48, 0xc0, 0xf6}}
 | 
			
		||||
	FOLDERID_OneDrive               = &KNOWNFOLDERID{0xa52bba46, 0xe9e1, 0x435f, [8]byte{0xb3, 0xd9, 0x28, 0xda, 0xa6, 0x48, 0xc0, 0xf6}}
 | 
			
		||||
	FOLDERID_SkyDriveDocuments      = &KNOWNFOLDERID{0x24d89e24, 0x2f19, 0x4534, [8]byte{0x9d, 0xde, 0x6a, 0x66, 0x71, 0xfb, 0xb8, 0xfe}}
 | 
			
		||||
	FOLDERID_SkyDrivePictures       = &KNOWNFOLDERID{0x339719b5, 0x8c47, 0x4894, [8]byte{0x94, 0xc2, 0xd8, 0xf7, 0x7a, 0xdd, 0x44, 0xa6}}
 | 
			
		||||
	FOLDERID_SkyDriveMusic          = &KNOWNFOLDERID{0xc3f2459e, 0x80d6, 0x45dc, [8]byte{0xbf, 0xef, 0x1f, 0x76, 0x9f, 0x2b, 0xe7, 0x30}}
 | 
			
		||||
	FOLDERID_SkyDriveCameraRoll     = &KNOWNFOLDERID{0x767e6811, 0x49cb, 0x4273, [8]byte{0x87, 0xc2, 0x20, 0xf3, 0x55, 0xe1, 0x08, 0x5b}}
 | 
			
		||||
	FOLDERID_SearchHistory          = &KNOWNFOLDERID{0x0d4c3db6, 0x03a3, 0x462f, [8]byte{0xa0, 0xe6, 0x08, 0x92, 0x4c, 0x41, 0xb5, 0xd4}}
 | 
			
		||||
	FOLDERID_SearchTemplates        = &KNOWNFOLDERID{0x7e636bfe, 0xdfa9, 0x4d5e, [8]byte{0xb4, 0x56, 0xd7, 0xb3, 0x98, 0x51, 0xd8, 0xa9}}
 | 
			
		||||
	FOLDERID_CameraRollLibrary      = &KNOWNFOLDERID{0x2b20df75, 0x1eda, 0x4039, [8]byte{0x80, 0x97, 0x38, 0x79, 0x82, 0x27, 0xd5, 0xb7}}
 | 
			
		||||
	FOLDERID_SavedPictures          = &KNOWNFOLDERID{0x3b193882, 0xd3ad, 0x4eab, [8]byte{0x96, 0x5a, 0x69, 0x82, 0x9d, 0x1f, 0xb5, 0x9f}}
 | 
			
		||||
	FOLDERID_SavedPicturesLibrary   = &KNOWNFOLDERID{0xe25b5812, 0xbe88, 0x4bd9, [8]byte{0x94, 0xb0, 0x29, 0x23, 0x34, 0x77, 0xb6, 0xc3}}
 | 
			
		||||
	FOLDERID_RetailDemo             = &KNOWNFOLDERID{0x12d4c69e, 0x24ad, 0x4923, [8]byte{0xbe, 0x19, 0x31, 0x32, 0x1c, 0x43, 0xa7, 0x67}}
 | 
			
		||||
	FOLDERID_Device                 = &KNOWNFOLDERID{0x1c2ac1dc, 0x4358, 0x4b6c, [8]byte{0x97, 0x33, 0xaf, 0x21, 0x15, 0x65, 0x76, 0xf0}}
 | 
			
		||||
	FOLDERID_DevelopmentFiles       = &KNOWNFOLDERID{0xdbe8e08e, 0x3053, 0x4bbc, [8]byte{0xb1, 0x83, 0x2a, 0x7b, 0x2b, 0x19, 0x1e, 0x59}}
 | 
			
		||||
	FOLDERID_Objects3D              = &KNOWNFOLDERID{0x31c0dd25, 0x9439, 0x4f12, [8]byte{0xbf, 0x41, 0x7f, 0xf4, 0xed, 0xa3, 0x87, 0x22}}
 | 
			
		||||
	FOLDERID_AppCaptures            = &KNOWNFOLDERID{0xedc0fe71, 0x98d8, 0x4f4a, [8]byte{0xb9, 0x20, 0xc8, 0xdc, 0x13, 0x3c, 0xb1, 0x65}}
 | 
			
		||||
	FOLDERID_LocalDocuments         = &KNOWNFOLDERID{0xf42ee2d3, 0x909f, 0x4907, [8]byte{0x88, 0x71, 0x4c, 0x22, 0xfc, 0x0b, 0xf7, 0x56}}
 | 
			
		||||
	FOLDERID_LocalPictures          = &KNOWNFOLDERID{0x0ddd015d, 0xb06c, 0x45d5, [8]byte{0x8c, 0x4c, 0xf5, 0x97, 0x13, 0x85, 0x46, 0x39}}
 | 
			
		||||
	FOLDERID_LocalVideos            = &KNOWNFOLDERID{0x35286a68, 0x3c57, 0x41a1, [8]byte{0xbb, 0xb1, 0x0e, 0xae, 0x73, 0xd7, 0x6c, 0x95}}
 | 
			
		||||
	FOLDERID_LocalMusic             = &KNOWNFOLDERID{0xa0c69a99, 0x21c8, 0x4671, [8]byte{0x87, 0x03, 0x79, 0x34, 0x16, 0x2f, 0xcf, 0x1d}}
 | 
			
		||||
	FOLDERID_LocalDownloads         = &KNOWNFOLDERID{0x7d83ee9b, 0x2244, 0x4e70, [8]byte{0xb1, 0xf5, 0x53, 0x93, 0x04, 0x2a, 0xf1, 0xe4}}
 | 
			
		||||
	FOLDERID_RecordedCalls          = &KNOWNFOLDERID{0x2f8b40c2, 0x83ed, 0x48ee, [8]byte{0xb3, 0x83, 0xa1, 0xf1, 0x57, 0xec, 0x6f, 0x9a}}
 | 
			
		||||
	FOLDERID_AllAppMods             = &KNOWNFOLDERID{0x7ad67899, 0x66af, 0x43ba, [8]byte{0x91, 0x56, 0x6a, 0xad, 0x42, 0xe6, 0xc5, 0x96}}
 | 
			
		||||
	FOLDERID_CurrentAppMods         = &KNOWNFOLDERID{0x3db40b20, 0x2a30, 0x4dbe, [8]byte{0x91, 0x7e, 0x77, 0x1d, 0xd2, 0x1d, 0xd0, 0x99}}
 | 
			
		||||
	FOLDERID_AppDataDesktop         = &KNOWNFOLDERID{0xb2c5e279, 0x7add, 0x439f, [8]byte{0xb2, 0x8c, 0xc4, 0x1f, 0xe1, 0xbb, 0xf6, 0x72}}
 | 
			
		||||
	FOLDERID_AppDataDocuments       = &KNOWNFOLDERID{0x7be16610, 0x1f7f, 0x44ac, [8]byte{0xbf, 0xf0, 0x83, 0xe1, 0x5f, 0x2f, 0xfc, 0xa1}}
 | 
			
		||||
	FOLDERID_AppDataFavorites       = &KNOWNFOLDERID{0x7cfbefbc, 0xde1f, 0x45aa, [8]byte{0xb8, 0x43, 0xa5, 0x42, 0xac, 0x53, 0x6c, 0xc9}}
 | 
			
		||||
	FOLDERID_AppDataProgramData     = &KNOWNFOLDERID{0x559d40a3, 0xa036, 0x40fa, [8]byte{0xaf, 0x61, 0x84, 0xcb, 0x43, 0x0a, 0x4d, 0x34}}
 | 
			
		||||
)
 | 
			
		||||
							
								
								
									
										4051
									
								
								vendor/golang.org/x/sys/windows/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4051
									
								
								vendor/golang.org/x/sys/windows/zsyscall_windows.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										11
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							@@ -1,26 +1,23 @@
 | 
			
		||||
# github.com/cyrilix/robocar-base v0.0.0-20191229155957-683a9d53e6b8
 | 
			
		||||
# github.com/cyrilix/robocar-base v0.1.0
 | 
			
		||||
github.com/cyrilix/robocar-base/cli
 | 
			
		||||
github.com/cyrilix/robocar-base/service
 | 
			
		||||
# github.com/cyrilix/robocar-protobuf/go v0.0.0-20200125171436-7bf31bd564b8
 | 
			
		||||
# github.com/cyrilix/robocar-protobuf/go v1.0.0
 | 
			
		||||
github.com/cyrilix/robocar-protobuf/go/events
 | 
			
		||||
# github.com/eclipse/paho.mqtt.golang v1.2.0
 | 
			
		||||
github.com/eclipse/paho.mqtt.golang
 | 
			
		||||
github.com/eclipse/paho.mqtt.golang/packets
 | 
			
		||||
# github.com/golang/protobuf v1.3.2
 | 
			
		||||
# github.com/golang/protobuf v1.3.4
 | 
			
		||||
github.com/golang/protobuf/proto
 | 
			
		||||
github.com/golang/protobuf/ptypes/timestamp
 | 
			
		||||
# github.com/konsorten/go-windows-terminal-sequences v1.0.1
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences
 | 
			
		||||
# github.com/sirupsen/logrus v1.2.0
 | 
			
		||||
# github.com/sirupsen/logrus v1.4.2
 | 
			
		||||
github.com/sirupsen/logrus
 | 
			
		||||
# github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07
 | 
			
		||||
github.com/tarm/serial
 | 
			
		||||
# golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
 | 
			
		||||
golang.org/x/crypto/ssh/terminal
 | 
			
		||||
# golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553
 | 
			
		||||
golang.org/x/net/internal/socks
 | 
			
		||||
golang.org/x/net/proxy
 | 
			
		||||
golang.org/x/net/websocket
 | 
			
		||||
# golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9
 | 
			
		||||
golang.org/x/sys/unix
 | 
			
		||||
golang.org/x/sys/windows
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user