text:
package cloudwatch

import (
	"time"

	"github.com/aws/aws-sdk-go/aws/awsutil"
	"github.com/aws/aws-sdk-go/aws/request"
)

const opDeleteAlarms = "DeleteAlarms"

// DeleteAlarmsRequest generates a request for the DeleteAlarms operation.
func (c *CloudWatch) DeleteAlarmsRequest(input *DeleteAlarmsInput) (req *request.Request, output *DeleteAlarmsOutput) {
	op := &request.Operation{
		Name:       opDeleteAlarms,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DeleteAlarmsInput{}
	}

	req = c.newRequest(op, input, output)
	output = &DeleteAlarmsOutput{}
	req.Data = output
	return
}

// Deletes all specified alarms. In the event of an error, no alarms are deleted.
func (c *CloudWatch) DeleteAlarms(input *DeleteAlarmsInput) (*DeleteAlarmsOutput, error) {
	req, out := c.DeleteAlarmsRequest(input)
	err := req.Send()
	return out, err
}

const opDescribeAlarmHistory = "DescribeAlarmHistory"

// DescribeAlarmHistoryRequest generates a request for the DescribeAlarmHistory operation.
func (c *CloudWatch) DescribeAlarmHistoryRequest(input *DescribeAlarmHistoryInput) (req *request.Request, output *DescribeAlarmHistoryOutput) {
	op := &request.Operation{
		Name:       opDescribeAlarmHistory,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxRecords",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeAlarmHistoryInput{}
	}

	req = c.newRequest(op, input, output)
	output = &DescribeAlarmHistoryOutput{}
	req.Data = output
	return
}

// Retrieves history for the specified alarm. Filter alarms by date range or
// item type. If an alarm name is not specified, Amazon CloudWatch returns histories
// for all of the owner's alarms.
func (c *CloudWatch) DescribeAlarmHistory(input *DescribeAlarmHistoryInput) (*DescribeAlarmHistoryOutput, error) {
	req, out := c.DescribeAlarmHistoryRequest(input)
	err := req.Send()
	return out, err
}

func (c *CloudWatch) DescribeAlarmHistoryPages(input *DescribeAlarmHistoryInput, fn func(p *DescribeAlarmHistoryOutput, lastPage bool) (shouldContinue bool)) error {
	page, _ := c.DescribeAlarmHistoryRequest(input)
	page.Handlers.Build.PushBack(request.MakeAddToUserAgentFreeFormHandler("Paginator"))
	return page.EachPage(func(p interface{}, lastPage bool) bool {
		return fn(p.(*DescribeAlarmHistoryOutput), lastPage)
	})
}

const opDescribeAlarms = "DescribeAlarms"

// DescribeAlarmsRequest generates a request for the DescribeAlarms operation.
func (c *CloudWatch) DescribeAlarmsRequest(input *DescribeAlarmsInput) (req *request.Request, output *DescribeAlarmsOutput) {
	op := &request.Operation{
		Name:       opDescribeAlarms,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "MaxRecords",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &DescribeAlarmsInput{}
	}

	req = c.newRequest(op, input, output)
	output = &DescribeAlarmsOutput{}
	req.Data = output
	return
}

// Retrieves alarms with the specified names. If no name is specified, all alarms
// for the user are returned. Alarms can be retrieved by using only a prefix
// for the alarm name, the alarm state, or a prefix for any action.
func (c *CloudWatch) DescribeAlarms(input *DescribeAlarmsInput) (*DescribeAlarmsOutput, error) {
	req, out := c.DescribeAlarmsRequest(input)
	err := req.Send()
	return out, err
}

func (c *CloudWatch) DescribeAlarmsPages(input *DescribeAlarmsInput, fn func(p *DescribeAlarmsOutput, lastPage bool) (shouldContinue bool)) error {
	page, _ := c.DescribeAlarmsRequest(input)
	page.Handlers.Build.PushBack(request.MakeAddToUserAgentFreeFormHandler("Paginator"))
	return page.EachPage(func(p interface{}, lastPage bool) bool {
		return fn(p.(*DescribeAlarmsOutput), lastPage)
	})
}

const opDescribeAlarmsForMetric = "DescribeAlarmsForMetric"

// DescribeAlarmsForMetricRequest generates a request for the DescribeAlarmsForMetric operation.
func (c *CloudWatch) DescribeAlarmsForMetricRequest(input *DescribeAlarmsForMetricInput) (req *request.Request, output *DescribeAlarmsForMetricOutput) {
	op := &request.Operation{
		Name:       opDescribeAlarmsForMetric,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DescribeAlarmsForMetricInput{}
	}

	req = c.newRequest(op, input, output)
	output = &DescribeAlarmsForMetricOutput{}
	req.Data = output
	return
}

// Retrieves all alarms for a single metric. Specify a statistic, period, or
// unit to filter the set of alarms further.
func (c *CloudWatch) DescribeAlarmsForMetric(input *DescribeAlarmsForMetricInput) (*DescribeAlarmsForMetricOutput, error) {
	req, out := c.DescribeAlarmsForMetricRequest(input)
	err := req.Send()
	return out, err
}

const opDisableAlarmActions = "DisableAlarmActions"

// DisableAlarmActionsRequest generates a request for the DisableAlarmActions operation.
func (c *CloudWatch) DisableAlarmActionsRequest(input *DisableAlarmActionsInput) (req *request.Request, output *DisableAlarmActionsOutput) {
	op := &request.Operation{
		Name:       opDisableAlarmActions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &DisableAlarmActionsInput{}
	}

	req = c.newRequest(op, input, output)
	output = &DisableAlarmActionsOutput{}
	req.Data = output
	return
}

// Disables actions for the specified alarms. When an alarm's actions are disabled
// the alarm's state may change, but none of the alarm's actions will execute.
func (c *CloudWatch) DisableAlarmActions(input *DisableAlarmActionsInput) (*DisableAlarmActionsOutput, error) {
	req, out := c.DisableAlarmActionsRequest(input)
	err := req.Send()
	return out, err
}

const opEnableAlarmActions = "EnableAlarmActions"

// EnableAlarmActionsRequest generates a request for the EnableAlarmActions operation.
func (c *CloudWatch) EnableAlarmActionsRequest(input *EnableAlarmActionsInput) (req *request.Request, output *EnableAlarmActionsOutput) {
	op := &request.Operation{
		Name:       opEnableAlarmActions,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &EnableAlarmActionsInput{}
	}

	req = c.newRequest(op, input, output)
	output = &EnableAlarmActionsOutput{}
	req.Data = output
	return
}

