public without sharing class LeadIntentionController {
        public List<PCLInfo> pclInfos { get; set; }
    
    /*****************検索用******************/
    
    //检索日期
    public Contact con1 { get; set; }
    public Contact con2 { get; set; }
    
    //检索 两个页面上方的字段
    public String accSearch { get; set; }
    public String ownerSearch { get; set; }
    
    public List<SelectOption> dateOpts { get; private set; }
    public List<SelectOption> textOpts { get; private set; }
    public List<SelectOption> equalOpts { get; private set; }
    public List<SelectOption> textOpts2 { get; private set; }
    public List<SelectOption> equalOpts2 { get; private set; }
    public List<SelectOption> textOpts3 { get; private set; }
    public List<SelectOption> equalOpts3 { get; private set; }
    public List<SelectOption> limitOpts { get; private set; }

    //原因选项
    public List<SelectOption> reasonOpts { get; private set; }

    // public String dateField { get; set; }
    
    public String text { get; set; }
    public String condition { get; set; }
    public String value { get; set; }
    
    public String text2 { get; set; }
    public String condition2 { get; set; }
    public String value2 { get; set; }
    
    public String text3 { get; set; }
    public String condition3 { get; set; }
    public String value3 { get; set; }
    
    public Boolean onlyOpp { get; set; }
    
    public String limits { get; set; }

    //原因选项
    public String reasons { get;set; }
    public String inquiryformId { get;set; }
    public String reason { get;set; }
    public String opp_ID { get;set; }
    // public String Opp_Name_Search_Id { get;set; }
    public String batchReason { get;set; }

    //状态未跟进
    public String   leadStatus { get; set; }
    //战略科室有效
    public String   isActiveFormula { get; set; }
    
    /*****************画面表示Bean******************/
    public Integer pclCount { get; set; }
    public String saveType { get; set; }

    public String sortKey { get; set; }
    public String preSortKey { get; set; }
    public Boolean sortOrderAsc { get; set; }
    public String[] sortOrder { get; set; }
    public String[] columus = new String[]{'Contact_Name__c', 'Hospital_Name__c', 'Department_Class__c', 'Company__c', 'Status__c'
                                          ,'Request1__c', 'Inquiry_No__c', 'Phone__c', 'Email__c', 'Cancel_Reason__c'
                                          ,'Opp_Name_Search__c', 'Opportunity_Division__c', 'LeadSource__c', 'Campaign__c'
                                          ,'Urgent__c', 'Request_Detail__c','Contact_Id__c','Hospital_ID__c','Department_ID__c','Opp_Name_Search_ID__c'
                                          ,'Campaign_ID__c','Id','Name','Family_Name__c','Last_Name__c','Reasons_options__c','Product1__c'
                                          };
    private String soqlWithoutSort = null;
    private String soqlForMoneyWithoutSort = null;

    private static Integer searchLimit = 1000;
    public String staticResource {get; set;}
    public String awsDataIds {get; set;}
    public LeadIntentionController() {

        pclInfos = new List<PCLInfo>();

        con1 = new Contact();
        con2 = new Contact();

        dateOpts = new List<SelectOption>();

        textOpts = new List<SelectOption>();
        textOpts.add(new SelectOption('','--无--'));
        textOpts.add(new SelectOption('S:Name', Schema.SObjectType.Inquiry_form__c.fields.Name.label));
        textOpts.add(new SelectOption('S:Hospital_Name__r.Name', Schema.SObjectType.Inquiry_form__c.fields.Hospital_Name__c.label));
        textOpts.add(new SelectOption('S:Department_Class__r.Name', Schema.SObjectType.Inquiry_form__c.fields.Department_Class__c.label));
        textOpts.add(new SelectOption('S:Status__c', Schema.SObjectType.Inquiry_form__c.fields.Status__c.label));
        textOpts.add(new SelectOption('S:Request1__c', Schema.SObjectType.Inquiry_form__c.fields.Request1__c.label));
        textOpts.add(new SelectOption('S:Product1__c', Schema.SObjectType.Inquiry_form__c.fields.Product1__c.label));
        textOpts.add(new SelectOption('S:Phone__c', Schema.SObjectType.Inquiry_form__c.fields.Phone__c.label));
        textOpts.add(new SelectOption('S:Email__c', Schema.SObjectType.Inquiry_form__c.fields.Email__c.label));
        textOpts.add(new SelectOption('S:Cancel_Reason__c', Schema.SObjectType.Inquiry_form__c.fields.Cancel_Reason__c.label));
        textOpts.add(new SelectOption('S:Opp_Name_Search__r.Name', Schema.SObjectType.Inquiry_form__c.fields.Opp_Name_Search__c.label));
        textOpts.add(new SelectOption('S:Opportunity_Division__c', Schema.SObjectType.Inquiry_form__c.fields.Opportunity_Division__c.label));
        textOpts.add(new SelectOption('S:LeadSource__c', Schema.SObjectType.Inquiry_form__c.fields.LeadSource__c.label));
        textOpts.add(new SelectOption('S:Campaign__r.Name', Schema.SObjectType.Inquiry_form__c.fields.Campaign__c.label));
        textOpts.add(new SelectOption('S:Request_Detail__c', Schema.SObjectType.Inquiry_form__c.fields.Request_Detail__c.label));

        textOpts2 = textOpts;
        textOpts3 = textOpts;

        equalOpts = new List<SelectOption>();
        equalOpts.add(new SelectOption('equals','等于'));
        equalOpts.add(new SelectOption('notequals','不等于'));
        equalOpts.add(new SelectOption('contains','包含'));
        equalOpts.add(new SelectOption('notcontains','不包含'));
        equalOpts.add(new SelectOption('starts with','起始字符'));
        
        equalOpts2 = equalOpts;
        equalOpts3 = equalOpts;

        limitOpts = new List<SelectOption>();
        // limitOpts.add(new SelectOption('5','5'));
        limitOpts.add(new SelectOption('20','20'));
        limitOpts.add(new SelectOption('50','50'));
        limitOpts.add(new SelectOption('100','100'));
        limitOpts.add(new SelectOption('200','200'));
        limitOpts.add(new SelectOption('500','500'));
        limitOpts.add(new SelectOption('' + (searchLimit + 1), '全部'));
        
        limits = '50';

        reasonOpts = new List<SelectOption>();
        reasonOpts.add(new SelectOption('已经有询价','已经有询价'));
        reasonOpts.add(new SelectOption('客户不需要','客户不需要'));
        reasonOpts.add(new SelectOption('客户不存在','客户不存在'));
        

        reasons = '原因选项';

        leadStatus = '01.未跟进';

        isActiveFormula = '有效';

        staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Inquiry_form__c')); 

    }

    public PageReference init() {
        system.debug('test:12345');
        onlyOpp = false;
        String uidParam = System.currentPageReference().getParameters().get('uid');
        if (uidParam != null){
            User u = [select Id, FirstName, LastName from User where Id = :uidParam];
            ownerSearch = u.LastName + ' ' + u.FirstName;
        }
        String hpidParam = System.currentPageReference().getParameters().get('hpid');
        if(hpidParam != null){
            List<Account> hpAcc = ControllerUtil.selectAccountForTrigger(new String[] {hpidParam});
            if (hpAcc.size() > 0) {
                accSearch = hpAcc[0].name;
            }
        }
        soqlWithoutSort = this.makeSoql(false, accSearch, ownerSearch,
                                     text, condition, value, text2, condition2, value2, text3, condition3, value3);
        String soql = soqlWithoutSort + ' order by  CreatedDate  desc limit ' + Integer.valueOf(limits);
        
        soqlForMoneyWithoutSort = this.makeSoql(true, accSearch, ownerSearch,
                                    text, condition, value, text2, condition2, value2, text3, condition3, value3);
        String soqlForMoney = soqlForMoneyWithoutSort + ' order by  CreatedDate   desc limit ' + Integer.valueOf(System.Label.TotalLimit);
        System.debug('soqlWithoutSort:' + soqlWithoutSort);
        system.debug('aaaaaaaaaa'+soql);
        system.debug('bbbbbbb:'+soqlForMoney);
        List<Inquiry_form__c> queryList = Database.query(soql);
        List<Inquiry_form__c> queryListForMoney = Database.query(soqlForMoney);
        system.debug('ppppppppp:'+queryList);
        system.debug('ooooooooo:'+queryListForMoney);
        system.debug('ppppppppp的size():'+queryList.size());
        system.debug('ooooooooo的size():'+queryListForMoney.size());

        this.makeOppRecordsForView(queryList, queryListForMoney);
        
        this.sortKey = '0';
        this.preSortKey = '0';
        this.sortOrderAsc = true;
        this.sortOrder = new String[columus.size()];
        for (Integer i = 0; i < columus.size(); i++) this.sortOrder[i] = '　';
        
        System.debug('最后取得:'+pclInfos.size());
        pclCount = pclInfos.size();
        
        ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '取得最近的 ' + pclCount + ' 条数据'));

        List<String> a = new List<String>();
        for(Inquiry_form__c ifc : queryList){
            a.add(ifc.AWS_Data_Id__c);
        }
        awsDataIds = JSON.serialize(a);
        return null;
    }

    public PageReference searchOpp() {
        pclInfos = new List<PCLInfo>();
        
        String soql = this.makeSoql(false, accSearch, ownerSearch, text, condition, value, text2, condition2, value2, text3, condition3, value3)+ ' order by     CreatedDate desc limit ' + Integer.valueOf(limits);
        // soql += ' order by Name limit ' + Integer.valueOf(limits);
        
        String soqlForMoney = this.makeSoql(true, accSearch, ownerSearch, text, condition, value, text2, condition2, value2, text3, condition3, value3)+ ' order by   CreatedDate desc limit ' + Integer.valueOf(System.Label.TotalLimit);
        // soqlForMoney += ' order by Name limit ' + Integer.valueOf(System.Label.TotalLimit);
        this.sortOrder[0] = '↑';
        
        system.debug('soql：'+soql);
        system.debug('soqlForMoney：'+soqlForMoney);
        List<Inquiry_form__c> queryList = Database.query(soql);
        List<Inquiry_form__c> queryListForMoney = Database.query(soqlForMoney);
        
        this.makeOppRecordsForView(queryList, queryListForMoney);
        
        pclCount = pclInfos.size();
        if (pclCount > searchLimit) {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, 'The search returned more than the maximum number of rows (' + searchLimit + ')'));
        } else {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '共有 ' + pclCount + ' 条数据'));
        }
        return null;
    }
 
    public PageReference sortTable() {
        pclInfos = new List<PCLInfo>();
        
        if (this.sortKey == this.preSortKey) {
            this.sortOrderAsc = !this.sortOrderAsc;
            this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓');
        } else {
            this.sortOrderAsc = true;
            this.sortOrder[Integer.valueOf(this.preSortKey)] = '　';
            this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓');
        }

        system.debug(this.sortKey);
        this.preSortKey = this.sortKey;
        
        String soql = soqlWithoutSort
                + ' order by ' + this.columus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last') + ' limit ' + Integer.valueOf(limits);
system.debug('sort:::::'+ soql);
        List<Inquiry_form__c> queryList = Database.query(soql);
        String soqlForMoney = soqlForMoneyWithoutSort 
                + ' order by ' + this.columus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last')+ ' limit ' + Integer.valueOf(System.Label.TotalLimit) ;
system.debug('sort:::::'+ soqlForMoney);
        List<Inquiry_form__c> queryListForMoney = Database.query(soqlForMoney);
        
        
        this.makeOppRecordsForView(queryList, queryListForMoney);
        pclCount = pclInfos.size();
        if (pclCount > searchLimit) {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, 'The search returned more than the maximum number of rows (' + searchLimit + ')'));
        } else {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '共有 ' + pclCount + ' 条数据'));
        }
        return null;
    }
    //修改询问单状态为不要 并保存原因
    public PageReference   saveInquiryform() {
        //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '66666666666___'+ Id));
        system.debug('aaaaaaaaa'+inquiryformId+'bbbbbbbb'+reason);
        if (String.isNotBlank(inquiryformId)){
            List<Inquiry_form__c> updateInquiryform = new List<Inquiry_form__c>();
            Inquiry_form__c inquiryForm = new Inquiry_form__c();
            inquiryForm.Id = inquiryformId;
            inquiryForm.Status__c = '02.不需要';
            //不需要的时候 的确认日期
            system.debug('ccccccc:'+opp_ID);
            inquiryForm.Confirmation_Date__c = Date.toDay();
            inquiryForm.Reasons_options__c = reason;
            inquiryForm.Cancel_Reason__c = reason;
            if(reason == '已经有询价'){
                inquiryForm.Opp_Name_Search__c = opp_ID;
            }
            updateInquiryform.add(inquiryForm);

            if (updateInquiryform.size() > 0) {
                update updateInquiryform;
                // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '询问单状态更新完毕,已保存,请手动刷新页面。'));
            }
            inquiryformId = '';
        }
        
         return loadPage(); 
    }

     public PageReference loadPage() {
        PageReference ref = new PageReference('/apex/LeadIntention');
        ref.setRedirect(true);
        return ref;
    }
    //批量更新 询问单状态
    public PageReference   saveInquiryOpts() {
            //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '66666666666___'+ Id));

        try {
            system.debug('ccccccc'+batchReason);
        List<Inquiry_form__c> updSAs = new List<Inquiry_form__c>();
            
            for (PCLInfo oi : pclInfos) {
                  system.debug('输出的值为：'+oi.reasonFlg);  
                if (oi.reasonFlg == '1') {
                    oi.reasonFlg = '0';
                    oi.rec.Status__c = '02.不需要';
                    oi.rec.Reasons_options__c=batchReason;
                    oi.rec.Cancel_Reason__c = batchReason;
                    oi.rec.Confirmation_Date__c = Date.toDay();
                    updSAs.add(oi.rec); 
                    system.debug('更新的字段为：'+oi.rec);
                }
                 
            }
            system.debug(updSAs); 
        if (updSAs.size() > 0) update updSAs;
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, 'Save Completed'));
        }catch (Exception ex) {
            ApexPages.addMessages(ex);
            return null;
        } 
            
           return null; 
        }
       
    public PageReference save() {
        try {

            List<Inquiry_form__c> updSAs = new List<Inquiry_form__c>();
            system.debug('输出的值为：'+pclInfos);
            for (PCLInfo oi : pclInfos) {
                if (oi.changeFlg == '1') {
                    oi.changeFlg = '0';
                    updSAs.add(oi.rec);
                    system.debug('更新的字段为：'+oi.rec);
                }

                 
            }

            if (updSAs.size() > 0) update updSAs;
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, 'Save Completed'));
        } catch (Exception ex) {
            ApexPages.addMessages(ex);
            return null;
        }
        
        if (saveType == '1') {
            searchOpp();
            saveType = '';
        } else if (saveType == '2') {
            sortTable();
            saveType = '';
        } else {  
        }
        return null;
    }

    public PageReference cancel() {
        return new PageReference('/home/home.jsp');
    }

    private String makeSoql(Boolean isforMoneyFlg, String accStr, String ownerStr, //String dept, String rank, Boolean consumable,
                            String txt, String con, String val,
                            String txt2, String con2, String val2,
                            String txt3, String con3, String val3) {
        String soql ='';
            soql += 'select Id, Contact_Name__c, Hospital_Name__r.Name, Department_Class__c, Company__c, Request1__c,'
                + ' Inquiry_No__c, Phone__c, Email__c, Cancel_Reason__c,Status__c,'
                + ' Opp_Name_Search__c, Opportunity_Division__c, LeadSource__c, Campaign__c,'
                + ' Urgent__c, Request_Detail__c ,Contact_Id__c,Hospital_ID__c,Department_ID__c,Opp_Name_Search_ID__c,'
                + 'Campaign_ID__c,Last_Name__c,Family_Name__c,Name,Reasons_options__c,'
                + 'Product1__c,Confirmation_Date__c,AWS_Data_Id__c'
                //,Lead_link__c
                + ' from Inquiry_form__c where Id != null ';
                //2021-11-24  mzy  共通平台项目-首页修改  start
                //只查询所有人是当前用户的产品咨询单
                //+ ' And OwnerId = \''+UserInfo.getUserId()+'\''
                //2021-11-24  mzy  共通平台项目-首页修改  end

        //状态只显示未跟进
        if (!String.isBlank(leadStatus)) {
            String[] vals = leadStatus.split(' ');
                    for (String v : vals) {
                        soql += ' and Status__c = \'' + v + '\'' ;
            } 
        }
        if(!String.isBlank(isActiveFormula)){
            String[] vals = isActiveFormula.split(' ');
                    for (String v : vals) {
                        soql += ' and Department_Class__r.Is_Active_Formula__c = \'' + v + '\'' ;
            } 
        }
        if (!String.isBlank(accStr)) {
            String[] vals = accStr.split(' ');
            for (String v : vals) {
                soql += ' and Hospital_Name__r.Name like \'%' + v + '%\'';
            }
        }
        if (!String.isBlank(ownerStr)) {
            String[] vals = ownerStr.split(' ');
            for (String v : vals) {
                soql += ' and Name like \'%' + v + '%\'';
            }
        }
        
        soql += this.makeTextSql(txt, con, val);
        soql += this.makeTextSql(txt2, con2, val2);
        soql += this.makeTextSql(txt3, con3, val3);
        
        system.debug('sssssss:'+soql);
        return soql;
    }

    private void makeOppRecordsForView(List<Inquiry_form__c> queryList, List<Inquiry_form__c> queryListForMoney) {
        Savepoint sp = Database.setSavepoint();
        Database.SaveResult[] results = Database.update(queryList, false);
        Database.rollback(sp);
        system.debug('llllllllll:'+queryListForMoney.size());
        for (Integer i = 0; i < queryListForMoney.size(); i++) {
            system.debug('vvvvvvvvvv:'+queryList);
            if(i<queryList.size()){
                if (i == searchLimit + 1) {
                    continue;
                }
                pclInfos.add(new PCLInfo(queryList[i]));
                pclInfos[pclInfos.size() - 1].lineNo = pclInfos.size() - 1;
                //拼接 复选框的id值
                pclInfos[pclInfos.size() - 1].chk = 'chk'+ pclInfos[pclInfos.size() - 1].lineNo;
                if (!results[i].isSuccess()) {
                    pclInfos[pclInfos.size() - 1].canEdit = false;
                    if (results[i].getErrors()[0].getStatusCode() != null) {
                        if (String.valueOf(results[i].getErrors()[0].getStatusCode()) == 'INSUFFICIENT_ACCESS_OR_READONLY') {
                            pclInfos[pclInfos.size() - 1].hasError = true;
                        } else {
                            pclInfos[pclInfos.size() - 1].hasFieldError = true;
                        }
                    }
                }
            }
  
        }
    }

