/// <summary>
        /// Runs this sample.
        /// </summary>
        /// <param name="adsense">AdSense service object on which to run the requests.</param>
        /// <param name="adClientId">The ID for the ad client to be used.</param>
        /// <param name="maxReportPageSize">The maximum page size to retrieve.</param>
        public static void Run(AdsenseService adsense, string adClientId, int maxReportPageSize)
        {
            CommandLine.WriteLine("=================================================================");
            CommandLine.WriteLine("Running paginated report for ad client {0}", adClientId);
            CommandLine.WriteLine("=================================================================");

            // Prepare report.
            var startDate     = DateTime.Today.ToString(DateFormat);
            var endDate       = DateTime.Today.AddDays(-7).ToString(DateFormat);
            var reportRequest = adsense.Reports.Generate(startDate, endDate);
            var pageSize      = maxReportPageSize;
            var startIndex    = 0;

            // Specify the desired ad client using a filter, as well as other parameters.
            reportRequest.Filter = new List <string> {
                "AD_CLIENT_ID==" +
                GenerateReport.EscapeFilterParameter(adClientId)
            };
            reportRequest.Metric = new List <string> {
                "PAGE_VIEWS", "AD_REQUESTS", "AD_REQUESTS_COVERAGE",
                "AD_REQUESTS_CTR", "COST_PER_CLICK", "AD_REQUESTS_RPM", "EARNINGS"
            };
            reportRequest.Dimension = new List <string> {
                "DATE"
            };
            reportRequest.Sort = new List <string> {
                "+DATE"
            };

            // Run first page of report.
            var reportResponse = getPage(reportRequest, startIndex, pageSize);

            if (reportResponse.Rows == null || reportResponse.Rows.Count == 0)
            {
                CommandLine.WriteLine("No rows returned.");
                return;
            }

            // Display headers.
            GenerateReport.displayHeaders(reportResponse.Headers);

            // Display first page of results.
            GenerateReport.displayRows(reportResponse.Rows);

            var totalRows = Math.Min(int.Parse(reportResponse.TotalMatchedRows), RowLimit);

            for (startIndex = reportResponse.Rows.Count; startIndex < totalRows;
                 startIndex += reportResponse.Rows.Count)
            {
                // Check to see if we're going to go above the limit and get as many results as we can.
                pageSize = Math.Min(maxReportPageSize, totalRows - startIndex);

                // Run next page of report.
                reportResponse = getPage(reportRequest, startIndex, pageSize);

                // If the report size changes in between paged requests, the result may be empty.
                if (reportResponse.Rows == null || reportResponse.Rows.Count == 0)
                {
                    break;
                }

                // Display results.
                GenerateReport.displayRows(reportResponse.Rows);
            }

            CommandLine.WriteLine();
        }