// Enables actions for the specified alarms.
func (c *CloudWatch) EnableAlarmActions(input *EnableAlarmActionsInput) (*EnableAlarmActionsOutput, error) {
	req, out := c.EnableAlarmActionsRequest(input)
	err := req.Send()
	return out, err
}

const opGetMetricStatistics = "GetMetricStatistics"

// GetMetricStatisticsRequest generates a request for the GetMetricStatistics operation.
func (c *CloudWatch) GetMetricStatisticsRequest(input *GetMetricStatisticsInput) (req *request.Request, output *GetMetricStatisticsOutput) {
	op := &request.Operation{
		Name:       opGetMetricStatistics,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &GetMetricStatisticsInput{}
	}

	req = c.newRequest(op, input, output)
	output = &GetMetricStatisticsOutput{}
	req.Data = output
	return
}

// Gets statistics for the specified metric.
//
//  The maximum number of data points returned from a single GetMetricStatistics
// request is 1,440, wereas the maximum number of data points that can be queried
// is 50,850. If you make a request that generates more than 1,440 data points,
// Amazon CloudWatch returns an error. In such a case, you can alter the request
// by narrowing the specified time range or increasing the specified period.
// Alternatively, you can make multiple requests across adjacent time ranges.
//
//  Amazon CloudWatch aggregates data points based on the length of the period
// that you specify. For example, if you request statistics with a one-minute
// granularity, Amazon CloudWatch aggregates data points with time stamps that
// fall within the same one-minute period. In such a case, the data points queried
// can greatly outnumber the data points returned.
//
//  The following examples show various statistics allowed by the data point
// query maximum of 50,850 when you call GetMetricStatistics on Amazon EC2 instances
// with detailed (one-minute) monitoring enabled:
//
//  Statistics for up to 400 instances for a span of one hour Statistics for
// up to 35 instances over a span of 24 hours Statistics for up to 2 instances
// over a span of 2 weeks   For information about the namespace, metric names,
// and dimensions that other Amazon Web Services products use to send metrics
// to Cloudwatch, go to Amazon CloudWatch Metrics, Namespaces, and Dimensions
// Reference (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html)
// in the Amazon CloudWatch Developer Guide.
func (c *CloudWatch) GetMetricStatistics(input *GetMetricStatisticsInput) (*GetMetricStatisticsOutput, error) {
	req, out := c.GetMetricStatisticsRequest(input)
	err := req.Send()
	return out, err
}

const opListMetrics = "ListMetrics"

// ListMetricsRequest generates a request for the ListMetrics operation.
func (c *CloudWatch) ListMetricsRequest(input *ListMetricsInput) (req *request.Request, output *ListMetricsOutput) {
	op := &request.Operation{
		Name:       opListMetrics,
		HTTPMethod: "POST",
		HTTPPath:   "/",
		Paginator: &request.Paginator{
			InputTokens:     []string{"NextToken"},
			OutputTokens:    []string{"NextToken"},
			LimitToken:      "",
			TruncationToken: "",
		},
	}

	if input == nil {
		input = &ListMetricsInput{}
	}

	req = c.newRequest(op, input, output)
	output = &ListMetricsOutput{}
	req.Data = output
	return
}

// Returns a list of valid metrics stored for the AWS account owner. Returned
// metrics can be used with GetMetricStatistics to obtain statistical data for
// a given metric.
func (c *CloudWatch) ListMetrics(input *ListMetricsInput) (*ListMetricsOutput, error) {
	req, out := c.ListMetricsRequest(input)
	err := req.Send()
	return out, err
}

func (c *CloudWatch) ListMetricsPages(input *ListMetricsInput, fn func(p *ListMetricsOutput, lastPage bool) (shouldContinue bool)) error {
	page, _ := c.ListMetricsRequest(input)
	page.Handlers.Build.PushBack(request.MakeAddToUserAgentFreeFormHandler("Paginator"))
	return page.EachPage(func(p interface{}, lastPage bool) bool {
		return fn(p.(*ListMetricsOutput), lastPage)
	})
}

const opPutMetricAlarm = "PutMetricAlarm"

// PutMetricAlarmRequest generates a request for the PutMetricAlarm operation.
func (c *CloudWatch) PutMetricAlarmRequest(input *PutMetricAlarmInput) (req *request.Request, output *PutMetricAlarmOutput) {
	op := &request.Operation{
		Name:       opPutMetricAlarm,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &PutMetricAlarmInput{}
	}

	req = c.newRequest(op, input, output)
	output = &PutMetricAlarmOutput{}
	req.Data = output
	return
}

// Creates or updates an alarm and associates it with the specified Amazon CloudWatch
// metric. Optionally, this operation can associate one or more Amazon Simple
// Notification Service resources with the alarm.
//
//  When this operation creates an alarm, the alarm state is immediately set
// to INSUFFICIENT_DATA. The alarm is evaluated and its StateValue is set appropriately.
// Any actions associated with the StateValue is then executed.
func (c *CloudWatch) PutMetricAlarm(input *PutMetricAlarmInput) (*PutMetricAlarmOutput, error) {
	req, out := c.PutMetricAlarmRequest(input)
	err := req.Send()
	return out, err
}

const opPutMetricData = "PutMetricData"

// PutMetricDataRequest generates a request for the PutMetricData operation.
func (c *CloudWatch) PutMetricDataRequest(input *PutMetricDataInput) (req *request.Request, output *PutMetricDataOutput) {
	op := &request.Operation{
		Name:       opPutMetricData,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &PutMetricDataInput{}
	}

	req = c.newRequest(op, input, output)
	output = &PutMetricDataOutput{}
	req.Data = output
	return
}

// Publishes metric data points to Amazon CloudWatch. Amazon Cloudwatch associates
// the data points with the specified metric. If the specified metric does not
// exist, Amazon CloudWatch creates the metric. It can take up to fifteen minutes
// for a new metric to appear in calls to the ListMetrics action.
//
//  The size of a PutMetricData request is limited to 8 KB for HTTP GET requests
// and 40 KB for HTTP POST requests.
//
//  Although the Value parameter accepts numbers of type Double, Amazon CloudWatch
// truncates values with very large exponents. Values with base-10 exponents
// greater than 126 (1 x 10^126) are truncated. Likewise, values with base-10
// exponents less than -130 (1 x 10^-130) are also truncated.  Data that is
// timestamped 24 hours or more in the past may take in excess of 48 hours to
// become available from submission time using GetMetricStatistics.
func (c *CloudWatch) PutMetricData(input *PutMetricDataInput) (*PutMetricDataOutput, error) {
	req, out := c.PutMetricDataRequest(input)
	err := req.Send()
	return out, err
}