private String makeTextSql(String txt1, String con, String val) {
    system.debug('第一个参数：'+txt1+'第二个参数：'+con+'第三个参数：'+val);
        String soql = '';
        if (!String.isBlank(txt1)) {
            if ((con == 'contains' || con == 'notcontains') && val.contains(' ')) {
                String[] vals = val.split(' ');
                String cSql = '';
                for (String v : vals) {
                    cSql += this.makeTextSqlStr(txt1, con, v);
                }
                if (con == 'contains') {
                    soql += cSql;
                } else {
                    cSql = cSql.replaceAll(' and ', ') and (NOT ');
                    soql += cSql.substring(1) + ') ';
                }
            } else if ((con == 'equals' || con == 'notequals') && val.contains(',')) {
                String[] vals = val.split(',');
                if (vals.size() > 0) {
                    String txt = txt1.substring(2);  
                    soql += ' and ( ';
                    for (String v : vals) {
                        if (con == 'equals') {
                            soql += txt + ' = \'' + v + '\' or ';
                            system.debug('wwwwwwwwwwww :'+soql);
                        } else {
                            // notequals
                            soql += txt + ' <> \'' + v + '\' and ';
                        }
                    }
                    soql = soql.substring(0, soql.length() - 4);
                    soql += ')';
                }
            } else {
                String cSql = this.makeTextSqlStr(txt1, con, val);
                if (con != 'notcontains') {
                    soql += this.makeTextSqlStr(txt1, con, val);
                } else {
                    // notcontains
                    cSql = cSql.substring(5);    
                    soql += ' and (NOT ' + cSql + ') ';
                }
            }
        }
        return soql;
    }
    private String makeTextSqlStr(String txt1, String con, String val) {
        String soql = '';
        system.debug('第一个参数：'+txt1+'第二个参数：'+con+'第三个参数：'+val);
        if (!String.isBlank(txt1)) {
            String txt = txt1.substring(2);
            String colType = txt1.substring(0, 2);
            String tmpVal = val;
            if (String.isBlank(tmpVal)) {
                if (con == 'equals') {
                    soql += ' and ' + txt + ' = null';
                } else if (con == 'notequals') {
                    soql += ' and ' + txt + ' <> null';
                } else {
                }
            } else {
                soql += ' and ' + txt;
                if (con == 'equals') {
                    if (colType == 'S:') {
                        soql += ' = \'' + tmpVal + '\'';
                    } else {
                        soql += ' = ' + tmpVal + ' ';
                    }
                } else if (con == 'notequals') {
                    if (colType == 'S:') {
                        soql += ' <> \'' + tmpVal + '\'';
                    } else {
                        soql += ' <> ' + tmpVal + ' ';
                    }
                } else if (con == 'contains' || con == 'notcontains') {
                    soql += ' like \'%' + tmpVal + '%\'';
                } else if (con == 'starts with') {
                    soql += ' like \'' + tmpVal + '%\'';
                } else {
                    if (colType == 'S:') {
                        soql += ' ' + con + '\'' + tmpVal + '\'';
                    } else {
                        soql += ' ' + con + ' ' + tmpVal + ' ';
                    }
                }
            }
        }
        return soql;
    }

     class PCLInfo {
        public Inquiry_form__c rec { get; set; }
        public Boolean canEdit { get; private set; }
        public Boolean hasError { get; private set; }
        public Boolean hasFieldError { get; private set; }
        public Integer lineNo { get; private set; }
        public String changeFlg { get; set; }
        public String reasonFlg { get; set; }
        //复选框id值
        public String chk { get;set; }
        
        public PCLInfo(Inquiry_form__c record) {
            rec = record;
            canEdit = true;
            hasError = false;
            hasFieldError = false;
            lineNo = 0;
            changeFlg = '0';
            reasonFlg = '0';
            chk = 'chk'+lineNo;
        }

    }
	
    public static void forTest(){
        integer i = 0;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
    }
}