const opSetAlarmState = "SetAlarmState"

// SetAlarmStateRequest generates a request for the SetAlarmState operation.
func (c *CloudWatch) SetAlarmStateRequest(input *SetAlarmStateInput) (req *request.Request, output *SetAlarmStateOutput) {
	op := &request.Operation{
		Name:       opSetAlarmState,
		HTTPMethod: "POST",
		HTTPPath:   "/",
	}

	if input == nil {
		input = &SetAlarmStateInput{}
	}

	req = c.newRequest(op, input, output)
	output = &SetAlarmStateOutput{}
	req.Data = output
	return
}

// Temporarily sets the state of an alarm. When the updated StateValue differs
// from the previous value, the action configured for the appropriate state
// is invoked. This is not a permanent change. The next periodic alarm check
// (in about a minute) will set the alarm to its actual state.
func (c *CloudWatch) SetAlarmState(input *SetAlarmStateInput) (*SetAlarmStateOutput, error) {
	req, out := c.SetAlarmStateRequest(input)
	err := req.Send()
	return out, err
}

// The AlarmHistoryItem data type contains descriptive information about the
// history of a specific alarm. If you call DescribeAlarmHistory, Amazon CloudWatch
// returns this data type as part of the DescribeAlarmHistoryResult data type.
type AlarmHistoryItem struct {
	_ struct{} `type:"structure"`

	// The descriptive name for the alarm.
	AlarmName *string `min:"1" type:"string"`

	// Machine-readable data about the alarm in JSON format.
	HistoryData *string `min:"1" type:"string"`

	// The type of alarm history item.
	HistoryItemType *string `type:"string" enum:"HistoryItemType"`

	// A human-readable summary of the alarm history.
	HistorySummary *string `min:"1" type:"string"`

	// The time stamp for the alarm history item. Amazon CloudWatch uses Coordinated
	// Universal Time (UTC) when returning time stamps, which do not accommodate
	// seasonal adjustments such as daylight savings time. For more information,
	// see Time stamps (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#about_timestamp)
	// in the Amazon CloudWatch Developer Guide.
	Timestamp *time.Time `type:"timestamp" timestampFormat:"iso8601"`
}

// String returns the string representation
func (s AlarmHistoryItem) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s AlarmHistoryItem) GoString() string {
	return s.String()
}

// The Datapoint data type encapsulates the statistical data that Amazon CloudWatch
// computes from metric data.
type Datapoint struct {
	_ struct{} `type:"structure"`

	// The average of metric values that correspond to the datapoint.
	Average *float64 `type:"double"`

	// The maximum of the metric value used for the datapoint.
	Maximum *float64 `type:"double"`

	// The minimum metric value used for the datapoint.
	Minimum *float64 `type:"double"`

	// The number of metric values that contributed to the aggregate value of this
	// datapoint.
	SampleCount *float64 `type:"double"`

	// The sum of metric values used for the datapoint.
	Sum *float64 `type:"double"`

	// The time stamp used for the datapoint. Amazon CloudWatch uses Coordinated
	// Universal Time (UTC) when returning time stamps, which do not accommodate
	// seasonal adjustments such as daylight savings time. For more information,
	// see Time stamps (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#about_timestamp)
	// in the Amazon CloudWatch Developer Guide.
	Timestamp *time.Time `type:"timestamp" timestampFormat:"iso8601"`

	// The standard unit used for the datapoint.
	Unit *string `type:"string" enum:"StandardUnit"`
}

// String returns the string representation
func (s Datapoint) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Datapoint) GoString() string {
	return s.String()
}

type DeleteAlarmsInput struct {
	_ struct{} `type:"structure"`

	// A list of alarms to be deleted.
	AlarmNames []*string `type:"list" required:"true"`
}

// String returns the string representation
func (s DeleteAlarmsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteAlarmsInput) GoString() string {
	return s.String()
}

type DeleteAlarmsOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DeleteAlarmsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DeleteAlarmsOutput) GoString() string {
	return s.String()
}

type DescribeAlarmHistoryInput struct {
	_ struct{} `type:"structure"`

	// The name of the alarm.
	AlarmName *string `min:"1" type:"string"`

	// The ending date to retrieve alarm history.
	EndDate *time.Time `type:"timestamp" timestampFormat:"iso8601"`

	// The type of alarm histories to retrieve.
	HistoryItemType *string `type:"string" enum:"HistoryItemType"`

	// The maximum number of alarm history records to retrieve.
	MaxRecords *int64 `min:"1" type:"integer"`

	// The token returned by a previous call to indicate that there is more data
	// available.
	NextToken *string `type:"string"`

	// The starting date to retrieve alarm history.
	StartDate *time.Time `type:"timestamp" timestampFormat:"iso8601"`
}

// String returns the string representation
func (s DescribeAlarmHistoryInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAlarmHistoryInput) GoString() string {
	return s.String()
}

// The output for the DescribeAlarmHistory action.
type DescribeAlarmHistoryOutput struct {
	_ struct{} `type:"structure"`

	// A list of alarm histories in JSON format.
	AlarmHistoryItems []*AlarmHistoryItem `type:"list"`

	// A string that marks the start of the next batch of returned results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeAlarmHistoryOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAlarmHistoryOutput) GoString() string {
	return s.String()
}

type DescribeAlarmsForMetricInput struct {
	_ struct{} `type:"structure"`

	// The list of dimensions associated with the metric.
	Dimensions []*Dimension `type:"list"`

	// The name of the metric.
	MetricName *string `min:"1" type:"string" required:"true"`

	// The namespace of the metric.
	Namespace *string `min:"1" type:"string" required:"true"`

	// The period in seconds over which the statistic is applied.
	Period *int64 `min:"60" type:"integer"`

	// The statistic for the metric.
	Statistic *string `type:"string" enum:"Statistic"`

	// The unit for the metric.
	Unit *string `type:"string" enum:"StandardUnit"`
}

// String returns the string representation
func (s DescribeAlarmsForMetricInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAlarmsForMetricInput) GoString() string {
	return s.String()
}

// The output for the DescribeAlarmsForMetric action.
type DescribeAlarmsForMetricOutput struct {
	_ struct{} `type:"structure"`

	// A list of information for each alarm with the specified metric.
	MetricAlarms []*MetricAlarm `type:"list"`
}

// String returns the string representation
func (s DescribeAlarmsForMetricOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAlarmsForMetricOutput) GoString() string {
	return s.String()
}

type DescribeAlarmsInput struct {
	_ struct{} `type:"structure"`

	// The action name prefix.
	ActionPrefix *string `min:"1" type:"string"`

	// The alarm name prefix. AlarmNames cannot be specified if this parameter is
	// specified.
	AlarmNamePrefix *string `min:"1" type:"string"`

	// A list of alarm names to retrieve information for.
	AlarmNames []*string `type:"list"`

	// The maximum number of alarm descriptions to retrieve.
	MaxRecords *int64 `min:"1" type:"integer"`

	// The token returned by a previous call to indicate that there is more data
	// available.
	NextToken *string `type:"string"`

	// The state value to be used in matching alarms.
	StateValue *string `type:"string" enum:"StateValue"`
}

// String returns the string representation
func (s DescribeAlarmsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAlarmsInput) GoString() string {
	return s.String()
}

// The output for the DescribeAlarms action.
type DescribeAlarmsOutput struct {
	_ struct{} `type:"structure"`

	// A list of information for the specified alarms.
	MetricAlarms []*MetricAlarm `type:"list"`

	// A string that marks the start of the next batch of returned results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s DescribeAlarmsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DescribeAlarmsOutput) GoString() string {
	return s.String()
}

// The Dimension data type further expands on the identity of a metric using
// a Name, Value pair.
//
// For examples that use one or more dimensions, see PutMetricData.
type Dimension struct {
	_ struct{} `type:"structure"`

	// The name of the dimension.
	Name *string `min:"1" type:"string" required:"true"`

	// The value representing the dimension measurement
	Value *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation
func (s Dimension) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Dimension) GoString() string {
	return s.String()
}

// The DimensionFilter data type is used to filter ListMetrics results.
type DimensionFilter struct {
	_ struct{} `type:"structure"`

	// The dimension name to be matched.
	Name *string `min:"1" type:"string" required:"true"`

	// The value of the dimension to be matched.
	Value *string `min:"1" type:"string"`
}

// String returns the string representation
func (s DimensionFilter) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DimensionFilter) GoString() string {
	return s.String()
}

type DisableAlarmActionsInput struct {
	_ struct{} `type:"structure"`

	// The names of the alarms to disable actions for.
	AlarmNames []*string `type:"list" required:"true"`
}

// String returns the string representation
func (s DisableAlarmActionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableAlarmActionsInput) GoString() string {
	return s.String()
}

type DisableAlarmActionsOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s DisableAlarmActionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s DisableAlarmActionsOutput) GoString() string {
	return s.String()
}

type EnableAlarmActionsInput struct {
	_ struct{} `type:"structure"`

	// The names of the alarms to enable actions for.
	AlarmNames []*string `type:"list" required:"true"`
}

// String returns the string representation
func (s EnableAlarmActionsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableAlarmActionsInput) GoString() string {
	return s.String()
}

type EnableAlarmActionsOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s EnableAlarmActionsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s EnableAlarmActionsOutput) GoString() string {
	return s.String()
}

type GetMetricStatisticsInput struct {
	_ struct{} `type:"structure"`

	// A list of dimensions describing qualities of the metric.
	Dimensions []*Dimension `type:"list"`

	// The time stamp to use for determining the last datapoint to return. The value
	// specified is exclusive; results will include datapoints up to the time stamp
	// specified.
	EndTime *time.Time `type:"timestamp" timestampFormat:"iso8601" required:"true"`

	// The name of the metric, with or without spaces.
	MetricName *string `min:"1" type:"string" required:"true"`

	// The namespace of the metric, with or without spaces.
	Namespace *string `min:"1" type:"string" required:"true"`

	// The granularity, in seconds, of the returned datapoints. Period must be at
	// least 60 seconds and must be a multiple of 60. The default value is 60.
	Period *int64 `min:"60" type:"integer" required:"true"`

	// The time stamp to use for determining the first datapoint to return. The
	// value specified is inclusive; results include datapoints with the time stamp
	// specified.
	StartTime *time.Time `type:"timestamp" timestampFormat:"iso8601" required:"true"`

	// The metric statistics to return. For information about specific statistics
	// returned by GetMetricStatistics, go to Statistics (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/index.html?CHAP_TerminologyandKeyConcepts.html#Statistic)
	// in the Amazon CloudWatch Developer Guide.
	//
	//  Valid Values: Average | Sum | SampleCount | Maximum | Minimum
	Statistics []*string `min:"1" type:"list" required:"true"`

	// The unit for the metric.
	Unit *string `type:"string" enum:"StandardUnit"`
}

// String returns the string representation
func (s GetMetricStatisticsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetMetricStatisticsInput) GoString() string {
	return s.String()
}

// The output for the GetMetricStatistics action.
type GetMetricStatisticsOutput struct {
	_ struct{} `type:"structure"`

	// The datapoints for the specified metric.
	Datapoints []*Datapoint `type:"list"`

	// A label describing the specified metric.
	Label *string `type:"string"`
}

// String returns the string representation
func (s GetMetricStatisticsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s GetMetricStatisticsOutput) GoString() string {
	return s.String()
}

type ListMetricsInput struct {
	_ struct{} `type:"structure"`

	// A list of dimensions to filter against.
	Dimensions []*DimensionFilter `type:"list"`

	// The name of the metric to filter against.
	MetricName *string `min:"1" type:"string"`

	// The namespace to filter against.
	Namespace *string `min:"1" type:"string"`

	// The token returned by a previous call to indicate that there is more data
	// available.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s ListMetricsInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ListMetricsInput) GoString() string {
	return s.String()
}

// The output for the ListMetrics action.
type ListMetricsOutput struct {
	_ struct{} `type:"structure"`

	// A list of metrics used to generate statistics for an AWS account.
	Metrics []*Metric `type:"list"`

	// A string that marks the start of the next batch of returned results.
	NextToken *string `type:"string"`
}

// String returns the string representation
func (s ListMetricsOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s ListMetricsOutput) GoString() string {
	return s.String()
}

// The Metric data type contains information about a specific metric. If you
// call ListMetrics, Amazon CloudWatch returns information contained by this
// data type.
//
//  The example in the Examples section publishes two metrics named buffers
// and latency. Both metrics are in the examples namespace. Both metrics have
// two dimensions, InstanceID and InstanceType.
type Metric struct {
	_ struct{} `type:"structure"`

	// A list of dimensions associated with the metric.
	Dimensions []*Dimension `type:"list"`

	// The name of the metric.
	MetricName *string `min:"1" type:"string"`

	// The namespace of the metric.
	Namespace *string `min:"1" type:"string"`
}

// String returns the string representation
func (s Metric) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s Metric) GoString() string {
	return s.String()
}

// The MetricAlarm data type represents an alarm. You can use PutMetricAlarm
// to create or update an alarm.
type MetricAlarm struct {
	_ struct{} `type:"structure"`

	// Indicates whether actions should be executed during any changes to the alarm's
	// state.
	ActionsEnabled *bool `type:"boolean"`

	// The list of actions to execute when this alarm transitions into an ALARM
	// state from any other state. Each action is specified as an Amazon Resource
	// Number (ARN). Currently the only actions supported are publishing to an Amazon
	// SNS topic and triggering an Auto Scaling policy.
	AlarmActions []*string `type:"list"`

	// The Amazon Resource Name (ARN) of the alarm.
	AlarmArn *string `min:"1" type:"string"`

	// The time stamp of the last update to the alarm configuration. Amazon CloudWatch
	// uses Coordinated Universal Time (UTC) when returning time stamps, which do
	// not accommodate seasonal adjustments such as daylight savings time. For more
	// information, see Time stamps (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#about_timestamp)
	// in the Amazon CloudWatch Developer Guide.
	AlarmConfigurationUpdatedTimestamp *time.Time `type:"timestamp" timestampFormat:"iso8601"`

	// The description for the alarm.
	AlarmDescription *string `type:"string"`

	// The name of the alarm.
	AlarmName *string `min:"1" type:"string"`

	// The arithmetic operation to use when comparing the specified Statistic and
	// Threshold. The specified Statistic value is used as the first operand.
	ComparisonOperator *string `type:"string" enum:"ComparisonOperator"`

	// The list of dimensions associated with the alarm's associated metric.
	Dimensions []*Dimension `type:"list"`

	// The number of periods over which data is compared to the specified threshold.
	EvaluationPeriods *int64 `min:"1" type:"integer"`

	// The list of actions to execute when this alarm transitions into an INSUFFICIENT_DATA
	// state from any other state. Each action is specified as an Amazon Resource
	// Number (ARN). Currently the only actions supported are publishing to an Amazon
	// SNS topic or triggering an Auto Scaling policy.
	//
	// The current WSDL lists this attribute as UnknownActions.
	InsufficientDataActions []*string `type:"list"`

	// The name of the alarm's metric.
	MetricName *string `min:"1" type:"string"`

	// The namespace of alarm's associated metric.
	Namespace *string `min:"1" type:"string"`

	// The list of actions to execute when this alarm transitions into an OK state
	// from any other state. Each action is specified as an Amazon Resource Number
	// (ARN). Currently the only actions supported are publishing to an Amazon SNS
	// topic and triggering an Auto Scaling policy.
	OKActions []*string `type:"list"`

	// The period in seconds over which the statistic is applied.
	Period *int64 `min:"60" type:"integer"`

	// A human-readable explanation for the alarm's state.
	StateReason *string `type:"string"`

	// An explanation for the alarm's state in machine-readable JSON format
	StateReasonData *string `type:"string"`

	// The time stamp of the last update to the alarm's state. Amazon CloudWatch
	// uses Coordinated Universal Time (UTC) when returning time stamps, which do
	// not accommodate seasonal adjustments such as daylight savings time. For more
	// information, see Time stamps (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#about_timestamp)
	// in the Amazon CloudWatch Developer Guide.
	StateUpdatedTimestamp *time.Time `type:"timestamp" timestampFormat:"iso8601"`

	// The state value for the alarm.
	StateValue *string `type:"string" enum:"StateValue"`

	// The statistic to apply to the alarm's associated metric.
	Statistic *string `type:"string" enum:"Statistic"`

	// The value against which the specified statistic is compared.
	Threshold *float64 `type:"double"`

	// The unit of the alarm's associated metric.
	Unit *string `type:"string" enum:"StandardUnit"`
}

// String returns the string representation
func (s MetricAlarm) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s MetricAlarm) GoString() string {
	return s.String()
}

// The MetricDatum data type encapsulates the information sent with PutMetricData
// to either create a new metric or add new values to be aggregated into an
// existing metric.
type MetricDatum struct {
	_ struct{} `type:"structure"`

	// A list of dimensions associated with the metric. Note, when using the Dimensions
	// value in a query, you need to append .member.N to it (e.g., Dimensions.member.N).
	Dimensions []*Dimension `type:"list"`

	// The name of the metric.
	MetricName *string `min:"1" type:"string" required:"true"`

	// A set of statistical values describing the metric.
	StatisticValues *StatisticSet `type:"structure"`

	// The time stamp used for the metric. If not specified, the default value is
	// set to the time the metric data was received. Amazon CloudWatch uses Coordinated
	// Universal Time (UTC) when returning time stamps, which do not accommodate
	// seasonal adjustments such as daylight savings time. For more information,
	// see Time stamps (http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/cloudwatch_concepts.html#about_timestamp)
	// in the Amazon CloudWatch Developer Guide.
	Timestamp *time.Time `type:"timestamp" timestampFormat:"iso8601"`

	// The unit of the metric.
	Unit *string `type:"string" enum:"StandardUnit"`

	// The value for the metric.
	//
	// Although the Value parameter accepts numbers of type Double, Amazon CloudWatch
	// truncates values with very large exponents. Values with base-10 exponents
	// greater than 126 (1 x 10^126) are truncated. Likewise, values with base-10
	// exponents less than -130 (1 x 10^-130) are also truncated.
	Value *float64 `type:"double"`
}

// String returns the string representation
func (s MetricDatum) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s MetricDatum) GoString() string {
	return s.String()
}

type PutMetricAlarmInput struct {
	_ struct{} `type:"structure"`

	// Indicates whether or not actions should be executed during any changes to
	// the alarm's state.
	ActionsEnabled *bool `type:"boolean"`

	// The list of actions to execute when this alarm transitions into an ALARM
	// state from any other state. Each action is specified as an Amazon Resource
	// Number (ARN). Currently the only action supported is publishing to an Amazon
	// SNS topic or an Amazon Auto Scaling policy.
	AlarmActions []*string `type:"list"`

	// The description for the alarm.
	AlarmDescription *string `type:"string"`

	// The descriptive name for the alarm. This name must be unique within the user's
	// AWS account
	AlarmName *string `min:"1" type:"string" required:"true"`

	// The arithmetic operation to use when comparing the specified Statistic and
	// Threshold. The specified Statistic value is used as the first operand.
	ComparisonOperator *string `type:"string" required:"true" enum:"ComparisonOperator"`

	// The dimensions for the alarm's associated metric.
	Dimensions []*Dimension `type:"list"`

	// The number of periods over which data is compared to the specified threshold.
	EvaluationPeriods *int64 `min:"1" type:"integer" required:"true"`

	// The list of actions to execute when this alarm transitions into an INSUFFICIENT_DATA
	// state from any other state. Each action is specified as an Amazon Resource
	// Number (ARN). Currently the only action supported is publishing to an Amazon
	// SNS topic or an Amazon Auto Scaling policy.
	InsufficientDataActions []*string `type:"list"`

	// The name for the alarm's associated metric.
	MetricName *string `min:"1" type:"string" required:"true"`

	// The namespace for the alarm's associated metric.
	Namespace *string `min:"1" type:"string" required:"true"`

	// The list of actions to execute when this alarm transitions into an OK state
	// from any other state. Each action is specified as an Amazon Resource Number
	// (ARN). Currently the only action supported is publishing to an Amazon SNS
	// topic or an Amazon Auto Scaling policy.
	OKActions []*string `type:"list"`

	// The period in seconds over which the specified statistic is applied.
	Period *int64 `min:"60" type:"integer" required:"true"`

	// The statistic to apply to the alarm's associated metric.
	Statistic *string `type:"string" required:"true" enum:"Statistic"`

	// The value against which the specified statistic is compared.
	Threshold *float64 `type:"double" required:"true"`

	// The unit for the alarm's associated metric.
	Unit *string `type:"string" enum:"StandardUnit"`
}

// String returns the string representation
func (s PutMetricAlarmInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PutMetricAlarmInput) GoString() string {
	return s.String()
}

type PutMetricAlarmOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s PutMetricAlarmOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PutMetricAlarmOutput) GoString() string {
	return s.String()
}

type PutMetricDataInput struct {
	_ struct{} `type:"structure"`

	// A list of data describing the metric.
	MetricData []*MetricDatum `type:"list" required:"true"`

	// The namespace for the metric data.
	Namespace *string `min:"1" type:"string" required:"true"`
}

// String returns the string representation
func (s PutMetricDataInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PutMetricDataInput) GoString() string {
	return s.String()
}

type PutMetricDataOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s PutMetricDataOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s PutMetricDataOutput) GoString() string {
	return s.String()
}

type SetAlarmStateInput struct {
	_ struct{} `type:"structure"`

	// The descriptive name for the alarm. This name must be unique within the user's
	// AWS account. The maximum length is 255 characters.
	AlarmName *string `min:"1" type:"string" required:"true"`

	// The reason that this alarm is set to this specific state (in human-readable
	// text format)
	StateReason *string `type:"string" required:"true"`

	// The reason that this alarm is set to this specific state (in machine-readable
	// JSON format)
	StateReasonData *string `type:"string"`

	// The value of the state.
	StateValue *string `type:"string" required:"true" enum:"StateValue"`
}

// String returns the string representation
func (s SetAlarmStateInput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SetAlarmStateInput) GoString() string {
	return s.String()
}

type SetAlarmStateOutput struct {
	_ struct{} `type:"structure"`
}

// String returns the string representation
func (s SetAlarmStateOutput) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s SetAlarmStateOutput) GoString() string {
	return s.String()
}

// The StatisticSet data type describes the StatisticValues component of MetricDatum,
// and represents a set of statistics that describes a specific metric.
type StatisticSet struct {
	_ struct{} `type:"structure"`

	// The maximum value of the sample set.
	Maximum *float64 `type:"double" required:"true"`

	// The minimum value of the sample set.
	Minimum *float64 `type:"double" required:"true"`

	// The number of samples used for the statistic set.
	SampleCount *float64 `type:"double" required:"true"`

	// The sum of values for the sample set.
	Sum *float64 `type:"double" required:"true"`
}

// String returns the string representation
func (s StatisticSet) String() string {
	return awsutil.Prettify(s)
}

// GoString returns the string representation
func (s StatisticSet) GoString() string {
	return s.String()
}

const (
	// @enum ComparisonOperator
	ComparisonOperatorGreaterThanOrEqualToThreshold = "GreaterThanOrEqualToThreshold"
	// @enum ComparisonOperator
	ComparisonOperatorGreaterThanThreshold = "GreaterThanThreshold"
	// @enum ComparisonOperator
	ComparisonOperatorLessThanThreshold = "LessThanThreshold"
	// @enum ComparisonOperator
	ComparisonOperatorLessThanOrEqualToThreshold = "LessThanOrEqualToThreshold"
)

const (
	// @enum HistoryItemType
	HistoryItemTypeConfigurationUpdate = "ConfigurationUpdate"
	// @enum HistoryItemType
	HistoryItemTypeStateUpdate = "StateUpdate"
	// @enum HistoryItemType
	HistoryItemTypeAction = "Action"
)

const (
	// @enum StandardUnit
	StandardUnitSeconds = "Seconds"
	// @enum StandardUnit
	StandardUnitMicroseconds = "Microseconds"
	// @enum StandardUnit
	StandardUnitMilliseconds = "Milliseconds"
	// @enum StandardUnit
	StandardUnitBytes = "Bytes"
	// @enum StandardUnit
	StandardUnitKilobytes = "Kilobytes"
	// @enum StandardUnit
	StandardUnitMegabytes = "Megabytes"
	// @enum StandardUnit
	StandardUnitGigabytes = "Gigabytes"
	// @enum StandardUnit
	StandardUnitTerabytes = "Terabytes"
	// @enum StandardUnit
	StandardUnitBits = "Bits"
	// @enum StandardUnit
	StandardUnitKilobits = "Kilobits"
	// @enum StandardUnit
	StandardUnitMegabits = "Megabits"
	// @enum StandardUnit
	StandardUnitGigabits = "Gigabits"
	// @enum StandardUnit
	StandardUnitTerabits = "Terabits"
	// @enum StandardUnit
	StandardUnitPercent = "Percent"
	// @enum StandardUnit
	StandardUnitCount = "Count"
	// @enum StandardUnit
	StandardUnitBytesSecond = "Bytes/Second"
	// @enum StandardUnit
	StandardUnitKilobytesSecond = "Kilobytes/Second"
	// @enum StandardUnit
	StandardUnitMegabytesSecond = "Megabytes/Second"
	// @enum StandardUnit
	StandardUnitGigabytesSecond = "Gigabytes/Second"
	// @enum StandardUnit
	StandardUnitTerabytesSecond = "Terabytes/Second"
	// @enum StandardUnit
	StandardUnitBitsSecond = "Bits/Second"
	// @enum StandardUnit
	StandardUnitKilobitsSecond = "Kilobits/Second"
	// @enum StandardUnit
	StandardUnitMegabitsSecond = "Megabits/Second"
	// @enum StandardUnit
	StandardUnitGigabitsSecond = "Gigabits/Second"
	// @enum StandardUnit
	StandardUnitTerabitsSecond = "Terabits/Second"
	// @enum StandardUnit
	StandardUnitCountSecond = "Count/Second"
	// @enum StandardUnit
	StandardUnitNone = "None"
)

const (
	// @enum StateValue
	StateValueOk = "OK"
	// @enum StateValue
	StateValueAlarm = "ALARM"
	// @enum StateValue
	StateValueInsufficientData = "INSUFFICIENT_DATA"
)

const (
	// @enum Statistic
	StatisticSampleCount = "SampleCount"
	// @enum Statistic
	StatisticAverage = "Average"
	// @enum Statistic
	StatisticSum = "Sum"
	// @enum Statistic
	StatisticMinimum = "Minimum"
	// @enum Statistic
	StatisticMaximum = "Maximum"
)


text:
export class PromiseCompleter<R> {
  promise: Promise<R>;
  resolve: (value?: R|PromiseLike<R>) => void;
  reject: (error?: any, stackTrace?: string) => void;

  constructor() {
    this.promise = new Promise((res, rej) => {
      this.resolve = res;
      this.reject = rej;
    });
  }
}

export class PromiseWrapper {
  static resolve<T>(obj: T): Promise<T> { return Promise.resolve(obj); }

  static reject(obj: any, _): Promise<any> { return Promise.reject(obj); }

  // Note: We can't rename this method into `catch`, as this is not a valid
  // method name in Dart.
  static catchError<T>(promise: Promise<T>, onError: (error: any) => T | PromiseLike<T>):
      Promise<T> {
    return promise.catch(onError);
  }

  static all<T>(promises: (T|Promise<T>)[]): Promise<T[]> {
    if (promises.length == 0) return Promise.resolve([]);
    return Promise.all(promises);
  }

  static then<T, U>(
      promise: Promise<T>, success: (value: T) => U | PromiseLike<U>,
      rejection?: (error: any, stack?: any) => U | PromiseLike<U>): Promise<U> {
    return promise.then(success, rejection);
  }

  static wrap<T>(computation: () => T): Promise<T> {
    return new Promise((res, rej) => {
      try {
        res(computation());
      } catch (e) {
        rej(e);
      }
    });
  }

  static scheduleMicrotask(computation: () => any): void {
    PromiseWrapper.then(PromiseWrapper.resolve(null), computation, (_) => {});
  }

  static isPromise(obj: any): boolean { return obj instanceof Promise; }

  static completer<T>(): PromiseCompleter<T> { return new PromiseCompleter<T>(); }
}

redpajama_set_name: RedPajamaGithub


text:
package org.xmlactions.pager.actions.form;

public class ClientParamNames
{

	/** This is the key to getting the table name from the HttpRequestMap */
	public final static String TABLE_NAME_MAP_ENTRY = "table.name";

	/** This is the key to getting the field name from the HttpRequestMap */
	public final static String FIELD_NAME_MAP_ENTRY = "field.name";

	/** This is the key to getting the theme name from the HttpRequestMap */
	public final static String THEME_NAME_MAP_ENTRY = "theme.name";

	/** This is the key to getting the label position from the HttpRequestMap */
	public final static String LABEL_POSITION_MAP_ENTRY = "label.position";

    /** This is the key to getting the storage reference from the HttpRequestMap */
    public final static String STORAGE_CONFIG_REF = "storage.config.ref";

    /** This is the key to getting the email reference from the HttpRequestMap */
    public final static String EMAIL_CONFIG_REF = "email.config.ref";

    /** This is the key to getting ant Table and Field Names from the HttpRequestMap */
    public final static String TABLE_FIELD_NAME = "table.field.name";

    /** This is the key to getting ant Table and Field Names from the HttpRequestMap */
    public final static String ENFORCE_CONCURRENCY = "enforce.concurrency";

    /**
     * This is the key to getting the CallbackPhoneAction callback.name
     * reference from the HttpRequestMap
     */
    public final static String CALLBACK_NAME = "callback.name";

    /**
     * This is the key to getting the CallbackPhoneAction callback.phone
     * reference from the HttpRequestMap
     */
    public final static String CALLBACK_PHONE = "callback.phone";

    /**
     * This is the key to getting the CallbackPhoneAction callback.email
     * reference from the HttpRequestMap
     */
    public final static String CALLBACK_EMAIL = "callback.email";

    /**
     * This is the key to getting the CallbackPhoneAction callback.email
     * reference from the HttpRequestMap
     */
    public final static String CALLBACK_MESSAGE = "callback.message";

	/** This is the key to getting the success key pair from the HttpRequestMap */
	public final static String ON_SUCCESS = "on_success";

	/**
	 * This is the key to getting the primary key value (if we doing an update)
	 * from the HttpRequestMap
	 */
	public final static String PK_VALUE = "pk.value";

	/**
	 * This is the key to getting the unique id for the form/action.
	 */
	public final static String UNIQUE_ID = "unique.id";

	/**
	 * When we are editing a page this contains the page name.
	 */
	public final static String PAGE_NAME = "page.name";

	/**
	 * When we are editing a page this contains the page content.
	 */
	public final static String PAGE_CONTENT = "page.content";

	/** This is the key to getting a parent table pk name (if used) from the HttpRequestMap */
	public final static String PARENT_TABLE_AND_PK_NAME = "parent.table.and.pk.name";

    /** if we want to call a pre processor this value will be set */
    public final static String PRE_PROCESSOR = "pre.processor";

    /** if we want to call a post processor this value will be set */
    public final static String POST_PROCESSOR = "post.processor";

    /** if we're passing a code.call as a parameter use this name */
    public final static String CODE_CALL = "call";

    /** if we're passing a code.call as a parameter use this name */
    public final static String PAGE = "page";

}


text:
require 'rubygems'
require 'json'
require 'net/http'
require 'uri/common'
require '0lib_rbot'

Net::HTTP.version_1_2

class WikiPediaPlugin < Plugin

	include PluginLib

    Config.register Config::ArrayValue.new("wikipedia.ignore_channels",
      :desc => "Don't show info on these channels",
      :default => [])

    Config.register Config::ArrayValue.new("wikipedia.ignore",
      :desc => "Don't show info for urls from users represented as hostmasks on this list. Useful for ignoring other bots, for example.",
      :default => [])

	def help(plugin, topic="")
		return "wikipedia|wp <term>"
	end

	def lookup(m,params)

		if params[:query].length == 0
			m.reply 'incorrect usage: ' + help(m.plugin)
			return
		end

		s = params[:query].join(' ')

		url = google_search(s + " site:en.wikipedia.org")

		return m.reply "No entry found for #{s}" if not url

		#debug "got url: #{url}"

		# http://en.wikipedia.org/wiki/Java_(programming_language)
		url =~ %r|^http://[a-z]+.wikipedia.org/wiki/(.*)$|
        title = $1

        #debug "found title #{title}"

        begin
            m.reply "#{title}: " + shorten( title, get_article(title) )
        rescue
            m.reply $!
        end

	end

	def shorten(title, article)

	    max_len = 1143 - (title.length + 2)
	    return article[0, max_len]

	end

  def listen(m)

    return if m.nil? or not m.kind_of?(PrivMessage) or m.channel.nil?

    return if @bot.config["wikipedia.ignore_channels"].map { |c| c.nil? ? c : c.downcase }.include? m.channel.downcase
    return if @bot.config["wikipedia.ignore"].find { |u| m.source.matches?(u) }

    if m.message =~ %r|http://en.wikipedia.org/wiki/([^ ]+)|
		# found a wikipedia link
        title = $1
        return if title =~ /^File:/
        begin
            m.reply "#{title}: " + shorten( title, get_article(title) )
        rescue
            m.reply $!
        end
    end

  end

  def google_search(str)

    searchfor = URI.escape str

    query = "/search?q=#{searchfor}&btnI=I%27m%20feeling%20lucky"
    result = "not found!"

    proxy_host = nil
    proxy_port = nil

    if(ENV['http_proxy'])
      if(ENV['http_proxy'] =~ /^http:\/\/(.+):(\d+)$/)
        proxy_host = $1
        proxy_port = $2
      end
    end

    http = @bot.httputil.get_proxy(URI.parse("http://www.google.com"))

    begin
      http.start {|http|
        resp = http.get(query)
        if resp.code == "302"
          result = resp['location']
        end
      }
    rescue => e
      p e
      if e.response && e.response['location']
        result = e.response['location']
      else
        result = "error!"
      end
    end

    return result

  end

	def get_article(title)

	    wp = 'http://en.wikipedia.org/w/index.php?title=%s&action=raw&section=0'

        res = fetchurl(sprintf(wp, title))
        raise sprintf('Lookup failed for "%s"', title) if not res

        if res =~ /^#REDIRECT \[\[(.*)\]\]/i then
            title = $1
            res = fetchurl(sprintf(wp, title))
            raise sprintf('Lookup failed for "%s"', title) if not res
        end

        debug res

        m = res.match(/^\{\{ *infobox.*^\}\}(.*)/mi)
        if m
            entry = m[1]
        else
            entry = res
        end

        if entry =~ %r|<title>Error</title>| or entry =~ %r|<title>Error</title>| then
            return 'Error fetching entry'
        end

        text = strip_tags( parse(entry) ).
        	   gsub(/\r\n/, ' | ').
               gsub(/[\n\r]/, ' ').
               strip

        return text

	end

	def parse(raw)

	    scanner = StringScanner.new(raw)
	    cursor = 0
	    categories = Array.new
	    languages = Hash.new
	    fulltext = ''
	    related = Array.new
	    headings = Array.new
	    text = ''
        seen_heading = false

        while cursor < raw.length do

            scanner.pos = cursor

            ## [[ ... ]]

            if (substr = scanner.scan(/\G\[\[ *(.*?) *\]\]/)) and substr =~ /\G\[\[ *(.*?) *\]\]/ then
                directive = $1
                cursor += $&.length - 1
                if directive =~ /\:/ then
                    (type, text) = directive.split(':')
                    if type.downcase == 'category' then
                        categories << text
                    end

                    # language codes
                    if type.length == 2 and type.downcase == type then
                        languages[type] = Array.new if not languages[type]
                        languages[type] = text
                    end

                elsif directive =~ /\|/ then
                    (lookup, name) = directive.split('|')
                    fulltext += name
                    related << lookup if lookup !~ /^#/

                else
                    fulltext += directive
                    related << directive
                end

            ## === heading 2 ===
            elsif (substr = scanner.scan(/=== *(.*?) *===/)) and substr =~ /=== *(.*?) *===/ then
                ### don't bother storing these headings
                fulltext += $1
                cursor += $&.length - 1
                next

            ## == heading 1 ==
            elsif (substr = scanner.scan(/== *(.*?) *==/)) and substr =~ /== *(.*?) *==/ then
                headings << $1
                text = fulltext if not seen_heading
                seen_heading = true
                fulltext += $1
                cursor += $&.length - 1
                next

            ## '' italics '' or ''' bold '''
            elsif (substr = scanner.scan(/''' *(.*?) *'''/)) and substr =~ /''' *(.*?) *'''/ then
                fulltext += $1
                cursor += $&.length
                next

            ## {{ disambig }}
            elsif (substr = scanner.scan(/\{\{ *(.*?) *\}\}/)) and substr =~ /\{\{ *(.*?) *\}\}/ then
                ## ignore for now
                cursor += $&.length
                next

            else
                fulltext += raw[cursor,1]

            end

            cursor += 1

        end

        return fulltext

	end

end

plugin = WikiPediaPlugin.new
plugin.register("wikipedia")
plugin.map 'wikipedia *query', :action => 'lookup'
plugin.map 'wiki *query', :action => 'lookup'