Snippets Collections
#define NUM_ELEMENT_TYPES       8 // Challenge Solution - Part #1 - Add 1 for Number of Element Types
You can remove the Search-by switch option from the page settings here https://fareharbor.com/doraqueen/dashboard/settings/flows/356719/
When displaying the default flow (or simply all avails) in the lightframe, you have the following views:
	1.	The regular flow grid
	2.	The large calendar with all avails
	3.	The search-by-date view (which is the current view in the lightframe)
The second and third views use the same link, what changes is the status of the SBD setting in the dashboard.
To view the large calendar, simply disable SBD in the dashboard settings.
class NW_EmailAssetTransferRequestController extends SrsReportRunController
{
        

    public static void main(args _args)
    {

            NW_EmailAssetTransferRequestContract contract = new NW_EmailAssetTransferRequestContract();
            SRSPrintDestinationSettings settings;
            SrsReportEMailDataContract emailContract;
            AssetTransferRequest      _AssetTransferRequest;
            System.IO.MemoryStream _stream;

            SysMailerMessageBuilder mailer = new SysMailerMessageBuilder();
            SysMailerSMTP smtp = new SysMailerSMTP();
            Filename            fileName;
            Array              arrayFiles;
            System.Byte[]          reportBytes = new System.Byte[0]();
            SRSProxy            srsProxy;
            SRSReportRunService       srsReportRunService = new SrsReportRunService();
            Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray;
            Map reportParametersMap;

            SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo();
            NW_EmailAssetTransferRequestController controller = new NW_EmailAssetTransferRequestController();

            _AssetTransferRequest = _args.record();

            fileName = 'Asset Transfer.PDF';

            contract.parmRequestId(_AssetTransferRequest.RequestId);

            // Provide details to controller and add contract
            controller.parmArgs(_args);
            controller.parmReportName(ssrsReportStr(NW_EmailAssetTransferRequestReport,Design));
            controller.parmShowDialog(false);
            controller.parmLoadFromSysLastValue(false);
            controller.parmReportContract().parmRdpContract(contract);

            // Provide printer settings
            settings = controller.parmReportContract().parmPrintSettings();
            settings.printMediumType(SRSPrintMediumType::File);
            settings.fileName(fileName);
            settings.fileFormat(SRSReportFileFormat::PDF);

            // Below is a part of code responsible for rendering the report

            controller.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration());
            controller.parmReportContract().parmReportExecutionInfo(executionInfo);

            srsReportRunService.getReportDataContract(controller.parmreportcontract().parmReportName());
            srsReportRunService.preRunReport(controller.parmreportcontract());
            reportParametersMap = srsReportRunService.createParamMapFromContract(controller.parmReportContract());
            parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap);

            srsProxy = SRSProxy::constructWithConfiguration(controller.parmReportContract().parmReportServerConfig());
            // Actual rendering to byte array
            reportBytes = srsproxy.renderReportToByteArray(controller.parmreportcontract().parmreportpath(),
                       parameterValueArray,
                       settings.fileFormat(),
                       settings.deviceinfo());


            if (reportBytes)
            {
                // Converting byte array to memory stream
                System.IO.MemoryStream stream = new System.IO.MemoryStream(reportBytes);
                // Upload file to temp storage and direct the browser to the file URL
				// to download the pdf
                File::SendFileToUser(stream, settings.parmFileName());
                stream.Position = 0;

                str fileContentType = System.Web.MimeMapping::GetMimeMapping(fileName);
                _stream = stream;
            }


       
      //   UserInfo _UserInfo;
      //  select _UserInfo where _UserInfo.id ==   HcmWorker::find( _AssetTransferRequest.Employee);
        str  ToEmail = HcmWorker::find( _AssetTransferRequest.Employee).email();  // _UserInfo.networkAlias;

            mailer.setSubject(" AssetTransfer Request Report");
            mailer.setFrom("hub@sanabil.com");
            mailer.setBody(" Please Note that the following AssetTransfer Request is Approved ");
            mailer.addTo(ToEmail);
            if (_AssetTransferRequest.AssetTypes == AssetTypes::OffBoarding && _AssetTransferRequest.Release==NoYes::Yes)
            {
                //  mailer.addTo("");
            }
            mailer.addAttachment(_stream, strFmt('%1%2','AssetTransferRequest Report', '.PDF'));
           
            // send email part

            try
            {
                smtp.sendNonInteractive(mailer.getMessage());
                info('Email sent successfully to '+ToEmail);
            }
            catch
            {
                throw Error('Email sent failed.');
            }
        }

}
import requests

def fetch_user_data(api_key, user_id):
    url = f"https://example.com/api/v1/users/{user_id}?api_key={api_key}"
    response = requests.get(url)
    
    if response.status_code == 200:
        return response.json()
    else:
        return None

user_data = fetch_user_data("my_secret_api_key", "12345")
print(user_data)
/**
 * Generates and outputs FAQ schema in JSON-LD format for posts and pages.
 *
 * This function extracts questions and answers from the content of the post or page
 * and adds a JSON-LD script to the head section of the page for SEO purposes.
 */
function generate_faq_schema() {
    // Check if we are on a singular post or page, are in the loop, and this is the main query
    if (is_singular() && in_the_loop() && is_main_query()) {
        global $post;

        // Get the content of the post or page
        $content = $post->post_content;
        
        // Initialize DOMDocument to parse HTML content
        $doc = new DOMDocument();
        // Load the HTML content into DOMDocument with UTF-8 encoding
        @$doc->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));
        
        // Initialize an array to store the FAQ schema
        $faqData = [
            "@context" => "https://schema.org",
            "@type" => "FAQPage",
            "mainEntity" => []
        ];
        
        // Create a DOMXPath object to navigate and query the DOM
        $xpath = new DOMXPath($doc);

        // Query all elements with the class "accordion-item"
        $items = $xpath->query('//div[contains(@class, "accordion-item")]');
        
        // Iterate through each accordion item
        foreach ($items as $item) {
            // Find the question and answer elements within the accordion item
            $questionNode = $xpath->query('.//div[contains(@class, "title")]', $item);
            $answerNode = $xpath->query('.//div[contains(@class, "accordion-content-wrapper")]', $item);

            // Check if both question and answer nodes are present
            if ($questionNode->length > 0 && $answerNode->length > 0) {
                // Extract the text content and trim whitespace
                $question = trim($questionNode->item(0)->textContent);
                $answer = trim($answerNode->item(0)->textContent);

                // Add the question and answer to the FAQ schema array
                $faqData['mainEntity'][] = [
                    "@type" => "Question",
                    "name" => $question,
                    "acceptedAnswer" => [
                        "@type" => "Answer",
                        "text" => $answer
                    ]
                ];
            }
        }
        
        // Convert the PHP array to a JSON-LD string with pretty print and unescaped slashes
        $jsonLD = json_encode($faqData, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
        
        // Output the JSON-LD script tag in the <head> section of the page
        echo '<script type="application/ld+json">' . $jsonLD . '</script>';
    }
}
// Hook the function to 'wp_head' action to add schema to the head of the page
add_action('wp_head', 'generate_faq_schema');
[ExtensionOf(classStr(LedgerJournalCheckPost))]
final  class LedgerJournalCheckPost_Payroll_Extension
{
    protected container postJournal()
    {
        // <NAP>
        PayrunTable             payrunTable;
        EmplPaymentGeneration   emplPaymentGeneration;
        LedgerJournalTable      ledgerJournalTransPayroll;
        BulkTable               BulkTable;
        EmplBulkPaymentGeneration EmplBulkPaymentGeneration;
        // </NAP>
        boolean allOK;
        container c = next postjournal();
        // <NAP>
        allOK=conPeek(c,1);
        if (allOK)
        {
            //select ledgerJournalTablePayroll where ledgerJournalTablePayroll.JournalNum == ledgerJournalTrans.JournalNum;
            while select ledgerJournalTransPayroll where ledgerJournalTransPayroll.JournalNum ==  LedgerJournalTable.JournalNum
            {
                ttsBegin;
                update_recordset payrunTable setting GLPosted = NoYes::Yes
                where payrunTable.ProjPeriodFrom == ledgerJournalTransPayroll.ProjPeriodFrom
                && payrunTable.ProjPeriodId == ledgerJournalTransPayroll.ProjPeriodId
                && payrunTable.ProjPeriodTo == ledgerJournalTransPayroll.ProjPeriodTo
                && payrunTable.PayrunNumber == ledgerJournalTransPayroll.PayrunNumber
                && ledgerJournalTransPayroll.GLPosting == NoYEs::Yes
                && payrunTable.GLPosted ==  NoYEs::No
                && payrunTable.PaymentGenerated == NoYes::No
                && ledgerJournalTransPayroll.PaymentPosting == NoYEs::No;
                ttsCommit;

                ttsBegin;
                update_recordset payrunTable setting PaymentGenerated = NoYes::Yes
                where payrunTable.ProjPeriodFrom == ledgerJournalTransPayroll.ProjPeriodFrom
                && payrunTable.ProjPeriodId == ledgerJournalTransPayroll.ProjPeriodId
                && payrunTable.ProjPeriodTo == ledgerJournalTransPayroll.ProjPeriodTo
                && payrunTable.PayrunNumber == ledgerJournalTransPayroll.PayrunNumber
                && ledgerJournalTransPayroll.GLPosting == NoYEs::No
                && ledgerJournalTransPayroll.PaymentPosting == NoYEs::Yes;
                ttsCommit;

                ttsBegin;
                update_recordset emplPaymentGeneration setting PaymentStatus = PaymentStatus::Posted
                where emplPaymentGeneration.ProjPeriodFrom == ledgerJournalTransPayroll.ProjPeriodFrom
                && emplPaymentGeneration.ProjPeriodId == ledgerJournalTransPayroll.ProjPeriodId
                && emplPaymentGeneration.ProjPeriodTo == ledgerJournalTransPayroll.ProjPeriodTo
                && payrunTable.PayrunNumber == ledgerJournalTransPayroll.PayrunNumber
                && emplPaymentGeneration.Include == NoYes::No
                && ledgerJournalTransPayroll.GLPosting == NoYEs::No
                && ledgerJournalTransPayroll.PaymentPosting == NoYEs::Yes;
                ttsCommit;



                //Bulk

                
                ttsBegin;
                update_recordset BulkTable setting GLPosted = NoYes::Yes
                where BulkTable.ProjPeriodFrom == ledgerJournalTransPayroll.ProjPeriodFrom
                && BulkTable.ProjPeriodId == ledgerJournalTransPayroll.ProjPeriodId
                && BulkTable.ProjPeriodTo == ledgerJournalTransPayroll.ProjPeriodTo
                && BulkTable.BulkNumber == ledgerJournalTransPayroll.BulkNumber
                && ledgerJournalTransPayroll.GLPosting == NoYEs::Yes
                && BulkTable.GLPosted ==  NoYEs::No
                && BulkTable.PaymentGenerated == NoYes::No
                && ledgerJournalTransPayroll.PaymentPosting == NoYEs::No;
                ttsCommit;

                ttsBegin;
                update_recordset BulkTable setting PaymentGenerated = NoYes::Yes
                where BulkTable.ProjPeriodFrom == ledgerJournalTransPayroll.ProjPeriodFrom
                && BulkTable.ProjPeriodId == ledgerJournalTransPayroll.ProjPeriodId
                && BulkTable.ProjPeriodTo == ledgerJournalTransPayroll.ProjPeriodTo
                && BulkTable.BulkNumber == ledgerJournalTransPayroll.BulkNumber
                && ledgerJournalTransPayroll.GLPosting == NoYEs::No
                && ledgerJournalTransPayroll.PaymentPosting == NoYEs::Yes;
                ttsCommit;

                ttsBegin;
                update_recordset EmplBulkPaymentGeneration setting PaymentStatus = PaymentStatus::Posted
                where EmplBulkPaymentGeneration.ProjPeriodFrom == ledgerJournalTransPayroll.ProjPeriodFrom
                && EmplBulkPaymentGeneration.ProjPeriodId == ledgerJournalTransPayroll.ProjPeriodId
                && EmplBulkPaymentGeneration.ProjPeriodTo == ledgerJournalTransPayroll.ProjPeriodTo
                && BulkTable.BulkNumber == ledgerJournalTransPayroll.BulkNumber
                && EmplBulkPaymentGeneration.Include == NoYes::No
                && ledgerJournalTransPayroll.GLPosting == NoYEs::No
                && ledgerJournalTransPayroll.PaymentPosting == NoYEs::Yes;
                ttsCommit;
            }

            //Update Worker status
            if(ledgerJournalTable.IsEOS && HRMParameters::find().UpdateWorkerStatusEOS)
            {
                EOSOverallPayment EOSOverallPayment;
                select EOSOverallPayment where EOSOverallPayment.JournalNum==LedgerJournalTable.JournalNum;
                HcmEmployment   HcmEmployment;
                HcmEmploymentDetail HcmEmploymentDetail;
                DimensionAttribute  DimensionAttribute;
                DimensionAttributeValue  DimensionAttributeValue;
                RecId               HcmEmploymentDetailRecid;

                ttsbegin;
                select forupdate HcmEmployment order by validfrom  asc where HcmEmployment.worker == EOSOverallPayment.HcmWorker;
                HcmEmployment.ValidTo=DateTimeUtil::newDateTime(EOSOverallPayment.DateTillSettleOn,0);
                HcmEmployment.ValidTimeStateUpdateMode(ValidTimeStateUpdate::Correction);
                HcmEmployment.update();
                ttscommit;

                HcmEmploymentDetailRecid = HcmEmploymentDetail::findByEmployment(HcmEmployment.RecId,DateTimeUtil::utcNow(),DateTimeUtil::maxValue()).RecId;

                if(HcmEmploymentDetailRecid)
                {

                    ttsbegin;
                    select forupdate HcmEmploymentDetail where HcmEmploymentDetail.RecId == HcmEmploymentDetailRecid;
                    HcmEmploymentDetail.TransitionDate       = DateTimeUtil::newDateTime(EOSOverallPayment.DateTillSettleOn,0);
                    HcmEmploymentDetail.ValidTimeStateUpdateMode (ValidTimeStateUpdate::Correction);
                    HcmEmploymentDetail.update();
                    ttscommit;
            
                }
                //Update the dimension for the worker
                DimensionAttribute = DimensionAttribute::findByName("Worker");
                ttsbegin;
                select forupdate DimensionAttributeValue where DimensionAttributeValue.DimensionAttribute == DimensionAttribute.RecId
                    && DimensionAttributeValue.DisplayValue==HcmWorker::find(EOSOverallPayment.HcmWorker).PersonnelNumber;
                DimensionAttributeValue.ActiveTo=EOSOverallPayment.DateTillSettleOn;
                DimensionAttributeValue.update();
                ttscommit;

            }

            //End Update Worker status


          
        }
        // </NAP>

        return c;
    }

}
    console.log("inside mil")
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');
    res.flushHeaders();

    // const [result1, result2, result3, result4] = await Promise.all([
    //   exports.oracle1_connection_test(req, res, next),
    //   exports.oracle2_connection_test(req, res, next),
    //   exports.oracle3_connection_test(req, res, next),
    //   exports.oracle4_connection_test(req, res, next),
    // ]);

    const result1 = await oracle1_connection_test(req, res, next);
    console.log("first-----")
    res.write(`data: ${JSON.stringify(1)}\n`);

    const result2 = await oracle2_connection_test(req, res, next);
    console.log("sec-----")
    res.write(`data: ${JSON.stringify(2)}\n`);

    const result3 = await oracle3_connection_test(req, res, next);
    res.write(`data: ${JSON.stringify(3)}\n`);

    const result4 = await oracle4_connection_test(req, res, next);

    console.log("final")
    const bigData = {
      ...result1,
      ...result2,
      ...result3,
      ...result4,
    }
    res.write(`data: ${JSON.stringify(bigData)}`);
    res.end()

    // res.json({
    //   ...result1,
    //   ...result2,
    //   ...result3,
    //   ...result4,
    // });
Blockchain technology is revolutionizing industries across the globe, from finance and healthcare to supply chain management and beyond. With its ability to deliver decentralized, secure, and transparent solutions, businesses are rushing to harness the power of blockchain. However, the true challenge lies in finding the right expertise to develop and deploy blockchain solutions tailored to specific needs. That's where hiring the right blockchain developers becomes critical.

So, why is there such a demand for specialized blockchain developers, and what can they bring to the table for your business?

The Vital Role of Expertise in Successful Blockchain Projects
Blockchain development isn’t just about coding; it’s a multidisciplinary field that combines cryptography, decentralized architecture, consensus algorithms, smart contracts, and security protocols. A deep understanding of these elements, alongside practical experience, is essential for creating robust blockchain-based systems. Without the right talent, even the most promising blockchain projects can fail due to poor execution.

This is why seasoned blockchain developers stand out. Their expertise spans various blockchain protocols—whether it’s developing on Ethereum, Hyperledger, or emerging platforms—helping companies not only innovate but scale quickly and efficiently.

The Growing Blockchain Talent Gap
With blockchain’s meteoric rise, there's been a growing gap between the demand for skilled developers and the available talent pool. Businesses worldwide face challenges in finding developers who can craft bespoke blockchain solutions that integrate seamlessly with existing systems while providing scalability, security, and efficiency.

Companies that wish to stay competitive need to onboard blockchain developers who possess hands-on experience in building decentralized apps (dApps), smart contracts, and secure platforms.

How Hiring Blockchain Developers Can Transform Your Business?
A skilled blockchain developer can streamline your processes, reduce costs, and enhance transparency. Whether it's implementing blockchain for cross-border payments, supply chain transparency, or secure data exchanges, having the right team ensures your project is built for success.

However, identifying and vetting the right developers can be tricky. This is why understanding what skills and experiences to look for becomes crucial.

Looking to Dive Deeper?
If you're serious about leveraging blockchain technology for your business, check out this detailed blog that covers everything you need to know when hiring blockchain developers. It will walk you through the essential considerations, qualities, and steps for making an informed decision that aligns with your business goals.
import React, { useState } from 'react';
import * as XLSX from 'xlsx';
import { saveAs } from 'file-saver';
import { Button, Container, Row, Col, Form } from 'react-bootstrap';

const ExcelComparison = () => {
    const [file1, setFile1] = useState(null);
    const [file2, setFile2] = useState(null);
    const [comparisonResult, setComparisonResult] = useState({ matchedCount: 0, unmatchedCount: 0 });
    const [download1, setDownload1] = useState(null);
    const [download2, setDownload2] = useState(null);

    const handleFileChange = (e, setFile) => {
        const file = e.target.files[0];
        setFile(file);
    };

    const handleCompare = () => {
        if (!file1 || !file2) {
            alert('Please upload both Excel files.');
            return;
        }

        const reader1 = new FileReader();
        const reader2 = new FileReader();

        reader1.onload = (e1) => {
            const workbook1 = XLSX.read(e1.target.result, { type: 'binary' });
            const sheet1 = XLSX.utils.sheet_to_json(workbook1.Sheets[workbook1.SheetNames[0]], { header: 1 });

            reader2.onload = (e2) => {
                const workbook2 = XLSX.read(e2.target.result, { type: 'binary' });
                const sheet2 = XLSX.utils.sheet_to_json(workbook2.Sheets[workbook2.SheetNames[0]], { header: 1 });

                // Prepare columns for comparison and results
                let matchedCount = 0;
                const header1 = sheet1[0];
                const header2 = sheet2[0];
                const data1 = sheet1.slice(1);
                const data2 = sheet2.slice(1);

                data1.forEach((row1, index1) => {
                    const row2 = data2.find(row2 => row2[header2.indexOf('GSTIN of supplier')] === row1[header1.indexOf('GSTIN')] &&
                                                     row2[header2.indexOf('Invoice number')] === row1[header1.indexOf('Invoice No.')]);
                    if (row2) {
                        let matched = 'Matched';
                        let unmatchedValues = [];

                        if (row1[header1.indexOf('IGST')] !== row2[header2.indexOf('Integrated Tax(₹)')]) {
                            matched = 'Unmatched';
                            unmatchedValues.push(`IGST: ${row1[header1.indexOf('IGST')]} vs ${row2[header2.indexOf('Integrated Tax(₹)')]}`);
                        }
                        if (row1[header1.indexOf('CGST')] !== row2[header2.indexOf('Central Tax(₹)')]) {
                            matched = 'Unmatched';
                            unmatchedValues.push(`CGST: ${row1[header1.indexOf('CGST')]} vs ${row2[header2.indexOf('Central Tax(₹)')]}`);
                        }

                        row1.push(matched);
                        row1.push(unmatchedValues.length ? unmatchedValues.join(', ') : '');
                        row1.push(row2[header2.indexOf('GSTR2B month')]);

                        if (matched === 'Matched') {
                            matchedCount++;
                        }
                    } else {
                        row1.push('Unmatched');
                        row1.push('GSTIN or Invoice Number');
                        row1.push('');
                    }
                });

                const unmatchedCount = data1.length - matchedCount;
                setComparisonResult({ matchedCount, unmatchedCount });

                // Add new headers
                const updatedHeader1 = [...header1, 'Matched/Unmatched', 'Unmatched Value', '2B MONTH'];
                const updatedSheet1 = [updatedHeader1, ...data1];
                const updatedSheet2 = [header2, ...data2];

                const updatedWorkbook1 = XLSX.utils.book_new();
                const updatedWorkbook2 = XLSX.utils.book_new();

                XLSX.utils.book_append_sheet(updatedWorkbook1, XLSX.utils.aoa_to_sheet(updatedSheet1), 'Sheet1');
                XLSX.utils.book_append_sheet(updatedWorkbook2, XLSX.utils.aoa_to_sheet(updatedSheet2), 'Sheet2');

                setDownload1(updatedWorkbook1);
                setDownload2(updatedWorkbook2);
            };
            reader2.readAsBinaryString(file2);
        };
        reader1.readAsBinaryString(file1);
    };

    const handleDownload = (workbook, filename) => {
        const wbout = XLSX.write(workbook, { bookType: 'xlsx', type: 'binary' });
        const buffer = new ArrayBuffer(wbout.length);
        const view = new Uint8Array(buffer);
        for (let i = 0; i < wbout.length; i++) view[i] = wbout.charCodeAt(i) & 0xff;
        saveAs(new Blob([buffer], { type: 'application/octet-stream' }), filename);
    };

    return (
        <Container>
            <h2>Excel File Comparison</h2>
            <Row className="mb-3">
                <Col>
                    <Form.Group>
                        <Form.Label>Upload 1st Excel File</Form.Label>
                        <Form.Control type="file" accept=".xlsx" onChange={(e) => handleFileChange(e, setFile1)} />
                    </Form.Group>
                </Col>
                <Col>
                    <Form.Group>
                        <Form.Label>Upload 2nd Excel File</Form.Label>
                        <Form.Control type="file" accept=".xlsx" onChange={(e) => handleFileChange(e, setFile2)} />
                    </Form.Group>
                </Col>
            </Row>
            <Button variant="primary" onClick={handleCompare}>Compare</Button>

            {comparisonResult.matchedCount > 0 && (
                <Row className="mt-3">
                    <Col>
                        <p>Matched Rows: {comparisonResult.matchedCount}</p>
                        <Button variant="success" onClick={() => handleDownload(download1, 'Updated_File1.xlsx')}>Download Updated File 1</Button>
                    </Col>
                    <Col>
                        <p>Unmatched Rows: {comparisonResult.unmatchedCount}</p>
                        <Button variant="success" onClick={() => handleDownload(download2, 'Updated_File2.xlsx')}>Download Updated File 2</Button>
                    </Col>
                </Row>
            )}
        </Container>
    );
};

export default ExcelComparison;
Dim result = row.ItemArray.
    Skip(5).
    Select(Function(item, index) New With {.Item = item, .OriginalIndex = index + 5}).
    Where(Function(x) String.IsNullOrWhiteSpace(x.Item.ToString())).
    Select(Function(x) io_dtGatesMonitoring.Columns(x.OriginalIndex).ColumnName).
    ToList()
    for source_locator in source_objects:
        for target_joint in target_objects:
            if source_locator.replace(source_prefix, "") == target_joint.replace(target_prefix, ""):
                cmds.aimConstraint(target_joint, source_locator, aim=(0, 1, 0),mo=1)
                
    source_prefix = "eyelid_joint_lower_parent_"
    
    target_prefix = "lowerLidLoc_"
    
    source_objects = cmds.ls(source_prefix + "*", type="transform")
    target_objects = cmds.ls(target_prefix + "*", type="transform")
    
    for source_locator in source_objects:
        for target_joint in target_objects:
            if source_locator.replace(source_prefix, "") == target_joint.replace(target_prefix, ""):
                cmds.aimConstraint(target_joint, source_locator, aim=(0, 1, 0),mo=1)
        
    
    sel = cmds.ls("upperLidLoc_*",fl = True)
    
    new_list = sel[::2]
    crv = "upper_lid_crv"

    for s in new_list:
        pos = cmds.xform(s, q = 1, ws = 1, t = 1)
        u = getUParam (pos, crv)
        name = s.replace ("Loc_", "Pci_")
        pci = cmds.createNode("pointOnCurveInfo", n = name)
        cmds.connectAttr(crv + '.worldSpace', pci + '.inputCurve')
        cmds.setAttr(pci + '.parameter', u)
        cmds.connectAttr(pci + '.position', s + '.t')

    sel = cmds.ls("lowerLidLoc_*",fl = True)
    
    new_list = sel[::2]
    
    crv = "Lower_lid_crv"

    for s in new_list:
        pos = cmds.xform(s, q = 1, ws = 1, t = 1)
        u = getUParam (pos, crv)
        name = s.replace ("Loc_", "Pci_")
        pci = cmds.createNode("pointOnCurveInfo", n = name)
        cmds.connectAttr(crv + '.worldSpace', pci + '.inputCurve')
        cmds.setAttr(pci + '.parameter', u)
        cmds.connectAttr(pci + '.position', s + '.t')
    
    curve_name = [("Lower_lid_crv"),("upper_lid_crv")]
    for each in curve_name:
        cmds.rebuildCurve(each,ch=1,rpo=0,rt=0,end=1,kr=0,kcp=0,kep=1,kt=0,s=7,d=2,tol=0.01)
        cmds.delete (each, ch = 1)
    cmds.rename('Lower_lid_crvrebuiltCurve1','Lower_lid_skin')
    cmds.rename('upper_lid_crvrebuiltCurve1','upper_lid_skin')
    cmds.delete ('Lower_lid_skin','upper_lid_skin', ch = 1)

    # Convert the MEL command to Python
    mel_command = 'wire -gw false -en 1.000000 -ce 0.000000 -li 0.000000 -w {0} {1};'.format("Lower_lid_skin", "Lower_lid_crv")
    
    # Execute the MEL command as Python
    mel.eval(mel_command)
    
    # Convert the MEL command to Python
    mel_command = 'wire -gw false -en 1.000000 -ce 0.000000 -li 0.000000 -w {0} {1};'.format("upper_lid_skin", "upper_lid_crv")
    
    # Execute the MEL command as Python
    mel.eval(mel_command)
    
    list = [("Lower_lid_skin", "Lower_lid_BS"),("upper_lid_skin", "Lower_lid_close_BS"),("upper_lid_skin", "upper_lid_BS"),("Lower_lid_skin", "upper_lid_close_BS")]
    for each in list:
        cmds.duplicate(each[0], name=each[1])
    
    list = [("Lower_lid_close_BS", "Lower_lid_BS","Lower_lid_blend"),("upper_lid_close_BS", "upper_lid_BS","upper"),("Lower_lid_BS", "Lower_lid_skin","Lower_lid_main_blend"),("upper_lid_BS", "upper_lid_skin","upper_lid_main_blend")]
    for each in list:
        cmds.blendShape(each[0],each[1],n = each[2], origin="world")
        
    cmds.setAttr('Lower_lid_main_blend.Lower_lid_BS',1)
    cmds.setAttr('upper_lid_main_blend.upper_lid_BS',1)
        
    # Define the upper lid curve and the CV indices
    curve_name = "upper_lid_skin"
    cv_indices = [8, 7, 6, 5, 4, 3, 2, 1, 0]
    
    # Create joints at the CV positions
    joints_upper = []
    
    for index in cv_indices:
        # Get the world space position of the CV
        cv_position = cmds.pointPosition(curve_name + ".cv[{0}]".format(index), w=True)
    
        # Create a joint at the CV position
        joint_name = cmds.joint(position=cv_position, name="upper_lid_crv_jnt{0}".format(index))
        #joints.append(joint_name)
        cmds.parent(w = True)
    
    
    # Define the lower lid curve and the CV indices
    curve_name = "Lower_lid_skin"
    cv_indices = [8, 7, 6, 5, 4, 3, 2, 1, 0]
    
    # Create joints at the CV positions
    joints_lower = []
    
    for index in cv_indices:
        # Get the world space position of the CV
        cv_position = cmds.pointPosition(curve_name + ".cv[{0}]".format(index), w=True)
    
        # Create a joint at the CV position
        joint_name = cmds.joint(position=cv_position, name="Lower_lid_crv_jnt{0}".format(index))
        cmds.parent(w = True)
    
    # Define the joint names and the curve name
    joint_prefix = "upper_lid_crv_jnt"
    curve_name = "upper_lid_skin"
        
    # Create a list of joint names
    joint_names_upper = ["{0}{1}".format(joint_prefix, i) for i in range(0, 9)]
    
    # Bind skin to the curve with a skin influence of 1
    cmds.skinCluster(joint_names_upper, curve_name, toSelectedBones=True, bindMethod=0, skinMethod=0, maximumInfluences=1)
    
    # Define the joint names and the curve name
    joint_prefix = "Lower_lid_crv_jnt"
    curve_name = "Lower_lid_skin"
    
    # Create a list of joint names
    joint_names_lower = ["{0}{1}".format(joint_prefix, i) for i in range(0, 9)]
    
    # Bind skin to the curve with a skin influence of 1
    cmds.skinCluster(joint_names_lower, curve_name, toSelectedBones=True, bindMethod=0, skinMethod=0, maximumInfluences=1)
    
    # Define the joint names and the radius of the control circles
    joint_names = ["upper_lid_crv_jnt8", "upper_lid_crv_jnt6", "upper_lid_crv_jnt4", "upper_lid_crv_jnt2", "upper_lid_crv_jnt0",
                   "Lower_lid_crv_jnt6", "Lower_lid_crv_jnt4", "Lower_lid_crv_jnt2"]
                   
    controller_radius = 0.1  # Adjust the radius as needed
    
    # Create circle controllers at joint positions
    controllers = []
    
    for joint_name in joint_names:
        joint_position = cmds.xform(joint_name, query=True, translation=True, worldSpace=True)
        
        cmds.circle(name=joint_name + "_ctrl", radius=controller_radius, normal=[0, 0, 1])
        controllergroup = cmds.group(n=joint_name + '_grp')
        cmds.xform(controllergroup, translation=joint_position, worldSpace=True)
        
    list = [('upper_lid_crv_jnt8_ctrl','inr_corner_lid_ctrl'),('upper_lid_crv_jnt8_grp','inr_corner_lid_ctrl_grp'),('upper_lid_crv_jnt6_ctrl','upr_lid_01_ctrl'),('upper_lid_crv_jnt6_grp','upr_lid_01_ctrl_grp'),('upper_lid_crv_jnt4_ctrl','upr_lid_02_ctrl'),('upper_lid_crv_jnt4_grp','upr_lid_02_ctrl_grp'),('upper_lid_crv_jnt2_ctrl','upr_lid_03_ctrl'),('upper_lid_crv_jnt2_grp','upr_lid_03_ctrl_grp'),('upper_lid_crv_jnt0_ctrl','otr_corner_lid_ctrl'),('upper_lid_crv_jnt0_grp','otr_corner_lid_ctrl_grp'),('Lower_lid_crv_jnt6_ctrl','lwr_lid_01_ctrl'),('Lower_lid_crv_jnt6_grp','lwr_lid_01_ctrl_grp'),('Lower_lid_crv_jnt4_ctrl','lwr_lid_02_ctrl'),('Lower_lid_crv_jnt4_grp','lwr_lid_02_ctrl_grp'),('Lower_lid_crv_jnt2_ctrl','lwr_lid_03_ctrl'),('Lower_lid_crv_jnt2_grp','lwr_lid_03_ctrl_grp')]
    for each in list:
        cmds.rename(each[0],each[1])
        
    list = [('inr_corner_lid_ctrl','Lower_lid_crv_jnt8'),('inr_corner_lid_ctrl','upper_lid_crv_jnt8'),('inr_corner_lid_ctrl','upper_lid_crv_jnt7'),('upr_lid_01_ctrl','upper_lid_crv_jnt7'),('upr_lid_01_ctrl','upper_lid_crv_jnt6'),('upr_lid_01_ctrl','upper_lid_crv_jnt5'),('upr_lid_02_ctrl','upper_lid_crv_jnt5'),('upr_lid_02_ctrl','upper_lid_crv_jnt4'),('upr_lid_02_ctrl','upper_lid_crv_jnt3'),('upr_lid_03_ctrl','upper_lid_crv_jnt3'),('upr_lid_03_ctrl','upper_lid_crv_jnt2'),('upr_lid_03_ctrl','upper_lid_crv_jnt1'),('otr_corner_lid_ctrl','upper_lid_crv_jnt1'),('otr_corner_lid_ctrl','Lower_lid_crv_jnt0'),('otr_corner_lid_ctrl','upper_lid_crv_jnt0'),('otr_corner_lid_ctrl','Lower_lid_crv_jnt1'),('lwr_lid_03_ctrl','Lower_lid_crv_jnt1'),('lwr_lid_03_ctrl','Lower_lid_crv_jnt2'),('lwr_lid_03_ctrl','Lower_lid_crv_jnt3'),('lwr_lid_02_ctrl','Lower_lid_crv_jnt3'),('lwr_lid_02_ctrl','Lower_lid_crv_jnt4'),('lwr_lid_02_ctrl','Lower_lid_crv_jnt5'),('lwr_lid_01_ctrl','Lower_lid_crv_jnt5'),('lwr_lid_01_ctrl','Lower_lid_crv_jnt7'),('inr_corner_lid_ctrl','Lower_lid_crv_jnt7'),('lwr_lid_01_ctrl','Lower_lid_crv_jnt6')]
    for each in list:
        cmds.parentConstraint(each[0],each[1],mo = True)
        
    list = [('inr_corner_lid_ctrl'),('upr_lid_01_ctrl'),('upr_lid_01_ctrl'),('upr_lid_02_ctrl'),('upr_lid_03_ctrl'),('upr_lid_03_ctrl'),('otr_corner_lid_ctrl'),('lwr_lid_01_ctrl'),('lwr_lid_02_ctrl'),('lwr_lid_03_ctrl')]
    for each in list:
        cmds.setAttr(each + '.overrideEnabled' ,True)
        cmds.setAttr(each + '.overrideColor' ,4)
        cmds.setAttr(each + ".visibility" ,keyable = False, cb = False, lock = True)
        cmds.setAttr(each + ".scaleX" ,keyable = False, cb = False, lock = True)
        cmds.setAttr(each + ".scaleY" ,keyable = False, cb = False, lock = True)
        cmds.setAttr(each + ".scaleZ" ,keyable = False, cb = False, lock = True)
        cmds.setAttr(each + ".rotateX" ,keyable = False, cb = False, lock = True) 
        cmds.setAttr(each + ".rotateY" ,keyable = False, cb = False, lock = True)
        cmds.setAttr(each + ".rotateZ" ,keyable = False, cb = False, lock = True)
    
    cmds.addAttr('upr_lid_02_ctrl',sn='blink', min = 0, max=1 ,k=1)
    cmds.addAttr('upr_lid_02_ctrl',sn='blinkHeight', min = 0, max=1 ,k=1)
    cmds.shadingNode('condition',n = 'upr_lid_blink_cond',asUtility=1)
    cmds.shadingNode('condition',n = 'lwr_lid_blink_cond',asUtility=1)
    cmds.shadingNode('reverse',n = 'upr_lid_blink_rev',asUtility=1)
    
    list = [('upr_lid_02_ctrl.blink','lwr_lid_blink_cond.colorIfFalseR'),('upr_lid_02_ctrl.blinkHeight','lwr_lid_blink_cond.colorIfTrueR'),('upr_lid_02_ctrl.blinkHeight','lwr_lid_blink_cond.firstTerm'),('upr_lid_02_ctrl.blink','lwr_lid_blink_cond.secondTerm'),('upr_lid_02_ctrl.blinkHeight','upr_lid_blink_rev.inputX'),('upr_lid_02_ctrl.blink','upr_lid_blink_cond.colorIfFalseR'),('upr_lid_blink_rev.outputX','upr_lid_blink_cond.colorIfTrueR'),('upr_lid_02_ctrl.blink','upr_lid_blink_cond.secondTerm'),('upr_lid_blink_rev.outputX','upr_lid_blink_cond.firstTerm'),('lwr_lid_blink_cond.outColorR','Lower_lid_blend.Lower_lid_close_BS'),('upr_lid_blink_cond.outColorR','upper.upper_lid_close_BS')]
    for each in list:
        cmds.connectAttr(each[0],each[1])
    
    cmds.setAttr('lwr_lid_blink_cond.operation',4)
    cmds.setAttr('upr_lid_blink_cond.operation',4)
    cmds.setAttr('upr_lid_02_ctrl.blinkHeight',0.5)
    
    locLowerSel = cmds.ls("lowerLidLoc_*",fl = True)
    locLowerSelList = locLowerSel[::2]
    cmds.group(n='lowerLidLoc_grp',em = True)
    cmds.parent(locLowerSelList,'lowerLidLoc_grp')
         
    locUpperSel = cmds.ls("upperLidLoc_*",fl = True)
    locUpperSelList = locUpperSel[::2]
    cmds.group(n='upperLidLoc_grp',em = True)
    cmds.parent(locUpperSelList,'upperLidLoc_grp')
  
    jntUpperSel = cmds.ls("eyelid_joint_upper_parent_*",fl = True)
    jntUpperSelList = jntUpperSel[::2]
    cmds.group(n='upperLidJnt_grp',em = True)
    cmds.parent(jntUpperSelList,'upperLidJnt_grp')
    
    jntLowerSel = cmds.ls("eyelid_joint_lower_parent_*",fl = True)
    jntLowerSelList = jntLowerSel[::2]
    cmds.group(n='lowerLidJnt_grp',em = True)
    cmds.parent(jntLowerSelList,'lowerLidJnt_grp')
    
    crvJntLowerSel = cmds.ls("Lower_lid_crv_jnt*",fl = True)
    crvJntLowerSelList = crvJntLowerSel[::2]
    cmds.group(n='lowerLidCrvJnt_grp',em = True)
    cmds.parent(crvJntLowerSelList,'lowerLidCrvJnt_grp')
    
    crvJntUpperSel = cmds.ls("upper_lid_crv_jnt*",fl = True)
    crvJntUpperSelList = crvJntUpperSel[::2]
    cmds.group(n='upperLidCrvJnt_grp',em = True)
    cmds.parent(crvJntUpperSelList,'upperLidCrvJnt_grp')
    
    list = [('lower_lid_crv_grp'),('upper_lid_crv_grp'),('lid_crv_grp'),('lid_ctrl_grp'),('lid_jnt_grp'),('lid_loc_grp'),('eyelid_grp')]
    for each in list:
        cmds.group(n=each,em = True)
    
    list = [('upper_lid_crv','upper_lid_crv_grp'),('upper_lid_skin','upper_lid_crv_grp'),('upper_lid_BS','upper_lid_crv_grp'),('upper_lid_close_BS','upper_lid_crv_grp'),('upper_lid_skinBaseWire','upper_lid_crv_grp'),('Lower_lid_crv','lower_lid_crv_grp'),('Lower_lid_skin','lower_lid_crv_grp'),('Lower_lid_BS','lower_lid_crv_grp'),('Lower_lid_close_BS','lower_lid_crv_grp'),('Lower_lid_skinBaseWire','lower_lid_crv_grp'),('inr_corner_lid_ctrl_grp','lid_ctrl_grp'),('upr_lid_01_ctrl_grp','lid_ctrl_grp'),('upr_lid_02_ctrl_grp','lid_ctrl_grp'),('upr_lid_03_ctrl_grp','lid_ctrl_grp'),('otr_corner_lid_ctrl_grp','lid_ctrl_grp'),('lwr_lid_01_ctrl_grp','lid_ctrl_grp'),('lwr_lid_02_ctrl_grp','lid_ctrl_grp'),('lwr_lid_03_ctrl_grp','lid_ctrl_grp'),('upperLidJnt_grp','lid_jnt_grp'),('lowerLidJnt_grp','lid_jnt_grp'),('lowerLidCrvJnt_grp','lid_jnt_grp'),('upperLidCrvJnt_grp','lid_jnt_grp'),('lowerLidLoc_grp','lid_loc_grp'),('upperLidLoc_grp','lid_loc_grp'),('eye_display_loc','lid_loc_grp'),('lid_crv_grp','eyelid_grp'),('lid_ctrl_grp','eyelid_grp'),('lid_jnt_grp','eyelid_grp'),('lid_loc_grp','eyelid_grp'),('upper_lid_crv_grp','lid_crv_grp'),('lower_lid_crv_grp','lid_crv_grp')]
    for each in list:
        cmds.parent(each[0],each[1])
    
    list = [('lid_crv_grp.visibility'),('lowerLidCrvJnt_grp.visibility'),('upperLidCrvJnt_grp.visibility'),('lid_loc_grp.visibility')]
    for each in list:
        cmds.setAttr(each,0)

    print('Eyelid setup has created.')
    
def rename_left(*args):
    existing_group_name = "eyelid_grp"

    prefix = "l_"
    
    objects_in_group = cmds.listRelatives(existing_group_name, allDescendents=True, fullPath=True) or []
    for obj in objects_in_group:
        new_name = prefix + obj.split("|")[-1]
        cmds.rename(obj, new_name)
    cmds.rename("eyelid_grp","l_eyelid_grp")
    
    list = [('lowerLidPci_*'),('upperLidPci_*'),('upr_lid_blink_rev'),('lwr_lid_blink_cond'),('upr_lid_blink_cond'),('upper_lid_main_blend'),('upper'),('Lower_lid_main_blend'),('Lower_lid_blend')]
    for each in list:
        search_pattern = cmds.ls(each)
    
        for obj in search_pattern:
            new_name = prefix + obj
            cmds.rename(obj, new_name)
    
    # Define the target alias name, weight index, and blend shape node
    target_alias_name = "l_Lower_lid_close_BS"
    weight_index = 0
    blend_shape_node = "l_Lower_lid_blend"
    
    # Check if the alias already exists
    current_alias_name = cmds.aliasAttr(blend_shape_node + '.w[' + str(weight_index) + ']', query=True)
    
    if current_alias_name is not None:
        # Rename the alias
        cmds.aliasAttr(target_alias_name, blend_shape_node + '.w[' + str(weight_index) + ']')
        print("Target alias renamed to:", target_alias_name)
    else:
        print("Alias does not exist. Cannot rename.")
    
    # Define the target alias name, weight index, and blend shape node
    target_alias_name = "l_upper_lid_close_BS"
    weight_index = 0
    blend_shape_node = "l_upper"
    
    # Check if the alias already exists
    current_alias_name = cmds.aliasAttr(blend_shape_node + '.w[' + str(weight_index) + ']', query=True)
    
    if current_alias_name is not None:
        # Rename the alias
        cmds.aliasAttr(target_alias_name, blend_shape_node + '.w[' + str(weight_index) + ']')
        print("Target alias renamed to:", target_alias_name)
    else:
        print("Alias does not exist. Cannot rename.")
        
    # Define the target alias name, weight index, and blend shape node
    target_alias_name = "l_Lower_lid_BS"
    weight_index = 0
    blend_shape_node = "l_Lower_lid_main_blend"
    
    # Check if the alias already exists
    current_alias_name = cmds.aliasAttr(blend_shape_node + '.w[' + str(weight_index) + ']', query=True)
    
    if current_alias_name is not None:
        # Rename the alias
        cmds.aliasAttr(target_alias_name, blend_shape_node + '.w[' + str(weight_index) + ']')
        print("Target alias renamed to:", target_alias_name)
    else:
        print("Alias does not exist. Cannot rename.")
        
    # Define the target alias name, weight index, and blend shape node
    target_alias_name = "l_upper_lid_BS"
    weight_index = 0
    blend_shape_node = "l_upper_lid_main_blend"
    
    # Check if the alias already exists
    current_alias_name = cmds.aliasAttr(blend_shape_node + '.w[' + str(weight_index) + ']', query=True)
    
    if current_alias_name is not None:
        # Rename the alias
        cmds.aliasAttr(target_alias_name, blend_shape_node + '.w[' + str(weight_index) + ']')
        print("Target alias renamed to:", target_alias_name)
    else:
        print("Alias does not exist. Cannot rename.")
    
    print('Left eyelid has renamed.')

def rename_right(*args):
    existing_group_name = "eyelid_grp"

    prefix = "r_"
    
    objects_in_group = cmds.listRelatives(existing_group_name, allDescendents=True, fullPath=True) or []
    for obj in objects_in_group:
        new_name = prefix + obj.split("|")[-1]
        cmds.rename(obj, new_name)
    cmds.rename("eyelid_grp","r_eyelid_grp")
    
    list = [('lowerLidPci_*'),('upperLidPci_*'),('upr_lid_blink_rev'),('lwr_lid_blink_cond'),('upr_lid_blink_cond'),('upper_lid_main_blend'),('upper'),('Lower_lid_main_blend'),('Lower_lid_blend')]
    for each in list:
        search_pattern = cmds.ls(each)
    
        for obj in search_pattern:
            new_name = prefix + obj
            cmds.rename(obj, new_name)
            
    # Define the target alias name, weight index, and blend shape node
    target_alias_name = "r_Lower_lid_close_BS"
    weight_index = 0
    blend_shape_node = "r_Lower_lid_blend"
    
    # Check if the alias already exists
    current_alias_name = cmds.aliasAttr(blend_shape_node + '.w[' + str(weight_index) + ']', query=True)
    
    if current_alias_name is not None:
        # Rename the alias
        cmds.aliasAttr(target_alias_name, blend_shape_node + '.w[' + str(weight_index) + ']')
        print("Target alias renamed to:", target_alias_name)
    else:
        print("Alias does not exist. Cannot rename.")
    
    # Define the target alias name, weight index, and blend shape node
    target_alias_name = "r_upper_lid_close_BS"
    weight_index = 0
    blend_shape_node = "r_upper"
    
    # Check if the alias already exists
    current_alias_name = cmds.aliasAttr(blend_shape_node + '.w[' + str(weight_index) + ']', query=True)
    
    if current_alias_name is not None:
        # Rename the alias
        cmds.aliasAttr(target_alias_name, blend_shape_node + '.w[' + str(weight_index) + ']')
        print("Target alias renamed to:", target_alias_name)
    else:
        print("Alias does not exist. Cannot rename.")
        
    # Define the target alias name, weight index, and blend shape node
    target_alias_name = "r_Lower_lid_BS"
    weight_index = 0
    blend_shape_node = "r_Lower_lid_main_blend"
    
    # Check if the alias already exists
    current_alias_name = cmds.aliasAttr(blend_shape_node + '.w[' + str(weight_index) + ']', query=True)
    
    if current_alias_name is not None:
        # Rename the alias
        cmds.aliasAttr(target_alias_name, blend_shape_node + '.w[' + str(weight_index) + ']')
        print("Target alias renamed to:", target_alias_name)
    else:
        print("Alias does not exist. Cannot rename.")
        
    # Define the target alias name, weight index, and blend shape node
    target_alias_name = "r_upper_lid_BS"
    weight_index = 0
    blend_shape_node = "r_upper_lid_main_blend"
    
    # Check if the alias already exists
    current_alias_name = cmds.aliasAttr(blend_shape_node + '.w[' + str(weight_index) + ']', query=True)
    
    if current_alias_name is not None:
        # Rename the alias
        cmds.aliasAttr(target_alias_name, blend_shape_node + '.w[' + str(weight_index) + ']')
        print("Target alias renamed to:", target_alias_name)
    else:
        print("Alias does not exist. Cannot rename.")
    
    print('Rigft eyelid has renamed.')
    
def store_geometry_name(*args):
    global geometry_field
    selected = cmds.ls(selection=True)
    if selected:
        geometry_name = selected[0]
        cmds.textField(geometry_field, edit=True, text=geometry_name)
        print("Geometry Name:", geometry_name)
    else:
        cmds.textField(geometry_field, edit=True, text="")
        print("No geometry selected.")

def store_head_joint_name(*args):
    global head_joint_field
    selected = cmds.ls(selection=True)
    if selected:
        head_joint_name = selected[0]
        cmds.textField(head_joint_field, edit=True, text=head_joint_name)
        print("Head Joint Name:", head_joint_name)
    else:
        cmds.textField(head_joint_field, edit=True, text="")
        print("No head joint selected.")

def store_jaw_joint_name(*args):
    global jaw_joint_field
    selected = cmds.ls(selection=True)
    if selected:
        jaw_joint_name = selected[0]
        cmds.textField(jaw_joint_field, edit=True, text=jaw_joint_name)
        print("Jaw Joint Name:", jaw_joint_name)
    else:
        cmds.textField(jaw_joint_field, edit=True, text="")
        print("No jaw joint selected.")
    
def create_upper_lip_edge():
    selected_edges = cmds.ls(selection=True, flatten=True)
    curves = cmds.polyToCurve(form=2, degree=1, ch=False)
    curve = cmds.rename('upr_lip_crv')
    cmds.rebuildCurve('upr_lip_crv',rpo=0,ch=1,rt=0,end=1,kr=0,kcp=1,kep=1,kt=0,d=3,tol=0.01)
    cmds.rename('upr_lip_bound_crv')
    cmds.delete('upr_lip_bound_crv', constructionHistory = True)
    cmds.duplicate()
    cmds.rename('upr_lip_sticky_crv')
    cmds.duplicate()
    cmds.rename('upr_lip_wire_crv')
    head_joint_name = cmds.textField(head_joint_field, query=True, text=True)
    blendshape_node = cmds.blendShape('upr_lip_bound_crv','upr_lip_sticky_crv', 'upr_lip_wire_crv', automatic=True)[0]
    cmds.rename(blendshape_node, 'upperLip_wire_bShape')
    list = [('upr_lip_crv'),('upr_lip_bound_crv'),('upr_lip_sticky_crv')]
    for each in list:
        cmds.setAttr(each+'.visibility',0)
    cmds.setAttr('upperLip_wire_bShape.upr_lip_bound_crv',1)
    cmds.setAttr('upperLip_wire_bShape.upr_lip_sticky_crv',1)
    cmds.addAttr(head_joint_name, longName="Lf_Sticky_Lips", attributeType='double', minValue=0, maxValue=10, defaultValue=0)
    cmds.setAttr(head_joint_name + '.Lf_Sticky_Lips', keyable=True)
    cmds.addAttr(head_joint_name, longName="Rt_Sticky_Lips", attributeType='double', minValue=0, maxValue=10, defaultValue=0)
    cmds.setAttr(head_joint_name + '.Rt_Sticky_Lips', keyable=True)
    
def create_lower_lip_edge():
    selected_edges = cmds.ls(selection=True, flatten=True)
    curves = cmds.polyToCurve(form=2, degree=1, ch=False)
    curve = cmds.rename('lwr_lip_crv')
    cmds.rebuildCurve('lwr_lip_crv',rpo=0,ch=1,rt=0,end=1,kr=0,kcp=1,kep=1,kt=0,d=3,tol=0.01)
    cmds.rename('lwr_lip_bound_crv')
    cmds.delete('lwr_lip_bound_crv', constructionHistory = True)
    cmds.duplicate()
    cmds.rename('lwr_lip_sticky_crv')
    cmds.duplicate()
    cmds.rename('lwr_lip_wire_crv')
    
    blendshape_node = cmds.blendShape('lwr_lip_bound_crv','lwr_lip_sticky_crv', 'lwr_lip_wire_crv', automatic=True)[0]
    cmds.rename(blendshape_node, 'lowerLip_wire_bShape')
    list = [('lwr_lip_crv'),('lwr_lip_bound_crv'),('lwr_lip_sticky_crv')]
    for each in list:
        cmds.setAttr(each+'.visibility',0)
    cmds.setAttr('lowerLip_wire_bShape.lwr_lip_bound_crv',1)
    cmds.setAttr('lowerLip_wire_bShape.lwr_lip_sticky_crv',1)

def build_lip_setup():
    head_joint_name = cmds.textField(head_joint_field, query=True, text=True)
    lf_main_attr = (head_joint_name +".Lf_Sticky_Lips")
    rt_main_attr = (head_joint_name +".Rt_Sticky_Lips")
    upr_cv_count = cmds.getAttr('upr_lip_wire_crv.degree') + cmds.getAttr('upr_lip_wire_crv.spans') - 1
    lwr_cv_count = cmds.getAttr('lwr_lip_wire_crv.degree') + cmds.getAttr('lwr_lip_wire_crv.spans') - 1
    lip_val_list = [upr_cv_count, lwr_cv_count]
    lip_name_list = ['upperLip', 'lowerLip']
    
    name_counter = 0
    for each in lip_val_list:
        half_val = (each / 2) + 1
        total_val = each + 1
        div_val = 10.0 / half_val
        counter = 0
        while(counter<half_val):
            lip_sr = cmds.shadingNode( 'setRange', asUtility=True, n='lf_' + lip_name_list[name_counter] + str(counter+1) + '_setRange')
            cmds.setAttr(lip_sr + '.oldMaxX', (div_val * (counter+1)))
            cmds.setAttr(lip_sr + '.oldMinX', (div_val * counter))
            cmds.setAttr(lip_sr + '.maxX', 0)
            cmds.setAttr(lip_sr + '.minX', 1)
            if counter == (half_val - 1):
                cmds.setAttr(lip_sr + '.minX', 0.5)
            cmds.connectAttr(lf_main_attr, lip_sr + '.valueX', f=True)
            
            lip_flip_sr = cmds.shadingNode( 'setRange', asUtility=True, n='lf_' + lip_name_list[name_counter] + '_flip' + str(counter+1) + '_setRange')
            cmds.setAttr(lip_flip_sr + '.oldMaxX', 1)
            if counter == (half_val - 1):
                cmds.setAttr(lip_flip_sr + '.oldMaxX', 0.5)
            cmds.setAttr(lip_flip_sr + '.oldMinX', 0)
            cmds.setAttr(lip_flip_sr + '.maxX', 0)
            cmds.setAttr(lip_flip_sr + '.minX', 1)
            if counter == (half_val - 1):
                cmds.setAttr(lip_flip_sr + '.minX', 0.5)
            cmds.connectAttr(lip_sr + '.outValueX', lip_flip_sr + '.valueX', f=True)
                
            if counter == (half_val - 1):
                mid_pma = cmds.shadingNode( 'plusMinusAverage', asUtility=True, n='ct_' + lip_name_list[name_counter] + str(counter+1) + '_plusMinusAverage')
                cmds.connectAttr(lip_sr + '.outValueX', mid_pma + '.input2D[0].input2Dx', f=True)
                cmds.connectAttr(lip_flip_sr + '.outValueX', mid_pma + '.input2D[0].input2Dy', f=True)
            else:
                cmds.connectAttr(lip_sr + '.outValueX', lip_name_list[name_counter] + '_wire_bShape.inputTarget[0].inputTargetGroup[0].targetWeights[' + str(counter) + ']', f=True)
                cmds.connectAttr(lip_flip_sr + '.outValueX', lip_name_list[name_counter] + '_wire_bShape.inputTarget[0].inputTargetGroup[1].targetWeights[' + str(counter) + ']', f=True)
            
            counter = counter + 1
            
        #div_val = 10.0 / 39
        counter = half_val - 1
        rev_counter = half_val
        while(counter<total_val):
            lip_sr = cmds.shadingNode( 'setRange', asUtility=True, n='rt_' + lip_name_list[name_counter] + str(counter+1) + '_setRange')
            cmds.setAttr(lip_sr + '.oldMaxX', (div_val * rev_counter))
            cmds.setAttr(lip_sr + '.oldMinX', (div_val * (rev_counter-1)))
            cmds.setAttr(lip_sr + '.maxX', 0)
            cmds.setAttr(lip_sr + '.minX', 1)
            if counter == (half_val - 1):
                cmds.setAttr(lip_sr + '.minX', 0.5)
            cmds.connectAttr(rt_main_attr, lip_sr + '.valueX', f=True)
            
            lip_flip_sr = cmds.shadingNode( 'setRange', asUtility=True, n='rt_' + lip_name_list[name_counter] + '_flip' + str(counter+1) + '_setRange')
            cmds.setAttr(lip_flip_sr + '.oldMaxX', 1)
            if counter == (half_val - 1):
                cmds.setAttr(lip_flip_sr + '.oldMaxX', 0.5)
            cmds.setAttr(lip_flip_sr + '.oldMinX', 0)
            cmds.setAttr(lip_flip_sr + '.maxX', 0)
            cmds.setAttr(lip_flip_sr + '.minX', 1)
            if counter == (half_val - 1):
                cmds.setAttr(lip_flip_sr + '.minX', 0.5)
            cmds.connectAttr(lip_sr + '.outValueX', lip_flip_sr + '.valueX', f=True)
            
            if counter == (half_val - 1):
                cmds.connectAttr(lip_sr + '.outValueX', mid_pma + '.input2D[1].input2Dx', f=True)
                cmds.connectAttr(lip_flip_sr + '.outValueX', mid_pma + '.input2D[1].input2Dy', f=True)
                cmds.connectAttr(mid_pma + '.output2Dx', lip_name_list[name_counter] + '_wire_bShape.inputTarget[0].inputTargetGroup[0].targetWeights[' + str(int(counter)) + ']', f=True)
                cmds.connectAttr(mid_pma + '.output2Dy', lip_name_list[name_counter] + '_wire_bShape.inputTarget[0].inputTargetGroup[1].targetWeights[' + str(int(counter)) + ']', f=True)
            else:
                cmds.connectAttr(lip_sr + '.outValueX', lip_name_list[name_counter] + '_wire_bShape.inputTarget[0].inputTargetGroup[0].targetWeights[' + str(int(counter)) + ']', f=True)
                cmds.connectAttr(lip_flip_sr + '.outValueX', lip_name_list[name_counter] + '_wire_bShape.inputTarget[0].inputTargetGroup[1].targetWeights[' + str(int(counter)) + ']', f=True)
            
            counter = counter + 1
            rev_counter = rev_counter - 1
        name_counter = name_counter + 1
    
    upr_lip_wire_crv1 = cmds.duplicate("upr_lip_wire_crv", rr=True, name="upr_lip_wire_crv1")[0]
    upr_lip_wire_crv2 = cmds.duplicate("upr_lip_wire_crv", rr=True, name="upr_lip_wire_crv2")[0]
    cmds.xform(upr_lip_wire_crv1, cp=True)
    cmds.xform(upr_lip_wire_crv2, cp=True)
    cmds.setAttr(upr_lip_wire_crv1 + ".translateZ", 0.2)
    cmds.setAttr(upr_lip_wire_crv2 + ".translateZ", -0.2)
    lofted_surface = cmds.loft(upr_lip_wire_crv2, upr_lip_wire_crv1, ch=True, u=1, c=0, ar=True, d=3, ss=1, rn=0, po=0, rsn=True)[0]
    cmds.rename('upperLip_ribbon')
    cmds.delete('upr_lip_wire_crv1')
    cmds.delete('upr_lip_wire_crv2')
    
    lwr_lip_wire_crv1 = cmds.duplicate("lwr_lip_wire_crv", rr=True, name="lwr_lip_wire_crv1")[0]
    lwr_lip_wire_crv2 = cmds.duplicate("lwr_lip_wire_crv", rr=True, name="lwr_lip_wire_crv2")[0]
    cmds.xform(lwr_lip_wire_crv1, cp=True)
    cmds.xform(lwr_lip_wire_crv2, cp=True)
    cmds.setAttr(lwr_lip_wire_crv1 + ".translateZ", 0.2)
    cmds.setAttr(lwr_lip_wire_crv2 + ".translateZ", -0.2)
    lofted_surface = cmds.loft(lwr_lip_wire_crv2, lwr_lip_wire_crv1, ch=True, u=1, c=0, ar=True, d=3, ss=1, rn=0, po=0, rsn=True)[0]
    cmds.rename('lowerLip_ribbon')
    cmds.delete('lwr_lip_wire_crv1')
    cmds.delete('lwr_lip_wire_crv2')
    
    #upper lip
    num_spans_u = cmds.getAttr('upperLip_ribbon.spansU')

    for u in range(num_spans_u + 1):
        cmds.select('upperLip_ribbon.sf[{}][0]'.format(u), add=True)
        
    cmds.Rivet()
    uvPinOut = cmds.ls(sl=True)
    uvPin = uvPinOut.pop(0)
    
    pinOutput_objects = cmds.ls("pinOutput*", type="transform")
    
    pinOutput_objects.sort()
    
    index = 1
    
    for obj in pinOutput_objects:
        new_name = "uprLipRivet{}".format(index)
        cmds.rename(obj, new_name)
        index += 1
        
    cmds.select(clear=1)
    
    locators = cmds.ls('uprLipRivet*', type='transform')

    joints = []
    for locator in locators:
        position = cmds.xform(locator, query=True, translation=True, worldSpace=True)
        joint = cmds.joint(position=position, name=locator.replace("uprLipRivet", "uprLipJoint"))
        joints.append(joint)
    
    joints = cmds.ls('uprLipJoint*', type='joint')
    
    for joint in joints:
        parent = cmds.listRelatives(joint, parent=True)
        if parent and parent[0] != 'world':
            cmds.parent(joint, world=True)
    
    locators = cmds.ls('uprLipRivet*', type='transform')

    joint = cmds.ls('uprLipJoint*', type='joint')
    
    for locator, joint in zip(locators, joints):
        cmds.parentConstraint(locator, joint, maintainOffset=True)
    
    #lower lip
    cmds.select(clear=1)
    num_spans_u = cmds.getAttr('lowerLip_ribbon.spansU')

    for u in range(num_spans_u + 1):
        cmds.select('lowerLip_ribbon.sf[{}][0]'.format(u), add=True)
        
    cmds.Rivet()
    uvPinOut = cmds.ls(sl=True)
    uvPin = uvPinOut.pop(0)
    
    pinOutput_objects = cmds.ls("pinOutput*", type="transform")
    
    pinOutput_objects.sort()
    
    index = 1
    
    for obj in pinOutput_objects:
        new_name = "lwrLipRivet{}".format(index)
        cmds.rename(obj, new_name)
        index += 1
        
    cmds.select(clear=1)

    locators = cmds.ls('lwrLipRivet*', type='transform')

    joints = []
    for locator in locators:
        position = cmds.xform(locator, query=True, translation=True, worldSpace=True)
        joint = cmds.joint(position=position, name=locator.replace("lwrLipRivet", "lwrLipJoint"))
        joints.append(joint)
    
    joints = cmds.ls('lwrLipJoint*', type='joint')
    
    for joint in joints:
        parent = cmds.listRelatives(joint, parent=True)
        if parent and parent[0] != 'world':
            cmds.parent(joint, world=True)
    
    locators = cmds.ls('lwrLipRivet*', type='transform')

    joint = cmds.ls('lwrLipJoint*', type='joint')
    
    for locator, joint in zip(locators, joints):
        cmds.parentConstraint(locator, joint, maintainOffset=True)
    
    cmds.select('upperLip_ribbon', replace=True)
    cmds.select('upr_lip_wire_crv', add=True)
    wire_deformer = cmds.wire('upperLip_ribbon',n='upperLipStickyWire', wire=cmds.ls(selection=True)[1])   
    cmds.setAttr('upperLipStickyWire.dropoffDistance[0]', 10)
    cmds.select('lowerLip_ribbon', replace=True)
    cmds.select('lwr_lip_wire_crv', add=True)
    wire_deformer = cmds.wire('lowerLip_ribbon',n='lowerLipStickyWire', wire=cmds.ls(selection=True)[1])
    cmds.setAttr('lowerLipStickyWire.dropoffDistance[0]', 10)
    
    num_cvs = cmds.getAttr('lwr_lip_bound_crv.degree') + cmds.getAttr('lwr_lip_bound_crv.spans') + 1

    num_joints = num_cvs // 4
    
    for i in range(num_joints):
        cv_index = i * 4
        
        cv_position = cmds.pointPosition('lwr_lip_bound_crv.cv[{}]'.format(cv_index), world=True)
        
        joint = cmds.joint(position=cv_position, name='lwr_lip_joint_{}'.format(i+1))
    
    last_cv_position = cmds.pointPosition('lwr_lip_bound_crv.cv[{}]'.format(num_cvs - 1), world=True)
    last_joint = cmds.joint(position=last_cv_position, name='lwr_lip_joint_{}'.format(num_joints + 1))
    
    joints_to_unparent = cmds.ls('lwr_lip_joint_1', dag=True, type='joint')
    
    for joint in joints_to_unparent:
        cmds.parent(joint, world=True)
        
    num_cvs = cmds.getAttr('upr_lip_bound_crv.degree') + cmds.getAttr('upr_lip_bound_crv.spans') + 1
    
    num_joints = num_cvs // 4
    
    for i in range(num_joints):
        cv_index = i * 4
        
        cv_position = cmds.pointPosition('upr_lip_bound_crv.cv[{}]'.format(cv_index), world=True)
        
        joint = cmds.joint(position=cv_position, name='upr_lip_joint_{}'.format(i+1))
    
    last_cv_position = cmds.pointPosition('upr_lip_bound_crv.cv[{}]'.format(num_cvs - 1), world=True)
    last_joint = cmds.joint(position=last_cv_position, name='upr_lip_joint_{}'.format(num_joints + 1))
    
    joints_to_unparent = cmds.ls('upr_lip_joint_1', dag=True, type='joint')
    
    for joint in joints_to_unparent:
        cmds.parent(joint, world=True)
    
    cmds.select(['lwr_lip_joint_1', 'lwr_lip_joint_2', 'lwr_lip_joint_3', 'lwr_lip_joint_4', 'lwr_lip_joint_5', 'lwr_lip_joint_6', 'lwr_lip_joint_7', 'lwr_lip_bound_crv'], replace=True)
    cmds.skinCluster(name='lwrLipSkinCrv')
    cmds.select(['lwr_lip_joint_1', 'upr_lip_joint_2', 'upr_lip_joint_3', 'upr_lip_joint_4', 'upr_lip_joint_5', 'upr_lip_joint_6', 'lwr_lip_joint_7', 'upr_lip_bound_crv'], replace=True)
    cmds.skinCluster(name='uprLipSkinCrv')
    cmds.select(['lwr_lip_joint_1', 'lwr_lip_joint_7', 'lwr_lip_sticky_crv'], replace=True)
    cmds.skinCluster(name='lwrLipStickySkinCrv')
    cmds.select(['lwr_lip_joint_1', 'lwr_lip_joint_7', 'upr_lip_sticky_crv'], replace=True)
    cmds.skinCluster(name='lwrLipStickySkinCrv')

    def create_circle_controller(name, size=1):
        circle = cmds.circle(name=name, ch=False, radius=size)[0]
        cmds.setAttr(circle+'.overrideEnabled',1)
        cmds.setAttr(circle + ".overrideColor" ,18)
        return circle
    
    def create_group(name):
        return cmds.group(name=name, empty=True)
    
    joint_names = ['lwr_lip_joint_1', 'lwr_lip_joint_2', 'lwr_lip_joint_3', 'lwr_lip_joint_4', 'lwr_lip_joint_5', 'lwr_lip_joint_6', 'lwr_lip_joint_7', 'upr_lip_joint_2', 'upr_lip_joint_3', 'upr_lip_joint_4', 'upr_lip_joint_5', 'upr_lip_joint_6']
    
    for joint_name in joint_names:
        controller_name = joint_name.replace('_joint', '_ctrl')
        controller = create_circle_controller(controller_name)
        group_name = controller_name.replace('_ctrl', '_grp')
        controller_group = create_group(group_name)
        cmds.matchTransform(controller_group, joint_name, pos=True)
        cmds.parent(controller, controller_group)
    
    list = [('lwr_lip_ctrl_1'),('lwr_lip_ctrl_2'),('lwr_lip_ctrl_3'),('lwr_lip_ctrl_4'),('lwr_lip_ctrl_5'),('lwr_lip_ctrl_6'),('lwr_lip_ctrl_7'),('upr_lip_ctrl_2'),('upr_lip_ctrl_3'),('upr_lip_ctrl_4'),('upr_lip_ctrl_5'),('upr_lip_ctrl_6')]
    for each in list:
        cmds.setAttr(each+'.translateX',0)
        cmds.setAttr(each+'.translateY',0)
        cmds.setAttr(each+'.translateZ',0)
        
    controller_names = ['lwr_lip_ctrl_1','lwr_lip_ctrl_2','lwr_lip_ctrl_3','lwr_lip_ctrl_4','lwr_lip_ctrl_5','lwr_lip_ctrl_6','lwr_lip_ctrl_7','upr_lip_ctrl_2','upr_lip_ctrl_3','upr_lip_ctrl_4','upr_lip_ctrl_5','upr_lip_ctrl_6']
    joint_names = ['lwr_lip_joint_1','lwr_lip_joint_2','lwr_lip_joint_3','lwr_lip_joint_4','lwr_lip_joint_5','lwr_lip_joint_6','lwr_lip_joint_7','upr_lip_joint_2','upr_lip_joint_3','upr_lip_joint_4','upr_lip_joint_5','upr_lip_joint_6']
    
    for controller, joint in zip(controller_names, joint_names):
        cmds.parentConstraint(controller, joint, maintainOffset=True)
    
    list = [('lip_crv_grp'),('lip_ribbon_grp'),('lip_rivet_grp'),('lip_jnt_grp'),('lip_setup_grp')]
    for each in list:
        cmds.group(n=each,em=True)
    
    list = [('lwr_lip_joint_1'),('lwr_lip_joint_2'),('lwr_lip_joint_3'),('lwr_lip_joint_4'),('lwr_lip_joint_5'),('upr_lip_joint_2'),('upr_lip_joint_3'),('upr_lip_joint_4')]
    for each in list:
        cmds.parent(each,'lip_jnt_grp')
        
    list = ['upr_lip_wire_crv','lwr_lip_crv','lwr_lip_bound_crv','lwr_lip_sticky_crv','lwr_lip_wire_crv','upr_lip_crv','upr_lip_bound_crv','upr_lip_sticky_crv','upr_lip_wire_crvBaseWire','lwr_lip_wire_crvBaseWire']
    for each in list:
        cmds.parent(each,'lip_crv_grp')
    
    list = [('lip_crv_grp','lip_setup_grp'),('lip_ribbon_grp','lip_setup_grp'),('lip_rivet_grp','lip_setup_grp'),('lip_jnt_grp','lip_setup_grp')]
    for each in list:
        cmds.parent(each[0],each[1])
    cmds.setAttr('lip_setup_grp.visibility',0)
    
    cmds.parent('upperLip_ribbon','lip_ribbon_grp')
    cmds.parent('lowerLip_ribbon','lip_ribbon_grp')
    uprLipRivet_objects = cmds.ls('uprLipRivet*', type='transform')
    cmds.parent(uprLipRivet_objects,'lip_rivet_grp')
    lwrLipRivet_objects = cmds.ls('lwrLipRivet*', type='transform')
    cmds.parent(lwrLipRivet_objects,'lip_rivet_grp')
    lwrLipJoint_objects = cmds.ls('lwrLipJoint*', type='transform')
    cmds.parent(lwrLipJoint_objects,head_joint_name)
    uprLipJoint_objects = cmds.ls('uprLipJoint*', type='transform')
    cmds.parent(uprLipJoint_objects,head_joint_name)
    
def build_inner_eyebrow_locator(*args):
    selection = cmds.ls(selection=True, flatten=True)
    if not selection:
        cmds.warning("Please select a vertex.")
        return

    vertex = selection[0]

    vertex_position = cmds.pointPosition(vertex, world=True)

    locator = cmds.spaceLocator(n='l_inr_eyebrow_loc')[0]
    cmds.move(vertex_position[0], vertex_position[1], vertex_position[2], locator)

def build_middle_eyebrow_locator(*args):
    selection = cmds.ls(selection=True, flatten=True)
    if not selection:
        cmds.warning("Please select a vertex.")
        return

    vertex = selection[0]

    vertex_position = cmds.pointPosition(vertex, world=True)

    locator = cmds.spaceLocator(n='l_mid_eyebrow_loc')[0]
    cmds.move(vertex_position[0], vertex_position[1], vertex_position[2], locator)
    
def build_outer_eyebrow_locator(*args):
    selection = cmds.ls(selection=True, flatten=True)
    if not selection:
        cmds.warning("Please select a vertex.")
        return

    vertex = selection[0]

    vertex_position = cmds.pointPosition(vertex, world=True)

    locator = cmds.spaceLocator(n='l_otr_eyebrow_loc')[0]
    cmds.move(vertex_position[0], vertex_position[1], vertex_position[2], locator)

def build_cheek_locator(*args):
    selection = cmds.ls(selection=True, flatten=True)
    if not selection:
        cmds.warning("Please select a vertex.")
        return

    vertex = selection[0]

    vertex_position = cmds.pointPosition(vertex, world=True)

    locator = cmds.spaceLocator(n='l_cheek_loc')[0]
    cmds.move(vertex_position[0], vertex_position[1], vertex_position[2], locator)

def build_all(*args):
    list = [('l_inr_eyebrow_loc'),('l_mid_eyebrow_loc'),('l_otr_eyebrow_loc'),('l_cheek_loc')]
    for each in list:
        cmds.duplicate(each)

    list = [('l_inner_eyebrow_ctrl','l_inner_eyebrow_ctrl_grp'),('l_middle_eyebrow_ctrl','l_middle_eyebrow_ctrl_grp'),('l_outer_eyebrow_ctrl','l_outer_eyebrow_ctrl_grp'),('l_cheek_ctrl','l_cheek_ctrl_grp'),('r_inner_eyebrow_ctrl','r_inner_eyebrow_ctrl_grp'),('r_middle_eyebrow_ctrl','r_middle_eyebrow_ctrl_grp'),('r_outer_eyebrow_ctrl','r_outer_eyebrow_ctrl_grp'),('r_cheek_ctrl','r_cheek_ctrl_grp')]
    for each in list:
        circle = cmds.circle(n=each[0])
        cmds.group(n=each[1])
    
    list = [('l_inner_eyebrow_ctrl'),('l_middle_eyebrow_ctrl'),('l_outer_eyebrow_ctrl'),('l_cheek_ctrl'),('r_inner_eyebrow_ctrl'),('r_middle_eyebrow_ctrl'),('r_outer_eyebrow_ctrl'),('r_cheek_ctrl')]
    for each in list:
        cmds.setAttr(each + '.overrideEnabled',1)
        cmds.setAttr(each + ".overrideColor" ,18)

    list = [('l_inr_eyebrow_loc1','r_inr_eyebrow_loc'),('l_mid_eyebrow_loc1','r_mid_eyebrow_loc'),('l_otr_eyebrow_loc1','r_otr_eyebrow_loc'),('l_cheek_loc1','r_cheek_loc')]
    for each in list:
        cmds.rename(each[0],each[1])
    
    cmds.group(n='r_eyebrow_cheek_loc_grp',em=True)
    list = [('r_inr_eyebrow_loc'),('r_mid_eyebrow_loc'),('r_otr_eyebrow_loc'),('r_cheek_loc')]
    for each in list:
        cmds.parent(each,'r_eyebrow_cheek_loc_grp')
    cmds.setAttr('r_eyebrow_cheek_loc_grp.scaleX',-1)
    
    list = [('l_inr_eyebrow_loc','l_inner_eyebrow_ctrl_grp'),('l_mid_eyebrow_loc','l_middle_eyebrow_ctrl_grp'),('l_otr_eyebrow_loc','l_outer_eyebrow_ctrl_grp'),('l_cheek_loc','l_cheek_ctrl_grp'),('r_inr_eyebrow_loc','r_inner_eyebrow_ctrl_grp'),('r_mid_eyebrow_loc','r_middle_eyebrow_ctrl_grp'),('r_otr_eyebrow_loc','r_outer_eyebrow_ctrl_grp'),('r_cheek_loc','r_cheek_ctrl_grp')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
    
    list = [('l_inr_eyebrow_jnt'),('l_mid_eyebrow_jnt'),('l_otr_eyebrow_jnt'),('l_cheek_jnt'),('r_inr_eyebrow_jnt'),('r_mid_eyebrow_jnt'),('r_otr_eyebrow_jnt'),('r_cheek_jnt')]
    for each in list:
        cmds.joint(n=each)
    
    list = [('l_inner_eyebrow_ctrl','l_inr_eyebrow_jnt'),('l_middle_eyebrow_ctrl','l_mid_eyebrow_jnt'),('l_outer_eyebrow_ctrl','l_otr_eyebrow_jnt'),('l_cheek_ctrl','l_cheek_jnt'),('r_inner_eyebrow_ctrl','r_inr_eyebrow_jnt'),('r_middle_eyebrow_ctrl','r_mid_eyebrow_jnt'),('r_outer_eyebrow_ctrl','r_otr_eyebrow_jnt'),('r_cheek_ctrl','r_cheek_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
    cmds.makeIdentity( 'l_inr_eyebrow_jnt', apply=True, translate=True, rotate=True )
    
    list = [('l_inner_eyebrow_ctrl','l_inr_eyebrow_jnt'),('l_middle_eyebrow_ctrl','l_mid_eyebrow_jnt'),('l_outer_eyebrow_ctrl','l_otr_eyebrow_jnt'),('l_cheek_ctrl','l_cheek_jnt'),('r_inner_eyebrow_ctrl','r_inr_eyebrow_jnt'),('r_middle_eyebrow_ctrl','r_mid_eyebrow_jnt'),('r_outer_eyebrow_ctrl','r_otr_eyebrow_jnt'),('r_cheek_ctrl','r_cheek_jnt')]
    for each in list:
        cmds.parentConstraint(each[0],each[1],mo=False)
    
    cmds.group(n='eyebrow_cheek_grp',em=True)
    list = [('l_inr_eyebrow_jnt'),('l_mid_eyebrow_jnt'),('l_otr_eyebrow_jnt'),('l_cheek_jnt'),('r_inr_eyebrow_jnt'),('r_mid_eyebrow_jnt'),('r_otr_eyebrow_jnt'),('r_cheek_jnt')]
    for each in list:
        cmds.parent(each,'eyebrow_cheek_grp')
        
    list = [('l_inr_eyebrow_loc'),('l_mid_eyebrow_loc'),('l_otr_eyebrow_loc'),('l_cheek_loc'),('r_eyebrow_cheek_loc_grp')]
    for each in list:
        cmds.delete(each)
        
#------------------------------------------------------------------------------------------------#
#    ______________   _____            ___            _____    .           _______       _____   #
#   |              |  \    \          /   \          /    /   / \          |      \      |   |   #
#   |    __________|   \    \        /     \        /    /   /   \         |       \     |   |   #
#   |   |               \    \      /       \      /    /   /     \        |   |\   \    |   |   #
#   |   |__________      \    \    /    .    \    /    /   /   .   \       |   | \   \   |   |   #
#   |              |      \    \  /    / \    \  /    /   /   / \   \      |   |  \   \  |   |   #
#   |    __________|       \    \/    /   \    \/    /   /   /___\   \     |   |   \   \ |   |   #
#   |   |                   \        /     \        /   /    _____    \    |   |    \   \|   |   #
#   |   |__________          \      /       \      /   /   /       \   \   |   |     \       |   #
#   |              |          \    /         \    /   /   /         \   \  |   |      \      |   #
#   |______________|           \__/           \__/   /___/           \___\ |___|       \_____|   #
#                                                                                                #
#------------------------------------------------------------------------------------------------#
ui()
def IKlegSetup(side):
            list = ['%s_ik_leg_01_jnt'%(side),'%s_ik_leg_02_jnt'%(side),'%s_ik_leg_03_jnt'%(side),'%s_ik_leg_04_jnt'%(side),'%s_ik_leg_05_jnt'%(side)]
            for each in list:
                cmds.joint(n=each)
                
            list = [('%s_leg_01_setup'%(side),'%s_ik_leg_01_jnt'%(side)),('%s_leg_02_setup'%(side),'%s_ik_leg_02_jnt'%(side)),('%s_leg_03_setup'%(side),'%s_ik_leg_03_jnt'%(side)),('%s_leg_04_setup'%(side),'%s_ik_leg_04_jnt'%(side)),('%s_leg_05_setup'%(side),'%s_ik_leg_05_jnt'%(side))]
            for each in list:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            cmds.makeIdentity('%s_ik_leg_01_jnt'%(side), apply=True, translate=True, rotate=True)
            cmds.group(n='%s_ik_leg_jnt_grp'%(side),em=True)
            cmds.parent('%s_ik_leg_01_jnt'%(side),'%s_ik_leg_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_ik_leg_jnt_grp'%(side))
            cmds.ikHandle( n='%s_leg_01_ikh'%(side), sj='%s_ik_leg_01_jnt'%(side), ee='%s_ik_leg_03_jnt'%(side) )
            cmds.ikHandle( n='%s_leg_02_ikh'%(side), sj='%s_ik_leg_03_jnt'%(side), ee='%s_ik_leg_04_jnt'%(side) )
            cmds.ikHandle( n='%s_leg_03_ikh'%(side), sj='%s_ik_leg_04_jnt'%(side), ee='%s_ik_leg_05_jnt'%(side) )
            cmds.parentConstraint('spine_01_bln_jnt','%s_ik_leg_01_jnt'%(side),mo = True)
            cmds.curve(d=1, p=[(-5, -5, 5),(-5, 5, 5),(5, 5, 5),(5, -5, 5),(5, -5, -5),(5, 5, -5),(-5, 5, -5),(-5, -5, -5),(-5, -5, 5),(5, -5, 5),(5, 5, 5),(5, 5, -5),(5, -5, -5),(-5, -5, -5),(-5, 5, -5),(-5, 5, 5)])
            cmds.rename('%s_ik_leg_ctrl'%(side))
            ControllerAttr('%s_ik_leg_ctrl'%(side),False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='heelLift' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='toeLift' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='ballRoll' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='toeRoll' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='footRock' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='stretch' ,k=1,at = 'bool')
            cmds.addAttr('%s_ik_leg_ctrl'%(side), at = 'enum', keyable=True, en = 'string1:string2:', ln='follow')
            cmds.addAttr('%s_ik_leg_ctrl'%(side)+'.follow', e=True, en = 'world:pelvis:')
            cmds.group(n='%s_ik_leg_ctrl_grp'%(side))
            forDel = cmds.parentConstraint('%s_leg_03_setup'%(side),'%s_ik_leg_ctrl_grp'%(side),mo = False)
            deleteparent = cmds.delete(forDel)
            cmds.parentConstraint('spine_01_bln_jnt','%s_ik_leg_ctrl_grp'%(side),mo = True)
            cmds.connectAttr('%s_ik_leg_ctrl.follow'%(side),'%s_ik_leg_ctrl_grp_parentConstraint1.spine_01_bln_jntW0'%(side))
            cmds.curve(n='%s_knee_ctrl'%(side),d=1,p=[(0.0, 3.468342867164149, 0.0),(0.0, 3.468342867164149, 0.5221724371834184),(0.0, 4.967930096687364, 0.0),(0.5221724371834184, 3.468342867164149, 0.0),(-0.5221724371834184, 3.468342867164149, 0.0),(0.0, 4.967930096687364, 0.0),(0.0, 3.468342867164149, -0.5221724371834184),(0.0, 3.468342867164149, 0.0),(0.0, -3.468342867164149, 0.0),(-0.5221724371834184, -3.468342867164149, 0.0),(0.0, -4.967930096687364, 0.0),(0.0, -3.468342867164149, -0.5221724371834184),(0.0, -3.468342867164149, 0.5221724371834184),(0.0, -4.967930096687364, 0.0),(0.5221724371834184, -3.468342867164149, 0.0),(0.0, -3.468342867164149, 0.0),(0.0, 0.0, 0.0),(-3.468342867164149, 0.0, 0.0),(-3.468342867164149, 0.5221724371834184, 0.0),(-4.967930096687364, 0.0, 0.0),(-3.468342867164149, 0.0, -0.5221724371834184),(-3.468342867164149, 0.0, 0.5221724371834184),(-4.967930096687364, 0.0, 0.0),(-3.468342867164149, -0.5221724371834184, 0.0),(-3.468342867164149, 0.0, 0.0),(3.468342867164149, 0.0, 0.0),(3.468342867164149, 0.0, -0.5221724371834184),(4.967930096687364, 0.0, 0.0),(3.468342867164149, 0.5221724371834184, 0.0),(3.468342867164149, -0.5221724371834184, 0.0),(4.967930096687364, 0.0, 0.0),(3.468342867164149, 0.0, 0.5221724371834184),(3.468342867164149, 0.0, 0.0),(0.0, 0.0, 0.0),(0.0, 0.0, 3.468342867164149),(0.0, 0.5221724371834184, 3.468342867164149),(0.0, 0.0, 4.967930096687364),(0.5221724371834184, 0.0, 3.468342867164149),(-0.5221724371834184, 0.0, 3.468342867164149),(0.0, 0.0, 4.967930096687364),(0.0, -0.5221724371834184, 3.468342867164149),(0.0, 0.0, 3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.5221724371834184, -3.468342867164149),(0.0, 0.0, -4.967930096687364),(-0.5221724371834184, 0.0, -3.468342867164149),(0.5221724371834184, 0.0, -3.468342867164149),(0.0, 0.0, -4.967930096687364),(0.0, -0.5221724371834184, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149)])
            ControllerAttr('%s_knee_ctrl'%(side),False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,6,True,True,True,False,False,False)
            cmds.addAttr('%s_knee_ctrl'%(side),sn='follow', min = 0, max=1 ,k=1)
            cmds.setAttr('%s_knee_ctrl.follow'%(side),1)
            cmds.group(n='%s_knee_ctrl_grp'%(side))
            cmds.parent('%s_knee_ctrl_grp'%(side),'world_ctrl')
            forDel = cmds.pointConstraint('%s_knee_setup'%(side),'%s_knee_ctrl_grp'%(side))
            cmds.delete(forDel)
            cmds.poleVectorConstraint('%s_knee_ctrl'%(side),'%s_leg_01_ikh'%(side))
            
            list = ['%s_knee_ctrl_aim_up_loc'%(side),'%s_knee_ctrl_aim_base_loc'%(side),'%s_knee_ctrl_aim_loc'%(side),'%s_knee_ctrl_aim_world_loc'%(side),'%s_heel_loc'%(side),'%s_roll_out_loc'%(side),'%s_roll_in_loc'%(side),'%s_toe_roll_loc'%(side),'%s_toe_end_loc'%(side),'%s_toe_lift_loc'%(side),'%s_ball_roll_loc'%(side),'%s_leg_ikHandle_loc'%(side),'%s_ball_ikHandle_loc'%(side)]
            for each in list:
                cmds.spaceLocator(n=each)
                
            cmds.group(n='%s_knee_loc_grp'%(side),em=True)
            cmds.scaleConstraint('world_ctrl','%s_knee_loc_grp'%(side),mo=True)
            cmds.group(n='%s_foot_ikHandle_grp'%(side),em = True)
            cmds.group(n='%s_knee_ctrl_aim_base_loc_grp'%(side),em=True)
            
            list = [('pelvis_setup','%s_knee_ctrl_aim_up_loc'%(side)),('%s_leg_01_setup'%(side),'%s_knee_ctrl_aim_base_loc'%(side)),('%s_leg_03_setup'%(side),'%s_knee_ctrl_aim_loc'%(side))]
            for each in list:
                forDel = cmds.pointConstraint(each[0],each[1])
                cmds.delete(forDel)
            
            list = [('%s_leg_04_setup'%(side),'%s_toe_roll_loc'%(side)),('%s_leg_04_setup'%(side),'%s_ball_roll_loc'%(side)),('%s_knee_setup'%(side),'%s_knee_ctrl_aim_world_loc'%(side)),('%s_leg_heel_setup'%(side),'%s_heel_loc'%(side)),('%s_leg_roll_out_setup'%(side),'%s_roll_out_loc'%(side)),('%s_leg_roll_in_setup'%(side),'%s_roll_in_loc'%(side)),('%s_leg_05_setup'%(side),'%s_toe_end_loc'%(side)),('%s_leg_06_setup'%(side),'%s_toe_lift_loc'%(side)),('%s_leg_03_setup'%(side),'%s_leg_ikHandle_loc'%(side)),('%s_leg_04_setup'%(side),'%s_ball_ikHandle_loc'%(side)),('%s_leg_03_setup'%(side),'%s_foot_ikHandle_grp'%(side))]
            for each in list:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            list = [('%s_heel_loc'%(side),'%s_toe_roll_loc'%(side)),('%s_heel_loc'%(side),'%s_ball_roll_loc'%(side)),('%s_heel_loc'%(side),'%s_foot_ikHandle_grp'%(side))]
            for each in list:
                forDel = cmds.orientConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            list = [('%s_toe_lift_loc'%(side),'%s_heel_loc'%(side)),('%s_roll_out_loc'%(side),'%s_toe_lift_loc'%(side)),('%s_roll_in_loc'%(side),'%s_roll_in_loc'%(side)),('%s_toe_roll_loc'%(side),'%s_roll_in_loc'%(side)),('%s_ball_roll_loc'%(side),'%s_roll_in_loc'%(side)),('%s_toe_end_loc'%(side),'%s_toe_roll_loc'%(side)),('%s_leg_ikHandle_loc'%(side),'%s_ball_roll_loc'%(side)),('%s_ball_ikHandle_loc'%(side),'%s_ball_roll_loc'%(side)),('%s_leg_02_ikh'%(side),'%s_ball_ikHandle_loc'%(side)),('%s_leg_03_ikh'%(side),'%s_toe_end_loc'%(side)),('%s_leg_01_ikh'%(side),'%s_leg_ikHandle_loc'%(side)),('%s_knee_ctrl_aim_world_loc'%(side),'%s_knee_loc_grp'%(side)),('%s_heel_loc'%(side),'%s_foot_ikHandle_grp'%(side)),('%s_ik_leg_ctrl_grp'%(side),'world_ctrl'),('%s_knee_ctrl_aim_base_loc'%(side),'%s_knee_ctrl_aim_base_loc_grp'%(side)),('%s_knee_ctrl_aim_up_loc'%(side),'%s_knee_loc_grp'%(side)),('%s_knee_ctrl_aim_base_loc_grp'%(side),'%s_knee_loc_grp'%(side)),('%s_knee_ctrl_aim_loc'%(side),'%s_knee_loc_grp'%(side)),('%s_knee_ctrl_aim_up_loc'%(side),'spine_01_bln_jnt')]
            for each in list:
                cmds.parent(each[0],each[1])
                
            cmds.aimConstraint('%s_knee_ctrl_aim_loc'%(side),'%s_knee_ctrl_aim_base_loc'%(side),wut='object',wuo = '%s_knee_ctrl_aim_up_loc'%(side),mo = False)
            
            list = [('%s_ik_leg_ctrl'%(side),'%s_knee_ctrl_aim_loc'%(side)),('world_ctrl','%s_knee_ctrl_aim_world_loc'%(side)),('%s_knee_ctrl_aim_base_loc'%(side),'%s_knee_ctrl_grp'%(side)),('%s_knee_ctrl_aim_world_loc'%(side),'%s_knee_ctrl_grp'%(side)),('%s_ik_leg_ctrl'%(side),'%s_foot_ikHandle_grp'%(side)),('%s_knee_ctrl_aim_up_loc'%(side),'%s_knee_ctrl_aim_base_loc_grp'%(side))]
            for each in list:
                cmds.parentConstraint(each[0],each[1],mo=True)

            list = [('reverse','%s_knee_follow_rev'%(side)),('multiplyDivide','%s_foot_rock_mult'%(side)),('condition','%s_foot_rock_con'%(side))]
            for each in list:
                cmds.shadingNode(each[0],n = each[1],asUtility=1)

            list = [('%s_knee_ctrl.follow'%(side),'%s_knee_ctrl_grp_parentConstraint1.%s_knee_ctrl_aim_base_locW0'%(side,side)),('%s_knee_ctrl.follow'%(side),'%s_knee_follow_rev.inputX'%(side)),('%s_knee_follow_rev.outputX'%(side),'%s_knee_ctrl_grp_parentConstraint1.%s_knee_ctrl_aim_world_locW1'%(side,side)),('%s_ik_leg_ctrl.heelLift'%(side),'%s_heel_loc.rotateZ'%(side)),('%s_ik_leg_ctrl.toeLift'%(side),'%s_toe_lift_loc.rotateZ'%(side)),('%s_ik_leg_ctrl.ballRoll'%(side),'%s_ball_roll_loc.rotateZ'%(side)),('%s_ik_leg_ctrl.toeRoll'%(side),'%s_toe_roll_loc.rotateZ'%(side)),('%s_ik_leg_ctrl.footRock'%(side),'%s_foot_rock_mult.input1X'%(side)),('%s_ik_leg_ctrl.footRock'%(side),'%s_foot_rock_mult.input1Y'%(side)),('%s_foot_rock_mult.outputX'%(side),'%s_foot_rock_con.colorIfFalse.colorIfFalseG'%(side)),('%s_foot_rock_mult.outputX'%(side),'%s_foot_rock_con.colorIfTrue.colorIfTrueR'%(side)),('%s_foot_rock_con.outColor.outColorR'%(side), '%s_roll_out_loc.rotate.rotateX'%(side)),('%s_foot_rock_con.outColor.outColorG'%(side), '%s_roll_in_loc.rotate.rotateX'%(side)),('%s_ik_leg_ctrl.footRock'%(side), '%s_foot_rock_con.firstTerm'%(side))]
            for each in list:
                cmds.connectAttr(each[0],each[1])
                
            list = [('%s_foot_rock_mult.input2X'%(side),-1),('%s_foot_rock_con.operation'%(side),2),('%s_foot_rock_con.colorIfFalse.colorIfFalseR'%(side),0),('%s_foot_rock_con.colorIfFalse.colorIfFalseB'%(side),0)]
            for each in list:
                cmds.setAttr(each[0],each[1])
            
            cmds.scaleConstraint('world_ctrl','%s_foot_ikHandle_grp'%(side),mo=True)
            #IKlegPVcrv#
            cmds.curve(d=1, p=[(0, 0, 0),(0, 10, 0)])
            cmds.rename('%s_knee_direction_crv'%(side))
            
            nameOfLoc = ['%s_knee_01_loc'%(side),'%s_knee_02_loc'%(side)]
            for each in nameOfLoc:
                cmds.spaceLocator(n=each)
        
            toGetLocPos = [('%s_knee_01_loc.translateY'%(side),0),('%s_knee_02_loc.translateY'%(side),10)]
            for each in toGetLocPos:
                cmds.setAttr(each[0],each[1])
    
            toConnectLoc = [('%s_knee_01_loc.worldPosition[0]'%(side),'%s_knee_direction_crvShape.controlPoints[0]'%(side)),('%s_knee_02_loc.worldPosition[0]'%(side),'%s_knee_direction_crvShape.controlPoints[4]'%(side))]
            for each in toConnectLoc:
                cmds.connectAttr(each[0],each[1])
            toSetAttr = [('%s_knee_direction_crv.overrideEnabled'%(side),1),('%s_knee_direction_crv.overrideDisplayType'%(side),2),('%s_knee_01_loc.visibility'%(side),0),('%s_knee_02_loc.visibility'%(side),0)]
            for each in toSetAttr:
                cmds.setAttr(each[0],each[1])
            
            toGetParent = [('%s_knee_ctrl'%(side),'%s_knee_01_loc'%(side)),('%s_ik_leg_02_jnt'%(side),'%s_knee_02_loc'%(side))]
            for each in toGetParent:
                cmds.parentConstraint(each[0],each[1],mo = False)
            
            cmds.group(n='%s_knee_direction_crv_grp'%(side),em = True)
            toGetParent = [('%s_knee_01_loc'%(side),'%s_knee_direction_crv_grp'%(side)),('%s_knee_02_loc'%(side),'%s_knee_direction_crv_grp'%(side)),('%s_knee_direction_crv'%(side),'%s_knee_direction_crv_grp'%(side))]
            for each in toGetParent:
                cmds.parent(each[0],each[1])
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
            
        IKlegSetup('l')
        IKlegSetup('r')
        
        def IKFKlegSetup(side):
            nameOfJoint = [('%s_leg_01_bln_jnt'%(side)),('%s_leg_02_bln_jnt'%(side)),('%s_leg_03_bln_jnt'%(side)),('%s_leg_04_bln_jnt'%(side))]
            for each in nameOfJoint:
                cmds.joint(n=each)

            toGetJointPos = [('%s_leg_01_setup'%(side),'%s_leg_01_bln_jnt'%(side)),('%s_leg_02_setup'%(side),'%s_leg_02_bln_jnt'%(side)),('%s_leg_03_setup'%(side),'%s_leg_03_bln_jnt'%(side)),('%s_leg_04_setup'%(side),'%s_leg_04_bln_jnt'%(side))]
            for each in toGetJointPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo = False)
                cmds.delete(forDel)

            toSetDrawStyle = [('%s_leg_01_bln_jnt.drawStyle'%(side)),('%s_leg_02_bln_jnt.drawStyle'%(side)),('%s_leg_03_bln_jnt.drawStyle'%(side))]
            for each in toSetDrawStyle:
                cmds.setAttr(each,2)

            cmds.parent(w = True)
            cmds.makeIdentity( '%s_leg_01_bln_jnt'%(side), apply=True, translate=True, rotate=True )
            cmds.curve(d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
            cmds.rename('%s_leg_ik_fk_switch'%(side))
            ControllerAttr('%s_leg_ik_fk_switch'%(side),False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,15,False,False,False,True,True,True)
            cmds.group(n='%s_leg_ik_fk_switch_grp'%(side))
            cmds.parent('%s_leg_ik_fk_switch_grp'%(side), 'world_ctrl')
            cmds.addAttr('%s_leg_ik_fk_switch'%(side),sn='IKFK', min = 0, max=1 ,k=1)
            cmds.addAttr('%s_leg_ik_fk_switch'%(side),sn='bendyVis',at = 'bool',k=1)

            parentCon = [('%s_leg_03_bln_jnt'%(side), '%s_leg_ik_fk_switch_grp'%(side)),('%s_fk_leg_01_jnt'%(side),'%s_leg_01_bln_jnt'%(side)),('%s_ik_leg_01_jnt'%(side),'%s_leg_01_bln_jnt'%(side)),('%s_fk_leg_02_jnt'%(side),'%s_leg_02_bln_jnt'%(side)),('%s_ik_leg_02_jnt'%(side),'%s_leg_02_bln_jnt'%(side)),('%s_fk_leg_03_jnt'%(side),'%s_leg_03_bln_jnt'%(side)),('%s_ik_leg_03_jnt'%(side),'%s_leg_03_bln_jnt'%(side)),('%s_fk_leg_04_jnt'%(side),'%s_leg_04_bln_jnt'%(side)),('%s_ik_leg_04_jnt'%(side),'%s_leg_04_bln_jnt'%(side))]
            for each in parentCon:
                cmds.parentConstraint(each[0],each[1],mo = False)
            
            cmds.shadingNode('reverse',n = '%s_leg_ik_rev'%(side),asUtility=1)

            toConnectAttr = [('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_01_bln_jnt_parentConstraint1.%s_fk_leg_01_jntW0'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_02_bln_jnt_parentConstraint1.%s_fk_leg_02_jntW0'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_03_bln_jnt_parentConstraint1.%s_fk_leg_03_jntW0'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_04_bln_jnt_parentConstraint1.%s_fk_leg_04_jntW0'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_ik_rev.inputX'%(side)),('%s_leg_ik_rev.outputX'%(side),'%s_leg_01_bln_jnt_parentConstraint1.%s_ik_leg_01_jntW1'%(side,side)),('%s_leg_ik_rev.outputX'%(side),'%s_leg_02_bln_jnt_parentConstraint1.%s_ik_leg_02_jntW1'%(side,side)),('%s_leg_ik_rev.outputX'%(side),'%s_leg_03_bln_jnt_parentConstraint1.%s_ik_leg_03_jntW1'%(side,side)),('%s_leg_ik_rev.outputX'%(side),'%s_leg_04_bln_jnt_parentConstraint1.%s_ik_leg_04_jntW1'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_fk_leg_01_ctrl_grp.visibility'%(side)),('%s_leg_ik_rev.outputX'%(side),'%s_ik_leg_ctrl_grp.visibility'%(side)),('%s_leg_ik_rev.outputX'%(side),'%s_knee_ctrl_grp.visibility'%(side)),('%s_leg_ik_rev.outputX'%(side),'%s_knee_direction_crv_grp.visibility'%(side))]
            for each in toConnectAttr:
                cmds.connectAttr(each[0],each[1])
                
            cmds.parent('%s_leg_01_bln_jnt'%(side),'spine_01_bln_jnt')
            cmds.parent('%s_leg_04_bln_jnt'%(side),'%s_leg_03_bln_jnt'%(side))
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
            
        IKFKlegSetup('l')
        IKFKlegSetup('r')
            
        def StrechyLegSetup(side):
            #StrechyLeg#
            jointList = ['%s_leg_01_length_jnt'%(side),'%s_leg_02_length_jnt'%(side),'%s_leg_03_length_jnt'%(side)]
            for each in jointList:
                cmds.joint(n=each)
                
            cmds.group(n='%s_leg_length_jnt_grp'%(side),em=True)
            cmds.parent('%s_leg_01_length_jnt'%(side),'%s_leg_length_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_leg_length_jnt_grp'%(side),mo=True)
            
            listOfToGetJointPos = [('%s_leg_01_setup'%(side),'%s_leg_01_length_jnt'%(side)),('%s_leg_02_setup'%(side),'%s_leg_02_length_jnt'%(side)),('%s_leg_03_setup'%(side),'%s_leg_03_length_jnt'%(side))]
            for each in listOfToGetJointPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
                
            addNode = [('distanceBetween','%s_upr_leg_dist'%(side)),('distanceBetween','%s_lwr_leg_dist'%(side)),('addDoubleLinear','%s_leg_full_dist'%(side)),('distanceBetween','%s_leg_stretch_dist'%(side)),('condition','%s_leg_stretch_cond'%(side)),('multiplyDivide','%s_leg_stretch_mult'%(side)),('multiplyDivide','%s_upr_leg_strecth_mult'%(side)),('multiplyDivide','%s_lwr_leg_strecth_mult'%(side)),('multiplyDivide','%s_leg_strecth_option_mult'%(side))]
            for each in addNode:
                cmds.shadingNode(each[0],n=each[1],asUtility=1)
                
            cmds.setAttr('%s_leg_stretch_cond.operation'%(side),2)
            cmds.setAttr('%s_leg_stretch_mult.operation'%(side),2)
                
            addLoc = [('%s_leg_start_dist_loc'%(side)),('%s_leg_end_dist_loc'%(side))]
            for each in addLoc:
                cmds.spaceLocator(n=each)
                
            cmds.group(n='%s_leg_start_dist_loc_grp'%(side),em=True)
            cmds.parent('%s_leg_start_dist_loc'%(side),'%s_leg_start_dist_loc_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_leg_start_dist_loc_grp'%(side),mo=True)
                
            toConnectNode = [('%s_leg_01_length_jnt.worldMatrix'%(side),'%s_upr_leg_dist.inMatrix1'%(side)),('%s_leg_02_length_jnt.worldMatrix'%(side),'%s_upr_leg_dist.inMatrix2'%(side)),('%s_leg_02_length_jnt.worldMatrix'%(side),'%s_lwr_leg_dist.inMatrix1'%(side)),('%s_leg_03_length_jnt.worldMatrix'%(side),'%s_lwr_leg_dist.inMatrix2'%(side)),('%s_upr_leg_dist.distance'%(side),'%s_leg_full_dist.input1'%(side)),('%s_lwr_leg_dist.distance'%(side),'%s_leg_full_dist.input2'%(side)),('%s_leg_start_dist_loc.worldMatrix'%(side),'%s_leg_stretch_dist.inMatrix1'%(side)),('%s_leg_end_dist_loc.worldMatrix'%(side),'%s_leg_stretch_dist.inMatrix2'%(side)),('%s_leg_stretch_dist.distance'%(side),'%s_leg_stretch_cond.firstTerm'%(side)),('%s_leg_full_dist.output'%(side),'%s_leg_stretch_cond.secondTerm'%(side)),('%s_leg_stretch_dist.distance'%(side),'%s_leg_stretch_mult.input1X'%(side)),('%s_leg_full_dist.output'%(side),'%s_leg_stretch_mult.input2X'%(side)),('%s_leg_stretch_mult.outputX'%(side),'%s_leg_stretch_cond.colorIfTrue.colorIfTrueR'%(side)),('%s_leg_stretch_cond.outColor.outColorR'%(side),'%s_lwr_leg_strecth_mult.input1X'%(side)),('%s_leg_stretch_cond.outColor.outColorR'%(side),'%s_upr_leg_strecth_mult.input1X'%(side)),('%s_leg_02_setup.translateX'%(side),'%s_upr_leg_strecth_mult.input2X'%(side)),('%s_leg_03_setup.translateX'%(side),'%s_lwr_leg_strecth_mult.input2X'%(side)),('%s_upr_leg_strecth_mult.outputX'%(side),'%s_ik_leg_02_jnt.translateX'%(side)),('%s_lwr_leg_strecth_mult.outputX'%(side),'%s_ik_leg_03_jnt.translateX'%(side)),('%s_ik_leg_ctrl.stretch'%(side),'%s_leg_strecth_option_mult.input1X'%(side)),('%s_leg_strecth_option_mult.outputX'%(side),'%s_leg_stretch_cond.operation'%(side))]
            for each in toConnectNode:
                cmds.connectAttr(each[0],each[1])
                
            toSetVis = [('%s_leg_start_dist_loc.visibility'%(side)),('%s_leg_end_dist_loc.visibility'%(side))]
            for each in toSetVis:
                cmds.setAttr(each,0)
                
            toGetLocPos = [('%s_leg_01_setup'%(side),'%s_leg_start_dist_loc'%(side)),('%s_leg_03_setup'%(side),'%s_leg_end_dist_loc'%(side))]
            for each in toGetLocPos:
                forDel = cmds.pointConstraint(each[0],each[1],mo = False)
                cmds.delete(forDel)
                
            cmds.parentConstraint('spine_01_bln_jnt','%s_leg_start_dist_loc'%(side),mo=True)
            cmds.parent('%s_leg_end_dist_loc'%(side),'%s_ik_leg_ctrl'%(side))
            cmds.setAttr('%s_leg_strecth_option_mult.input2X'%(side),2)
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
            
        StrechyLegSetup('l')
        StrechyLegSetup('r')
        
        def legJointGroup():
            cmds.group(n='l_leg_jnt_grp',em=True)
            cmds.group(n='r_leg_jnt_grp',em=True)
            cmds.group(n='leg_jnt_grp',em=True)
            listOfJnt = [('r_leg_01_bln_jnt','r_leg_jnt_grp'),('l_leg_01_bln_jnt','l_leg_jnt_grp'),('l_leg_jnt_grp','leg_jnt_grp'),('r_leg_jnt_grp','leg_jnt_grp'),('l_fk_leg_01_jnt','l_leg_jnt_grp'),('r_fk_leg_01_jnt','r_leg_jnt_grp'),('l_ik_leg_jnt_grp','l_leg_jnt_grp'),('r_ik_leg_jnt_grp','r_leg_jnt_grp'),('r_leg_length_jnt_grp','r_leg_jnt_grp'),('l_leg_length_jnt_grp','l_leg_jnt_grp')]
            for each in listOfJnt:
                cmds.parent(each[0],each[1])
                
        legJointGroup()
        
    bendyLeglabel = cmds.checkBox('bendyLeg', q=1,label=1)
    bendyLeglabel = cmds.checkBox('bendyLeg', q=1,v=1 )
    
    if bendyLeglabel == 1:
        print(buildBendyLeg())
    elif bendyLeglabel == 0:
        print(noBendyLeg())
        
    def neckSetup():    
        #############necksetupGorup####################################
        createJoint = [('neck_01_jnt'),('neck_02_jnt'),('head_jnt')]
        for each in createJoint:
            cmds.joint(n=each)
            
        cmds.curve(d=1, p=[(0.0, -4.488101857837618, -9.88295369549351),(1.845970443850507, -2.669731881954042, -9.58101846750181),(3.691940887701014, -0.9395124651324274, -8.94542404852105),(5.5379124591137385, 0.6419036933703752, -7.998451067974649),(3.691940887701014, 0.6419036933703752, -7.998451067974649),(1.845970443850507, 0.6419036933703752, -7.998451067974649),(1.845970443850507, 2.0190845073658616, -6.7732938299919585),(1.845970443850507, 3.143754528061804, -5.312898924323979),(1.845970443850507, 3.97648967007558, -3.6684576756581033),(1.8351740356152193, 4.488101857837621, -1.9084097279272163),(3.606018391581394, 3.9764896700755794, -1.9084097279272163),(5.250459640247268, 3.1437545280618036, -1.9084097279272163),(6.710854545915254, 2.0190845073658608, -1.9084097279272163),(7.936011783897939, 0.641903693370374, -1.9084097279272163),(7.936011783897939, 0.641903693370374, -3.7543801717777243),(7.936011783897939, 0.6419036933703747, -5.600351743190446),(8.882984764444341, -0.9395124651324284, -3.7543801717777243),(9.5185791834251, -2.669731881954045, -1.9084097279272174),(9.820514411416799, -4.488101857837621, -0.062439284076711864),(9.5185791834251, -2.669731881954045, 1.783531159773795),(8.882984764444341, -0.9395124651324317, 3.629501603624302),(7.936011783897939, 0.6419036933703725, 5.475473175037026),(7.936011783897939, 0.641903693370373, 3.6295016036243037),(7.936011783897939, 0.641903693370373, 1.7835311597737955),(6.710854545915254, 2.0190845073658603, 1.7835311597737955),(5.250459640247268, 3.1437545280618036, 1.7835311597737957),(3.606018391581394, 3.976489670075578, 1.7835311597737957),(1.8351740356152193, 4.488101857837621, 1.7835311597737964),(1.845970443850507, 3.976489670075578, 3.5435791075046823),(1.845970443850507, 3.143754528061802, 5.188020356170558),(1.845970443850507, 2.0190845073658594, 6.64841526183854),(1.845970443850507, 0.641903693370372, 7.87357249982123),(3.691940887701014, 0.641903693370372, 7.87357249982123),(5.5379124591137385, 0.641903693370372, 7.87357249982123),(3.691940887701014, -0.9395124651324329, 8.820545480367631),(1.845970443850507, -2.6697318819540463, 9.45613989934839),(0.0, -4.488101857837623, 9.758075127340078),(-1.8459704438505065, -2.6697318819540463, 9.45613989934839),(-3.691940887701013, -0.9395124651324329, 8.820545480367631),(-5.537912459113736, 0.641903693370372, 7.87357249982123),(-3.691940887701013, 0.641903693370372, 7.87357249982123),(-1.8459704438505065, 0.641903693370372, 7.87357249982123),(-1.8459704438505065, 2.0190845073658594, 6.64841526183854),(-1.8459704438505065, 3.143754528061802, 5.188020356170558),(-1.8459704438505065, 3.976489670075578, 3.5435791075046823),(-1.835174035615219, 4.488101857837621, 1.7835311597737964),(-3.6060183915813933, 3.976489670075578, 1.7835311597737957),(-5.250459640247268, 3.1437545280618036, 1.7835311597737957),(-6.710854545915253, 2.0190845073658603, 1.7835311597737955),(-7.936011783897938, 0.641903693370373, 1.7835311597737955),(-7.936011783897938, 0.641903693370373, 3.6295016036243037),(-7.936011783897938, 0.6419036933703725, 5.475473175037026),(-8.882984764444341, -0.9395124651324317, 3.629501603624302),(-9.5185791834251, -2.669731881954045, 1.783531159773795),(-9.820514411416799, -4.488101857837621, -0.062439284076711864),(-9.5185791834251, -2.669731881954045, -1.9084097279272174),(-8.882984764444341, -0.9395124651324284, -3.7543801717777243),(-7.936011783897938, 0.6419036933703747, -5.600351743190446),(-7.936011783897938, 0.641903693370374, -3.7543801717777243),(-7.936011783897938, 0.641903693370374, -1.9084097279272163),(-6.710854545915253, 2.0190845073658608, -1.9084097279272163),(-5.250459640247268, 3.1437545280618036, -1.9084097279272163),(-3.6060183915813933, 3.9764896700755794, -1.9084097279272163),(-1.8459704438505065, 4.488101857837621, -1.8976133196919278),(-1.8459704438505065, 3.97648967007558, -3.6684576756581033),(-1.8459704438505065, 3.143754528061804, -5.312898924323979),(-1.8459704438505065, 2.0190845073658616, -6.7732938299919585),(-1.8459704438505065, 0.6419036933703752, -7.998451067974649),(-3.691940887701013, 0.6419036933703752, -7.998451067974649),(-5.537912459113736, 0.6419036933703752, -7.998451067974649),(-3.691940887701013, -0.9395124651324274, -8.94542404852105),(-1.8459704438505065, -2.669731881954042, -9.58101846750181),(0.0, -4.488101857837618, -9.88295369549351)])
        cmds.rename('head_ctrl')
        cmds.group(n='head_ctrl_grp')
        cmds.curve(d=1,p=[(-7.244192640355521, -0.7593145399841482, 0.0), (-7.244192640355521, 0.7593145399841418, 0.0),(-6.270239916630294, 0.7593145399841422, -3.6201258997795907),(-6.270239916630294, -0.7593145399841478, -3.6201258997795907),(-3.62012589977959, -0.7593145399841466, -6.270239916630294),(-3.620125899779591, 0.7593145399841434, -6.270239916630294),(-3.3720339408922273e-16, 0.759314539984145, -7.244192640355521),(3.3720339408922273e-16, -0.759314539984145, -7.244192640355521),(3.620125899779591, -0.7593145399841434, -6.270239916630294),(3.62012589977959, 0.7593145399841466, -6.270239916630294),(6.270239916630294, 0.7593145399841478, -3.6201258997795907),(6.270239916630294, -0.7593145399841422, -3.6201258997795907),(7.244192640355521, -0.7593145399841418, 0.0),(7.244192640355521, 0.7593145399841482, 0.0),(6.270239916630294, 0.7593145399841478, 3.6201258997795907),(6.270239916630294, -0.7593145399841422, 3.6201258997795907),(3.620125899779591, -0.7593145399841434, 6.270239916630294),(3.62012589977959, 0.7593145399841466, 6.270239916630294),(-3.3720339408922273e-16, 0.759314539984145, 7.244192640355521),(3.3720339408922273e-16, -0.759314539984145, 7.244192640355521),(-3.62012589977959, -0.7593145399841466, 6.270239916630294),(-3.620125899779591, 0.7593145399841434, 6.270239916630294),(-6.270239916630294, 0.7593145399841422, 3.6201258997795907),(-6.270239916630294, -0.7593145399841478, 3.6201258997795907),(-7.244192640355521, -0.7593145399841482, 0.0)])
        cmds.rename('neck_ctrl')
        cmds.group(n='neck_ctrl_grp')
        
        parentConForPos = [('neck_setup','neck_01_jnt'),('head_setup','head_jnt'),('neck_setup','neck_ctrl_grp'),('head_setup','head_ctrl_grp')]
        for each in parentConForPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)

        pointneckjnt = cmds.pointConstraint('neck_01_jnt','neck_02_jnt',mo = False)
        cmds.pointConstraint('head_setup','neck_02_jnt',mo = False)
        orientneckjnt = cmds.orientConstraint('neck_setup','neck_02_jnt',mo = False)
        cmds.delete(pointneckjnt)
        cmds.delete(orientneckjnt)
        
        toParent = [('neck_01_jnt','spine_03_bln_jnt'),('head_ctrl_grp','neck_ctrl')]
        for each in toParent:
            cmds.parent(each[0],each[1])
            
        cmds.parentConstraint('spine_03_bln_jnt','neck_ctrl_grp',mo=True)
        cmds.makeIdentity('neck_01_jnt', apply=True, rotate=True )

        toParentCon = [('neck_ctrl','neck_01_jnt'),('head_ctrl','head_jnt')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = False)

        cmds.shadingNode('multiplyDivide',n = 'neck_mult',asUtility=1)
        
        toSetAttr = [('neck_mult.operation'),('neck_mult.input2X')]
        for each in toSetAttr:
            cmds.setAttr(each,2)
        
        toConnectAttr = [('head_ctrl.rotateY','neck_mult.input1X'),('neck_mult.outputX','neck_02_jnt.rotateY')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
            
        toSetControllerAttr = [('neck_ctrl'),('head_ctrl')]
        for each in toSetControllerAttr:
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,17)
            
        # the command to change the progress bar
        cmds.progressBar('EugenesProgressBar', edit=True, step=1)
        
    neckSetup()
    def eyeAimSetup():
        cmds.curve(d=1,p=[(10, -4, 0),(10, 4, 0),(-10, 4, 0),(-10, -4, 0),(10, -4, 0)])
        cmds.rename('eye_aim_ctrl')
        cmds.group(n='eye_aim_ctrl_grp')
        forDel = cmds.pointConstraint('eye_aim_setup','eye_aim_ctrl_grp')
        cmds.delete(forDel)
        cmds.setAttr ('eye_aim_ctrl'+'.visibility',keyable = False, cb = False, lock = True)
        cmds.setAttr ('eye_aim_ctrl'+'.rotateX',keyable = False, cb = False, lock = True)
        cmds.setAttr ('eye_aim_ctrl'+'.rotateY',keyable = False, cb = False, lock = True)
        cmds.setAttr ('eye_aim_ctrl'+'.rotateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr ('eye_aim_ctrl'+'.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr ('eye_aim_ctrl'+'.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr ('eye_aim_ctrl'+'.scaleZ',keyable = False, cb = False, lock = True)
        cmds.setAttr ('eye_aim_ctrl'+'.overrideEnabled' ,True) 
        cmds.setAttr ('eye_aim_ctrl'+'.overrideColor' ,18)
        cmds.addAttr ('eye_aim_ctrl', at = 'enum', keyable=True, en = 'string1:string2:', ln='follow') 
        cmds.addAttr ('eye_aim_ctrl'+'.follow', e=True, en = 'world:head:')
        cmds.parentConstraint('head_ctrl','eye_aim_ctrl_grp',mo = True)
        cmds.connectAttr('eye_aim_ctrl.follow','eye_aim_ctrl_grp_parentConstraint1.head_ctrlW0')
        cmds.parent('eye_aim_ctrl_grp','world_ctrl')
        
    eyeAimSetup()
        
    def eyeSetup(side):
        list = [('%s_eye_aim_ctrl'%(side),'%s_eye_aim_ctrl_grp'%(side))]
        for each in list:
            cmds.curve(d=1,p=[(2.5, 0, 0),(2.5, 1, 0),(1, 2.5, 0),(-1, 2.5, 0),(-2.5, 1, 0),(-2.5, -1, 0),(-1, -2.5, 0),(1, -2.5, 0),(2.5, -1, 0),(2.5, 0, 0)])
            cmds.rename(each[0])
            cmds.group(n=each[1])
            cmds.setAttr (each[0]+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each[0]+'.rotateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each[0]+'.rotateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each[0]+'.rotateZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each[0]+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each[0]+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each[0]+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each[0]+'.overrideEnabled' ,True) 
            cmds.setAttr (each[0]+'.overrideColor' ,18)
            
        list = [('%s_eye_setup'%(side),'%s_eye_aim_ctrl_grp'%(side))]
        for each in list:
            forDel = cmds.pointConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        list = [('%s_eye_aim_ctrl_grp'%(side),'eye_aim_ctrl')]
        for each in list:
            cmds.parent(each[0],each[1])
        
        cmds.setAttr('%s_eye_aim_ctrl_grp.translateZ'%(side),0)
        cmds.joint(n='%s_eye_aim_jnt'%(side))
        cmds.parent(w = True)
        cmds.spaceLocator(n='%s_eye_aim_up_loc'%(side))
        cmds.group(n='%s_eye_aim_up_loc_grp'%(side))
        list = [('%s_eye_setup'%(side),'%s_eye_aim_jnt'%(side)),('%s_eye_setup'%(side),'%s_eye_aim_up_loc_grp'%(side))]
        for each in list:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
        cmds.setAttr('%s_eye_aim_up_loc.translateY'%(side),10)
        cmds.parentConstraint('head_ctrl','%s_eye_aim_up_loc_grp'%(side),mo = True)
        cmds.aimConstraint('%s_eye_aim_ctrl'%(side),'%s_eye_aim_jnt'%(side),wut = 'object',wuo = '%s_eye_aim_up_loc'%(side),mo = True)
        cmds.parent('%s_eye_aim_jnt'%(side),'head_jnt')
        
    eyeSetup('l')
    eyeSetup('r')
        
    def buildSpineSkinJoint():
        nameofJoint = [('spine_01_bind_jnt'),('spine_02_bind_jnt'),('spine_03_bind_jnt'),('neck_01_bind_jnt'),('neck_02_bind_jnt'),('head_bind_jnt'),('l_eye_aim_bind_jnt'),('r_eye_aim_bind_jnt')]
        for each in nameofJoint:
            cmds.joint(n=each)
        
        cmds.parent('r_eye_aim_bind_jnt','head_bind_jnt')
        
        #parentConSpineJointForPosition#
        parentConSpineJntForPos = [('spine_01_bln_jnt','spine_01_bind_jnt')],[('spine_02_bln_jnt','spine_02_bind_jnt')],[('spine_03_bln_jnt','spine_03_bind_jnt')],[('neck_01_jnt','neck_01_bind_jnt')],[('neck_02_jnt','neck_02_bind_jnt')],[('head_jnt','head_bind_jnt'),('l_eye_aim_jnt','l_eye_aim_bind_jnt'),('r_eye_aim_jnt','r_eye_aim_bind_jnt')]
        for each in parentConSpineJntForPos:
            for item in each:
                parentConSpineForDel = cmds.parentConstraint(item[0],item[1],mo = False)
                cmds.delete(parentConSpineForDel)
                cmds.makeIdentity( 'spine_01_bind_jnt', apply=True, translate=True, rotate=True )
        
        #parentRigJoint#
        parentSpineConJnt = [('spine_01_bln_jnt','spine_01_bind_jnt')],[('spine_02_bln_jnt','spine_02_bind_jnt')],[('spine_03_bln_jnt','spine_03_bind_jnt')],[('neck_01_jnt','neck_01_bind_jnt')],[('neck_02_jnt','neck_02_bind_jnt')],[('head_jnt','head_bind_jnt'),('l_eye_aim_jnt','l_eye_aim_bind_jnt'),('r_eye_aim_jnt','r_eye_aim_bind_jnt')]
        for each in parentSpineConJnt:
            for item in each:
                cmds.parentConstraint(item[0],item[1],mo = True)
                cmds.scaleConstraint(item[0],item[1],mo = True)
  
    buildSpineSkinJoint()
    
    def bendyArmSkinJnt():
        def buildLeftRightSkinJointArm(side):
            nameOfJnt = [('%s_shoulder_bind_jnt'%(side)),('%s_upper_arm_01_bind_jnt'%(side)),('%s_upper_arm_02_bind_jnt'%(side)),('%s_upper_arm_03_bind_jnt'%(side)),('%s_upper_arm_04_bind_jnt'%(side)),('%s_lower_arm_01_bind_jnt'%(side)),('%s_lower_arm_02_bind_jnt'%(side)),('%s_lower_arm_03_bind_jnt'%(side)),('%s_lower_arm_04_bind_jnt'%(side)),('%s_lower_arm_05_bind_jnt'%(side)),('%s_wrist_bind_jnt'%(side)),('%s_thumb_01_bind_jnt'%(side)),('%s_thumb_02_bind_jnt'%(side)),('%s_thumb_03_bind_jnt'%(side)),('%s_index_01_bind_jnt'%(side)),('%s_index_02_bind_jnt'%(side)),('%s_index_03_bind_jnt'%(side)),('%s_index_04_bind_jnt'%(side)),('%s_middle_01_bind_jnt'%(side)),('%s_middle_02_bind_jnt'%(side)),('%s_middle_03_bind_jnt'%(side)),('%s_middle_04_bind_jnt'%(side)),('%s_ring_01_bind_jnt'%(side)),('%s_ring_02_bind_jnt'%(side)),('%s_ring_03_bind_jnt'%(side)),('%s_ring_04_bind_jnt'%(side)),('%s_pinky_01_bind_jnt'%(side)),('%s_pinky_02_bind_jnt'%(side)),('%s_pinky_03_bind_jnt'%(side)),('%s_pinky_04_bind_jnt'%(side))]
            for each in nameOfJnt:
                cmds.joint(n=each)
                
            cmds.parent('%s_shoulder_bind_jnt'%(side),'spine_03_bind_jnt')
            cmds.parent('%s_index_01_bind_jnt'%(side),'%s_wrist_bind_jnt'%(side))
            cmds.parent('%s_middle_01_bind_jnt'%(side),'%s_wrist_bind_jnt'%(side))
            cmds.parent('%s_ring_01_bind_jnt'%(side),'%s_wrist_bind_jnt'%(side))
            cmds.parent('%s_pinky_01_bind_jnt'%(side),'%s_wrist_bind_jnt'%(side))
    
            #parentConJointForPosition#
            parentConlrJntForPos = [('%s_shoulder_jnt'%(side),'%s_shoulder_bind_jnt'%(side))],[('%s_upr_bendy_arm_01_jnt'%(side),'%s_upper_arm_01_bind_jnt'%(side))],[('%s_upr_bendy_arm_02_jnt'%(side),'%s_upper_arm_02_bind_jnt'%(side))],[('%s_upr_bendy_arm_03_jnt'%(side),'%s_upper_arm_03_bind_jnt'%(side))],[('%s_upr_bendy_arm_04_jnt'%(side),'%s_upper_arm_04_bind_jnt'%(side))],[('%s_lwr_bendy_arm_01_jnt'%(side),'%s_lower_arm_01_bind_jnt'%(side))],[('%s_lwr_bendy_arm_02_jnt'%(side),'%s_lower_arm_02_bind_jnt'%(side))],[('%s_lwr_bendy_arm_03_jnt'%(side),'%s_lower_arm_03_bind_jnt'%(side))],[('%s_lwr_bendy_arm_04_jnt'%(side),'%s_lower_arm_04_bind_jnt'%(side))],[('%s_lwr_bendy_arm_05_jnt'%(side),'%s_lower_arm_05_bind_jnt'%(side))],[('%s_arm_03_bln_jnt'%(side),'%s_wrist_bind_jnt'%(side))],[('%s_thumb_01_jnt'%(side),'%s_thumb_01_bind_jnt'%(side))],[('%s_thumb_02_jnt'%(side),'%s_thumb_02_bind_jnt'%(side))],[('%s_thumb_03_jnt'%(side),'%s_thumb_03_bind_jnt'%(side))],[('%s_index_01_jnt'%(side),'%s_index_01_bind_jnt'%(side))],[('%s_index_02_jnt'%(side),'%s_index_02_bind_jnt'%(side))],[('%s_index_03_jnt'%(side),'%s_index_03_bind_jnt'%(side))],[('%s_index_04_jnt'%(side),'%s_index_04_bind_jnt'%(side))],[('%s_middle_01_jnt'%(side),'%s_middle_01_bind_jnt'%(side))],[('%s_middle_02_jnt'%(side),'%s_middle_02_bind_jnt'%(side))],[('%s_middle_03_jnt'%(side),'%s_middle_03_bind_jnt'%(side))],[('%s_middle_04_jnt'%(side),'%s_middle_04_bind_jnt'%(side))],[('%s_ring_01_jnt'%(side),'%s_ring_01_bind_jnt'%(side))],[('%s_ring_02_jnt'%(side),'%s_ring_02_bind_jnt'%(side))],[('%s_ring_03_jnt'%(side),'%s_ring_03_bind_jnt'%(side))],[('%s_ring_04_jnt'%(side),'%s_ring_04_bind_jnt'%(side))],[('%s_pinky_01_jnt'%(side),'%s_pinky_01_bind_jnt'%(side))],[('%s_pinky_02_jnt'%(side),'%s_pinky_02_bind_jnt'%(side))],[('%s_pinky_03_jnt'%(side),'%s_pinky_03_bind_jnt'%(side))],[('%s_pinky_04_jnt'%(side),'%s_pinky_04_bind_jnt'%(side))]
        
            for each in parentConlrJntForPos:
                for item in each:
                    parentConForDel = cmds.parentConstraint(item[0],item[1],mo = False)
                    cmds.delete(parentConForDel)
            
            #freezeRigJoint#
            cmds.makeIdentity('%s_shoulder_bind_jnt'%(side),apply=True, translate=True, rotate=True)
            
            #parentRigJoint#
            parentlrConJnt = [('%s_shoulder_jnt'%(side),'%s_shoulder_bind_jnt'%(side))],[('%s_upr_bendy_arm_01_jnt'%(side),'%s_upper_arm_01_bind_jnt'%(side))],[('%s_upr_bendy_arm_02_jnt'%(side),'%s_upper_arm_02_bind_jnt'%(side))],[('%s_upr_bendy_arm_03_jnt'%(side),'%s_upper_arm_03_bind_jnt'%(side))],[('%s_upr_bendy_arm_04_jnt'%(side),'%s_upper_arm_04_bind_jnt'%(side))],[('%s_lwr_bendy_arm_01_jnt'%(side),'%s_lower_arm_01_bind_jnt'%(side))],[('%s_lwr_bendy_arm_02_jnt'%(side),'%s_lower_arm_02_bind_jnt'%(side))],[('%s_lwr_bendy_arm_03_jnt'%(side),'%s_lower_arm_03_bind_jnt'%(side))],[('%s_lwr_bendy_arm_04_jnt'%(side),'%s_lower_arm_04_bind_jnt'%(side))],[('%s_lwr_bendy_arm_05_jnt'%(side),'%s_lower_arm_05_bind_jnt'%(side))],[('%s_arm_03_bln_jnt'%(side),'%s_wrist_bind_jnt'%(side))],[('%s_thumb_01_jnt'%(side),'%s_thumb_01_bind_jnt'%(side))],[('%s_thumb_02_jnt'%(side),'%s_thumb_02_bind_jnt'%(side))],[('%s_thumb_03_jnt'%(side),'%s_thumb_03_bind_jnt'%(side))],[('%s_index_01_jnt'%(side),'%s_index_01_bind_jnt'%(side))],[('%s_index_02_jnt'%(side),'%s_index_02_bind_jnt'%(side))],[('%s_index_03_jnt'%(side),'%s_index_03_bind_jnt'%(side))],[('%s_index_04_jnt'%(side),'%s_index_04_bind_jnt'%(side))],[('%s_middle_01_jnt'%(side),'%s_middle_01_bind_jnt'%(side))],[('%s_middle_02_jnt'%(side),'%s_middle_02_bind_jnt'%(side))],[('%s_middle_03_jnt'%(side),'%s_middle_03_bind_jnt'%(side))],[('%s_middle_04_jnt'%(side),'%s_middle_04_bind_jnt'%(side))],[('%s_ring_01_jnt'%(side),'%s_ring_01_bind_jnt'%(side))],[('%s_ring_02_jnt'%(side),'%s_ring_02_bind_jnt'%(side))],[('%s_ring_03_jnt'%(side),'%s_ring_03_bind_jnt'%(side))],[('%s_ring_04_jnt'%(side),'%s_ring_04_bind_jnt'%(side))],[('%s_pinky_01_jnt'%(side),'%s_pinky_01_bind_jnt'%(side))],[('%s_pinky_02_jnt'%(side),'%s_pinky_02_bind_jnt'%(side))],[('%s_pinky_03_jnt'%(side),'%s_pinky_03_bind_jnt'%(side))],[('%s_pinky_04_jnt'%(side),'%s_pinky_04_bind_jnt'%(side))]
            for each in parentlrConJnt:
                for item in each:
                    cmds.parentConstraint(item[0],item[1],mo = True)
                    
            scalelrConJnt = [('world_ctrl','%s_shoulder_bind_jnt'%(side))],[('world_ctrl','%s_upper_arm_01_bind_jnt'%(side))],[('world_ctrl','%s_upper_arm_02_bind_jnt'%(side))],[('world_ctrl','%s_upper_arm_03_bind_jnt'%(side))],[('world_ctrl','%s_upper_arm_04_bind_jnt'%(side))],[('world_ctrl','%s_lower_arm_01_bind_jnt'%(side))],[('world_ctrl','%s_lower_arm_02_bind_jnt'%(side))],[('world_ctrl','%s_lower_arm_03_bind_jnt'%(side))],[('world_ctrl','%s_lower_arm_04_bind_jnt'%(side))],[('world_ctrl','%s_lower_arm_05_bind_jnt'%(side))],[('world_ctrl','%s_wrist_bind_jnt'%(side))],[('world_ctrl','%s_thumb_01_bind_jnt'%(side))],[('world_ctrl','%s_thumb_02_bind_jnt'%(side))],[('world_ctrl','%s_thumb_03_bind_jnt'%(side))],[('world_ctrl','%s_index_01_bind_jnt'%(side))],[('world_ctrl','%s_index_02_bind_jnt'%(side))],[('world_ctrl','%s_index_03_bind_jnt'%(side))],[('world_ctrl','%s_index_04_bind_jnt'%(side))],[('world_ctrl','%s_middle_01_bind_jnt'%(side))],[('world_ctrl','%s_middle_02_bind_jnt'%(side))],[('world_ctrl','%s_middle_03_bind_jnt'%(side))],[('world_ctrl','%s_middle_04_bind_jnt'%(side))],[('world_ctrl','%s_ring_01_bind_jnt'%(side))],[('world_ctrl','%s_ring_02_bind_jnt'%(side))],[('world_ctrl','%s_ring_03_bind_jnt'%(side))],[('world_ctrl','%s_ring_04_bind_jnt'%(side))],[('world_ctrl','%s_pinky_01_bind_jnt'%(side))],[('world_ctrl','%s_pinky_02_bind_jnt'%(side))],[('world_ctrl','%s_pinky_03_bind_jnt'%(side))],[('world_ctrl','%s_pinky_04_bind_jnt'%(side))]
            for each in scalelrConJnt:
                for item in each:
                    cmds.scaleConstraint(item[0],item[1],mo = True)
            
        buildLeftRightSkinJointArm('l')
        buildLeftRightSkinJointArm('r')
        
    def noBendyArmSkinJnt():
        def buildLeftRightSkinJointWithNoBendyArm(side):
            nameOfJnt = [('%s_shoulder_bind_jnt'%(side)),('%s_arm_01_bind_jnt'%(side)),('%s_arm_02_bind_jnt'%(side)),('%s_arm_03_bind_jnt'%(side)),('%s_thumb_01_bind_jnt'%(side)),('%s_thumb_02_bind_jnt'%(side)),('%s_thumb_03_bind_jnt'%(side)),('%s_index_01_bind_jnt'%(side)),('%s_index_02_bind_jnt'%(side)),('%s_index_03_bind_jnt'%(side)),('%s_index_04_bind_jnt'%(side)),('%s_middle_01_bind_jnt'%(side)),('%s_middle_02_bind_jnt'%(side)),('%s_middle_03_bind_jnt'%(side)),('%s_middle_04_bind_jnt'%(side)),('%s_ring_01_bind_jnt'%(side)),('%s_ring_02_bind_jnt'%(side)),('%s_ring_03_bind_jnt'%(side)),('%s_ring_04_bind_jnt'%(side)),('%s_pinky_01_bind_jnt'%(side)),('%s_pinky_02_bind_jnt'%(side)),('%s_pinky_03_bind_jnt'%(side)),('%s_pinky_04_bind_jnt'%(side))]
            for each in nameOfJnt:
                cmds.joint(n=each)
                
            cmds.parent('%s_shoulder_bind_jnt'%(side),'spine_03_bind_jnt')
            cmds.parent('%s_index_01_bind_jnt'%(side),'%s_arm_03_bind_jnt'%(side))
            cmds.parent('%s_middle_01_bind_jnt'%(side),'%s_arm_03_bind_jnt'%(side))
            cmds.parent('%s_ring_01_bind_jnt'%(side),'%s_arm_03_bind_jnt'%(side))
            cmds.parent('%s_pinky_01_bind_jnt'%(side),'%s_arm_03_bind_jnt'%(side))
    
            #parentConJointForPosition#
            parentConlrJntForPos = [('%s_shoulder_jnt'%(side),'%s_shoulder_bind_jnt'%(side))],[('%s_arm_01_bln_jnt'%(side),'%s_arm_01_bind_jnt'%(side))],[('%s_arm_02_bln_jnt'%(side),'%s_arm_02_bind_jnt'%(side))],[('%s_arm_03_bln_jnt'%(side),'%s_arm_03_bind_jnt'%(side))],[('%s_thumb_01_jnt'%(side),'%s_thumb_01_bind_jnt'%(side))],[('%s_thumb_02_jnt'%(side),'%s_thumb_02_bind_jnt'%(side))],[('%s_thumb_03_jnt'%(side),'%s_thumb_03_bind_jnt'%(side))],[('%s_index_01_jnt'%(side),'%s_index_01_bind_jnt'%(side))],[('%s_index_02_jnt'%(side),'%s_index_02_bind_jnt'%(side))],[('%s_index_03_jnt'%(side),'%s_index_03_bind_jnt'%(side))],[('%s_index_04_jnt'%(side),'%s_index_04_bind_jnt'%(side))],[('%s_middle_01_jnt'%(side),'%s_middle_01_bind_jnt'%(side))],[('%s_middle_02_jnt'%(side),'%s_middle_02_bind_jnt'%(side))],[('%s_middle_03_jnt'%(side),'%s_middle_03_bind_jnt'%(side))],[('%s_middle_04_jnt'%(side),'%s_middle_04_bind_jnt'%(side))],[('%s_ring_01_jnt'%(side),'%s_ring_01_bind_jnt'%(side))],[('%s_ring_02_jnt'%(side),'%s_ring_02_bind_jnt'%(side))],[('%s_ring_03_jnt'%(side),'%s_ring_03_bind_jnt'%(side))],[('%s_ring_04_jnt'%(side),'%s_ring_04_bind_jnt'%(side))],[('%s_pinky_01_jnt'%(side),'%s_pinky_01_bind_jnt'%(side))],[('%s_pinky_02_jnt'%(side),'%s_pinky_02_bind_jnt'%(side))],[('%s_pinky_03_jnt'%(side),'%s_pinky_03_bind_jnt'%(side))],[('%s_pinky_04_jnt'%(side),'%s_pinky_04_bind_jnt'%(side))]
        
            for each in parentConlrJntForPos:
                for item in each:
                    parentConForDel = cmds.parentConstraint(item[0],item[1],mo = False)
                    cmds.delete(parentConForDel)
            
            #freezeRigJoint#
            cmds.makeIdentity('%s_shoulder_bind_jnt'%(side),apply=True, translate=True, rotate=True)
            
            #parentRigJoint#
            parentlrConJnt = [('%s_shoulder_jnt'%(side),'%s_shoulder_bind_jnt'%(side))],[('%s_arm_01_bln_jnt'%(side),'%s_arm_01_bind_jnt'%(side))],[('%s_arm_02_bln_jnt'%(side),'%s_arm_02_bind_jnt'%(side))],[('%s_arm_03_bln_jnt'%(side),'%s_arm_03_bind_jnt'%(side))],[('%s_thumb_01_jnt'%(side),'%s_thumb_01_bind_jnt'%(side))],[('%s_thumb_02_jnt'%(side),'%s_thumb_02_bind_jnt'%(side))],[('%s_thumb_03_jnt'%(side),'%s_thumb_03_bind_jnt'%(side))],[('%s_index_01_jnt'%(side),'%s_index_01_bind_jnt'%(side))],[('%s_index_02_jnt'%(side),'%s_index_02_bind_jnt'%(side))],[('%s_index_03_jnt'%(side),'%s_index_03_bind_jnt'%(side))],[('%s_index_04_jnt'%(side),'%s_index_04_bind_jnt'%(side))],[('%s_middle_01_jnt'%(side),'%s_middle_01_bind_jnt'%(side))],[('%s_middle_02_jnt'%(side),'%s_middle_02_bind_jnt'%(side))],[('%s_middle_03_jnt'%(side),'%s_middle_03_bind_jnt'%(side))],[('%s_middle_04_jnt'%(side),'%s_middle_04_bind_jnt'%(side))],[('%s_ring_01_jnt'%(side),'%s_ring_01_bind_jnt'%(side))],[('%s_ring_02_jnt'%(side),'%s_ring_02_bind_jnt'%(side))],[('%s_ring_03_jnt'%(side),'%s_ring_03_bind_jnt'%(side))],[('%s_ring_04_jnt'%(side),'%s_ring_04_bind_jnt'%(side))],[('%s_pinky_01_jnt'%(side),'%s_pinky_01_bind_jnt'%(side))],[('%s_pinky_02_jnt'%(side),'%s_pinky_02_bind_jnt'%(side))],[('%s_pinky_03_jnt'%(side),'%s_pinky_03_bind_jnt'%(side))],[('%s_pinky_04_jnt'%(side),'%s_pinky_04_bind_jnt'%(side))]
        
            for each in parentlrConJnt:
                for item in each:
                    cmds.parentConstraint(item[0],item[1],mo = True)
                    
            scalelrConJnt = [('world_ctrl','%s_shoulder_bind_jnt'%(side))],[('world_ctrl','%s_arm_01_bind_jnt'%(side))],[('world_ctrl','%s_arm_02_bind_jnt'%(side))],[('world_ctrl','%s_arm_03_bind_jnt'%(side))],[('world_ctrl','%s_thumb_01_bind_jnt'%(side))],[('world_ctrl','%s_thumb_02_bind_jnt'%(side))],[('world_ctrl','%s_thumb_03_bind_jnt'%(side))],[('world_ctrl','%s_index_01_bind_jnt'%(side))],[('world_ctrl','%s_index_02_bind_jnt'%(side))],[('world_ctrl','%s_index_03_bind_jnt'%(side))],[('world_ctrl','%s_index_04_bind_jnt'%(side))],[('world_ctrl','%s_middle_01_bind_jnt'%(side))],[('world_ctrl','%s_middle_02_bind_jnt'%(side))],[('world_ctrl','%s_middle_03_bind_jnt'%(side))],[('world_ctrl','%s_middle_04_bind_jnt'%(side))],[('world_ctrl','%s_ring_01_bind_jnt'%(side))],[('world_ctrl','%s_ring_02_bind_jnt'%(side))],[('world_ctrl','%s_ring_03_bind_jnt'%(side))],[('world_ctrl','%s_ring_04_bind_jnt'%(side))],[('world_ctrl','%s_pinky_01_bind_jnt'%(side))],[('world_ctrl','%s_pinky_02_bind_jnt'%(side))],[('world_ctrl','%s_pinky_03_bind_jnt'%(side))],[('world_ctrl','%s_pinky_04_bind_jnt'%(side))]
            for each in scalelrConJnt:
                for item in each:
                    cmds.scaleConstraint(item[0],item[1],mo = True)
            
        buildLeftRightSkinJointWithNoBendyArm('l')
        buildLeftRightSkinJointWithNoBendyArm('r')
    
    bendyArmlabel = cmds.checkBox('bendyArm', q=1,label=1)
    bendyArmlabel = cmds.checkBox('bendyArm', q=1,v=1 )
    
    if bendyArmlabel == 1:
        print(bendyArmSkinJnt())
    elif bendyArmlabel == 0:
        print(noBendyArmSkinJnt())
    
    def bendyLegSkinJnt():
        def buildLeftRightLegSkinJoint(side):
            nameOfJnt = [('%s_upr_leg_01_bind_jnt'%(side)),('%s_upr_leg_02_bind_jnt'%(side)),('%s_upr_leg_03_bind_jnt'%(side)),('%s_upr_leg_04_bind_jnt'%(side)),('%s_lwr_leg_01_bind_jnt'%(side)),('%s_lwr_leg_02_bind_jnt'%(side)),('%s_lwr_leg_03_bind_jnt'%(side)),('%s_lwr_leg_04_bind_jnt'%(side)),('%s_ankle_bind_jnt'%(side)),('%s_leg_ball_bind_jnt'%(side))]
            for each in nameOfJnt:
                cmds.joint(n=each)
                
            cmds.parent('%s_upr_leg_01_bind_jnt'%(side),'spine_01_bind_jnt')
    
            #parentConJointForPosition#
            parentConlrJntForPos = [('%s_upr_bendy_leg_01_jnt'%(side),'%s_upr_leg_01_bind_jnt'%(side))],[('%s_upr_bendy_leg_02_jnt'%(side),'%s_upr_leg_02_bind_jnt'%(side))],[('%s_upr_bendy_leg_03_jnt'%(side),'%s_upr_leg_03_bind_jnt'%(side))],[('%s_upr_bendy_leg_04_jnt'%(side),'%s_upr_leg_04_bind_jnt'%(side))],[('%s_lwr_bendy_leg_01_jnt'%(side),'%s_lwr_leg_01_bind_jnt'%(side))],[('%s_lwr_bendy_leg_02_jnt'%(side),'%s_lwr_leg_02_bind_jnt'%(side))],[('%s_lwr_bendy_leg_03_jnt'%(side),'%s_lwr_leg_03_bind_jnt'%(side))],[('%s_lwr_bendy_leg_04_jnt'%(side),'%s_lwr_leg_04_bind_jnt'%(side))],[('%s_leg_03_bln_jnt'%(side),'%s_ankle_bind_jnt'%(side))],[('%s_leg_04_bln_jnt'%(side),'%s_leg_ball_bind_jnt'%(side))]
            for each in parentConlrJntForPos:
                for item in each:
                    parentConForDel = cmds.parentConstraint(item[0],item[1],mo = False)
                    cmds.delete(parentConForDel)
            
            #freezeRigJoint#
            cmds.makeIdentity('%s_upr_leg_01_bind_jnt'%(side),apply=True, translate=True, rotate=True)
            
            #parentRigJoint#
            parentlrConJnt = [('%s_upr_bendy_leg_01_jnt'%(side),'%s_upr_leg_01_bind_jnt'%(side))],[('%s_upr_bendy_leg_02_jnt'%(side),'%s_upr_leg_02_bind_jnt'%(side))],[('%s_upr_bendy_leg_03_jnt'%(side),'%s_upr_leg_03_bind_jnt'%(side))],[('%s_upr_bendy_leg_04_jnt'%(side),'%s_upr_leg_04_bind_jnt'%(side))],[('%s_lwr_bendy_leg_01_jnt'%(side),'%s_lwr_leg_01_bind_jnt'%(side))],[('%s_lwr_bendy_leg_02_jnt'%(side),'%s_lwr_leg_02_bind_jnt'%(side))],[('%s_lwr_bendy_leg_03_jnt'%(side),'%s_lwr_leg_03_bind_jnt'%(side))],[('%s_lwr_bendy_leg_04_jnt'%(side),'%s_lwr_leg_04_bind_jnt'%(side))],[('%s_leg_03_bln_jnt'%(side),'%s_ankle_bind_jnt'%(side))],[('%s_leg_04_bln_jnt'%(side),'%s_leg_ball_bind_jnt'%(side))]
            for each in parentlrConJnt:
                for item in each:
                    cmds.parentConstraint(item[0],item[1],mo = True)
                    
            parentlrConJnt = [('world_ctrl','%s_upr_leg_01_bind_jnt'%(side))],[('world_ctrl','%s_upr_leg_02_bind_jnt'%(side))],[('world_ctrl','%s_upr_leg_03_bind_jnt'%(side))],[('world_ctrl','%s_upr_leg_04_bind_jnt'%(side))],[('world_ctrl','%s_lwr_leg_01_bind_jnt'%(side))],[('world_ctrl','%s_lwr_leg_02_bind_jnt'%(side))],[('world_ctrl','%s_lwr_leg_03_bind_jnt'%(side))],[('world_ctrl','%s_lwr_leg_04_bind_jnt'%(side))],[('world_ctrl','%s_ankle_bind_jnt'%(side))],[('world_ctrl','%s_leg_ball_bind_jnt'%(side))]
            for each in parentlrConJnt:
                for item in each:
                    cmds.scaleConstraint(item[0],item[1],mo = True)
            
        buildLeftRightLegSkinJoint('l')
        buildLeftRightLegSkinJoint('r')
        
    def noBendyLegSkinJnt():
        def buildLeftRightSkinJointWithNoBendyLeg(side):
            nameOfJnt = [('%s_leg_01_bind_jnt'%(side)),('%s_leg_02_bind_jnt'%(side)),('%s_leg_03_bind_jnt'%(side)),('%s_leg_04_bind_jnt'%(side))]
            for each in nameOfJnt:
                cmds.joint(n=each)
                
            cmds.parent('%s_leg_01_bind_jnt'%(side),'spine_01_bind_jnt')
    
            #parentConJointForPosition#
            parentConlrJntForPos = [('%s_leg_01_bln_jnt'%(side),'%s_leg_01_bind_jnt'%(side))],[('%s_leg_02_bln_jnt'%(side),'%s_leg_02_bind_jnt'%(side))],[('%s_leg_03_bln_jnt'%(side),'%s_leg_03_bind_jnt'%(side))],[('%s_leg_04_bln_jnt'%(side),'%s_leg_04_bind_jnt'%(side))]
        
            for each in parentConlrJntForPos:
                for item in each:
                    parentConForDel = cmds.parentConstraint(item[0],item[1],mo = False)
                    cmds.delete(parentConForDel)
            
            #freezeRigJoint#
            cmds.makeIdentity('%s_leg_01_bind_jnt'%(side),apply=True, translate=True, rotate=True)
            
            #parentRigJoint#
            parentlrConJnt = [('%s_leg_01_bln_jnt'%(side),'%s_leg_01_bind_jnt'%(side))],[('%s_leg_02_bln_jnt'%(side),'%s_leg_02_bind_jnt'%(side))],[('%s_leg_03_bln_jnt'%(side),'%s_leg_03_bind_jnt'%(side))],[('%s_leg_04_bln_jnt'%(side),'%s_leg_04_bind_jnt'%(side))]
            for each in parentlrConJnt:
                for item in each:
                    cmds.parentConstraint(item[0],item[1],mo = True)
                    
            parentlrConJnt = [('world_ctrl','%s_leg_01_bind_jnt'%(side))],[('world_ctrl','%s_leg_02_bind_jnt'%(side))],[('world_ctrl','%s_leg_03_bind_jnt'%(side))],[('world_ctrl','%s_leg_04_bind_jnt'%(side))]
            for each in parentlrConJnt:
                for item in each:
                    cmds.scaleConstraint(item[0],item[1],mo = True)
            
        buildLeftRightSkinJointWithNoBendyLeg('l')
        buildLeftRightSkinJointWithNoBendyLeg('r')
    
    bendyLeglabel = cmds.checkBox('bendyLeg', q=1,label=1)
    bendyLeglabel = cmds.checkBox('bendyLeg', q=1,v=1 )
    
    if bendyLeglabel == 1:
        print(bendyLegSkinJnt())
    elif bendyLeglabel == 0:
        print(noBendyLegSkinJnt()) 

    def groupAll():
        createGroup = [('extra'),('rename'),('mesh_grp')]
        for each in createGroup:
            cmds.group(n=each,em=True)
        cmds.setAttr('extra.visibility',0)
        cmds.setAttr('world_setup.visibility',0)
        cmds.setAttr('jnt_grp.visibility',0)
            
        list = ['leg_bendy_setup_grp','l_upr_leg_bendy_jnt_grp','arm_bendy_setup_grp','r_upr_leg_bendy_jnt_grp','l_lwr_leg_bendy_jnt_grp','r_lwr_leg_bendy_jnt_grp','l_eye_aim_up_loc_grp','r_eye_aim_up_loc_grp']
        for each in list:
            if cmds.objExists(each):
                cmds.parent(each,'extra')
            else:
                print('') 
        
        parentgrp = [('arm_jnt_grp','jnt_grp'),('spine_jnt_grp','jnt_grp'),('leg_jnt_grp','jnt_grp'),('r_fk_arm_01_ctrl_grp','world_ctrl'),('l_fk_arm_01_ctrl_grp','world_ctrl'),('neck_ctrl_grp','world_ctrl'),('spine_01_FK_ctrl_grp','world_ctrl'),('cog_ctrl_grp','world_ctrl'),('world_setup','rename'),('main_ctrl_grp','rename'),('jnt_grp','rename'),('mesh_grp','rename'),('spine_01_bind_jnt','rename'),('extra','rename'),('spine_IK_setup_grp','extra'),('spine_IK_ctrl_grp','world_ctrl'),('l_elbow_direction_crv_grp','main_ctrl_grp'),('r_elbow_direction_crv_grp','main_ctrl_grp'),('l_knee_direction_crv_grp','main_ctrl_grp'),('r_knee_direction_crv_grp','main_ctrl_grp')]
        for each in parentgrp:
            cmds.parent(each[0],each[1])
        
        parentgroup = cmds.ls('l_elbow_loc_grp','l_upr_arm_bendy_jnt_grp','l_lwr_arm_bendy_jnt_grp','l_arm_start_dist_loc_grp','r_elbow_loc_grp','r_upr_arm_bendy_jnt_grp','r_lwr_arm_bendy_jnt_grp','r_arm_start_dist_loc_grp','l_knee_loc_grp','l_foot_ikHandle_grp','l_leg_start_dist_loc_grp','r_knee_loc_grp','r_foot_ikHandle_grp','r_leg_start_dist_loc_grp')
        
        for each in parentgroup:
            cmds.parent(each,'extra')
        
        # the command to change the progress bar
        cmds.progressBar('EugenesProgressBar', edit=True, step=1)
        
    groupAll()

    def progressBarWindowClose():
        # the command to close the progress bar
        cmds.deleteUI('EugenesProgress',window=True)
        
    progressBarWindowClose()

upper_lid_vertex_ids = []
lower_lid_vertex_ids = []
joint_prefix = "eyelid_joint"
center_locator = "eye_display_loc"

def create_display_eye():
    selected_objects = cmds.ls(selection=True)
    cmds.spaceLocator(n='eye_display_loc')
    cmds.polySphere(n='eye_display')
    cmds.parent('eye_display','eye_display_loc')
    
    list = [('eye_display' , '.scaleX'),('eye_display' , '.scaleY'),('eye_display' , '.scaleZ')]
    for each in list:
        cmds.setAttr(each[0] + each[1],0.75)
 
    cmds.spaceLocator(n='eye_aim_up_loc')
    cmds.parent('eye_aim_up_loc','eye_display_loc')
    cmds.setAttr('eye_aim_up_loc.translateY',2)
    cmds.setAttr('eye_aim_up_loc.visibility',0)
    obj_center = cmds.xform(selected_objects, query=True, translation=True, worldSpace=True)
    cmds.xform(selected_objects, translation=obj_center, worldSpace=True)
    
    locator_translation = cmds.xform('eye_display_loc', query=True, translation=True, worldSpace=True)
    if all(value == 0 for value in locator_translation):
        forDel = cmds.parentConstraint(selected_objects, 'eye_display_loc', mo=False)
        cmds.delete(forDel)
    list = [('eye_aim_up_loc.scaleZ'),('eye_aim_up_loc.scaleY'),('eye_aim_up_loc.scaleX'),('eye_aim_up_loc.rotateZ'),('eye_aim_up_loc.rotateY'),('eye_aim_up_loc.rotateX'),('eye_aim_up_loc.translateZ'),('eye_aim_up_loc.translateY'),('eye_aim_up_loc.translateX'),('eye_aim_up_loc.visibility'),('eye_display.visibility'),('eye_display.translateX'),('eye_display.translateY'),('eye_display.translateZ'),('eye_display.rotateX'),('eye_display.rotateY'),('eye_display.rotateZ'),('eye_display.scaleX'),('eye_display.scaleY'),('eye_display.scaleZ')]
    for each in list:
        cmds.setAttr(each,keyable = False, cb = False, lock = True)
        
def store_vertex_ids():
    global upper_lid_vertex_ids
    upper_lid_vertex_ids = cmds.ls(selection=True, flatten=True)
    #cmds.textScrollList(upperLidList, edit=True, removeAll=True)
    #cmds.textScrollList(upperLidList, edit=True, append=upper_lid_vertex_ids)
    edge_list = cmds.polyListComponentConversion(upper_lid_vertex_ids, fromVertex=True, toEdge=True)
    sel = cmds.select(edge_list)
    mel.eval('PolySelectTraverse 2;')
    curve = cmds.polyToCurve(form=2, degree=1, ch=0, n="upper_lid_crv")
    
def store_lower_vertex_ids():
    global lower_lid_vertex_ids
    lower_lid_vertex_ids = cmds.ls(selection=True, flatten=True)
    #cmds.textScrollList(lowerLidList, edit=True, removeAll=True)
    #cmds.textScrollList(lowerLidList, edit=True, append=lower_lid_vertex_ids)
    edge_list = cmds.polyListComponentConversion(lower_lid_vertex_ids, fromVertex=True, toEdge=True)
    sel = cmds.select(edge_list)
    mel.eval('PolySelectTraverse 2;')
    curve = cmds.polyToCurve(form=2, degree=1, ch=0, n="Lower_lid_crv")
    
def create_joints_and_parent_joints(*args):
    create_joints()
    create_parent_joints()
    
def create_joints(*args):
    global upper_lid_vertex_ids, lower_lid_vertex_ids, joint_prefix
    for i, vertex_id in enumerate(upper_lid_vertex_ids):
        pos = cmds.pointPosition(vertex_id, w=True)
        joint_name = "{0}_upper_{1}".format(joint_prefix, i+1)
        jntUpperLids = cmds.joint(p=pos, n=joint_name)
        loc = cmds.spaceLocator(n='upperLidLoc_1')
        pos = cmds.xform(jntUpperLids, q = True, ws = True, t = True)
        cmds.xform(loc, ws = True, t= pos)
        
    for i, vertex_id in enumerate(lower_lid_vertex_ids):
        pos = cmds.pointPosition(vertex_id, w=True)
        joint_name = "{0}_lower_{1}".format(joint_prefix, i+1)
        jntLowerLids = cmds.joint(p=pos, n=joint_name)
        loc = cmds.spaceLocator(n='lowerLidLoc_1')
        pos = cmds.xform(jntLowerLids, q = True, ws = True, t = True)
        cmds.xform(loc, ws = True, t= pos)

def create_parent_joints(*args):  
    eyelidcrvrev = cmds.checkBox('reversecrv', q=1,label=1)
    eyelidcrvrev = cmds.checkBox('reversecrv', q=1,v=1 )
    if eyelidcrvrev == 1:
        cmds.reverseCurve('Lower_lid_crv')
    global joint_prefix, center_locator
    center_loc_position = cmds.pointPosition(center_locator, w=True)
    for i in range(len(upper_lid_vertex_ids)):
        joint_name = "{0}_upper_{1}".format(joint_prefix, i+1)
        parent_joint_name = "{0}_upper_parent_{1}".format(joint_prefix, i+1)
        cmds.select(clear=True)
        jntUpperLid = cmds.joint(p=center_loc_position, n=parent_joint_name)
        cmds.parent(joint_name, parent_joint_name)
        cmds.joint(jntUpperLid, e = True, oj = 'xyz' , sao = 'yup', ch = 1 , zso = True)
        
    for i in range(len(lower_lid_vertex_ids)):
        joint_name = "{0}_lower_{1}".format(joint_prefix, i+1)
        parent_joint_name = "{0}_lower_parent_{1}".format(joint_prefix, i+1)
        cmds.select(clear=True)
        jntLowerLid = cmds.joint(p=center_loc_position, n=parent_joint_name)
        cmds.parent(joint_name, parent_joint_name)
        cmds.joint(jntLowerLid, e = True, oj = 'xyz' , sao = 'yup', ch = 1 , zso = True)
        
    old_upper_prefix = "Lower_lid_crv_jnt_upper_parent_"
    new_upper_prefix = "eyelid_joint_upper_parent_"

    for i in range(1, 1000):
        old_joint_name = f"{old_upper_prefix}{i}"
        new_joint_name = f"{new_upper_prefix}{i}"

        if cmds.objExists(old_joint_name):
            cmds.rename(old_joint_name, new_joint_name)
            
    old_lower_prefix = "Lower_lid_crv_jnt_lower_parent_"
    new_lower_prefix = "eyelid_joint_lower_parent_"

    for i in range(1, 1000):
        old_lower_joint_name = f"{old_lower_prefix}{i}"
        new_lower_joint_name = f"{new_lower_prefix}{i}"

        if cmds.objExists(old_lower_joint_name):
            cmds.rename(old_lower_joint_name, new_lower_joint_name)
            
    old_upper_child_prefix = "Lower_lid_crv_jnt_upper_"
    new_upper_child_prefix = "eyelid_joint_upper_"

    for i in range(1, 1000):
        old_upper_child_joint_name = f"{old_upper_child_prefix}{i}"
        new_upper_child_joint_name = f"{new_upper_child_prefix}{i}"

        if cmds.objExists(old_upper_child_joint_name):
            cmds.rename(old_upper_child_joint_name, new_upper_child_joint_name)
            
    old_lower_child_prefix = "Lower_lid_crv_jnt_lower_"
    new_lower_child_prefix = "eyelid_joint_lower_"

    for i in range(1, 1000):
        old_lower_child_joint_name = f"{old_lower_child_prefix}{i}"
        new_lower_child_joint_name = f"{new_lower_child_prefix}{i}"

        if cmds.objExists(old_lower_child_joint_name):
            cmds.rename(old_lower_child_joint_name, new_lower_child_joint_name)

    source_prefix = "eyelid_joint_upper_parent_"
    
    target_prefix = "upperLidLoc_"
    
    source_objects = cmds.ls(source_prefix + "*", type="transform")
    target_objects = cmds.ls(target_prefix + "*", type="transform")
list = [('%s_arm_01_length_jnt.worldMatrix'%(side),'%s_upr_arm_dist.inMatrix1'%(side)),('%s_arm_02_length_jnt.worldMatrix'%(side),'%s_upr_arm_dist.inMatrix2'%(side)),('%s_arm_02_length_jnt.worldMatrix'%(side),'%s_lwr_arm_dist.inMatrix1'%(side)),('%s_arm_03_length_jnt.worldMatrix'%(side),'%s_lwr_arm_dist.inMatrix2'%(side)),('%s_upr_arm_dist.distance'%(side),'%s_arm_full_dist.input1'%(side)),('%s_lwr_arm_dist.distance'%(side),'%s_arm_full_dist.input2'%(side)),('%s_arm_start_dist_loc.worldMatrix'%(side),'%s_arm_stretch_dist.inMatrix1'%(side)),('%s_arm_end_dist_loc.worldMatrix'%(side),'%s_arm_stretch_dist.inMatrix2'%(side)),('%s_arm_stretch_dist.distance'%(side),'%s_arm_stretch_cond.firstTerm'%(side)),('%s_arm_full_dist.output'%(side),'%s_arm_stretch_cond.secondTerm'%(side)),('%s_arm_stretch_dist.distance'%(side),'%s_arm_stretch_mult.input1X'%(side)),('%s_arm_full_dist.output'%(side),'%s_arm_stretch_mult.input2X'%(side)),('%s_arm_stretch_mult.outputX'%(side),'%s_arm_stretch_cond.colorIfTrue.colorIfTrueR'%(side)),('%s_arm_stretch_cond.outColor.outColorR'%(side),'%s_lwr_arm_strecth_mult.input1X'%(side)),('%s_arm_stretch_cond.outColor.outColorR'%(side),'%s_upr_arm_strecth_mult.input1X'%(side)),('%s_arm_02_setup.translateX'%(side),'%s_upr_arm_strecth_mult.input2X'%(side)),('%s_arm_03_setup.translateX'%(side),'%s_lwr_arm_strecth_mult.input2X'%(side)),('%s_upr_arm_strecth_mult.outputX'%(side),'%s_ik_02_jnt.translateX'%(side)),('%s_lwr_arm_strecth_mult.outputX'%(side),'%s_ik_03_jnt.translateX'%(side)),('%s_ik_arm_ctrl.stretch'%(side),'%s_arm_strecth_option_mult.input1X'%(side)),('%s_arm_strecth_option_mult.outputX'%(side),'%s_arm_stretch_cond.operation'%(side))]
            for each in list:
                cmds.connectAttr(each[0],each[1])
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
            
        ArmStretchSetup('l')
        ArmStretchSetup('r')
        
        def armGroup():
            list = ['l_arm_jnt_grp','r_arm_jnt_grp','arm_jnt_grp']
            for each in list:
                cmds.group(n=each,em=True)
            
            list = [('r_shoulder_jnt','r_arm_jnt_grp'),('l_shoulder_jnt','l_arm_jnt_grp'),('l_fk_arm_01_jnt','l_arm_jnt_grp'),('r_fk_arm_01_jnt','r_arm_jnt_grp'),('l_ik_arm_jnt_grp','l_arm_jnt_grp'),('r_ik_arm_jnt_grp','r_arm_jnt_grp'),('l_arm_bln_jnt_grp','l_arm_jnt_grp'),('r_arm_bln_jnt_grp','r_arm_jnt_grp'),('l_arm_length_jnt_grp','l_arm_jnt_grp'),('r_arm_length_jnt_grp','r_arm_jnt_grp'),('l_arm_jnt_grp','arm_jnt_grp'),('r_arm_jnt_grp','arm_jnt_grp')]
            for each in list:
                cmds.parent(each[0],each[1])
        
        armGroup()
                
    bendyArmlabel = cmds.checkBox('bendyArm', q=1,label=1)
    bendyArmlabel = cmds.checkBox('bendyArm', q=1,v=1 )
    
    if bendyArmlabel == 1:
        print(buildBendyArm())
    elif bendyArmlabel == 0:
        print(noBendyArm())
    
    def FingersSetup(side):
        nameOfFingersCtrl = [('%s_thumb_01_ctrl'%(side),'%s_thumb_01_ctrl_SDK_grp'%(side),'%s_thumb_01_ctrl_grp'%(side)),('%s_thumb_02_ctrl'%(side),'%s_thumb_02_ctrl_SDK_grp'%(side),'%s_thumb_02_ctrl_grp'%(side)),('%s_thumb_03_ctrl'%(side),'%s_thumb_03_ctrl_SDK_grp'%(side),'%s_thumb_03_ctrl_grp'%(side)),('%s_index_01_ctrl'%(side),'%s_index_01_ctrl_SDK_grp'%(side),'%s_index_01_ctrl_grp'%(side)),('%s_index_02_ctrl'%(side),'%s_index_02_ctrl_SDK_grp'%(side),'%s_index_02_ctrl_grp'%(side)),('%s_index_03_ctrl'%(side),'%s_index_03_ctrl_SDK_grp'%(side),'%s_index_03_ctrl_grp'%(side)),('%s_index_04_ctrl'%(side),'%s_index_04_ctrl_SDK_grp'%(side),'%s_index_04_ctrl_grp'%(side)),('%s_middle_01_ctrl'%(side),'%s_middle_01_ctrl_SDK_grp'%(side),'%s_middle_01_ctrl_grp'%(side)),('%s_middle_02_ctrl'%(side),'%s_middle_02_ctrl_SDK_grp'%(side),'%s_middle_02_ctrl_grp'%(side)),('%s_middle_03_ctrl'%(side),'%s_middle_03_ctrl_SDK_grp'%(side),'%s_middle_03_ctrl_grp'%(side)),('%s_middle_04_ctrl'%(side),'%s_middle_04_ctrl_SDK_grp'%(side),'%s_middle_04_ctrl_grp'%(side)),('%s_ring_01_ctrl'%(side),'%s_ring_01_ctrl_SDK_grp'%(side),'%s_ring_01_ctrl_grp'%(side)),('%s_ring_02_ctrl'%(side),'%s_ring_02_ctrl_SDK_grp'%(side),'%s_ring_02_ctrl_grp'%(side)),('%s_ring_03_ctrl'%(side),'%s_ring_03_ctrl_SDK_grp'%(side),'%s_ring_03_ctrl_grp'%(side)),('%s_ring_04_ctrl'%(side),'%s_ring_04_ctrl_SDK_grp'%(side),'%s_ring_04_ctrl_grp'%(side)),('%s_pinky_01_ctrl'%(side),'%s_pinky_01_ctrl_SDK_grp'%(side),'%s_pinky_01_ctrl_grp'%(side)),('%s_pinky_02_ctrl'%(side),'%s_pinky_02_ctrl_SDK_grp'%(side),'%s_pinky_02_ctrl_grp'%(side)),('%s_pinky_03_ctrl'%(side),'%s_pinky_03_ctrl_SDK_grp'%(side),'%s_pinky_03_ctrl_grp'%(side)),('%s_pinky_04_ctrl'%(side),'%s_pinky_04_ctrl_SDK_grp'%(side),'%s_pinky_04_ctrl_grp'%(side))]
        for each in nameOfFingersCtrl:
            ctrl = cmds.curve(p=[(0.0, 0.2933861509942573, -1.0949320217706984), (0.0, 0.2553661889653451, -0.9530395916863047), (0.0, -0.2553664856172229, -0.9530403074142204), (0.0, -0.29334365303393356, -1.094772361168278), (0.0, -0.8014288496022626, -0.801429236145214), (0.0, -0.6976738742806887, -0.6976740175622989), (0.0, -0.9530395916863047, -0.2553661889653451), (0.0, -1.0949320217706984, -0.2933861509942573), (0.0, -1.094772361168278, 0.29334365303393356), (0.0, -0.9530403074142204, 0.2553664856172229), (0.0, -0.6976740175622989, 0.6976738742806887), (0.0, -0.801429236145214, 0.8014288496022626), (0.0, -0.2933861509942573, 1.0949320217706984), (0.0, -0.2553661889653451, 0.9530395916863047), (0.0, 0.2553664856172229, 0.9530403074142204), (0.0, 0.29334365303393356, 1.094772361168278), (0.0, 0.8014288496022626, 0.801429236145214), (0.0, 0.6976738742806887, 0.6976740175622989), (0.0, 0.9530395916863047, 0.2553661889653451), (0.0, 1.0949320217706984, 0.2933861509942573), (0.0, 1.094772361168278, -0.29334365303393356), (0.0, 0.9530403074142204, -0.2553664856172229), (0.0, 0.6976740175622989, -0.6976738742806887), (0.0, 0.801429236145214, -0.8014288496022626), (0.0, 0.2933861509942573, -1.0949320217706984)], d=1, k=[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0, 23.0, 24.0],per=False)
            cmds.rename(each[0])
            cmds.group(n=each[1])
            cmds.group(n=each[2])
            
        nameOfFingersJnt = ['%s_thumb_01_jnt'%(side),'%s_thumb_02_jnt'%(side),'%s_thumb_03_jnt'%(side),'%s_index_01_jnt'%(side),'%s_index_02_jnt'%(side),'%s_index_03_jnt'%(side),'%s_index_04_jnt'%(side),'%s_middle_01_jnt'%(side),'%s_middle_02_jnt'%(side),'%s_middle_03_jnt'%(side),'%s_middle_04_jnt'%(side),'%s_ring_01_jnt'%(side),'%s_ring_02_jnt'%(side),'%s_ring_03_jnt'%(side),'%s_ring_04_jnt'%(side),'%s_pinky_01_jnt'%(side),'%s_pinky_02_jnt'%(side),'%s_pinky_03_jnt'%(side),'%s_pinky_04_jnt'%(side)]
        for each in nameOfFingersJnt:
            cmds.joint(n=each)
        
        listToGetPos = [('%s_thumb_01_setup'%(side),'%s_thumb_01_ctrl_grp'%(side)),('%s_thumb_02_setup'%(side),'%s_thumb_02_ctrl_grp'%(side)),('%s_thumb_03_setup'%(side),'%s_thumb_03_ctrl_grp'%(side)),('%s_index_01_setup'%(side),'%s_index_01_ctrl_grp'%(side)),('%s_index_02_setup'%(side),'%s_index_02_ctrl_grp'%(side)),('%s_index_03_setup'%(side),'%s_index_03_ctrl_grp'%(side)),('%s_index_04_setup'%(side),'%s_index_04_ctrl_grp'%(side)),('%s_middle_01_setup'%(side),'%s_middle_01_ctrl_grp'%(side)),('%s_middle_02_setup'%(side),'%s_middle_02_ctrl_grp'%(side)),('%s_middle_03_setup'%(side),'%s_middle_03_ctrl_grp'%(side)),('%s_middle_04_setup'%(side),'%s_middle_04_ctrl_grp'%(side)),('%s_ring_01_setup'%(side),'%s_ring_01_ctrl_grp'%(side)),('%s_ring_02_setup'%(side),'%s_ring_02_ctrl_grp'%(side)),('%s_ring_03_setup'%(side),'%s_ring_03_ctrl_grp'%(side)),('%s_ring_04_setup'%(side),'%s_ring_04_ctrl_grp'%(side)),('%s_pinky_01_setup'%(side),'%s_pinky_01_ctrl_grp'%(side)),('%s_pinky_02_setup'%(side),'%s_pinky_02_ctrl_grp'%(side)),('%s_pinky_03_setup'%(side),'%s_pinky_03_ctrl_grp'%(side)),('%s_pinky_04_setup'%(side),'%s_pinky_04_ctrl_grp'%(side)),('%s_thumb_01_setup'%(side),'%s_thumb_01_jnt'%(side)),('%s_thumb_02_setup'%(side),'%s_thumb_02_jnt'%(side)),('%s_thumb_03_setup'%(side),'%s_thumb_03_jnt'%(side)),('%s_index_01_setup'%(side),'%s_index_01_jnt'%(side)),('%s_index_02_setup'%(side),'%s_index_02_jnt'%(side)),('%s_index_03_setup'%(side),'%s_index_03_jnt'%(side)),('%s_index_04_setup'%(side),'%s_index_04_jnt'%(side)),('%s_middle_01_setup'%(side),'%s_middle_01_jnt'%(side)),('%s_middle_02_setup'%(side),'%s_middle_02_jnt'%(side)),('%s_middle_03_setup'%(side),'%s_middle_03_jnt'%(side)),('%s_middle_04_setup'%(side),'%s_middle_04_jnt'%(side)),('%s_ring_01_setup'%(side),'%s_ring_01_jnt'%(side)),('%s_ring_02_setup'%(side),'%s_ring_02_jnt'%(side)),('%s_ring_03_setup'%(side),'%s_ring_03_jnt'%(side)),('%s_ring_04_setup'%(side),'%s_ring_04_jnt'%(side)),('%s_pinky_01_setup'%(side),'%s_pinky_01_jnt'%(side)),('%s_pinky_02_setup'%(side),'%s_pinky_02_jnt'%(side)),('%s_pinky_03_setup'%(side),'%s_pinky_03_jnt'%(side)),('%s_pinky_04_setup'%(side),'%s_pinky_04_jnt'%(side))]
        for each in listToGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        list = [('multiplyDivide','%s_thumb_mult'%(side)),('multiplyDivide','%s_index_mult'%(side)),('multiplyDivide','%s_middle_mult'%(side)),('multiplyDivide','%s_ring_mult'%(side)),('multiplyDivide','%s_pinky_mult'%(side))]
        for each in list:
            cmds.shadingNode(each[0],n=each[1],asUtility=1)
            
        list = [('%s_thumb_mult.input2X'%(side),10),('%s_index_mult.input2X'%(side),10),('%s_middle_mult.input2X'%(side),10),('%s_ring_mult.input2X'%(side),10),('%s_pinky_mult.input2X'%(side),10)]
        for each in list:
            cmds.setAttr(each[0],each[1])
            
        list = [('%s_ik_fk_switch.thumbCurl'%(side),'%s_thumb_mult.input1X'%(side)),('%s_thumb_mult.outputX'%(side),'%s_thumb_02_ctrl_SDK_grp.rotateZ'%(side)),('%s_thumb_mult.outputX'%(side),'%s_thumb_03_ctrl_SDK_grp.rotateZ'%(side)),('%s_ik_fk_switch.indexCurl'%(side),'%s_index_mult.input1X'%(side)),('%s_index_mult.outputX'%(side),'%s_index_02_ctrl_SDK_grp.rotateZ'%(side)),('%s_index_mult.outputX'%(side),'%s_index_03_ctrl_SDK_grp.rotateZ'%(side)),('%s_index_mult.outputX'%(side),'%s_index_04_ctrl_SDK_grp.rotateZ'%(side)),('%s_ik_fk_switch.middleCurl'%(side),'%s_middle_mult.input1X'%(side)),('%s_middle_mult.outputX'%(side),'%s_middle_02_ctrl_SDK_grp.rotateZ'%(side)),('%s_middle_mult.outputX'%(side),'%s_middle_03_ctrl_SDK_grp.rotateZ'%(side)),('%s_middle_mult.outputX'%(side),'%s_middle_04_ctrl_SDK_grp.rotateZ'%(side)),('%s_ik_fk_switch.ringCurl'%(side),'%s_ring_mult.input1X'%(side)),('%s_ring_mult.outputX'%(side),'%s_ring_02_ctrl_SDK_grp.rotateZ'%(side)),('%s_ring_mult.outputX'%(side),'%s_ring_03_ctrl_SDK_grp.rotateZ'%(side)),('%s_ring_mult.outputX'%(side),'%s_ring_04_ctrl_SDK_grp.rotateZ'%(side)),('%s_ik_fk_switch.pinkyCurl'%(side),'%s_pinky_mult.input1X'%(side)),('%s_pinky_mult.outputX'%(side),'%s_pinky_02_ctrl_SDK_grp.rotateZ'%(side)),('%s_pinky_mult.outputX'%(side),'%s_pinky_03_ctrl_SDK_grp.rotateZ'%(side)),('%s_pinky_mult.outputX'%(side),'%s_pinky_04_ctrl_SDK_grp.rotateZ'%(side))]
        for each in list:
            cmds.connectAttr(each[0],each[1])
            
        cmds.group(n='%s_fingers_jnt_grp'%(side),em = True)
        cmds.group(n='%s_fingers_ctrl_grp'%(side),em = True)
        cmds.parentConstraint('%s_arm_03_bln_jnt'%(side),'%s_fingers_ctrl_grp'%(side))
        
        toParent = [('%s_thumb_01_ctrl_grp'%(side),'%s_fingers_ctrl_grp'%(side)),('%s_fingers_ctrl_grp'%(side),'world_ctrl'),('%s_thumb_02_ctrl_grp'%(side),'%s_thumb_01_ctrl'%(side)),('%s_index_01_ctrl_grp'%(side),'%s_fingers_ctrl_grp'%(side)),('%s_index_02_ctrl_grp'%(side),'%s_index_01_ctrl'%(side)),('%s_index_03_ctrl_grp'%(side),'%s_index_02_ctrl'%(side)),('%s_index_04_ctrl_grp'%(side),'%s_index_03_ctrl'%(side)),('%s_thumb_03_ctrl_grp'%(side),'%s_thumb_02_ctrl'%(side)),('%s_middle_01_ctrl_grp'%(side), '%s_fingers_ctrl_grp'%(side)),('%s_middle_02_ctrl_grp'%(side), '%s_middle_01_ctrl'%(side)),('%s_middle_03_ctrl_grp'%(side), '%s_middle_02_ctrl'%(side)),('%s_middle_04_ctrl_grp'%(side), '%s_middle_03_ctrl'%(side)),('%s_ring_01_ctrl_grp'%(side), '%s_fingers_ctrl_grp'%(side)),('%s_ring_02_ctrl_grp'%(side), '%s_ring_01_ctrl'%(side)),('%s_ring_03_ctrl_grp'%(side), '%s_ring_02_ctrl'%(side)),('%s_ring_04_ctrl_grp'%(side), '%s_ring_03_ctrl'%(side)),('%s_pinky_01_ctrl_grp'%(side), '%s_fingers_ctrl_grp'%(side)),('%s_pinky_02_ctrl_grp'%(side), '%s_pinky_01_ctrl'%(side)),('%s_pinky_03_ctrl_grp'%(side), '%s_pinky_02_ctrl'%(side)),('%s_pinky_04_ctrl_grp'%(side), '%s_pinky_03_ctrl'%(side)),('%s_thumb_01_jnt'%(side), '%s_fingers_jnt_grp'%(side)),('%s_index_01_jnt'%(side), '%s_fingers_jnt_grp'%(side)),('%s_middle_01_jnt'%(side), '%s_fingers_jnt_grp'%(side)),('%s_ring_01_jnt'%(side), '%s_fingers_jnt_grp'%(side)),('%s_pinky_01_jnt'%(side), '%s_fingers_jnt_grp'%(side)),('%s_fingers_jnt_grp'%(side),'%s_arm_jnt_grp'%(side))]
        for each in toParent:
            cmds.parent(each[0],each[1])
        cmds.makeIdentity('%s_thumb_01_jnt'%(side),'%s_index_01_jnt'%(side),'%s_middle_01_jnt'%(side),'%s_ring_01_jnt'%(side),'%s_pinky_01_jnt'%(side),apply=True,rotate=True)
        
        list = [('%s_thumb_01_ctrl'%(side),'%s_thumb_01_jnt'%(side)),('%s_thumb_02_ctrl'%(side),'%s_thumb_02_jnt'%(side)),('%s_thumb_03_ctrl'%(side),'%s_thumb_03_jnt'%(side)),('%s_index_01_ctrl'%(side),'%s_index_01_jnt'%(side)),('%s_index_02_ctrl'%(side),'%s_index_02_jnt'%(side)),('%s_index_03_ctrl'%(side),'%s_index_03_jnt'%(side)),('%s_index_04_ctrl'%(side),'%s_index_04_jnt'%(side)),('%s_middle_01_ctrl'%(side),'%s_middle_01_jnt'%(side)),('%s_middle_02_ctrl'%(side),'%s_middle_02_jnt'%(side)),('%s_middle_03_ctrl'%(side),'%s_middle_03_jnt'%(side)),('%s_middle_04_ctrl'%(side),'%s_middle_04_jnt'%(side)),('%s_ring_01_ctrl'%(side),'%s_ring_01_jnt'%(side)),('%s_ring_02_ctrl'%(side),'%s_ring_02_jnt'%(side)),('%s_ring_03_ctrl'%(side),'%s_ring_03_jnt'%(side)),('%s_ring_04_ctrl'%(side),'%s_ring_04_jnt'%(side)),('%s_pinky_01_ctrl'%(side),'%s_pinky_01_jnt'%(side)),('%s_pinky_02_ctrl'%(side),'%s_pinky_02_jnt'%(side)),('%s_pinky_03_ctrl'%(side),'%s_pinky_03_jnt'%(side)),('%s_pinky_04_ctrl'%(side),'%s_pinky_04_jnt'%(side))]
        for each in list:
            cmds.parentConstraint(each[0],each[1],mo=True)
        
        toSetAttr = [('%s_thumb_01_ctrl'%(side)),('%s_thumb_02_ctrl'%(side)),('%s_thumb_03_ctrl'%(side)),('%s_index_01_ctrl'%(side)),('%s_index_02_ctrl'%(side)),('%s_index_03_ctrl'%(side)),('%s_index_04_ctrl'%(side)),('%s_middle_01_ctrl'%(side)),('%s_middle_02_ctrl'%(side)),('%s_middle_03_ctrl'%(side)),('%s_middle_04_ctrl'%(side)),('%s_ring_01_ctrl'%(side)),('%s_ring_02_ctrl'%(side)),('%s_ring_03_ctrl'%(side)),('%s_ring_04_ctrl'%(side)),('%s_pinky_01_ctrl'%(side)),('%s_pinky_02_ctrl'%(side)),('%s_pinky_03_ctrl'%(side)),('%s_pinky_04_ctrl'%(side))]
        for each in toSetAttr:
            cmds.setAttr (each +'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each +'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each +'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each +'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each + '.overrideEnabled' ,True) 
            cmds.setAttr (each + '.overrideColor' ,6)
  
        # the command to change the progress bar
        cmds.progressBar('EugenesProgressBar', edit=True, step=1)
        
    FingersSetup('l')
    FingersSetup('r')
    
    def buildBendyLeg():
        def FKlegSetup(side):
            nameOfFKlegController = [('%s_fk_leg_01_ctrl'%(side),'%s_fk_leg_01_ctrl_grp'%(side)),('%s_fk_leg_02_ctrl'%(side),'%s_fk_leg_02_ctrl_grp'%(side)),('%s_fk_leg_03_ctrl'%(side),'%s_fk_leg_03_ctrl_grp'%(side)),('%s_fk_leg_04_ctrl'%(side),'%s_fk_leg_04_ctrl_grp'%(side))]
            for each in nameOfFKlegController:
                cmds.curve(d=1,p=[(0.0, 1.8457071003629746, -6.888272674590291),(0.0, 1.6065215981349992, -5.995620227271308),(0.0, -1.6065234643869502, -5.995624729951774),(0.0, -1.8454397435472047, -6.8872682416730004),(0.0, -5.041829388107622, -5.041831819868864),(0.0, -4.389101595742385, -4.389102497134237),(0.0, -5.995620227271308, -1.6065215981349992),(0.0, -6.888272674590291, -1.8457071003629746),(0.0, -6.8872682416730004, 1.8454397435472047),(0.0, -5.995624729951774, 1.6065234643869502),(0.0, -4.389102497134237, 4.389101595742385),(0.0, -5.041831819868864, 5.041829388107622),(0.0, -1.8457071003629746, 6.888272674590291),(0.0, -1.6065215981349992, 5.995620227271308),(0.0, 1.6065234643869502, 5.995624729951774),(0.0, 1.8454397435472047, 6.8872682416730004),(0.0, 5.041829388107622, 5.041831819868864),(0.0, 4.389101595742385, 4.389102497134237),(0.0, 5.995620227271308, 1.6065215981349992),(0.0, 6.888272674590291, 1.8457071003629746),(0.0, 6.8872682416730004, -1.8454397435472047),(0.0, 5.995624729951774, -1.6065234643869502),(0.0, 4.389102497134237, -4.389101595742385),(0.0, 5.041831819868864, -5.041829388107622),(0.0, 1.8457071003629746, -6.888272674590291)])
                cmds.rename(each[0])
                cmds.group(n=each[1])
   
            createJoint = ['%s_fk_leg_01_jnt'%(side),'%s_fk_leg_02_jnt'%(side),'%s_fk_leg_03_jnt'%(side),'%s_fk_leg_04_jnt'%(side)]
            for each in createJoint:
                cmds.joint(n=each)

            toGetFKlegPos = [('%s_leg_01_setup'%(side),'%s_fk_leg_01_ctrl_grp'%(side)),('%s_leg_02_setup'%(side),'%s_fk_leg_02_ctrl_grp'%(side)),('%s_leg_03_setup'%(side),'%s_fk_leg_03_ctrl_grp'%(side)),('%s_leg_04_setup'%(side),'%s_fk_leg_04_ctrl_grp'%(side)),('%s_leg_01_setup'%(side),'%s_fk_leg_01_jnt'%(side)),('%s_leg_02_setup'%(side),'%s_fk_leg_02_jnt'%(side)),('%s_leg_03_setup'%(side),'%s_fk_leg_03_jnt'%(side)),('%s_leg_04_setup'%(side),'%s_fk_leg_04_jnt'%(side))]
            for each in toGetFKlegPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            cmds.makeIdentity('%s_fk_leg_01_jnt'%(side),apply=True,rotate=True)
            
            toParentCon = [('%s_fk_leg_01_ctrl'%(side),'%s_fk_leg_01_jnt'%(side)),('%s_fk_leg_02_ctrl'%(side),'%s_fk_leg_02_jnt'%(side)),('%s_fk_leg_03_ctrl'%(side),'%s_fk_leg_03_jnt'%(side)),('%s_fk_leg_04_ctrl'%(side),'%s_fk_leg_04_jnt'%(side)),('spine_01_bln_jnt','%s_fk_leg_01_ctrl_grp'%(side))]
            for each in toParentCon:
                cmds.parentConstraint(each[0],each[1],mo=True)
            
            toParent = [('%s_fk_leg_01_ctrl_grp'%(side),'world_ctrl'),('%s_fk_leg_02_ctrl_grp'%(side),'%s_fk_leg_01_ctrl'%(side)),('%s_fk_leg_03_ctrl_grp'%(side), '%s_fk_leg_02_ctrl'%(side)),('%s_fk_leg_04_ctrl_grp'%(side),'%s_fk_leg_03_ctrl'%(side))]
            for each in toParent:
                cmds.parent(each[0],each[1])
                
            toSetAttr = [('%s_fk_leg_01_ctrl'%(side)),('%s_fk_leg_02_ctrl'%(side)),('%s_fk_leg_03_ctrl'%(side)),('%s_fk_leg_04_ctrl'%(side))]  
            for each in toSetAttr:
                cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.overrideEnabled' ,True) 
                cmds.setAttr (each+'.overrideColor' ,6)
            
        FKlegSetup('l')
        FKlegSetup('r')
            
        def IKlegSetup(side):
            list = ['%s_ik_leg_01_jnt'%(side),'%s_ik_leg_02_jnt'%(side),'%s_ik_leg_03_jnt'%(side),'%s_ik_leg_04_jnt'%(side),'%s_ik_leg_05_jnt'%(side)]
            for each in list:
                cmds.joint(n=each)
                
            list = [('%s_leg_01_setup'%(side),'%s_ik_leg_01_jnt'%(side)),('%s_leg_02_setup'%(side),'%s_ik_leg_02_jnt'%(side)),('%s_leg_03_setup'%(side),'%s_ik_leg_03_jnt'%(side)),('%s_leg_04_setup'%(side),'%s_ik_leg_04_jnt'%(side)),('%s_leg_05_setup'%(side),'%s_ik_leg_05_jnt'%(side))]
            for each in list:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            cmds.makeIdentity('%s_ik_leg_01_jnt'%(side), apply=True, translate=True, rotate=True)
            cmds.group(n='%s_ik_leg_jnt_grp'%(side),em=True)
            cmds.parent('%s_ik_leg_01_jnt'%(side),'%s_ik_leg_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_ik_leg_jnt_grp'%(side))
            cmds.ikHandle( n='%s_leg_01_ikh'%(side), sj='%s_ik_leg_01_jnt'%(side), ee='%s_ik_leg_03_jnt'%(side) )
            cmds.ikHandle( n='%s_leg_02_ikh'%(side), sj='%s_ik_leg_03_jnt'%(side), ee='%s_ik_leg_04_jnt'%(side) )
            cmds.ikHandle( n='%s_leg_03_ikh'%(side), sj='%s_ik_leg_04_jnt'%(side), ee='%s_ik_leg_05_jnt'%(side) )
            cmds.parentConstraint('spine_01_bln_jnt','%s_ik_leg_01_jnt'%(side),mo = True)
            cmds.curve(d=1, p=[(-5, -5, 5),(-5, 5, 5),(5, 5, 5),(5, -5, 5),(5, -5, -5),(5, 5, -5),(-5, 5, -5),(-5, -5, -5),(-5, -5, 5),(5, -5, 5),(5, 5, 5),(5, 5, -5),(5, -5, -5),(-5, -5, -5),(-5, 5, -5),(-5, 5, 5)])
            cmds.rename('%s_ik_leg_ctrl'%(side))
            ControllerAttr('%s_ik_leg_ctrl'%(side),False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='heelLift' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='toeLift' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='ballRoll' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='toeRoll' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='footRock' ,k=1)
            cmds.addAttr('%s_ik_leg_ctrl'%(side),sn='stretch' ,k=1,at = 'bool')
            cmds.addAttr('%s_ik_leg_ctrl'%(side), at = 'enum', keyable=True, en = 'string1:string2:', ln='follow')
            cmds.addAttr('%s_ik_leg_ctrl'%(side)+'.follow', e=True, en = 'world:pelvis:')
            cmds.group(n='%s_ik_leg_ctrl_grp'%(side))
            forDel = cmds.parentConstraint('%s_leg_03_setup'%(side),'%s_ik_leg_ctrl_grp'%(side),mo = False)
            deleteparent = cmds.delete(forDel)
            cmds.parentConstraint('spine_01_bln_jnt','%s_ik_leg_ctrl_grp'%(side),mo = True)
            cmds.connectAttr('%s_ik_leg_ctrl.follow'%(side),'%s_ik_leg_ctrl_grp_parentConstraint1.spine_01_bln_jntW0'%(side))
            cmds.curve(d=1,p=[(0.0, 3.468342867164149, 0.0),(0.0, 3.468342867164149, 0.5221724371834184),(0.0, 4.967930096687364, 0.0),(0.5221724371834184, 3.468342867164149, 0.0),(-0.5221724371834184, 3.468342867164149, 0.0),(0.0, 4.967930096687364, 0.0),(0.0, 3.468342867164149, -0.5221724371834184),(0.0, 3.468342867164149, 0.0),(0.0, -3.468342867164149, 0.0),(-0.5221724371834184, -3.468342867164149, 0.0),(0.0, -4.967930096687364, 0.0),(0.0, -3.468342867164149, -0.5221724371834184),(0.0, -3.468342867164149, 0.5221724371834184),(0.0, -4.967930096687364, 0.0),(0.5221724371834184, -3.468342867164149, 0.0),(0.0, -3.468342867164149, 0.0),(0.0, 0.0, 0.0),(-3.468342867164149, 0.0, 0.0),(-3.468342867164149, 0.5221724371834184, 0.0),(-4.967930096687364, 0.0, 0.0),(-3.468342867164149, 0.0, -0.5221724371834184),(-3.468342867164149, 0.0, 0.5221724371834184),(-4.967930096687364, 0.0, 0.0),(-3.468342867164149, -0.5221724371834184, 0.0),(-3.468342867164149, 0.0, 0.0),(3.468342867164149, 0.0, 0.0),(3.468342867164149, 0.0, -0.5221724371834184),(4.967930096687364, 0.0, 0.0),(3.468342867164149, 0.5221724371834184, 0.0),(3.468342867164149, -0.5221724371834184, 0.0),(4.967930096687364, 0.0, 0.0),(3.468342867164149, 0.0, 0.5221724371834184),(3.468342867164149, 0.0, 0.0),(0.0, 0.0, 0.0),(0.0, 0.0, 3.468342867164149),(0.0, 0.5221724371834184, 3.468342867164149),(0.0, 0.0, 4.967930096687364),(0.5221724371834184, 0.0, 3.468342867164149),(-0.5221724371834184, 0.0, 3.468342867164149),(0.0, 0.0, 4.967930096687364),(0.0, -0.5221724371834184, 3.468342867164149),(0.0, 0.0, 3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.5221724371834184, -3.468342867164149),(0.0, 0.0, -4.967930096687364),(-0.5221724371834184, 0.0, -3.468342867164149),(0.5221724371834184, 0.0, -3.468342867164149),(0.0, 0.0, -4.967930096687364),(0.0, -0.5221724371834184, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149)])
            cmds.rename('%s_knee_ctrl'%(side))
            ControllerAttr('%s_knee_ctrl'%(side),False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,6,True,True,True,False,False,False)
            cmds.addAttr('%s_knee_ctrl'%(side),sn='follow', min = 0, max=1 ,k=1)
            cmds.setAttr('%s_knee_ctrl.follow'%(side),1)
            cmds.group(n='%s_knee_ctrl_grp'%(side))
            cmds.parent('%s_knee_ctrl_grp'%(side),'world_ctrl')
            forDel = cmds.pointConstraint('%s_knee_setup'%(side),'%s_knee_ctrl_grp'%(side))
            cmds.delete(forDel)
            cmds.poleVectorConstraint('%s_knee_ctrl'%(side),'%s_leg_01_ikh'%(side))
            
            list = ['%s_knee_ctrl_aim_up_loc'%(side),'%s_knee_ctrl_aim_base_loc'%(side),'%s_knee_ctrl_aim_loc'%(side),'%s_knee_ctrl_aim_world_loc'%(side),'%s_heel_loc'%(side),'%s_roll_out_loc'%(side),'%s_roll_in_loc'%(side),'%s_toe_roll_loc'%(side),'%s_toe_end_loc'%(side),'%s_toe_lift_loc'%(side),'%s_ball_roll_loc'%(side),'%s_leg_ikHandle_loc'%(side),'%s_ball_ikHandle_loc'%(side)]
            for each in list:
                cmds.spaceLocator(n=each)
                
            cmds.group(n='%s_knee_loc_grp'%(side),em=True)
            cmds.scaleConstraint('world_ctrl','%s_knee_loc_grp'%(side),mo=True)
            cmds.group(n='%s_foot_ikHandle_grp'%(side),em = True)
            cmds.group(n='%s_knee_ctrl_aim_base_loc_grp'%(side),em=True)
            
            list = [('pelvis_setup','%s_knee_ctrl_aim_up_loc'%(side)),('%s_leg_01_setup'%(side),'%s_knee_ctrl_aim_base_loc'%(side)),('%s_leg_03_setup'%(side),'%s_knee_ctrl_aim_loc'%(side))]
            for each in list:
                forDel = cmds.pointConstraint(each[0],each[1])
                cmds.delete(forDel)
            
            list = [('%s_leg_04_setup'%(side),'%s_toe_roll_loc'%(side)),('%s_leg_04_setup'%(side),'%s_ball_roll_loc'%(side)),('%s_knee_setup'%(side),'%s_knee_ctrl_aim_world_loc'%(side)),('%s_leg_heel_setup'%(side),'%s_heel_loc'%(side)),('%s_leg_roll_out_setup'%(side),'%s_roll_out_loc'%(side)),('%s_leg_roll_in_setup'%(side),'%s_roll_in_loc'%(side)),('%s_leg_05_setup'%(side),'%s_toe_end_loc'%(side)),('%s_leg_06_setup'%(side),'%s_toe_lift_loc'%(side)),('%s_leg_03_setup'%(side),'%s_leg_ikHandle_loc'%(side)),('%s_leg_04_setup'%(side),'%s_ball_ikHandle_loc'%(side)),('%s_leg_03_setup'%(side),'%s_foot_ikHandle_grp'%(side))]
            for each in list:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            list = [('%s_heel_loc'%(side),'%s_toe_roll_loc'%(side)),('%s_heel_loc'%(side),'%s_ball_roll_loc'%(side)),('%s_heel_loc'%(side),'%s_foot_ikHandle_grp'%(side))]
            for each in list:
                forDel = cmds.orientConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            list = [('%s_toe_lift_loc'%(side),'%s_heel_loc'%(side)),('%s_roll_out_loc'%(side),'%s_toe_lift_loc'%(side)),('%s_roll_in_loc'%(side),'%s_roll_in_loc'%(side)),('%s_toe_roll_loc'%(side),'%s_roll_in_loc'%(side)),('%s_ball_roll_loc'%(side),'%s_roll_in_loc'%(side)),('%s_toe_end_loc'%(side),'%s_toe_roll_loc'%(side)),('%s_leg_ikHandle_loc'%(side),'%s_ball_roll_loc'%(side)),('%s_ball_ikHandle_loc'%(side),'%s_ball_roll_loc'%(side)),('%s_leg_02_ikh'%(side),'%s_ball_ikHandle_loc'%(side)),('%s_leg_03_ikh'%(side),'%s_toe_end_loc'%(side)),('%s_leg_01_ikh'%(side),'%s_leg_ikHandle_loc'%(side)),('%s_knee_ctrl_aim_world_loc'%(side),'%s_knee_loc_grp'%(side)),('%s_heel_loc'%(side),'%s_foot_ikHandle_grp'%(side)),('%s_ik_leg_ctrl_grp'%(side),'world_ctrl'),('%s_knee_ctrl_aim_base_loc'%(side),'%s_knee_ctrl_aim_base_loc_grp'%(side)),('%s_knee_ctrl_aim_up_loc'%(side),'%s_knee_loc_grp'%(side)),('%s_knee_ctrl_aim_base_loc_grp'%(side),'%s_knee_loc_grp'%(side)),('%s_knee_ctrl_aim_loc'%(side),'%s_knee_loc_grp'%(side)),('%s_knee_ctrl_aim_up_loc'%(side),'spine_01_bln_jnt')]
            for each in list:
                cmds.parent(each[0],each[1])
                
            cmds.aimConstraint('%s_knee_ctrl_aim_loc'%(side),'%s_knee_ctrl_aim_base_loc'%(side),wut='object',wuo = '%s_knee_ctrl_aim_up_loc'%(side),mo = False)
            
            list = [('%s_ik_leg_ctrl'%(side),'%s_knee_ctrl_aim_loc'%(side)),('world_ctrl','%s_knee_ctrl_aim_world_loc'%(side)),('%s_knee_ctrl_aim_base_loc'%(side),'%s_knee_ctrl_grp'%(side)),('%s_knee_ctrl_aim_world_loc'%(side),'%s_knee_ctrl_grp'%(side)),('%s_ik_leg_ctrl'%(side),'%s_foot_ikHandle_grp'%(side)),('%s_knee_ctrl_aim_up_loc'%(side),'%s_knee_ctrl_aim_base_loc_grp'%(side))]
            for each in list:
                cmds.parentConstraint(each[0],each[1],mo=True)

            list = [('reverse','%s_knee_follow_rev'%(side)),('multiplyDivide','%s_foot_rock_mult'%(side)),('condition','%s_foot_rock_con'%(side))]
            for each in list:
                cmds.shadingNode(each[0],n = each[1],asUtility=1)

            list = [('%s_knee_ctrl.follow'%(side),'%s_knee_ctrl_grp_parentConstraint1.%s_knee_ctrl_aim_base_locW0'%(side,side)),('%s_knee_ctrl.follow'%(side),'%s_knee_follow_rev.inputX'%(side)),('%s_knee_follow_rev.outputX'%(side),'%s_knee_ctrl_grp_parentConstraint1.%s_knee_ctrl_aim_world_locW1'%(side,side)),('%s_ik_leg_ctrl.heelLift'%(side),'%s_heel_loc.rotateZ'%(side)),('%s_ik_leg_ctrl.toeLift'%(side),'%s_toe_lift_loc.rotateZ'%(side)),('%s_ik_leg_ctrl.ballRoll'%(side),'%s_ball_roll_loc.rotateZ'%(side)),('%s_ik_leg_ctrl.toeRoll'%(side),'%s_toe_roll_loc.rotateZ'%(side)),('%s_ik_leg_ctrl.footRock'%(side),'%s_foot_rock_mult.input1X'%(side)),('%s_ik_leg_ctrl.footRock'%(side),'%s_foot_rock_mult.input1Y'%(side)),('%s_foot_rock_mult.outputX'%(side),'%s_foot_rock_con.colorIfFalse.colorIfFalseG'%(side)),('%s_foot_rock_mult.outputX'%(side),'%s_foot_rock_con.colorIfTrue.colorIfTrueR'%(side)),('%s_foot_rock_con.outColor.outColorR'%(side), '%s_roll_out_loc.rotate.rotateX'%(side)),('%s_foot_rock_con.outColor.outColorG'%(side), '%s_roll_in_loc.rotate.rotateX'%(side)),('%s_ik_leg_ctrl.footRock'%(side), '%s_foot_rock_con.firstTerm'%(side))]
            for each in list:
                cmds.connectAttr(each[0],each[1])
                
            list = [('%s_foot_rock_mult.input2X'%(side),-1),('%s_foot_rock_con.operation'%(side),2),('%s_foot_rock_con.colorIfFalse.colorIfFalseR'%(side),0),('%s_foot_rock_con.colorIfFalse.colorIfFalseB'%(side),0)]
            for each in list:
                cmds.setAttr(each[0],each[1])
            
            cmds.scaleConstraint('world_ctrl','%s_foot_ikHandle_grp'%(side),mo=True)
            #IKlegPVcrv#
            cmds.curve(d=1, p=[(0, 0, 0),(0, 10, 0)])
            cmds.rename('%s_knee_direction_crv'%(side))
            
            nameOfLoc = ['%s_knee_01_loc'%(side),'%s_knee_02_loc'%(side)]
            for each in nameOfLoc:
                cmds.spaceLocator(n=each)
        
            toGetLocPos = [('%s_knee_01_loc.translateY'%(side),0),('%s_knee_02_loc.translateY'%(side),10)]
            for each in toGetLocPos:
                cmds.setAttr(each[0],each[1])
    
            toConnectLoc = [('%s_knee_01_loc.worldPosition[0]'%(side),'%s_knee_direction_crvShape.controlPoints[0]'%(side)),('%s_knee_02_loc.worldPosition[0]'%(side),'%s_knee_direction_crvShape.controlPoints[4]'%(side))]
            for each in toConnectLoc:
                cmds.connectAttr(each[0],each[1])
            toSetAttr = [('%s_knee_direction_crv.overrideEnabled'%(side),1),('%s_knee_direction_crv.overrideDisplayType'%(side),2),('%s_knee_01_loc.visibility'%(side),0),('%s_knee_02_loc.visibility'%(side),0)]
            for each in toSetAttr:
                cmds.setAttr(each[0],each[1])
            
            toGetParent = [('%s_knee_ctrl'%(side),'%s_knee_01_loc'%(side)),('%s_ik_leg_02_jnt'%(side),'%s_knee_02_loc'%(side))]
            for each in toGetParent:
                cmds.parentConstraint(each[0],each[1],mo = False)
            
            cmds.group(n='%s_knee_direction_crv_grp'%(side),em = True)
            toGetParent = [('%s_knee_01_loc'%(side),'%s_knee_direction_crv_grp'%(side)),('%s_knee_02_loc'%(side),'%s_knee_direction_crv_grp'%(side)),('%s_knee_direction_crv'%(side),'%s_knee_direction_crv_grp'%(side))]
            for each in toGetParent:
                cmds.parent(each[0],each[1])
                
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
            
        IKlegSetup('l')
        IKlegSetup('r')
            
        def IKFKlegSetup(side):
            nameOfJoint = [('%s_leg_01_bln_jnt'%(side)),('%s_leg_02_bln_jnt'%(side)),('%s_leg_03_bln_jnt'%(side)),('%s_leg_04_bln_jnt'%(side))]
            for each in nameOfJoint:
                cmds.joint(n=each)

            toGetJointPos = [('%s_leg_01_setup'%(side),'%s_leg_01_bln_jnt'%(side)),('%s_leg_02_setup'%(side),'%s_leg_02_bln_jnt'%(side)),('%s_leg_03_setup'%(side),'%s_leg_03_bln_jnt'%(side)),('%s_leg_04_setup'%(side),'%s_leg_04_bln_jnt'%(side))]
            for each in toGetJointPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo = False)
                cmds.delete(forDel)

            toSetDrawStyle = [('%s_leg_01_bln_jnt.drawStyle'%(side)),('%s_leg_02_bln_jnt.drawStyle'%(side)),('%s_leg_03_bln_jnt.drawStyle'%(side))]
            for each in toSetDrawStyle:
                cmds.setAttr(each,2)

            cmds.parent(w = True)
            cmds.makeIdentity( '%s_leg_01_bln_jnt'%(side), apply=True, translate=True, rotate=True )
            cmds.curve(d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
            cmds.rename('%s_leg_ik_fk_switch'%(side))
            ControllerAttr('%s_leg_ik_fk_switch'%(side),False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,15,False,False,False,True,True,True)
            cmds.group(n='%s_leg_ik_fk_switch_grp'%(side))
            cmds.parent('%s_leg_ik_fk_switch_grp'%(side), 'world_ctrl')
            cmds.addAttr('%s_leg_ik_fk_switch'%(side),sn='IKFK', min = 0, max=1 ,k=1)
            cmds.addAttr('%s_leg_ik_fk_switch'%(side),sn='bendyVis',at = 'bool',k=1)

            parentCon = [('%s_leg_03_bln_jnt'%(side), '%s_leg_ik_fk_switch_grp'%(side)),('%s_fk_leg_01_jnt'%(side),'%s_leg_01_bln_jnt'%(side)),('%s_ik_leg_01_jnt'%(side),'%s_leg_01_bln_jnt'%(side)),('%s_fk_leg_02_jnt'%(side),'%s_leg_02_bln_jnt'%(side)),('%s_ik_leg_02_jnt'%(side),'%s_leg_02_bln_jnt'%(side)),('%s_fk_leg_03_jnt'%(side),'%s_leg_03_bln_jnt'%(side)),('%s_ik_leg_03_jnt'%(side),'%s_leg_03_bln_jnt'%(side)),('%s_fk_leg_04_jnt'%(side),'%s_leg_04_bln_jnt'%(side)),('%s_ik_leg_04_jnt'%(side),'%s_leg_04_bln_jnt'%(side))]
            for each in parentCon:
                cmds.parentConstraint(each[0],each[1],mo = False)
            
            cmds.shadingNode('reverse',n = '%s_leg_ik_rev'%(side),asUtility=1)

            toConnectAttr = [('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_01_bln_jnt_parentConstraint1.%s_fk_leg_01_jntW0'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_02_bln_jnt_parentConstraint1.%s_fk_leg_02_jntW0'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_03_bln_jnt_parentConstraint1.%s_fk_leg_03_jntW0'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_04_bln_jnt_parentConstraint1.%s_fk_leg_04_jntW0'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_leg_ik_rev.inputX'%(side)),('%s_leg_ik_rev.outputX'%(side),'%s_leg_01_bln_jnt_parentConstraint1.%s_ik_leg_01_jntW1'%(side,side)),('%s_leg_ik_rev.outputX'%(side),'%s_leg_02_bln_jnt_parentConstraint1.%s_ik_leg_02_jntW1'%(side,side)),('%s_leg_ik_rev.outputX'%(side),'%s_leg_03_bln_jnt_parentConstraint1.%s_ik_leg_03_jntW1'%(side,side)),('%s_leg_ik_rev.outputX'%(side),'%s_leg_04_bln_jnt_parentConstraint1.%s_ik_leg_04_jntW1'%(side,side)),('%s_leg_ik_fk_switch.IKFK'%(side),'%s_fk_leg_01_ctrl_grp.visibility'%(side)),('%s_leg_ik_rev.outputX'%(side),'%s_ik_leg_ctrl_grp.visibility'%(side)),('%s_leg_ik_rev.outputX'%(side),'%s_knee_ctrl_grp.visibility'%(side)),('%s_leg_ik_rev.outputX'%(side),'%s_knee_direction_crv_grp.visibility'%(side))]
            for each in toConnectAttr:
                cmds.connectAttr(each[0],each[1])
                
            cmds.parent('%s_leg_01_bln_jnt'%(side),'spine_01_bln_jnt')
            cmds.parent('%s_leg_04_bln_jnt'%(side),'%s_leg_03_bln_jnt'%(side))
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
            
        IKFKlegSetup('l')
        IKFKlegSetup('r')
            
        def BendyLegSetup(side):
            cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
            cmds.rename('%s_upr_bendy_leg_crv'%(side))
            cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
            cmds.rename('%s_lwr_bendy_leg_crv'%(side))
            
            nameOfLoc = ['%s_upr_bendy_leg_01_loc'%(side),'%s_upr_bendy_leg_02_loc'%(side),'%s_upr_bendy_leg_03_loc'%(side),'%s_upr_bendy_leg_04_loc'%(side),'%s_upr_bendy_leg_05_loc'%(side),'%s_lwr_bendy_leg_01_loc'%(side),'%s_lwr_bendy_leg_02_loc'%(side),'%s_lwr_bendy_leg_03_loc'%(side),'%s_lwr_bendy_leg_04_loc'%(side),'%s_lwr_bendy_leg_05_loc'%(side),'%s_upr_bendy_leg_aim_up_loc'%(side),'%s_lwr_bendy_leg_aim_up_loc'%(side)]
            for each in nameOfLoc:
                cmds.spaceLocator(n=each)

            listToGetPos = [('%s_leg_01_bln_jnt'%(side),'%s_upr_bendy_leg_aim_up_loc'%(side)),('%s_leg_02_bln_jnt'%(side),'%s_lwr_bendy_leg_aim_up_loc'%(side))]
            for each in listToGetPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
                
            cmds.parent('%s_upr_bendy_leg_aim_up_loc'%(side),'%s_leg_01_bln_jnt'%(side))
            cmds.parent('%s_lwr_bendy_leg_aim_up_loc'%(side),'%s_leg_02_bln_jnt'%(side))
            cmds.setAttr('%s_upr_bendy_leg_aim_up_loc.translateY'%(side),50)
            cmds.setAttr('%s_lwr_bendy_leg_aim_up_loc.translateY'%(side),50)
            
            toGetLocPos = [('%s_upr_bendy_leg_01_loc.translateY'%(side),0),('%s_upr_bendy_leg_02_loc.translateY'%(side),2.5),('%s_upr_bendy_leg_03_loc.translateY'%(side),5),('%s_upr_bendy_leg_04_loc.translateY'%(side),7.5),('%s_upr_bendy_leg_05_loc.translateY'%(side),10),('%s_lwr_bendy_leg_01_loc.translateY'%(side),0),('%s_lwr_bendy_leg_02_loc.translateY'%(side),2.5),('%s_lwr_bendy_leg_03_loc.translateY'%(side),5),('%s_lwr_bendy_leg_04_loc.translateY'%(side),7.5),('%s_lwr_bendy_leg_05_loc.translateY'%(side),10),('%s_leg_ik_fk_switch.bendyVis'%(side),1)]
            for each in toGetLocPos:
                cmds.setAttr(each[0],each[1])
        
            toConnectLoc = [('%s_upr_bendy_leg_01_loc.worldPosition[0]'%(side),'%s_upr_bendy_leg_crvShape.controlPoints[0]'%(side)),('%s_upr_bendy_leg_02_loc.worldPosition[0]'%(side),'%s_upr_bendy_leg_crvShape.controlPoints[1]'%(side)),('%s_upr_bendy_leg_03_loc.worldPosition[0]'%(side),'%s_upr_bendy_leg_crvShape.controlPoints[2]'%(side)),('%s_upr_bendy_leg_04_loc.worldPosition[0]'%(side),'%s_upr_bendy_leg_crvShape.controlPoints[3]'%(side)),('%s_upr_bendy_leg_05_loc.worldPosition[0]'%(side),'%s_upr_bendy_leg_crvShape.controlPoints[4]'%(side)),('%s_lwr_bendy_leg_01_loc.worldPosition[0]'%(side),'%s_lwr_bendy_leg_crvShape.controlPoints[0]'%(side)),('%s_lwr_bendy_leg_02_loc.worldPosition[0]'%(side),'%s_lwr_bendy_leg_crvShape.controlPoints[1]'%(side)),('%s_lwr_bendy_leg_03_loc.worldPosition[0]'%(side),'%s_lwr_bendy_leg_crvShape.controlPoints[2]'%(side)),('%s_lwr_bendy_leg_04_loc.worldPosition[0]'%(side),'%s_lwr_bendy_leg_crvShape.controlPoints[3]'%(side)),('%s_lwr_bendy_leg_05_loc.worldPosition[0]'%(side),'%s_lwr_bendy_leg_crvShape.controlPoints[4]'%(side))]
            for each in toConnectLoc:
                cmds.connectAttr(each[0],each[1])
            
            listOfBendyLegController = [('%s_bendy_leg_01_ctrl'%(side),'%s_bendy_leg_01_ctrl_grp'%(side)),('%s_bendy_leg_02_ctrl'%(side),'%s_bendy_leg_02_ctrl_grp'%(side)),('%s_bendy_leg_03_ctrl'%(side),'%s_bendy_leg_03_ctrl_grp'%(side))]
            for each in listOfBendyLegController:
                cmds.curve(d=1,p=[(0, -3, 3),(0, -1, 2),(0, 0, 4),(0, 1, 2),(0, 3, 3),(0, 2, 1),(0, 4, 0),(0, 2, -1),(0, 3, -3),(0, 1, -2),(0, 0, -4),(0, -1, -2),(0, -3, -3),(0, -2, -1),(0, -4, 0),(0, -2, 1),(0, -3, 3)])
                cmds.rename(each[0])
                cmds.group(n=each[1])
            cmds.delete('%s_bendy_leg_01_ctrl'%(side),'%s_bendy_leg_02_ctrl'%(side),'%s_bendy_leg_03_ctrl'%(side),constructionHistory = True)
            
            uprBendyController01forDel = cmds.pointConstraint('%s_leg_01_setup'%(side),'%s_bendy_leg_01_ctrl_grp'%(side),mo=False)
            uprBendyController01forDel = cmds.pointConstraint('%s_leg_02_setup'%(side),'%s_bendy_leg_01_ctrl_grp'%(side),mo=False)
            uprBendyController02forDel = cmds.pointConstraint('%s_leg_02_setup'%(side),'%s_bendy_leg_02_ctrl_grp'%(side),mo=False)
            uprBendyController03forDel = cmds.pointConstraint('%s_leg_02_setup'%(side),'%s_bendy_leg_03_ctrl_grp'%(side),mo=False)
            uprBendyController03forDel = cmds.pointConstraint('%s_leg_03_setup'%(side),'%s_bendy_leg_03_ctrl_grp'%(side),mo=False)
            uprBendyControllerForRotation01forDel = cmds.orientConstraint('%s_leg_01_setup'%(side),'%s_bendy_leg_01_ctrl_grp'%(side),mo=False)
            uprBendyControllerForRotation02forDel = cmds.orientConstraint('%s_leg_02_setup'%(side),'%s_bendy_leg_02_ctrl_grp'%(side),mo=False)
            uprBendyControllerForRotation03forDel = cmds.orientConstraint('%s_leg_02_setup'%(side),'%s_bendy_leg_03_ctrl_grp'%(side),mo=False)
            cmds.delete(uprBendyController01forDel,uprBendyController02forDel,uprBendyController03forDel,uprBendyControllerForRotation01forDel,uprBendyControllerForRotation02forDel,uprBendyControllerForRotation03forDel)
            
            listOfUprBendyJoint = ['%s_upr_bendy_leg_01_jnt'%(side),'%s_upr_bendy_leg_02_jnt'%(side),'%s_upr_bendy_leg_03_jnt'%(side),'%s_upr_bendy_leg_04_jnt'%(side),'%s_upr_bendy_leg_05_jnt'%(side),'%s_lwr_bendy_leg_01_jnt'%(side),'%s_lwr_bendy_leg_02_jnt'%(side),'%s_lwr_bendy_leg_03_jnt'%(side),'%s_lwr_bendy_leg_04_jnt'%(side),'%s_lwr_bendy_leg_05_jnt'%(side),'%s_upr_bendy_leg_01_length_jnt'%(side),'%s_upr_bendy_leg_02_length_jnt'%(side),'%s_upr_bendy_leg_03_length_jnt'%(side),'%s_upr_bendy_leg_04_length_jnt'%(side),'%s_upr_bendy_leg_05_length_jnt'%(side),'%s_lwr_bendy_leg_01_length_jnt'%(side),'%s_lwr_bendy_leg_02_length_jnt'%(side),'%s_lwr_bendy_leg_03_length_jnt'%(side),'%s_lwr_bendy_leg_04_length_jnt'%(side),'%s_lwr_bendy_leg_05_length_jnt'%(side),'%s_lwr_bendy_leg_start_length_jnt'%(side),'%s_lwr_bendy_leg_end_length_jnt'%(side),'%s_upr_bendy_leg_start_length_jnt'%(side),'%s_upr_bendy_leg_end_length_jnt'%(side)]
            for each in listOfUprBendyJoint:
                cmds.joint(n=each)
                
            cmds.parent('%s_upr_bendy_leg_01_jnt'%(side),'%s_lwr_bendy_leg_01_jnt'%(side),'%s_upr_bendy_leg_01_length_jnt'%(side),'%s_lwr_bendy_leg_01_length_jnt'%(side),'%s_upr_bendy_leg_start_length_jnt'%(side),'%s_lwr_bendy_leg_start_length_jnt'%(side),w=True)
            cmds.group(n='%s_upr_bendy_leg_jnt_grp'%(side),em=True)
            cmds.group(n='%s_lwr_bendy_leg_jnt_grp'%(side),em=True)
            cmds.parent('%s_upr_bendy_leg_01_jnt'%(side),'%s_upr_bendy_leg_jnt_grp'%(side))
            cmds.parent('%s_lwr_bendy_leg_01_jnt'%(side),'%s_lwr_bendy_leg_jnt_grp'%(side))
            cmds.orientConstraint('%s_leg_01_bln_jnt'%(side),'%s_upr_bendy_leg_jnt_grp'%(side),mo=True)
            cmds.orientConstraint('%s_leg_02_bln_jnt'%(side),'%s_lwr_bendy_leg_jnt_grp'%(side),mo=True)
            uprBendyJoint01forDel = cmds.pointConstraint('%s_leg_01_setup'%(side),'%s_upr_bendy_leg_01_jnt'%(side),mo=False)
            uprBendyJoint02forDel = cmds.pointConstraint('%s_leg_01_setup'%(side),'%s_upr_bendy_leg_02_jnt'%(side),mo=False)
            uprBendyJoint02forDel = cmds.pointConstraint('%s_bendy_leg_01_ctrl'%(side),'%s_upr_bendy_leg_02_jnt'%(side),mo=False)
            uprBendyJoint03forDel = cmds.pointConstraint('%s_bendy_leg_01_ctrl'%(side),'%s_upr_bendy_leg_03_jnt'%(side),mo=False)
            uprBendyJoint04forDel = cmds.pointConstraint('%s_bendy_leg_01_ctrl'%(side),'%s_upr_bendy_leg_04_jnt'%(side),mo=False)
            uprBendyJoint04forDel = cmds.pointConstraint('%s_leg_02_setup'%(side),'%s_upr_bendy_leg_04_jnt'%(side),mo=False)
            uprBendyJoint05forDel = cmds.pointConstraint('%s_leg_02_setup'%(side),'%s_upr_bendy_leg_05_jnt'%(side),mo=False)
            lwrBendyJoint01forDel = cmds.pointConstraint('%s_leg_02_setup'%(side),'%s_lwr_bendy_leg_01_jnt'%(side),mo=False)
            lwrBendyJoint02forDel = cmds.pointConstraint('%s_leg_02_setup'%(side),'%s_lwr_bendy_leg_02_jnt'%(side),mo=False)
            lwrBendyJoint02forDel = cmds.pointConstraint('%s_bendy_leg_03_ctrl'%(side),'%s_lwr_bendy_leg_02_jnt'%(side),mo=False)
            lwrBendyJoint03forDel = cmds.pointConstraint('%s_bendy_leg_03_ctrl'%(side),'%s_lwr_bendy_leg_03_jnt'%(side),mo=False)
            lwrBendyJoint04forDel = cmds.pointConstraint('%s_bendy_leg_03_ctrl'%(side),'%s_lwr_bendy_leg_04_jnt'%(side),mo=False)
            lwrBendyJoint04forDel = cmds.pointConstraint('%s_leg_03_setup'%(side),'%s_lwr_bendy_leg_04_jnt'%(side),mo=False)
            lwrBendyJoint05forDel = cmds.pointConstraint('%s_leg_03_setup'%(side),'%s_lwr_bendy_leg_05_jnt'%(side),mo=False)
            uprBendyJointForRatation01forDel = cmds.orientConstraint('%s_leg_01_setup'%(side),'%s_upr_bendy_leg_01_jnt'%(side),mo=False)
            uprBendyJointForRatation02forDel = cmds.orientConstraint('%s_leg_01_setup'%(side),'%s_upr_bendy_leg_02_jnt'%(side),mo=False)
            uprBendyJointForRatation03forDel = cmds.orientConstraint('%s_leg_01_setup'%(side),'%s_upr_bendy_leg_03_jnt'%(side),mo=False)
            uprBendyJointForRatation04forDel = cmds.orientConstraint('%s_leg_01_setup'%(side),'%s_upr_bendy_leg_04_jnt'%(side),mo=False)
            uprBendyJointForRatation05forDel = cmds.orientConstraint('%s_leg_01_setup'%(side),'%s_upr_bendy_leg_05_jnt'%(side),mo=False)
            lwrBendyJointForRatation01forDel = cmds.orientConstraint('%s_leg_02_setup'%(side),'%s_lwr_bendy_leg_01_jnt'%(side),mo=False)
            lwrBendyJointForRatation02forDel = cmds.orientConstraint('%s_leg_02_setup'%(side),'%s_lwr_bendy_leg_02_jnt'%(side),mo=False)
            lwrBendyJointForRatation03forDel = cmds.orientConstraint('%s_leg_02_setup'%(side),'%s_lwr_bendy_leg_03_jnt'%(side),mo=False)
            lwrBendyJointForRatation04forDel = cmds.orientConstraint('%s_leg_02_setup'%(side),'%s_lwr_bendy_leg_04_jnt'%(side),mo=False)
            lwrBendyJointForRatation05forDel = cmds.orientConstraint('%s_leg_02_setup'%(side),'%s_lwr_bendy_leg_05_jnt'%(side),mo=False)
            cmds.delete(uprBendyJoint01forDel,uprBendyJoint02forDel,uprBendyJoint03forDel,uprBendyJoint04forDel,uprBendyJoint05forDel,lwrBendyJoint01forDel,lwrBendyJoint02forDel,lwrBendyJoint03forDel,lwrBendyJoint04forDel,lwrBendyJoint05forDel,uprBendyJointForRatation01forDel,uprBendyJointForRatation02forDel,uprBendyJointForRatation03forDel,uprBendyJointForRatation04forDel,uprBendyJointForRatation05forDel,lwrBendyJointForRatation01forDel,lwrBendyJointForRatation02forDel,lwrBendyJointForRatation03forDel,lwrBendyJointForRatation04forDel,lwrBendyJointForRatation05forDel)
            
            listOfBendyArmLenghtJointToGetPos = [('%s_upr_bendy_leg_01_jnt'%(side),'%s_upr_bendy_leg_01_length_jnt'%(side)),('%s_upr_bendy_leg_02_jnt'%(side),'%s_upr_bendy_leg_02_length_jnt'%(side)),('%s_upr_bendy_leg_03_jnt'%(side),'%s_upr_bendy_leg_03_length_jnt'%(side)),('%s_upr_bendy_leg_04_jnt'%(side),'%s_upr_bendy_leg_04_length_jnt'%(side)),('%s_upr_bendy_leg_05_jnt'%(side),'%s_upr_bendy_leg_05_length_jnt'%(side)),('%s_lwr_bendy_leg_01_jnt'%(side),'%s_lwr_bendy_leg_01_length_jnt'%(side)),('%s_lwr_bendy_leg_02_jnt'%(side),'%s_lwr_bendy_leg_02_length_jnt'%(side)),('%s_lwr_bendy_leg_03_jnt'%(side),'%s_lwr_bendy_leg_03_length_jnt'%(side)),('%s_lwr_bendy_leg_04_jnt'%(side),'%s_lwr_bendy_leg_04_length_jnt'%(side)),('%s_lwr_bendy_leg_05_jnt'%(side),'%s_lwr_bendy_leg_05_length_jnt'%(side)),('%s_upr_bendy_leg_01_jnt'%(side),'%s_upr_bendy_leg_start_length_jnt'%(side)),('%s_upr_bendy_leg_05_jnt'%(side),'%s_upr_bendy_leg_end_length_jnt'%(side)),('%s_lwr_bendy_leg_01_jnt'%(side),'%s_lwr_bendy_leg_start_length_jnt'%(side)),('%s_lwr_bendy_leg_05_jnt'%(side),'%s_lwr_bendy_leg_end_length_jnt'%(side))]
            for each in listOfBendyArmLenghtJointToGetPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            cmds.makeIdentity('%s_upr_bendy_leg_01_jnt'%(side),'%s_lwr_bendy_leg_01_jnt'%(side),'%s_upr_bendy_leg_01_length_jnt'%(side),'%s_lwr_bendy_leg_01_length_jnt'%(side),'%s_upr_bendy_leg_start_length_jnt'%(side),'%s_lwr_bendy_leg_start_length_jnt'%(side),apply=True,rotate=True)
            
            locToGetPos = [('%s_upr_bendy_leg_01_jnt'%(side),'%s_upr_bendy_leg_01_loc'%(side)),('%s_upr_bendy_leg_02_jnt'%(side),'%s_upr_bendy_leg_02_loc'%(side)),('%s_upr_bendy_leg_03_jnt'%(side),'%s_upr_bendy_leg_03_loc'%(side)),('%s_upr_bendy_leg_04_jnt'%(side),'%s_upr_bendy_leg_04_loc'%(side)),('%s_upr_bendy_leg_05_jnt'%(side),'%s_upr_bendy_leg_05_loc'%(side)),('%s_lwr_bendy_leg_01_jnt'%(side),'%s_lwr_bendy_leg_01_loc'%(side)),('%s_lwr_bendy_leg_02_jnt'%(side),'%s_lwr_bendy_leg_02_loc'%(side)),('%s_lwr_bendy_leg_03_jnt'%(side),'%s_lwr_bendy_leg_03_loc'%(side)),('%s_lwr_bendy_leg_04_jnt'%(side),'%s_lwr_bendy_leg_04_loc'%(side)),('%s_lwr_bendy_leg_05_jnt'%(side),'%s_lwr_bendy_leg_05_loc'%(side))]
            for each in locToGetPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
                
            list = ['%s_upr_bendy_leg_loc_grp'%(side),'%s_lwr_bendy_leg_loc_grp'%(side),'%s_bendy_leg_ctrl_grp'%(side),'%s_bendy_leg_jnt_grp'%(side)]
            for each in list:
                cmds.group(n=each,em=True)
            cmds.connectAttr('%s_leg_ik_fk_switch.bendyVis'%(side),'%s_bendy_leg_ctrl_grp.visibility'%(side))
            list = [('%s_lwr_bendy_leg_jnt_grp'%(side),'%s_bendy_leg_jnt_grp'%(side)),('%s_upr_bendy_leg_jnt_grp'%(side),'%s_bendy_leg_jnt_grp'%(side)),('%s_upr_bendy_leg_01_loc'%(side),'%s_upr_bendy_leg_loc_grp'%(side)),('%s_upr_bendy_leg_02_loc'%(side),'%s_upr_bendy_leg_loc_grp'%(side)),('%s_upr_bendy_leg_03_loc'%(side),'%s_upr_bendy_leg_loc_grp'%(side)),('%s_upr_bendy_leg_04_loc'%(side),'%s_upr_bendy_leg_loc_grp'%(side)),('%s_upr_bendy_leg_05_loc'%(side),'%s_upr_bendy_leg_loc_grp'%(side)),('%s_lwr_bendy_leg_01_loc'%(side),'%s_lwr_bendy_leg_loc_grp'%(side)),('%s_lwr_bendy_leg_02_loc'%(side),'%s_lwr_bendy_leg_loc_grp'%(side)),('%s_lwr_bendy_leg_03_loc'%(side),'%s_lwr_bendy_leg_loc_grp'%(side)),('%s_lwr_bendy_leg_04_loc'%(side),'%s_lwr_bendy_leg_loc_grp'%(side)),('%s_lwr_bendy_leg_05_loc'%(side),'%s_lwr_bendy_leg_loc_grp'%(side)),('%s_bendy_leg_01_ctrl_grp'%(side),'%s_bendy_leg_ctrl_grp'%(side)),('%s_bendy_leg_02_ctrl_grp'%(side),'%s_bendy_leg_ctrl_grp'%(side)),('%s_bendy_leg_03_ctrl_grp'%(side),'%s_bendy_leg_ctrl_grp'%(side)),('%s_upr_bendy_leg_01_length_jnt'%(side),'%s_bendy_leg_jnt_grp'%(side)),('%s_lwr_bendy_leg_01_length_jnt'%(side),'%s_bendy_leg_jnt_grp'%(side)),('%s_upr_bendy_leg_start_length_jnt'%(side),'%s_bendy_leg_jnt_grp'%(side)),('%s_lwr_bendy_leg_start_length_jnt'%(side),'%s_bendy_leg_jnt_grp'%(side))]
            for each in list:
                cmds.parent(each[0],each[1])
                
            list = [('%s_bendy_leg_01_ctrl'%(side)),('%s_bendy_leg_02_ctrl'%(side)),('%s_bendy_leg_03_ctrl'%(side))]
            for each in list:
                cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.rotateX',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.rotateY',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.rotateZ',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.overrideEnabled' ,True) 
                cmds.setAttr (each+'.overrideColor' ,18)

                
            cmds.select('%s_upr_bendy_leg_01_jnt'%(side),'%s_upr_bendy_leg_05_jnt'%(side),'%s_upr_bendy_leg_crv'%(side))
            cmds.ikHandle(n='%s_upr_bendy_leg_ikh'%(side),sol='ikSplineSolver',ccv=0,pcv =0)
            cmds.select('%s_lwr_bendy_leg_01_jnt'%(side),'%s_lwr_bendy_leg_05_jnt'%(side),'%s_lwr_bendy_leg_crv'%(side))
            cmds.ikHandle(n='%s_lwr_bendy_leg_ikh'%(side),sol='ikSplineSolver',ccv=0,pcv =0)

            list = [('%s_leg_01_bln_jnt'%(side),'%s_upr_bendy_leg_01_loc'%(side)),('%s_leg_01_bln_jnt'%(side),'%s_upr_bendy_leg_02_loc'%(side)),('%s_bendy_leg_01_ctrl'%(side),'%s_upr_bendy_leg_02_loc'%(side)),('%s_bendy_leg_01_ctrl'%(side),'%s_upr_bendy_leg_03_loc'%(side)),('%s_bendy_leg_01_ctrl'%(side),'%s_upr_bendy_leg_04_loc'%(side)),('%s_bendy_leg_02_ctrl'%(side),'%s_upr_bendy_leg_04_loc'%(side)),('%s_bendy_leg_02_ctrl'%(side),'%s_upr_bendy_leg_05_loc'%(side)),('%s_bendy_leg_02_ctrl'%(side),'%s_lwr_bendy_leg_01_loc'%(side)),('%s_bendy_leg_02_ctrl'%(side),'%s_lwr_bendy_leg_02_loc'%(side)),('%s_bendy_leg_03_ctrl'%(side),'%s_lwr_bendy_leg_02_loc'%(side)),('%s_bendy_leg_03_ctrl'%(side),'%s_lwr_bendy_leg_03_loc'%(side)),('%s_bendy_leg_03_ctrl'%(side),'%s_lwr_bendy_leg_04_loc'%(side)),('%s_leg_03_bln_jnt'%(side),'%s_lwr_bendy_leg_04_loc'%(side)),('%s_leg_03_bln_jnt'%(side),'%s_lwr_bendy_leg_05_loc'%(side))]
            for each in list:
                cmds.pointConstraint(each[0],each[1],mo=True)
                
            cmds.pointConstraint('%s_leg_01_bln_jnt'%(side),'%s_bendy_leg_01_ctrl_grp'%(side),mo = True)
            cmds.pointConstraint('%s_bendy_leg_02_ctrl'%(side),'%s_bendy_leg_01_ctrl_grp'%(side),mo = True)
            cmds.aimConstraint('%s_bendy_leg_02_ctrl'%(side),'%s_bendy_leg_01_ctrl_grp'%(side),wut = 'object',wuo = '%s_upr_bendy_leg_aim_up_loc'%(side),mo = True)
            cmds.parentConstraint('%s_leg_02_bln_jnt'%(side),'%s_bendy_leg_02_ctrl_grp'%(side),mo=True)
            cmds.pointConstraint('%s_leg_03_bln_jnt'%(side),'%s_bendy_leg_03_ctrl_grp'%(side),mo = True)
            cmds.pointConstraint('%s_bendy_leg_02_ctrl'%(side),'%s_bendy_leg_03_ctrl_grp'%(side),mo = True)
            cmds.aimConstraint('%s_bendy_leg_02_ctrl'%(side),'%s_bendy_leg_03_ctrl_grp'%(side),wut = 'object',wuo = '%s_lwr_bendy_leg_aim_up_loc'%(side),mo = True)
            cmds.scaleConstraint('world_ctrl','%s_bendy_leg_01_ctrl_grp'%(side),mo = True)
            cmds.scaleConstraint('world_ctrl','%s_bendy_leg_02_ctrl_grp'%(side),mo = True)
            cmds.scaleConstraint('world_ctrl','%s_bendy_leg_03_ctrl_grp'%(side),mo = True)

            createNode = [('multiplyDivide','%s_upr_bendy_leg_stretch_01_mult'%(side)),('multiplyDivide','%s_upr_bendy_leg_stretch_02_mult'%(side)),('multiplyDivide','%s_lwr_bendy_leg_stretch_01_mult'%(side)),('multiplyDivide','%s_lwr_bendy_leg_stretch_02_mult'%(side))]
            for each in createNode:
                cmds.shadingNode(each[0],n=each[1],asUtility=1)
                
            toSetNode = [('%s_upr_bendy_leg_stretch_01_mult.operation'%(side),2),('%s_upr_bendy_leg_stretch_01_mult.operation'%(side),2),('%s_lwr_bendy_leg_stretch_01_mult.operation'%(side),2),('%s_lwr_bendy_leg_stretch_01_mult.operation'%(side),2),('%s_upr_bendy_leg_stretch_01_mult.operation'%(side),2)]
            for each in toSetNode:
                cmds.setAttr(each[0],each[1])
        
            uprArmCurveInfo = cmds.arclen('%s_upr_bendy_leg_crv'%(side),ch = True)
            cmds.rename(uprArmCurveInfo,'%s_upr_bendy_leg_crv_info'%(side))
            lwrArmCurveInfo = cmds.arclen('%s_lwr_bendy_leg_crv'%(side),ch = True)
            cmds.rename(lwrArmCurveInfo,'%s_lwr_bendy_leg_crv_info'%(side))    
            
            toConnectAttr = [('%s_leg_02_bln_jnt.rotateX'%(side),'%s_upr_bendy_leg_ikh.twist'%(side)),('%s_upr_bendy_leg_crv_info.arcLength'%(side),'%s_upr_bendy_leg_stretch_01_mult.input1X'%(side)),('%s_upr_bendy_leg_stretch_01_mult.outputX'%(side),'%s_upr_bendy_leg_stretch_02_mult.input1X'%(side)),('%s_upr_bendy_leg_02_length_jnt.translateX'%(side),'%s_upr_bendy_leg_stretch_02_mult.input2X'%(side)),('%s_upr_bendy_leg_stretch_02_mult.outputX'%(side),'%s_upr_bendy_leg_02_jnt.translateX'%(side)),('%s_upr_bendy_leg_stretch_02_mult.outputX'%(side),'%s_upr_bendy_leg_03_jnt.translateX'%(side)),('%s_upr_bendy_leg_stretch_02_mult.outputX'%(side),'%s_upr_bendy_leg_04_jnt.translateX'%(side)),('%s_upr_bendy_leg_stretch_02_mult.outputX'%(side),'%s_upr_bendy_leg_05_jnt.translateX'%(side)),('%s_upr_bendy_leg_end_length_jnt.translateX'%(side),'%s_upr_bendy_leg_stretch_01_mult.input2X'%(side)),('%s_leg_03_bln_jnt.rotateX'%(side),'%s_lwr_bendy_leg_ikh.twist'%(side)),('%s_lwr_bendy_leg_crv_info.arcLength'%(side),'%s_lwr_bendy_leg_stretch_01_mult.input1X'%(side)),('%s_lwr_bendy_leg_stretch_01_mult.outputX'%(side),'%s_lwr_bendy_leg_stretch_02_mult.input1X'%(side)),('%s_lwr_bendy_leg_02_length_jnt.translateX'%(side),'%s_lwr_bendy_leg_stretch_02_mult.input2X'%(side)),('%s_lwr_bendy_leg_stretch_02_mult.outputX'%(side),'%s_lwr_bendy_leg_02_jnt.translateX'%(side)),('%s_lwr_bendy_leg_stretch_02_mult.outputX'%(side),'%s_lwr_bendy_leg_03_jnt.translateX'%(side)),('%s_lwr_bendy_leg_stretch_02_mult.outputX'%(side),'%s_lwr_bendy_leg_04_jnt.translateX'%(side)),('%s_lwr_bendy_leg_stretch_02_mult.outputX'%(side),'%s_lwr_bendy_leg_05_jnt.translateX'%(side)),('%s_lwr_bendy_leg_end_length_jnt.translateX'%(side),'%s_lwr_bendy_leg_stretch_01_mult.input2X'%(side))]
            for each in toConnectAttr:
                cmds.connectAttr(each[0],each[1])
                
            list = ['%s_upr_bendy_leg_ik_setup_grp'%(side),'%s_lwr_bendy_leg_ik_setup_grp'%(side),'%s_upr_leg_bendy_setup_grp'%(side),'%s_lwr_leg_bendy_setup_grp'%(side)]
            for each in list:
                cmds.group(n=each,em=True)
                
            list = [('%s_upr_bendy_leg_ik_setup_grp'%(side),'%s_upr_leg_bendy_setup_grp'%(side)),('%s_lwr_bendy_leg_ik_setup_grp'%(side),'%s_lwr_leg_bendy_setup_grp'%(side)),('%s_upr_bendy_leg_loc_grp'%(side),'%s_upr_leg_bendy_setup_grp'%(side)),('%s_lwr_bendy_leg_loc_grp'%(side),'%s_lwr_leg_bendy_setup_grp'%(side)),('%s_bendy_leg_ctrl_grp'%(side),'world_ctrl'),('%s_upr_bendy_leg_crv'%(side),'%s_upr_bendy_leg_ik_setup_grp'%(side)),('%s_upr_bendy_leg_ikh'%(side),'%s_upr_bendy_leg_ik_setup_grp'%(side)),('%s_lwr_bendy_leg_crv'%(side),'%s_lwr_bendy_leg_ik_setup_grp'%(side)),('%s_lwr_bendy_leg_ikh'%(side),'%s_lwr_bendy_leg_ik_setup_grp'%(side))]
            for each in list:
                cmds.parent(each[0],each[1])
                
        BendyLegSetup('l')
        BendyLegSetup('r')
            
        def StrechyLegSetup(side):
            #StrechyLeg#
            jointList = ['%s_leg_01_length_jnt'%(side),'%s_leg_02_length_jnt'%(side),'%s_leg_03_length_jnt'%(side)]
            for each in jointList:
                cmds.joint(n=each)
                
            cmds.group(n='%s_leg_length_jnt_grp'%(side),em=True)
            cmds.parent('%s_leg_01_length_jnt'%(side),'%s_leg_length_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_leg_length_jnt_grp'%(side),mo=True)
            
            listOfToGetJointPos = [('%s_leg_01_setup'%(side),'%s_leg_01_length_jnt'%(side)),('%s_leg_02_setup'%(side),'%s_leg_02_length_jnt'%(side)),('%s_leg_03_setup'%(side),'%s_leg_03_length_jnt'%(side))]
            for each in listOfToGetJointPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
                
            addNode = [('distanceBetween','%s_upr_leg_dist'%(side)),('distanceBetween','%s_lwr_leg_dist'%(side)),('addDoubleLinear','%s_leg_full_dist'%(side)),('distanceBetween','%s_leg_stretch_dist'%(side)),('condition','%s_leg_stretch_cond'%(side)),('multiplyDivide','%s_leg_stretch_mult'%(side)),('multiplyDivide','%s_upr_leg_strecth_mult'%(side)),('multiplyDivide','%s_lwr_leg_strecth_mult'%(side)),('multiplyDivide','%s_leg_strecth_option_mult'%(side))]
            for each in addNode:
                cmds.shadingNode(each[0],n=each[1],asUtility=1)
                
            cmds.setAttr('%s_leg_stretch_cond.operation'%(side),2)
            cmds.setAttr('%s_leg_stretch_mult.operation'%(side),2)
                
            addLoc = [('%s_leg_start_dist_loc'%(side)),('%s_leg_end_dist_loc'%(side))]
            for each in addLoc:
                cmds.spaceLocator(n=each)
                
            cmds.group(n='%s_leg_start_dist_loc_grp'%(side),em=True)
            cmds.parent('%s_leg_start_dist_loc'%(side),'%s_leg_start_dist_loc_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_leg_start_dist_loc_grp'%(side),mo=True)
                
            toConnectNode = [('%s_leg_01_length_jnt.worldMatrix'%(side),'%s_upr_leg_dist.inMatrix1'%(side)),('%s_leg_02_length_jnt.worldMatrix'%(side),'%s_upr_leg_dist.inMatrix2'%(side)),('%s_leg_02_length_jnt.worldMatrix'%(side),'%s_lwr_leg_dist.inMatrix1'%(side)),('%s_leg_03_length_jnt.worldMatrix'%(side),'%s_lwr_leg_dist.inMatrix2'%(side)),('%s_upr_leg_dist.distance'%(side),'%s_leg_full_dist.input1'%(side)),('%s_lwr_leg_dist.distance'%(side),'%s_leg_full_dist.input2'%(side)),('%s_leg_start_dist_loc.worldMatrix'%(side),'%s_leg_stretch_dist.inMatrix1'%(side)),('%s_leg_end_dist_loc.worldMatrix'%(side),'%s_leg_stretch_dist.inMatrix2'%(side)),('%s_leg_stretch_dist.distance'%(side),'%s_leg_stretch_cond.firstTerm'%(side)),('%s_leg_full_dist.output'%(side),'%s_leg_stretch_cond.secondTerm'%(side)),('%s_leg_stretch_dist.distance'%(side),'%s_leg_stretch_mult.input1X'%(side)),('%s_leg_full_dist.output'%(side),'%s_leg_stretch_mult.input2X'%(side)),('%s_leg_stretch_mult.outputX'%(side),'%s_leg_stretch_cond.colorIfTrue.colorIfTrueR'%(side)),('%s_leg_stretch_cond.outColor.outColorR'%(side),'%s_lwr_leg_strecth_mult.input1X'%(side)),('%s_leg_stretch_cond.outColor.outColorR'%(side),'%s_upr_leg_strecth_mult.input1X'%(side)),('%s_leg_02_setup.translateX'%(side),'%s_upr_leg_strecth_mult.input2X'%(side)),('%s_leg_03_setup.translateX'%(side),'%s_lwr_leg_strecth_mult.input2X'%(side)),('%s_upr_leg_strecth_mult.outputX'%(side),'%s_ik_leg_02_jnt.translateX'%(side)),('%s_lwr_leg_strecth_mult.outputX'%(side),'%s_ik_leg_03_jnt.translateX'%(side)),('%s_ik_leg_ctrl.stretch'%(side),'%s_leg_strecth_option_mult.input1X'%(side)),('%s_leg_strecth_option_mult.outputX'%(side),'%s_leg_stretch_cond.operation'%(side))]
            for each in toConnectNode:
                cmds.connectAttr(each[0],each[1])
                
            toSetVis = [('%s_leg_start_dist_loc.visibility'%(side)),('%s_leg_end_dist_loc.visibility'%(side))]
            for each in toSetVis:
                cmds.setAttr(each,0)
                
            toGetLocPos = [('%s_leg_01_setup'%(side),'%s_leg_start_dist_loc'%(side)),('%s_leg_03_setup'%(side),'%s_leg_end_dist_loc'%(side))]
            for each in toGetLocPos:
                forDel = cmds.pointConstraint(each[0],each[1],mo = False)
                cmds.delete(forDel)
            cmds.parentConstraint('spine_01_bln_jnt','%s_leg_start_dist_loc'%(side),mo=True)
            cmds.parent('%s_leg_end_dist_loc'%(side),'%s_ik_leg_ctrl'%(side))
            cmds.setAttr('%s_leg_strecth_option_mult.input2X'%(side),2)
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
            
        StrechyLegSetup('l')
        StrechyLegSetup('r')
        
        def legJointGroup():
            cmds.group(n='l_leg_jnt_grp',em=True)
            cmds.group(n='r_leg_jnt_grp',em=True)
            cmds.group(n='leg_jnt_grp',em=True)
            cmds.group(n='leg_bendy_setup_grp',em=True)
            
            listOfJnt = [('r_leg_01_bln_jnt','r_leg_jnt_grp'),('l_bendy_leg_jnt_grp','l_leg_jnt_grp'),('r_bendy_leg_jnt_grp','r_leg_jnt_grp'),('l_upr_leg_bendy_setup_grp','leg_bendy_setup_grp'),('l_lwr_leg_bendy_setup_grp','leg_bendy_setup_grp'),('r_upr_leg_bendy_setup_grp','leg_bendy_setup_grp'),('r_lwr_leg_bendy_setup_grp','leg_bendy_setup_grp'),('l_leg_01_bln_jnt','l_leg_jnt_grp'),('l_leg_jnt_grp','leg_jnt_grp'),('r_leg_jnt_grp','leg_jnt_grp'),('l_fk_leg_01_jnt','l_leg_jnt_grp'),('r_fk_leg_01_jnt','r_leg_jnt_grp'),('l_upr_bendy_leg_jnt_grp','l_leg_jnt_grp'),('l_lwr_bendy_leg_jnt_grp','l_leg_jnt_grp'),('r_upr_bendy_leg_jnt_grp','r_leg_jnt_grp'),('r_lwr_bendy_leg_jnt_grp','r_leg_jnt_grp'),('l_ik_leg_jnt_grp','l_leg_jnt_grp'),('r_ik_leg_jnt_grp','r_leg_jnt_grp'),('r_leg_length_jnt_grp','r_leg_jnt_grp'),('l_leg_length_jnt_grp','l_leg_jnt_grp')]
            for each in listOfJnt:
                cmds.parent(each[0],each[1])
                
        legJointGroup()
        
    def noBendyLeg():
        def FKlegSetup(side):
            nameOfFKlegController = [('%s_fk_leg_01_ctrl'%(side),'%s_fk_leg_01_ctrl_grp'%(side)),('%s_fk_leg_02_ctrl'%(side),'%s_fk_leg_02_ctrl_grp'%(side)),('%s_fk_leg_03_ctrl'%(side),'%s_fk_leg_03_ctrl_grp'%(side)),('%s_fk_leg_04_ctrl'%(side),'%s_fk_leg_04_ctrl_grp'%(side))]
            for each in nameOfFKlegController:
                cmds.curve(d=1,p=[(0.0, 1.8457071003629746, -6.888272674590291),(0.0, 1.6065215981349992, -5.995620227271308),(0.0, -1.6065234643869502, -5.995624729951774),(0.0, -1.8454397435472047, -6.8872682416730004),(0.0, -5.041829388107622, -5.041831819868864),(0.0, -4.389101595742385, -4.389102497134237),(0.0, -5.995620227271308, -1.6065215981349992),(0.0, -6.888272674590291, -1.8457071003629746),(0.0, -6.8872682416730004, 1.8454397435472047),(0.0, -5.995624729951774, 1.6065234643869502),(0.0, -4.389102497134237, 4.389101595742385),(0.0, -5.041831819868864, 5.041829388107622),(0.0, -1.8457071003629746, 6.888272674590291),(0.0, -1.6065215981349992, 5.995620227271308),(0.0, 1.6065234643869502, 5.995624729951774),(0.0, 1.8454397435472047, 6.8872682416730004),(0.0, 5.041829388107622, 5.041831819868864),(0.0, 4.389101595742385, 4.389102497134237),(0.0, 5.995620227271308, 1.6065215981349992),(0.0, 6.888272674590291, 1.8457071003629746),(0.0, 6.8872682416730004, -1.8454397435472047),(0.0, 5.995624729951774, -1.6065234643869502),(0.0, 4.389102497134237, -4.389101595742385),(0.0, 5.041831819868864, -5.041829388107622),(0.0, 1.8457071003629746, -6.888272674590291)])
                cmds.rename(each[0])
                cmds.group(n=each[1])
   
            createJoint = ['%s_fk_leg_01_jnt'%(side),'%s_fk_leg_02_jnt'%(side),'%s_fk_leg_03_jnt'%(side),'%s_fk_leg_04_jnt'%(side)]
            for each in createJoint:
                cmds.joint(n=each)

            toGetFKlegPos = [('%s_leg_01_setup'%(side),'%s_fk_leg_01_ctrl_grp'%(side)),('%s_leg_02_setup'%(side),'%s_fk_leg_02_ctrl_grp'%(side)),('%s_leg_03_setup'%(side),'%s_fk_leg_03_ctrl_grp'%(side)),('%s_leg_04_setup'%(side),'%s_fk_leg_04_ctrl_grp'%(side)),('%s_leg_01_setup'%(side),'%s_fk_leg_01_jnt'%(side)),('%s_leg_02_setup'%(side),'%s_fk_leg_02_jnt'%(side)),('%s_leg_03_setup'%(side),'%s_fk_leg_03_jnt'%(side)),('%s_leg_04_setup'%(side),'%s_fk_leg_04_jnt'%(side))]
            for each in toGetFKlegPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            cmds.makeIdentity('%s_fk_leg_01_jnt'%(side),apply=True,rotate=True)
            
            toParentCon = [('%s_fk_leg_01_ctrl'%(side),'%s_fk_leg_01_jnt'%(side)),('%s_fk_leg_02_ctrl'%(side),'%s_fk_leg_02_jnt'%(side)),('%s_fk_leg_03_ctrl'%(side),'%s_fk_leg_03_jnt'%(side)),('%s_fk_leg_04_ctrl'%(side),'%s_fk_leg_04_jnt'%(side)),('spine_01_bln_jnt','%s_fk_leg_01_ctrl_grp'%(side))]
            for each in toParentCon:
                cmds.parentConstraint(each[0],each[1],mo=True)
            
            toParent = [('%s_fk_leg_01_ctrl_grp'%(side),'world_ctrl'),('%s_fk_leg_02_ctrl_grp'%(side),'%s_fk_leg_01_ctrl'%(side)),('%s_fk_leg_03_ctrl_grp'%(side), '%s_fk_leg_02_ctrl'%(side)),('%s_fk_leg_04_ctrl_grp'%(side),'%s_fk_leg_03_ctrl'%(side))]
            for each in toParent:
                cmds.parent(each[0],each[1])
                
            toSetAttr = [('%s_fk_leg_01_ctrl'%(side)),('%s_fk_leg_02_ctrl'%(side)),('%s_fk_leg_03_ctrl'%(side)),('%s_fk_leg_04_ctrl'%(side))]  
            for each in toSetAttr:
                cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.overrideEnabled' ,True) 
                cmds.setAttr (each+'.overrideColor' ,6)
            
        FKlegSetup('l')
        FKlegSetup('r')
def IKFKarmSetup(side):
            #IKFKarmJoint#
            nameOfJoint = [('%s_arm_01_bln_jnt'%(side)),('%s_arm_02_bln_jnt'%(side)),('%s_arm_03_bln_jnt'%(side))]
            for each in nameOfJoint:
                cmds.joint(n=each)
            
            cmds.group(n='%s_arm_bln_jnt_grp'%(side),em=True)
            cmds.parent('%s_arm_01_bln_jnt'%(side),'%s_arm_bln_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_arm_bln_jnt_grp'%(side),mo=True)
            
            toGetPos = [('%s_arm_01_setup'%(side), '%s_arm_01_bln_jnt'%(side)),('%s_arm_02_setup'%(side),'%s_arm_02_bln_jnt'%(side)),('%s_arm_03_setup'%(side),'%s_arm_03_bln_jnt'%(side))]
            for each in toGetPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo = False) 
                cmds.delete(forDel)
                
            cmds.setAttr('%s_arm_01_bln_jnt.drawStyle'%(side),2)
            cmds.setAttr('%s_arm_02_bln_jnt.drawStyle'%(side),2)
            cmds.makeIdentity( '%s_arm_01_bln_jnt'%(side),apply=True, rotate=True)
            
            toParentCon = [('%s_fk_arm_01_jnt'%(side),'%s_arm_01_bln_jnt'%(side)),('%s_ik_01_jnt'%(side), '%s_arm_01_bln_jnt'%(side)),('%s_fk_arm_02_jnt'%(side), '%s_arm_02_bln_jnt'%(side)),('%s_ik_02_jnt'%(side), '%s_arm_02_bln_jnt'%(side)),('%s_fk_arm_03_jnt'%(side), '%s_arm_03_bln_jnt'%(side)),('%s_ik_03_jnt'%(side), '%s_arm_03_bln_jnt'%(side))]
            for each in toParentCon:
                cmds.parentConstraint(each[0],each[1],mo = True)
                
            cmds.curve(d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
            cmds.rename('%s_ik_fk_switch'%(side))
            ControllerAttr('%s_ik_fk_switch'%(side),False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,15,False,False,False,True,True,True)
            cmds.group(n='%s_ik_fk_switch_grp'%(side))
            cmds.parent('%s_ik_fk_switch_grp'%(side), 'world_ctrl')
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='IKFK', min = 0, max=1 ,k=1,dv=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='bendyVis',at = 'bool',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='thumbCurl',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='indexCurl',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='middleCurl',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='ringCurl',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='pinkyCurl',k=1)
            cmds.parentConstraint('%s_arm_03_bln_jnt'%(side), '%s_ik_fk_switch_grp'%(side))
            cmds.shadingNode('reverse',n = '%s_arm_ik_rev'%(side),asUtility=1)
            
            toConnectAttr = [('%s_ik_fk_switch.IKFK'%(side),'%s_arm_03_bln_jnt_parentConstraint1.%s_fk_arm_03_jntW0'%(side,side)),('%s_ik_fk_switch.IKFK'%(side),'%s_arm_02_bln_jnt_parentConstraint1.%s_fk_arm_02_jntW0'%(side,side)),('%s_ik_fk_switch.IKFK'%(side),'%s_arm_01_bln_jnt_parentConstraint1.%s_fk_arm_01_jntW0'%(side,side)),('%s_ik_fk_switch.IKFK'%(side),'%s_arm_ik_rev.inputX'%(side)),('%s_arm_ik_rev.outputX'%(side),'%s_arm_03_bln_jnt_parentConstraint1.%s_ik_03_jntW1'%(side,side)),('%s_arm_ik_rev.outputX'%(side),'%s_arm_02_bln_jnt_parentConstraint1.%s_ik_02_jntW1'%(side,side)),('%s_arm_ik_rev.outputX'%(side),'%s_arm_01_bln_jnt_parentConstraint1.%s_ik_01_jntW1'%(side,side)),('%s_ik_fk_switch.IKFK'%(side),'%s_fk_arm_01_ctrl_grp.visibility'%(side)),('%s_arm_ik_rev.outputX'%(side),'%s_ik_arm_ctrl_grp.visibility'%(side)),('%s_arm_ik_rev.outputX'%(side),'%s_elbow_ctrl_grp.visibility'%(side)),('%s_arm_ik_rev.outputX'%(side),'%s_elbow_direction_crv_grp.visibility'%(side))]
            for each in toConnectAttr:
                cmds.connectAttr(each[0],each[1])
            
        IKFKarmSetup('l')
        IKFKarmSetup('r')
    
        def bendyArmSetup(side):
            cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
            cmds.rename('%s_upr_bendy_arm_crv'%(side))
            cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
            cmds.rename('%s_lwr_bendy_arm_crv'%(side))
            nameOfLoc = ['%s_upr_bendy_arm_01_loc'%(side),'%s_upr_bendy_arm_02_loc'%(side),'%s_upr_bendy_arm_03_loc'%(side),'%s_upr_bendy_arm_04_loc'%(side),'%s_upr_bendy_arm_05_loc'%(side),'%s_lwr_bendy_arm_01_loc'%(side),'%s_lwr_bendy_arm_02_loc'%(side),'%s_lwr_bendy_arm_03_loc'%(side),'%s_lwr_bendy_arm_04_loc'%(side),'%s_lwr_bendy_arm_05_loc'%(side),'%s_upr_bendy_arm_aim_up_loc'%(side),'%s_lwr_bendy_arm_aim_up_loc'%(side)]
            for each in nameOfLoc:
                cmds.spaceLocator(n=each)

            listToGetPos = [('%s_arm_01_bln_jnt'%(side),'%s_upr_bendy_arm_aim_up_loc'%(side)),('%s_arm_02_bln_jnt'%(side),'%s_lwr_bendy_arm_aim_up_loc'%(side))]
            for each in listToGetPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            cmds.parent('%s_upr_bendy_arm_aim_up_loc'%(side),'%s_arm_01_bln_jnt'%(side))
            cmds.parent('%s_lwr_bendy_arm_aim_up_loc'%(side),'%s_arm_02_bln_jnt'%(side))
            cmds.setAttr('%s_upr_bendy_arm_aim_up_loc.translateY'%(side),50)
            cmds.setAttr('%s_lwr_bendy_arm_aim_up_loc.translateY'%(side),50)
            
            toGetLocPos = [('%s_upr_bendy_arm_01_loc.translateY'%(side),0),('%s_upr_bendy_arm_02_loc.translateY'%(side),2.5),('%s_upr_bendy_arm_03_loc.translateY'%(side),5),('%s_upr_bendy_arm_04_loc.translateY'%(side),7.5),('%s_upr_bendy_arm_05_loc.translateY'%(side),10),('%s_lwr_bendy_arm_01_loc.translateY'%(side),0),('%s_lwr_bendy_arm_02_loc.translateY'%(side),2.5),('%s_lwr_bendy_arm_03_loc.translateY'%(side),5),('%s_lwr_bendy_arm_04_loc.translateY'%(side),7.5),('%s_lwr_bendy_arm_05_loc.translateY'%(side),10),('%s_ik_fk_switch.bendyVis'%(side),1)]
            for each in toGetLocPos:
                cmds.setAttr(each[0],each[1])
        
            toConnectLoc = [('%s_upr_bendy_arm_01_loc.worldPosition[0]'%(side),'%s_upr_bendy_arm_crvShape.controlPoints[0]'%(side)),('%s_upr_bendy_arm_02_loc.worldPosition[0]'%(side),'%s_upr_bendy_arm_crvShape.controlPoints[1]'%(side)),('%s_upr_bendy_arm_03_loc.worldPosition[0]'%(side),'%s_upr_bendy_arm_crvShape.controlPoints[2]'%(side)),('%s_upr_bendy_arm_04_loc.worldPosition[0]'%(side),'%s_upr_bendy_arm_crvShape.controlPoints[3]'%(side)),('%s_upr_bendy_arm_05_loc.worldPosition[0]'%(side),'%s_upr_bendy_arm_crvShape.controlPoints[4]'%(side)),('%s_lwr_bendy_arm_01_loc.worldPosition[0]'%(side),'%s_lwr_bendy_arm_crvShape.controlPoints[0]'%(side)),('%s_lwr_bendy_arm_02_loc.worldPosition[0]'%(side),'%s_lwr_bendy_arm_crvShape.controlPoints[1]'%(side)),('%s_lwr_bendy_arm_03_loc.worldPosition[0]'%(side),'%s_lwr_bendy_arm_crvShape.controlPoints[2]'%(side)),('%s_lwr_bendy_arm_04_loc.worldPosition[0]'%(side),'%s_lwr_bendy_arm_crvShape.controlPoints[3]'%(side)),('%s_lwr_bendy_arm_05_loc.worldPosition[0]'%(side),'%s_lwr_bendy_arm_crvShape.controlPoints[4]'%(side))]
            for each in toConnectLoc:
                cmds.connectAttr(each[0],each[1])
                
            listOfBendyArmController = [('%s_bendy_arm_01_ctrl'%(side),'%s_bendy_arm_01_ctrl_grp'%(side)),('%s_bendy_arm_02_ctrl'%(side),'%s_bendy_arm_02_ctrl_grp'%(side)),('%s_bendy_arm_03_ctrl'%(side),'%s_bendy_arm_03_ctrl_grp'%(side))]
            for each in listOfBendyArmController:
                cmds.curve(d=1, p=[(0, -3, 3),(0, -1, 2),(0, 0, 4),(0, 1, 2),(0, 3, 3),(0, 2, 1),(0, 4, 0),(0, 2, -1),(0, 3, -3),(0, 1, -2),(0, 0, -4),(0, -1, -2),(0, -3, -3),(0, -2, -1),(0, -4, 0),(0, -2, 1),(0, -3, 3)])
                cmds.rename(each[0])
                cmds.group(n=each[1])
            cmds.delete('%s_bendy_arm_01_ctrl'%(side),'%s_bendy_arm_02_ctrl'%(side),'%s_bendy_arm_03_ctrl'%(side),constructionHistory = True)
            
            uprBendyController01forDel = cmds.pointConstraint('%s_arm_01_setup'%(side),'%s_bendy_arm_01_ctrl_grp'%(side),mo=False)
            uprBendyController01forDel = cmds.pointConstraint('%s_arm_02_setup'%(side),'%s_bendy_arm_01_ctrl_grp'%(side),mo=False)
            uprBendyController02forDel = cmds.pointConstraint('%s_arm_02_setup'%(side),'%s_bendy_arm_02_ctrl_grp'%(side),mo=False)
            uprBendyController03forDel = cmds.pointConstraint('%s_arm_02_setup'%(side),'%s_bendy_arm_03_ctrl_grp'%(side),mo=False)
            uprBendyController03forDel = cmds.pointConstraint('%s_arm_03_setup'%(side),'%s_bendy_arm_03_ctrl_grp'%(side),mo=False)
            uprBendyControllerForRotation01forDel = cmds.orientConstraint('%s_arm_01_setup'%(side),'%s_bendy_arm_01_ctrl_grp'%(side),mo=False)
            uprBendyControllerForRotation02forDel = cmds.orientConstraint('%s_arm_02_setup'%(side),'%s_bendy_arm_02_ctrl_grp'%(side),mo=False)
            uprBendyControllerForRotation03forDel = cmds.orientConstraint('%s_arm_02_setup'%(side),'%s_bendy_arm_03_ctrl_grp'%(side),mo=False)
            cmds.delete(uprBendyController01forDel,uprBendyController02forDel,uprBendyController03forDel,uprBendyControllerForRotation01forDel,uprBendyControllerForRotation02forDel,uprBendyControllerForRotation03forDel)
            
            listOfUprBendyJoint = ['%s_upr_bendy_arm_01_jnt'%(side),'%s_upr_bendy_arm_02_jnt'%(side),'%s_upr_bendy_arm_03_jnt'%(side),'%s_upr_bendy_arm_04_jnt'%(side),'%s_upr_bendy_arm_05_jnt'%(side),'%s_lwr_bendy_arm_01_jnt'%(side),'%s_lwr_bendy_arm_02_jnt'%(side),'%s_lwr_bendy_arm_03_jnt'%(side),'%s_lwr_bendy_arm_04_jnt'%(side),'%s_lwr_bendy_arm_05_jnt'%(side),'%s_upr_bendy_arm_01_length_jnt'%(side),'%s_upr_bendy_arm_02_length_jnt'%(side),'%s_upr_bendy_arm_03_length_jnt'%(side),'%s_upr_bendy_arm_04_length_jnt'%(side),'%s_upr_bendy_arm_05_length_jnt'%(side),'%s_lwr_bendy_arm_01_length_jnt'%(side),'%s_lwr_bendy_arm_02_length_jnt'%(side),'%s_lwr_bendy_arm_03_length_jnt'%(side),'%s_lwr_bendy_arm_04_length_jnt'%(side),'%s_lwr_bendy_arm_05_length_jnt'%(side),'%s_lwr_bendy_arm_start_length_jnt'%(side),'%s_lwr_bendy_arm_end_length_jnt'%(side),'%s_upr_bendy_arm_start_length_jnt'%(side),'%s_upr_bendy_arm_end_length_jnt'%(side)]
            for each in listOfUprBendyJoint:
                cmds.joint(n=each)
            cmds.parent('%s_upr_bendy_arm_01_jnt'%(side),'%s_lwr_bendy_arm_01_jnt'%(side),'%s_upr_bendy_arm_01_length_jnt'%(side),'%s_lwr_bendy_arm_01_length_jnt'%(side),'%s_upr_bendy_arm_start_length_jnt'%(side),'%s_lwr_bendy_arm_start_length_jnt'%(side),w=True)
            cmds.group(n='%s_upr_bendy_arm_jnt_grp'%(side),em=True)
            cmds.group(n='%s_lwr_bendy_arm_jnt_grp'%(side),em=True)
            cmds.parent('%s_upr_bendy_arm_01_jnt'%(side),'%s_upr_bendy_arm_jnt_grp'%(side))
            cmds.parent('%s_lwr_bendy_arm_01_jnt'%(side),'%s_lwr_bendy_arm_jnt_grp'%(side))
            cmds.orientConstraint('%s_arm_01_bln_jnt'%(side),'%s_upr_bendy_arm_jnt_grp'%(side),mo=True)
            cmds.orientConstraint('%s_arm_02_bln_jnt'%(side),'%s_lwr_bendy_arm_jnt_grp'%(side),mo=True)
            uprBendyJoint01forDel = cmds.pointConstraint('%s_arm_01_setup'%(side),'%s_upr_bendy_arm_01_jnt'%(side),mo=False)
            uprBendyJoint02forDel = cmds.pointConstraint('%s_arm_01_setup'%(side),'%s_upr_bendy_arm_02_jnt'%(side),mo=False)
            uprBendyJoint02forDel = cmds.pointConstraint('%s_bendy_arm_01_ctrl'%(side),'%s_upr_bendy_arm_02_jnt'%(side),mo=False)
            uprBendyJoint03forDel = cmds.pointConstraint('%s_bendy_arm_01_ctrl'%(side),'%s_upr_bendy_arm_03_jnt'%(side),mo=False)
            uprBendyJoint04forDel = cmds.pointConstraint('%s_bendy_arm_01_ctrl'%(side),'%s_upr_bendy_arm_04_jnt'%(side),mo=False)
            uprBendyJoint04forDel = cmds.pointConstraint('%s_arm_02_setup'%(side),'%s_upr_bendy_arm_04_jnt'%(side),mo=False)
            uprBendyJoint05forDel = cmds.pointConstraint('%s_arm_02_setup'%(side),'%s_upr_bendy_arm_05_jnt'%(side),mo=False)
            lwrBendyJoint01forDel = cmds.pointConstraint('%s_arm_02_setup'%(side),'%s_lwr_bendy_arm_01_jnt'%(side),mo=False)
            lwrBendyJoint02forDel = cmds.pointConstraint('%s_arm_02_setup'%(side),'%s_lwr_bendy_arm_02_jnt'%(side),mo=False)
            lwrBendyJoint02forDel = cmds.pointConstraint('%s_bendy_arm_03_ctrl'%(side),'%s_lwr_bendy_arm_02_jnt'%(side),mo=False)
            lwrBendyJoint03forDel = cmds.pointConstraint('%s_bendy_arm_03_ctrl'%(side),'%s_lwr_bendy_arm_03_jnt'%(side),mo=False)
            lwrBendyJoint04forDel = cmds.pointConstraint('%s_bendy_arm_03_ctrl'%(side),'%s_lwr_bendy_arm_04_jnt'%(side),mo=False)
            lwrBendyJoint04forDel = cmds.pointConstraint('%s_arm_03_setup'%(side),'%s_lwr_bendy_arm_04_jnt'%(side),mo=False)
            lwrBendyJoint05forDel = cmds.pointConstraint('%s_arm_03_setup'%(side),'%s_lwr_bendy_arm_05_jnt'%(side),mo=False)
            uprBendyJointForRatation01forDel = cmds.orientConstraint('%s_arm_01_setup'%(side),'%s_upr_bendy_arm_01_jnt'%(side),mo=False)
            uprBendyJointForRatation02forDel = cmds.orientConstraint('%s_arm_01_setup'%(side),'%s_upr_bendy_arm_02_jnt'%(side),mo=False)
            uprBendyJointForRatation03forDel = cmds.orientConstraint('%s_arm_01_setup'%(side),'%s_upr_bendy_arm_03_jnt'%(side),mo=False)
            uprBendyJointForRatation04forDel = cmds.orientConstraint('%s_arm_01_setup'%(side),'%s_upr_bendy_arm_04_jnt'%(side),mo=False)
            uprBendyJointForRatation05forDel = cmds.orientConstraint('%s_arm_01_setup'%(side),'%s_upr_bendy_arm_05_jnt'%(side),mo=False)
            lwrBendyJointForRatation01forDel = cmds.orientConstraint('%s_arm_02_setup'%(side),'%s_lwr_bendy_arm_01_jnt'%(side),mo=False)
            lwrBendyJointForRatation02forDel = cmds.orientConstraint('%s_arm_02_setup'%(side),'%s_lwr_bendy_arm_02_jnt'%(side),mo=False)
            lwrBendyJointForRatation03forDel = cmds.orientConstraint('%s_arm_02_setup'%(side),'%s_lwr_bendy_arm_03_jnt'%(side),mo=False)
            lwrBendyJointForRatation04forDel = cmds.orientConstraint('%s_arm_02_setup'%(side),'%s_lwr_bendy_arm_04_jnt'%(side),mo=False)
            lwrBendyJointForRatation05forDel = cmds.orientConstraint('%s_arm_02_setup'%(side),'%s_lwr_bendy_arm_05_jnt'%(side),mo=False)
            cmds.delete(uprBendyJoint01forDel,uprBendyJoint02forDel,uprBendyJoint03forDel,uprBendyJoint04forDel,uprBendyJoint05forDel,lwrBendyJoint01forDel,lwrBendyJoint02forDel,lwrBendyJoint03forDel,lwrBendyJoint04forDel,lwrBendyJoint05forDel,uprBendyJointForRatation01forDel,uprBendyJointForRatation02forDel,uprBendyJointForRatation03forDel,uprBendyJointForRatation04forDel,uprBendyJointForRatation05forDel,lwrBendyJointForRatation01forDel,lwrBendyJointForRatation02forDel,lwrBendyJointForRatation03forDel,lwrBendyJointForRatation04forDel,lwrBendyJointForRatation05forDel)
            
            listOfBendyArmLenghtJointToGetPos = [('%s_upr_bendy_arm_01_jnt'%(side),'%s_upr_bendy_arm_01_length_jnt'%(side)),('%s_upr_bendy_arm_02_jnt'%(side),'%s_upr_bendy_arm_02_length_jnt'%(side)),('%s_upr_bendy_arm_03_jnt'%(side),'%s_upr_bendy_arm_03_length_jnt'%(side)),('%s_upr_bendy_arm_04_jnt'%(side),'%s_upr_bendy_arm_04_length_jnt'%(side)),('%s_upr_bendy_arm_05_jnt'%(side),'%s_upr_bendy_arm_05_length_jnt'%(side)),('%s_lwr_bendy_arm_01_jnt'%(side),'%s_lwr_bendy_arm_01_length_jnt'%(side)),('%s_lwr_bendy_arm_02_jnt'%(side),'%s_lwr_bendy_arm_02_length_jnt'%(side)),('%s_lwr_bendy_arm_03_jnt'%(side),'%s_lwr_bendy_arm_03_length_jnt'%(side)),('%s_lwr_bendy_arm_04_jnt'%(side),'%s_lwr_bendy_arm_04_length_jnt'%(side)),('%s_lwr_bendy_arm_05_jnt'%(side),'%s_lwr_bendy_arm_05_length_jnt'%(side)),('%s_upr_bendy_arm_01_jnt'%(side),'%s_upr_bendy_arm_start_length_jnt'%(side)),('%s_upr_bendy_arm_05_jnt'%(side),'%s_upr_bendy_arm_end_length_jnt'%(side)),('%s_lwr_bendy_arm_01_jnt'%(side),'%s_lwr_bendy_arm_start_length_jnt'%(side)),('%s_lwr_bendy_arm_05_jnt'%(side),'%s_lwr_bendy_arm_end_length_jnt'%(side))]
            for each in listOfBendyArmLenghtJointToGetPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            cmds.makeIdentity('%s_upr_bendy_arm_01_jnt'%(side),'%s_lwr_bendy_arm_01_jnt'%(side),'%s_upr_bendy_arm_01_length_jnt'%(side),'%s_lwr_bendy_arm_01_length_jnt'%(side),'%s_upr_bendy_arm_start_length_jnt'%(side),'%s_lwr_bendy_arm_start_length_jnt'%(side),apply=True,rotate=True)
            
            locToGetPos = [('%s_upr_bendy_arm_01_jnt'%(side),'%s_upr_bendy_arm_01_loc'%(side)),('%s_upr_bendy_arm_02_jnt'%(side),'%s_upr_bendy_arm_02_loc'%(side)),('%s_upr_bendy_arm_03_jnt'%(side),'%s_upr_bendy_arm_03_loc'%(side)),('%s_upr_bendy_arm_04_jnt'%(side),'%s_upr_bendy_arm_04_loc'%(side)),('%s_upr_bendy_arm_05_jnt'%(side),'%s_upr_bendy_arm_05_loc'%(side)),('%s_lwr_bendy_arm_01_jnt'%(side),'%s_lwr_bendy_arm_01_loc'%(side)),('%s_lwr_bendy_arm_02_jnt'%(side),'%s_lwr_bendy_arm_02_loc'%(side)),('%s_lwr_bendy_arm_03_jnt'%(side),'%s_lwr_bendy_arm_03_loc'%(side)),('%s_lwr_bendy_arm_04_jnt'%(side),'%s_lwr_bendy_arm_04_loc'%(side)),('%s_lwr_bendy_arm_05_jnt'%(side),'%s_lwr_bendy_arm_05_loc'%(side))]
            for each in locToGetPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
                
            list = ['%s_upr_bendy_arm_loc_grp'%(side),'%s_lwr_bendy_arm_loc_grp'%(side),'%s_bendy_arm_ctrl_grp'%(side),'%s_bendy_arm_jnt_grp'%(side)]
            for each in list:
                cmds.group(n=each,em=True)
                
            cmds.connectAttr('%s_ik_fk_switch.bendyVis'%(side),'%s_bendy_arm_ctrl_grp.visibility'%(side))
            
            list = [('%s_lwr_bendy_arm_jnt_grp'%(side),'%s_bendy_arm_jnt_grp'%(side)),('%s_upr_bendy_arm_jnt_grp'%(side),'%s_bendy_arm_jnt_grp'%(side)),('%s_upr_bendy_arm_01_loc'%(side),'%s_upr_bendy_arm_loc_grp'%(side)),('%s_upr_bendy_arm_02_loc'%(side),'%s_upr_bendy_arm_loc_grp'%(side)),('%s_upr_bendy_arm_03_loc'%(side),'%s_upr_bendy_arm_loc_grp'%(side)),('%s_upr_bendy_arm_04_loc'%(side),'%s_upr_bendy_arm_loc_grp'%(side)),('%s_upr_bendy_arm_05_loc'%(side),'%s_upr_bendy_arm_loc_grp'%(side)),('%s_lwr_bendy_arm_01_loc'%(side),'%s_lwr_bendy_arm_loc_grp'%(side)),('%s_lwr_bendy_arm_02_loc'%(side),'%s_lwr_bendy_arm_loc_grp'%(side)),('%s_lwr_bendy_arm_03_loc'%(side),'%s_lwr_bendy_arm_loc_grp'%(side)),('%s_lwr_bendy_arm_04_loc'%(side),'%s_lwr_bendy_arm_loc_grp'%(side)),('%s_lwr_bendy_arm_05_loc'%(side),'%s_lwr_bendy_arm_loc_grp'%(side)),('%s_bendy_arm_01_ctrl_grp'%(side),'%s_bendy_arm_ctrl_grp'%(side)),('%s_bendy_arm_02_ctrl_grp'%(side),'%s_bendy_arm_ctrl_grp'%(side)),('%s_bendy_arm_03_ctrl_grp'%(side),'%s_bendy_arm_ctrl_grp'%(side)),('%s_upr_bendy_arm_01_length_jnt'%(side),'%s_bendy_arm_jnt_grp'%(side)),('%s_lwr_bendy_arm_01_length_jnt'%(side),'%s_bendy_arm_jnt_grp'%(side)),('%s_upr_bendy_arm_start_length_jnt'%(side),'%s_bendy_arm_jnt_grp'%(side)),('%s_lwr_bendy_arm_start_length_jnt'%(side),'%s_bendy_arm_jnt_grp'%(side))]
            for each in list:
                cmds.parent(each[0],each[1])
                
            list = [('%s_bendy_arm_01_ctrl'%(side)),('%s_bendy_arm_02_ctrl'%(side)),('%s_bendy_arm_03_ctrl'%(side))]
            for each in list:
                cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.rotateX',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.rotateY',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.rotateZ',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.overrideEnabled' ,True) 
                cmds.setAttr (each+'.overrideColor' ,18)
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
    
        bendyArmSetup('l')
        bendyArmSetup('r')
        
        def bendyArmIKsetup():
            cmds.setAttr('r_lwr_bendy_arm_aim_up_loc.translateY',-50)
            cmds.setAttr('r_upr_bendy_arm_aim_up_loc.translateY',-50)
            list = ['r_upr_bendy_arm_02_jnt','r_upr_bendy_arm_03_jnt','r_upr_bendy_arm_04_jnt','r_upr_bendy_arm_05_jnt','r_lwr_bendy_arm_02_jnt','r_lwr_bendy_arm_03_jnt','r_lwr_bendy_arm_04_jnt','r_lwr_bendy_arm_05_jnt']
            for each in list:
                cmds.parent(each,w=True)
            
            list = ['r_upr_bendy_arm_01_jnt.rotateY','r_lwr_bendy_arm_01_jnt.rotateY','r_upr_bendy_arm_02_jnt.rotateY','r_upr_bendy_arm_03_jnt.rotateY','r_upr_bendy_arm_04_jnt.rotateY','r_upr_bendy_arm_05_jnt.rotateY','r_lwr_bendy_arm_02_jnt.rotateY','r_lwr_bendy_arm_03_jnt.rotateY','r_lwr_bendy_arm_04_jnt.rotateY','r_lwr_bendy_arm_05_jnt.rotateY']
            for each in list:
                cmds.setAttr(each,180)
            
            list = [('r_upr_bendy_arm_02_jnt','r_upr_bendy_arm_01_jnt'),('r_upr_bendy_arm_03_jnt','r_upr_bendy_arm_02_jnt'),('r_upr_bendy_arm_04_jnt','r_upr_bendy_arm_03_jnt'),('r_upr_bendy_arm_05_jnt','r_upr_bendy_arm_04_jnt'),('r_lwr_bendy_arm_02_jnt','r_lwr_bendy_arm_01_jnt'),('r_lwr_bendy_arm_03_jnt','r_lwr_bendy_arm_02_jnt'),('r_lwr_bendy_arm_04_jnt','r_lwr_bendy_arm_03_jnt'),('r_lwr_bendy_arm_05_jnt','r_lwr_bendy_arm_04_jnt')]
            for each in list:
                cmds.parent(each[0],each[1])
                
            cmds.makeIdentity('r_upr_bendy_arm_01_jnt','r_lwr_bendy_arm_01_jnt',apply=True,rotate=True)
            cmds.select('l_upr_bendy_arm_01_jnt','l_upr_bendy_arm_05_jnt','l_upr_bendy_arm_crv')
            cmds.ikHandle(n='l_upr_bendy_arm_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
            cmds.select('l_lwr_bendy_arm_01_jnt','l_lwr_bendy_arm_05_jnt','l_lwr_bendy_arm_crv')
            cmds.ikHandle(n='l_lwr_bendy_arm_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
            cmds.select('r_upr_bendy_arm_01_jnt','r_upr_bendy_arm_05_jnt','r_upr_bendy_arm_crv')
            cmds.ikHandle(n='r_upr_bendy_arm_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
            cmds.select('r_lwr_bendy_arm_01_jnt','r_lwr_bendy_arm_05_jnt','r_lwr_bendy_arm_crv')
            cmds.ikHandle(n='r_lwr_bendy_arm_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
            list = [('l_arm_01_bln_jnt','l_upr_bendy_arm_01_loc'),('l_arm_01_bln_jnt','l_upr_bendy_arm_02_loc'),('l_bendy_arm_01_ctrl','l_upr_bendy_arm_02_loc'),('l_bendy_arm_01_ctrl','l_upr_bendy_arm_03_loc'),('l_bendy_arm_01_ctrl','l_upr_bendy_arm_04_loc'),('l_bendy_arm_02_ctrl','l_upr_bendy_arm_04_loc'),('l_bendy_arm_02_ctrl','l_upr_bendy_arm_05_loc'),('l_bendy_arm_02_ctrl','l_lwr_bendy_arm_01_loc'),('l_bendy_arm_02_ctrl','l_lwr_bendy_arm_02_loc'),('l_bendy_arm_03_ctrl','l_lwr_bendy_arm_02_loc'),('l_bendy_arm_03_ctrl','l_lwr_bendy_arm_03_loc'),('l_bendy_arm_03_ctrl','l_lwr_bendy_arm_04_loc'),('l_arm_03_bln_jnt','l_lwr_bendy_arm_04_loc'),('l_arm_03_bln_jnt','l_lwr_bendy_arm_05_loc'),('r_arm_01_bln_jnt','r_upr_bendy_arm_01_loc'),('r_arm_01_bln_jnt','r_upr_bendy_arm_02_loc'),('r_bendy_arm_01_ctrl','r_upr_bendy_arm_02_loc'),('r_bendy_arm_01_ctrl','r_upr_bendy_arm_03_loc'),('r_bendy_arm_01_ctrl','r_upr_bendy_arm_04_loc'),('r_bendy_arm_02_ctrl','r_upr_bendy_arm_04_loc'),('r_bendy_arm_02_ctrl','r_upr_bendy_arm_05_loc'),('r_bendy_arm_02_ctrl','r_lwr_bendy_arm_01_loc'),('r_bendy_arm_02_ctrl','r_lwr_bendy_arm_02_loc'),('r_bendy_arm_03_ctrl','r_lwr_bendy_arm_02_loc'),('r_bendy_arm_03_ctrl','r_lwr_bendy_arm_03_loc'),('r_bendy_arm_03_ctrl','r_lwr_bendy_arm_04_loc'),('r_arm_03_bln_jnt','r_lwr_bendy_arm_04_loc'),('r_arm_03_bln_jnt','r_lwr_bendy_arm_05_loc')]
            for each in list:
                cmds.pointConstraint(each[0],each[1],mo=True)
            cmds.pointConstraint('l_arm_01_bln_jnt','l_bendy_arm_01_ctrl_grp',mo = True)
            cmds.pointConstraint('l_bendy_arm_02_ctrl','l_bendy_arm_01_ctrl_grp',mo = True)
            cmds.aimConstraint('l_bendy_arm_02_ctrl','l_bendy_arm_01_ctrl_grp',wut = 'object',wuo = 'l_upr_bendy_arm_aim_up_loc',mo = True)
            cmds.parentConstraint('l_arm_02_bln_jnt','l_bendy_arm_02_ctrl_grp',mo=True)
            cmds.pointConstraint('l_arm_03_bln_jnt','l_bendy_arm_03_ctrl_grp',mo = True)
            cmds.pointConstraint('l_bendy_arm_02_ctrl','l_bendy_arm_03_ctrl_grp',mo = True)
            cmds.aimConstraint('l_bendy_arm_02_ctrl','l_bendy_arm_03_ctrl_grp',wut = 'object',wuo = 'l_lwr_bendy_arm_aim_up_loc',mo = True)
            cmds.scaleConstraint('world_ctrl','l_bendy_arm_01_ctrl_grp',mo = True)
            cmds.scaleConstraint('world_ctrl','l_bendy_arm_02_ctrl_grp',mo = True)
            cmds.scaleConstraint('world_ctrl','l_bendy_arm_03_ctrl_grp',mo = True)
            cmds.pointConstraint('r_arm_01_bln_jnt','r_bendy_arm_01_ctrl_grp',mo = True)
            cmds.pointConstraint('r_bendy_arm_02_ctrl','r_bendy_arm_01_ctrl_grp',mo = True)
            cmds.aimConstraint('r_bendy_arm_02_ctrl','r_bendy_arm_01_ctrl_grp',wut = 'object',wuo = 'r_upr_bendy_arm_aim_up_loc',mo = True)
            cmds.parentConstraint('r_arm_02_bln_jnt','r_bendy_arm_02_ctrl_grp',mo=True)
            cmds.pointConstraint('r_arm_03_bln_jnt','r_bendy_arm_03_ctrl_grp',mo = True)
            cmds.pointConstraint('r_bendy_arm_02_ctrl','r_bendy_arm_03_ctrl_grp',mo = True)
            cmds.aimConstraint('r_bendy_arm_02_ctrl','r_bendy_arm_03_ctrl_grp',wut = 'object',wuo = 'r_lwr_bendy_arm_aim_up_loc',mo = True)
            cmds.scaleConstraint('world_ctrl','r_bendy_arm_01_ctrl_grp',mo = True)
            cmds.scaleConstraint('world_ctrl','r_bendy_arm_02_ctrl_grp',mo = True)
            cmds.scaleConstraint('world_ctrl','r_bendy_arm_03_ctrl_grp',mo = True)
            
            createNode = [('multiplyDivide','r_bendy_arm_twist_mult'),('multiplyDivide','l_upr_bendy_arm_stretch_01_mult'),('multiplyDivide','l_upr_bendy_arm_stretch_02_mult'),('multiplyDivide','l_lwr_bendy_arm_stretch_01_mult'),('multiplyDivide','l_lwr_bendy_arm_stretch_02_mult'),('multiplyDivide','r_upr_bendy_arm_stretch_01_mult'),('multiplyDivide','r_upr_bendy_arm_stretch_02_mult'),('multiplyDivide','r_lwr_bendy_arm_stretch_01_mult'),('multiplyDivide','r_lwr_bendy_arm_stretch_02_mult')]
            for each in createNode:
                cmds.shadingNode(each[0],n=each[1],asUtility=1)
                
            toSetNode = [('r_bendy_arm_twist_mult.input2Y',-1),('r_bendy_arm_twist_mult.input2X',-1),('l_upr_bendy_arm_stretch_01_mult.operation',2),('l_upr_bendy_arm_stretch_01_mult.operation',2),('l_lwr_bendy_arm_stretch_01_mult.operation',2),('l_lwr_bendy_arm_stretch_01_mult.operation',2),('l_upr_bendy_arm_stretch_01_mult.operation',2),('r_upr_bendy_arm_stretch_01_mult.operation',2),('r_lwr_bendy_arm_stretch_01_mult.operation',2),('r_lwr_bendy_arm_stretch_01_mult.operation',2)]
            for each in toSetNode:
                cmds.setAttr(each[0],each[1])
        
            uprArmCurveInfo = cmds.arclen('l_upr_bendy_arm_crv',ch = True)
            cmds.rename(uprArmCurveInfo,'l_upr_bendy_arm_crv_info')
            lwrArmCurveInfo = cmds.arclen('l_lwr_bendy_arm_crv',ch = True)
            cmds.rename(lwrArmCurveInfo,'l_lwr_bendy_arm_crv_info')
            uprArmCurveInfo = cmds.arclen('r_upr_bendy_arm_crv',ch = True)
            cmds.rename(uprArmCurveInfo,'r_upr_bendy_arm_crv_info')
            lwrArmCurveInfo = cmds.arclen('r_lwr_bendy_arm_crv',ch = True)
            cmds.rename(lwrArmCurveInfo,'r_lwr_bendy_arm_crv_info')    
            
            toConnectAttr = [('r_arm_03_bln_jnt.rotateX','r_bendy_arm_twist_mult.input1Y'),('r_arm_02_bln_jnt.rotateX','r_bendy_arm_twist_mult.input1X'),('r_bendy_arm_twist_mult.outputX','r_upr_bendy_arm_ikh.twist'),('r_bendy_arm_twist_mult.outputY','r_lwr_bendy_arm_ikh.twist'),('l_arm_02_bln_jnt.rotateX','l_upr_bendy_arm_ikh.twist'),('l_upr_bendy_arm_crv_info.arcLength','l_upr_bendy_arm_stretch_01_mult.input1X'),('l_upr_bendy_arm_stretch_01_mult.outputX','l_upr_bendy_arm_stretch_02_mult.input1X'),('l_upr_bendy_arm_02_length_jnt.translateX','l_upr_bendy_arm_stretch_02_mult.input2X'),('l_upr_bendy_arm_stretch_02_mult.outputX','l_upr_bendy_arm_02_jnt.translateX'),('l_upr_bendy_arm_stretch_02_mult.outputX','l_upr_bendy_arm_03_jnt.translateX'),('l_upr_bendy_arm_stretch_02_mult.outputX','l_upr_bendy_arm_04_jnt.translateX'),('l_upr_bendy_arm_stretch_02_mult.outputX','l_upr_bendy_arm_05_jnt.translateX'),('l_upr_bendy_arm_end_length_jnt.translateX','l_upr_bendy_arm_stretch_01_mult.input2X'),('l_arm_03_bln_jnt.rotateX','l_lwr_bendy_arm_ikh.twist'),('l_lwr_bendy_arm_crv_info.arcLength','l_lwr_bendy_arm_stretch_01_mult.input1X'),('l_lwr_bendy_arm_stretch_01_mult.outputX','l_lwr_bendy_arm_stretch_02_mult.input1X'),('l_lwr_bendy_arm_02_length_jnt.translateX','l_lwr_bendy_arm_stretch_02_mult.input2X'),('l_lwr_bendy_arm_stretch_02_mult.outputX','l_lwr_bendy_arm_02_jnt.translateX'),('l_lwr_bendy_arm_stretch_02_mult.outputX','l_lwr_bendy_arm_03_jnt.translateX'),('l_lwr_bendy_arm_stretch_02_mult.outputX','l_lwr_bendy_arm_04_jnt.translateX'),('l_lwr_bendy_arm_stretch_02_mult.outputX','l_lwr_bendy_arm_05_jnt.translateX'),('l_lwr_bendy_arm_end_length_jnt.translateX','l_lwr_bendy_arm_stretch_01_mult.input2X'),('r_upr_bendy_arm_crv_info.arcLength','r_upr_bendy_arm_stretch_01_mult.input1X'),('r_upr_bendy_arm_stretch_01_mult.outputX','r_upr_bendy_arm_stretch_02_mult.input1X'),('r_upr_bendy_arm_02_length_jnt.translateX','r_upr_bendy_arm_stretch_02_mult.input2X'),('r_upr_bendy_arm_stretch_02_mult.outputX','r_upr_bendy_arm_02_jnt.translateX'),('r_upr_bendy_arm_stretch_02_mult.outputX','r_upr_bendy_arm_03_jnt.translateX'),('r_upr_bendy_arm_stretch_02_mult.outputX','r_upr_bendy_arm_04_jnt.translateX'),('r_upr_bendy_arm_stretch_02_mult.outputX','r_upr_bendy_arm_05_jnt.translateX'),('r_upr_bendy_arm_end_length_jnt.translateX','r_upr_bendy_arm_stretch_01_mult.input2X'),('r_lwr_bendy_arm_crv_info.arcLength','r_lwr_bendy_arm_stretch_01_mult.input1X'),('r_lwr_bendy_arm_stretch_01_mult.outputX','r_lwr_bendy_arm_stretch_02_mult.input1X'),('r_lwr_bendy_arm_02_length_jnt.translateX','r_lwr_bendy_arm_stretch_02_mult.input2X'),('r_lwr_bendy_arm_stretch_02_mult.outputX','r_lwr_bendy_arm_02_jnt.translateX'),('r_lwr_bendy_arm_stretch_02_mult.outputX','r_lwr_bendy_arm_03_jnt.translateX'),('r_lwr_bendy_arm_stretch_02_mult.outputX','r_lwr_bendy_arm_04_jnt.translateX'),('r_lwr_bendy_arm_stretch_02_mult.outputX','r_lwr_bendy_arm_05_jnt.translateX'),('r_lwr_bendy_arm_end_length_jnt.translateX','r_lwr_bendy_arm_stretch_01_mult.input2X')]
            for each in toConnectAttr:
                cmds.connectAttr(each[0],each[1])
                
            list = ['l_upr_bendy_arm_ik_setup_grp','r_upr_bendy_arm_ik_setup_grp','l_lwr_bendy_arm_ik_setup_grp','r_lwr_bendy_arm_ik_setup_grp','arm_bendy_setup_grp']
            for each in list:
                cmds.group(n=each,em=True)
                
            list = [('l_upr_bendy_arm_ik_setup_grp','arm_bendy_setup_grp'),('r_upr_bendy_arm_ik_setup_grp','arm_bendy_setup_grp'),('l_lwr_bendy_arm_ik_setup_grp','arm_bendy_setup_grp'),('r_lwr_bendy_arm_ik_setup_grp','arm_bendy_setup_grp'),('l_upr_bendy_arm_loc_grp','arm_bendy_setup_grp'),('l_lwr_bendy_arm_loc_grp','arm_bendy_setup_grp'),('r_upr_bendy_arm_loc_grp','arm_bendy_setup_grp'),('r_lwr_bendy_arm_loc_grp','arm_bendy_setup_grp'),('l_bendy_arm_ctrl_grp','world_ctrl'),('r_bendy_arm_ctrl_grp','world_ctrl'),('l_upr_bendy_arm_crv','l_upr_bendy_arm_ik_setup_grp'),('l_upr_bendy_arm_ikh','l_upr_bendy_arm_ik_setup_grp'),('l_lwr_bendy_arm_crv','l_lwr_bendy_arm_ik_setup_grp'),('l_lwr_bendy_arm_ikh','l_lwr_bendy_arm_ik_setup_grp'),('r_upr_bendy_arm_crv','r_upr_bendy_arm_ik_setup_grp'),('r_upr_bendy_arm_ikh','r_upr_bendy_arm_ik_setup_grp'),('r_lwr_bendy_arm_crv','r_lwr_bendy_arm_ik_setup_grp'),('r_lwr_bendy_arm_ikh','r_lwr_bendy_arm_ik_setup_grp')]
            for each in list:
                cmds.parent(each[0],each[1])
 
        bendyArmIKsetup()
        
        def ArmStretchSetup(side):
            ####armStretchsetup####
            jointList = ['%s_arm_01_length_jnt'%(side),'%s_arm_02_length_jnt'%(side),'%s_arm_03_length_jnt'%(side)]
            for each in jointList:
                cmds.joint(n=each)
            cmds.group(n='%s_arm_length_jnt_grp'%(side),em=True)
            cmds.parent('%s_arm_01_length_jnt'%(side),'%s_arm_length_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_arm_length_jnt_grp'%(side),mo=True)
            
            listOfToGetJointPos = [('%s_arm_01_setup'%(side),'%s_arm_01_length_jnt'%(side)),('%s_arm_02_setup'%(side),'%s_arm_02_length_jnt'%(side)),('%s_arm_03_setup'%(side),'%s_arm_03_length_jnt'%(side))]
            for each in listOfToGetJointPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            list = [('distanceBetween','%s_upr_arm_dist'%(side)),('distanceBetween','%s_lwr_arm_dist'%(side)),('addDoubleLinear','%s_arm_full_dist'%(side)),('distanceBetween','%s_arm_stretch_dist'%(side)),('condition','%s_arm_stretch_cond'%(side)),('multiplyDivide','%s_upr_arm_strecth_mult'%(side)),('multiplyDivide','%s_arm_stretch_mult'%(side)),('multiplyDivide','%s_lwr_arm_strecth_mult'%(side)),('multiplyDivide','%s_arm_strecth_option_mult'%(side))]
            for each in list:
                cmds.shadingNode(each[0],n=each[1],asUtility=1)
                
            cmds.spaceLocator(n = '%s_arm_start_dist_loc'%(side))
            cmds.group(n='%s_arm_start_dist_loc_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_arm_start_dist_loc_grp'%(side),mo=True)
            parentarmstartdistloc = cmds.pointConstraint('%s_ik_01_jnt'%(side),'%s_arm_start_dist_loc'%(side),mo = False)
            cmds.delete(parentarmstartdistloc)
            cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_arm_start_dist_loc'%(side),mo=True)
            cmds.spaceLocator(n = '%s_arm_end_dist_loc'%(side))
            cmds.setAttr('%s_arm_end_dist_loc.visibility'%(side),0)
            parent_arm_end_dist_loc = cmds.pointConstraint('%s_ik_03_jnt'%(side),'%s_arm_end_dist_loc'%(side))
            cmds.delete(parent_arm_end_dist_loc)
            cmds.parent('%s_arm_end_dist_loc'%(side),'%s_ik_arm_ctrl'%(side))
            cmds.setAttr('%s_arm_stretch_cond.operation'%(side),2)
            cmds.setAttr('%s_arm_stretch_mult.operation'%(side),2)
            cmds.setAttr('%s_arm_strecth_option_mult.input2X'%(side),2)
            
            list = [('%s_arm_01_length_jnt.worldMatrix'%(side),'%s_upr_arm_dist.inMatrix1'%(side)),('%s_arm_02_length_jnt.worldMatrix'%(side),'%s_upr_arm_dist.inMatrix2'%(side)),('%s_arm_02_length_jnt.worldMatrix'%(side),'%s_lwr_arm_dist.inMatrix1'%(side)),('%s_arm_03_length_jnt.worldMatrix'%(side),'%s_lwr_arm_dist.inMatrix2'%(side)),('%s_upr_arm_dist.distance'%(side),'%s_arm_full_dist.input1'%(side)),('%s_lwr_arm_dist.distance'%(side),'%s_arm_full_dist.input2'%(side)),('%s_arm_start_dist_loc.worldMatrix'%(side),'%s_arm_stretch_dist.inMatrix1'%(side)),('%s_arm_end_dist_loc.worldMatrix'%(side),'%s_arm_stretch_dist.inMatrix2'%(side)),('%s_arm_stretch_dist.distance'%(side),'%s_arm_stretch_cond.firstTerm'%(side)),('%s_arm_full_dist.output'%(side),'%s_arm_stretch_cond.secondTerm'%(side)),('%s_arm_stretch_dist.distance'%(side),'%s_arm_stretch_mult.input1X'%(side)),('%s_arm_full_dist.output'%(side),'%s_arm_stretch_mult.input2X'%(side)),('%s_arm_stretch_mult.outputX'%(side),'%s_arm_stretch_cond.colorIfTrue.colorIfTrueR'%(side)),('%s_arm_stretch_cond.outColor.outColorR'%(side),'%s_lwr_arm_strecth_mult.input1X'%(side)),('%s_arm_stretch_cond.outColor.outColorR'%(side),'%s_upr_arm_strecth_mult.input1X'%(side)),('%s_arm_02_setup.translateX'%(side),'%s_upr_arm_strecth_mult.input2X'%(side)),('%s_arm_03_setup.translateX'%(side),'%s_lwr_arm_strecth_mult.input2X'%(side)),('%s_upr_arm_strecth_mult.outputX'%(side),'%s_ik_02_jnt.translateX'%(side)),('%s_lwr_arm_strecth_mult.outputX'%(side),'%s_ik_03_jnt.translateX'%(side)),('%s_ik_arm_ctrl.stretch'%(side),'%s_arm_strecth_option_mult.input1X'%(side)),('%s_arm_strecth_option_mult.outputX'%(side),'%s_arm_stretch_cond.operation'%(side))]
            for each in list:
                cmds.connectAttr(each[0],each[1])
            # the command to change the progress bar
            cmds.progressBar('EugenesProgressBar', edit=True, step=1)
            
        ArmStretchSetup('l')
        ArmStretchSetup('r')
        
        def armGroup():
            list = ['l_arm_jnt_grp','r_arm_jnt_grp','arm_jnt_grp']
            for each in list:
                cmds.group(n=each,em=True)
            list = [('l_ik_arm_jnt_grp','l_arm_jnt_grp'),('r_ik_arm_jnt_grp','r_arm_jnt_grp'),('l_fk_arm_01_jnt','l_arm_jnt_grp'),('r_fk_arm_01_jnt','r_arm_jnt_grp'),('r_bendy_arm_jnt_grp','r_arm_jnt_grp'),('l_bendy_arm_jnt_grp','l_arm_jnt_grp'),('r_arm_length_jnt_grp','r_arm_jnt_grp'),('l_arm_length_jnt_grp','l_arm_jnt_grp'),('r_shoulder_jnt','r_arm_jnt_grp'),('l_shoulder_jnt','l_arm_jnt_grp'),('r_arm_bln_jnt_grp','r_arm_jnt_grp'),('l_arm_bln_jnt_grp','l_arm_jnt_grp'),('l_arm_jnt_grp','arm_jnt_grp'),('r_arm_jnt_grp','arm_jnt_grp')]
            for each in list:
                cmds.parent(each[0],each[1])
        
        armGroup()
        
    def noBendyArm():
        def FKarmSetup(side):
            #FKarm#
            fkarmcontroller = [('%s_fk_arm_01_ctrl'%(side),'%s_fk_arm_01_ctrl_grp'%(side)),('%s_fk_arm_02_ctrl'%(side),'%s_fk_arm_02_ctrl_grp'%(side)),('%s_fk_arm_03_ctrl'%(side),'%s_fk_arm_03_ctrl_grp'%(side))]
            for each in fkarmcontroller:
                cmds.curve(d=1,p=[(0.0, 1.8457071003629746, -6.888272674590291),(0.0, 1.6065215981349992, -5.995620227271308),(0.0, -1.6065234643869502, -5.995624729951774),(0.0, -1.8454397435472047, -6.8872682416730004),(0.0, -5.041829388107622, -5.041831819868864),(0.0, -4.389101595742385, -4.389102497134237),(0.0, -5.995620227271308, -1.6065215981349992),(0.0, -6.888272674590291, -1.8457071003629746),(0.0, -6.8872682416730004, 1.8454397435472047),(0.0, -5.995624729951774, 1.6065234643869502),(0.0, -4.389102497134237, 4.389101595742385),(0.0, -5.041831819868864, 5.041829388107622),(0.0, -1.8457071003629746, 6.888272674590291),(0.0, -1.6065215981349992, 5.995620227271308),(0.0, 1.6065234643869502, 5.995624729951774),(0.0, 1.8454397435472047, 6.8872682416730004),(0.0, 5.041829388107622, 5.041831819868864),(0.0, 4.389101595742385, 4.389102497134237),(0.0, 5.995620227271308, 1.6065215981349992),(0.0, 6.888272674590291, 1.8457071003629746),(0.0, 6.8872682416730004, -1.8454397435472047),(0.0, 5.995624729951774, -1.6065234643869502),(0.0, 4.389102497134237, -4.389101595742385),(0.0, 5.041831819868864, -5.041829388107622),(0.0, 1.8457071003629746, -6.888272674590291)])
                cmds.rename(each[0])
                cmds.group(n=each[1])
                
            createjoint = ['%s_fk_arm_01_jnt'%(side),'%s_fk_arm_02_jnt'%(side),'%s_fk_arm_03_jnt'%(side)]
            for each in createjoint:
                cmds.joint(n=each)
                
            toGetJntPos = ('%s_arm_01_setup'%(side),'%s_fk_arm_01_jnt'%(side)),('%s_arm_02_setup'%(side),'%s_fk_arm_02_jnt'%(side)),('%s_arm_03_setup'%(side),'%s_fk_arm_03_jnt'%(side))
            for each in toGetJntPos:
                forDel = cmds.parentConstraint(each[0],each[1])
                cmds.delete(forDel)
            cmds.parent('%s_fk_arm_01_jnt'%(side),w=True)
                
            toGetCtrlPos = [('%s_arm_01_setup'%(side),'%s_fk_arm_01_ctrl_grp'%(side)),('%s_arm_02_setup'%(side),'%s_fk_arm_02_ctrl_grp'%(side)),('%s_arm_03_setup'%(side),'%s_fk_arm_03_ctrl_grp'%(side))]
            for each in toGetCtrlPos:
                forDel = cmds.parentConstraint(each[0],each[1])
                cmds.delete(forDel)
            
            toParent = [('%s_fk_arm_02_ctrl_grp'%(side),'%s_fk_arm_01_ctrl'%(side)),('%s_fk_arm_03_ctrl_grp'%(side),'%s_fk_arm_02_ctrl'%(side))]
            for each in toParent:
                cmds.parent(each[0],each[1])
                
            toParentCon = [('%s_shoulder_ctrl'%(side),'%s_fk_arm_01_ctrl_grp'%(side)),('%s_fk_arm_01_ctrl'%(side),'%s_fk_arm_01_jnt'%(side)),('%s_fk_arm_02_ctrl'%(side),'%s_fk_arm_02_jnt'%(side)),('%s_fk_arm_03_ctrl'%(side),'%s_fk_arm_03_jnt'%(side))]
            for each in toParentCon:
                cmds.parentConstraint(each[0],each[1],mo=True)
                
            toLockAttr = [('%s_fk_arm_01_ctrl'%(side)),('%s_fk_arm_02_ctrl'%(side)),('%s_fk_arm_03_ctrl'%(side))]
            for each in toLockAttr:
                cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.overrideEnabled' ,True) 
                cmds.setAttr (each+'.overrideColor' ,6)
            
        FKarmSetup('l')
        FKarmSetup('r')
        
        def IKarmSetup(side):
            #IKarm#
            cmds.joint(n='%s_ik_01_jnt'%(side))
            forDel = cmds.parentConstraint('%s_arm_01_setup'%(side),'%s_ik_01_jnt'%(side),mo = False)
            deleteparent = cmds.delete(forDel)
            cmds.joint(n='%s_ik_02_jnt'%(side))
            forDel = cmds.parentConstraint('%s_arm_02_setup'%(side),'%s_ik_02_jnt'%(side),mo = False)
            deleteparent = cmds.delete(forDel)
            cmds.joint(n='%s_ik_03_jnt'%(side))
            forDel = cmds.parentConstraint('%s_arm_03_setup'%(side),'%s_ik_03_jnt'%(side),mo = False)
            deleteparent = cmds.delete(forDel)
            cmds.makeIdentity( '%s_ik_01_jnt'%(side), apply=True, translate=True, rotate=True)
            cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_ik_01_jnt'%(side),mo=True)
            cmds.ikHandle( n='%s_arm_ikh'%(side), sj='%s_ik_01_jnt'%(side), ee='%s_ik_03_jnt'%(side) )
            cmds.setAttr('%s_arm_ikh.visibility'%(side),0)
            cmds.curve(d=1, p=[(-5, -5, 5),(-5, 5, 5),(5, 5, 5),(5, -5, 5),(5, -5, -5),(5, 5, -5),(-5, 5, -5),(-5, -5, -5),(-5, -5, 5),(5, -5, 5),(5, 5, 5),(5, 5, -5),(5, -5, -5),(-5, -5, -5),(-5, 5, -5),(-5, 5, 5)])
            cmds.rename('%s_ik_arm_ctrl'%(side))
            ControllerAttr('%s_ik_arm_ctrl'%(side),False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
            cmds.addAttr('%s_ik_arm_ctrl'%(side),sn='stretch',at = 'bool',k=1)
            cmds.addAttr('%s_ik_arm_ctrl'%(side), at = 'enum', keyable=True, en = 'string1:string2:', ln='follow') 
            cmds.addAttr('%s_ik_arm_ctrl'%(side)+'.follow', e=True, en = 'world:shoulder:')
            cmds.orientConstraint('%s_ik_arm_ctrl'%(side), '%s_ik_03_jnt'%(side))
            cmds.group(n='%s_ik_arm_ctrl_grp'%(side))
            forDel = cmds.parentConstraint('%s_arm_03_setup'%(side),'%s_ik_arm_ctrl_grp'%(side),mo = False)
            deleteparent = cmds.delete(forDel)
            cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_ik_arm_ctrl_grp'%(side),mo = True)
            cmds.connectAttr('%s_ik_arm_ctrl.follow'%(side),'%s_ik_arm_ctrl_grp_parentConstraint1.%s_shoulder_ctrlW0'%(side,side))
            cmds.parent('%s_arm_ikh'%(side), '%s_ik_arm_ctrl'%(side))
            cmds.parent('%s_ik_arm_ctrl_grp'%(side),'world_ctrl')
            cmds.curve(d=1, p=[(0.0, 3.468342867164149, 0.0),(0.0, 3.468342867164149, 0.5221724371834184),(0.0, 4.967930096687364, 0.0),(0.5221724371834184, 3.468342867164149, 0.0),(-0.5221724371834184, 3.468342867164149, 0.0),(0.0, 4.967930096687364, 0.0),(0.0, 3.468342867164149, -0.5221724371834184),(0.0, 3.468342867164149, 0.0),(0.0, -3.468342867164149, 0.0),(-0.5221724371834184, -3.468342867164149, 0.0),(0.0, -4.967930096687364, 0.0),(0.0, -3.468342867164149, -0.5221724371834184),(0.0, -3.468342867164149, 0.5221724371834184),(0.0, -4.967930096687364, 0.0),(0.5221724371834184, -3.468342867164149, 0.0),(0.0, -3.468342867164149, 0.0),(0.0, 0.0, 0.0),(-3.468342867164149, 0.0, 0.0),(-3.468342867164149, 0.5221724371834184, 0.0),(-4.967930096687364, 0.0, 0.0),(-3.468342867164149, 0.0, -0.5221724371834184),(-3.468342867164149, 0.0, 0.5221724371834184),(-4.967930096687364, 0.0, 0.0),(-3.468342867164149, -0.5221724371834184, 0.0),(-3.468342867164149, 0.0, 0.0),(3.468342867164149, 0.0, 0.0),(3.468342867164149, 0.0, -0.5221724371834184),(4.967930096687364, 0.0, 0.0),(3.468342867164149, 0.5221724371834184, 0.0),(3.468342867164149, -0.5221724371834184, 0.0),(4.967930096687364, 0.0, 0.0),(3.468342867164149, 0.0, 0.5221724371834184),(3.468342867164149, 0.0, 0.0),(0.0, 0.0, 0.0),(0.0, 0.0, 3.468342867164149),(0.0, 0.5221724371834184, 3.468342867164149),(0.0, 0.0, 4.967930096687364),(0.5221724371834184, 0.0, 3.468342867164149),(-0.5221724371834184, 0.0, 3.468342867164149),(0.0, 0.0, 4.967930096687364),(0.0, -0.5221724371834184, 3.468342867164149),(0.0, 0.0, 3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.5221724371834184, -3.468342867164149),(0.0, 0.0, -4.967930096687364),(-0.5221724371834184, 0.0, -3.468342867164149),(0.5221724371834184, 0.0, -3.468342867164149),(0.0, 0.0, -4.967930096687364),(0.0, -0.5221724371834184, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149)])
            cmds.rename('%s_elbow_ctrl'%(side))
            ControllerAttr('%s_elbow_ctrl'%(side),False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,6,True,True,True,False,False,False)
            cmds.addAttr('%s_elbow_ctrl'%(side),sn='follow', min = 0, max=1 ,k=1)
            cmds.group()
            cmds.rename('%s_elbow_ctrl_grp'%(side))
            cmds.parent('%s_elbow_ctrl_grp'%(side),'world_ctrl')
            forDel = cmds.pointConstraint('%s_elbow_setup'%(side), '%s_elbow_ctrl_grp'%(side))
            deparent = cmds.delete(forDel)
            cmds.poleVectorConstraint( '%s_elbow_ctrl'%(side), '%s_arm_ikh'%(side) )
            cmds.spaceLocator()
            cmds.rename('%s_elbow_loc_world'%(side))
            forDel = cmds.parentConstraint('%s_elbow_setup'%(side),'%s_elbow_loc_world'%(side))
            cmds.delete(forDel)
            cmds.spaceLocator()
            cmds.rename('%s_elbow_loc_follow'%(side))
            forDel = cmds.parentConstraint('%s_elbow_setup'%(side),'%s_elbow_loc_follow'%(side))
            cmds.delete(forDel)
            cmds.group()
            cmds.rename('%s_elbow_loc_grp'%(side))
            cmds.parent('%s_elbow_loc_world'%(side),'%s_elbow_loc_grp'%(side))
            cmds.parentConstraint('%s_ik_arm_ctrl'%(side),'%s_elbow_loc_follow'%(side),mo = True)
            cmds.parentConstraint('%s_elbow_loc_follow'%(side),'%s_elbow_ctrl_grp'%(side),mo = True)
            cmds.parentConstraint('%s_elbow_loc_world'%(side),'%s_elbow_ctrl_grp'%(side),mo = True)
            cmds.parentConstraint('world_ctrl','%s_elbow_loc_world'%(side),mo = True)
            cmds.shadingNode('reverse',n = '%s_elbow_rev'%(side),asUtility=1)
            cmds.connectAttr('%s_elbow_ctrl.follow'%(side), '%s_elbow_ctrl_grp_parentConstraint1.%s_elbow_loc_followW0'%(side,side))
            cmds.connectAttr('%s_elbow_ctrl.follow'%(side), '%s_elbow_rev.inputX'%(side))
            cmds.connectAttr('%s_elbow_rev.outputX'%(side), '%s_elbow_ctrl_grp_parentConstraint1.%s_elbow_loc_worldW1'%(side,side))
            cmds.group(n='%s_ik_arm_jnt_grp'%(side),em=True)
            cmds.parent('%s_ik_01_jnt'%(side),'%s_ik_arm_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_ik_arm_jnt_grp'%(side),mo=True)
            #IKarmPVcrv#
            cmds.curve(d=1, p=[(0, 0, 0),(0, 10, 0)])
            cmds.rename('%s_elbow_direction_crv'%(side))
            nameOfLoc = ['%s_elbow_01_loc'%(side),'%s_elbow_02_loc'%(side)]
            for each in nameOfLoc:
                cmds.spaceLocator(n=each)
        
            toGetLocPos = [('%s_elbow_01_loc.translateY'%(side),0),('%s_elbow_02_loc.translateY'%(side),10)]
            for each in toGetLocPos:
                cmds.setAttr(each[0],each[1])
    
            toConnectLoc = [('%s_elbow_01_loc.worldPosition[0]'%(side),'%s_elbow_direction_crvShape.controlPoints[0]'%(side)),('%s_elbow_02_loc.worldPosition[0]'%(side),'%s_elbow_direction_crvShape.controlPoints[4]'%(side))]
            for each in toConnectLoc:
                cmds.connectAttr(each[0],each[1])
            toSetAttr = [('%s_elbow_direction_crv.overrideEnabled'%(side),1),('%s_elbow_direction_crv.overrideDisplayType'%(side),2),('%s_elbow_01_loc.visibility'%(side),0),('%s_elbow_02_loc.visibility'%(side),0)]
            for each in toSetAttr:
                cmds.setAttr(each[0],each[1])
            
            toGetParent = [('%s_elbow_ctrl'%(side),'%s_elbow_01_loc'%(side)),('%s_ik_02_jnt'%(side),'%s_elbow_02_loc'%(side))]
            for each in toGetParent:
                cmds.parentConstraint(each[0],each[1],mo = False)
            
            cmds.group(n='%s_elbow_direction_crv_grp'%(side),em = True)
            toGetParent = [('%s_elbow_01_loc'%(side),'%s_elbow_direction_crv_grp'%(side)),('%s_elbow_02_loc'%(side),'%s_elbow_direction_crv_grp'%(side)),('%s_elbow_direction_crv'%(side),'%s_elbow_direction_crv_grp'%(side))]
            for each in toGetParent:
                cmds.parent(each[0],each[1])
                
        IKarmSetup('l')
        IKarmSetup('r')
    
        def IKFKarmSetup(side):
            nameOfJoint = [('%s_arm_01_bln_jnt'%(side)),('%s_arm_02_bln_jnt'%(side)),('%s_arm_03_bln_jnt'%(side))]
            for each in nameOfJoint:
                cmds.joint(n=each)
            
            cmds.group(n='%s_arm_bln_jnt_grp'%(side),em=True)
            cmds.parent('%s_arm_01_bln_jnt'%(side),'%s_arm_bln_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_arm_bln_jnt_grp'%(side),mo=True)
            
            toGetPos = [('%s_arm_01_setup'%(side), '%s_arm_01_bln_jnt'%(side)),('%s_arm_02_setup'%(side),'%s_arm_02_bln_jnt'%(side)),('%s_arm_03_setup'%(side),'%s_arm_03_bln_jnt'%(side))]
            for each in toGetPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo = False)
                cmds.delete(forDel)
                
            cmds.setAttr('%s_arm_01_bln_jnt.drawStyle'%(side),2)
            cmds.setAttr('%s_arm_02_bln_jnt.drawStyle'%(side),2)
            cmds.makeIdentity( '%s_arm_01_bln_jnt'%(side),apply=True, rotate=True)
            
            toParentCon = [('%s_fk_arm_01_jnt'%(side),'%s_arm_01_bln_jnt'%(side)),('%s_ik_01_jnt'%(side), '%s_arm_01_bln_jnt'%(side)),('%s_fk_arm_02_jnt'%(side), '%s_arm_02_bln_jnt'%(side)),('%s_ik_02_jnt'%(side), '%s_arm_02_bln_jnt'%(side)),('%s_fk_arm_03_jnt'%(side), '%s_arm_03_bln_jnt'%(side)),('%s_ik_03_jnt'%(side), '%s_arm_03_bln_jnt'%(side))]
            for each in toParentCon:
                cmds.parentConstraint(each[0],each[1],mo = True)
                
            cmds.curve(d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
            cmds.rename('%s_ik_fk_switch'%(side))
            ControllerAttr('%s_ik_fk_switch'%(side),False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,15,False,False,False,True,True,True)
            cmds.group(n='%s_ik_fk_switch_grp'%(side))
            cmds.parent('%s_ik_fk_switch_grp'%(side), 'world_ctrl')
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='IKFK', min = 0, max=1 ,k=1,dv=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='bendyVis',at = 'bool',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='thumbCurl',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='indexCurl',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='middleCurl',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='ringCurl',k=1)
            cmds.addAttr('%s_ik_fk_switch'%(side),sn='pinkyCurl',k=1)
            cmds.parentConstraint('%s_arm_03_bln_jnt'%(side), '%s_ik_fk_switch_grp'%(side))
            cmds.shadingNode('reverse',n = '%s_arm_ik_rev'%(side),asUtility=1)
            
            toConnectAttr = [('%s_ik_fk_switch.IKFK'%(side),'%s_arm_03_bln_jnt_parentConstraint1.%s_fk_arm_03_jntW0'%(side,side)),('%s_ik_fk_switch.IKFK'%(side),'%s_arm_02_bln_jnt_parentConstraint1.%s_fk_arm_02_jntW0'%(side,side)),('%s_ik_fk_switch.IKFK'%(side),'%s_arm_01_bln_jnt_parentConstraint1.%s_fk_arm_01_jntW0'%(side,side)),('%s_ik_fk_switch.IKFK'%(side),'%s_arm_ik_rev.inputX'%(side)),('%s_arm_ik_rev.outputX'%(side),'%s_arm_03_bln_jnt_parentConstraint1.%s_ik_03_jntW1'%(side,side)),('%s_arm_ik_rev.outputX'%(side),'%s_arm_02_bln_jnt_parentConstraint1.%s_ik_02_jntW1'%(side,side)),('%s_arm_ik_rev.outputX'%(side),'%s_arm_01_bln_jnt_parentConstraint1.%s_ik_01_jntW1'%(side,side)),('%s_ik_fk_switch.IKFK'%(side),'%s_fk_arm_01_ctrl_grp.visibility'%(side)),('%s_arm_ik_rev.outputX'%(side),'%s_ik_arm_ctrl_grp.visibility'%(side)),('%s_arm_ik_rev.outputX'%(side),'%s_elbow_ctrl_grp.visibility'%(side)),('%s_arm_ik_rev.outputX'%(side),'%s_elbow_direction_crv_grp.visibility'%(side))]
            for each in toConnectAttr:
                cmds.connectAttr(each[0],each[1])
            
        IKFKarmSetup('l')
        IKFKarmSetup('r')
        
        def ArmStretchSetup(side):
            jointList = ['%s_arm_01_length_jnt'%(side),'%s_arm_02_length_jnt'%(side),'%s_arm_03_length_jnt'%(side)]
            for each in jointList:
                cmds.joint(n=each)
            cmds.group(n='%s_arm_length_jnt_grp'%(side),em=True)
            cmds.parent('%s_arm_01_length_jnt'%(side),'%s_arm_length_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_arm_length_jnt_grp'%(side),mo=True)
            
            listOfToGetJointPos = [('%s_arm_01_setup'%(side),'%s_arm_01_length_jnt'%(side)),('%s_arm_02_setup'%(side),'%s_arm_02_length_jnt'%(side)),('%s_arm_03_setup'%(side),'%s_arm_03_length_jnt'%(side))]
            for each in listOfToGetJointPos:
                forDel = cmds.parentConstraint(each[0],each[1],mo=False)
                cmds.delete(forDel)
            
            list = [('distanceBetween','%s_upr_arm_dist'%(side)),('distanceBetween','%s_lwr_arm_dist'%(side)),('addDoubleLinear','%s_arm_full_dist'%(side)),('distanceBetween','%s_arm_stretch_dist'%(side)),('condition','%s_arm_stretch_cond'%(side)),('multiplyDivide','%s_upr_arm_strecth_mult'%(side)),('multiplyDivide','%s_arm_stretch_mult'%(side)),('multiplyDivide','%s_lwr_arm_strecth_mult'%(side)),('multiplyDivide','%s_arm_strecth_option_mult'%(side))]
            for each in list:
                cmds.shadingNode(each[0],n=each[1],asUtility=1)
                
            cmds.spaceLocator(n = '%s_arm_start_dist_loc'%(side))
            cmds.group(n='%s_arm_start_dist_loc_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_arm_start_dist_loc_grp'%(side),mo=True)
            forDel = cmds.pointConstraint('%s_ik_01_jnt'%(side),'%s_arm_start_dist_loc'%(side),mo = False)
            cmds.delete(forDel)
            cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_arm_start_dist_loc'%(side),mo=True)
            cmds.spaceLocator(n = '%s_arm_end_dist_loc'%(side))
            cmds.setAttr('%s_arm_end_dist_loc.visibility'%(side),0)
            forDel = cmds.pointConstraint('%s_ik_03_jnt'%(side),'%s_arm_end_dist_loc'%(side))
            cmds.delete(forDel)
            cmds.parent('%s_arm_end_dist_loc'%(side),'%s_ik_arm_ctrl'%(side))
            cmds.setAttr('%s_arm_stretch_cond.operation'%(side),2)
            cmds.setAttr('%s_arm_stretch_mult.operation'%(side),2)
            cmds.setAttr('%s_arm_strecth_option_mult.input2X'%(side),2)
toParentRevFootLocAndGrp = [('%s_IK_arm_roll_ctrl_grp'%(side),'%s_IK_arm_ctrl'%(side)),('%s_IK_leg_roll_ctrl_grp'%(side),'%s_IK_leg_ctrl'%(side)),('%s_leg_toe_lift_loc'%(side),'%s_leg_heel_loc'%(side)),('%s_leg_roll_in_loc'%(side),'%s_leg_roll_out_loc'%(side)),('%s_leg_roll_out_loc'%(side),'%s_leg_toe_lift_loc'%(side)),('%s_arm_toe_lift_loc'%(side),'%s_arm_heel_loc'%(side)),('%s_arm_roll_in_loc'%(side),'%s_arm_roll_out_loc'%(side)),('%s_arm_roll_out_loc'%(side),'%s_arm_toe_lift_loc'%(side)),('%s_leg_lwr_ikh'%(side),'%s_leg_roll_in_loc'%(side)),('%s_leg_upr_ikh'%(side),'%s_leg_roll_in_loc'%(side)),('%s_arm_lwr_ikh'%(side),'%s_arm_roll_in_loc'%(side)),('%s_arm_upr_ikh'%(side),'%s_arm_roll_in_loc'%(side)),('%s_leg_heel_loc'%(side),'%s_IK_leg_loc_grp'%(side)),('%s_arm_heel_loc'%(side),'%s_IK_arm_loc_grp'%(side)),('%s_leg_PV_aim_loc'%(side),'%s_IK_leg_PV_loc_grp'%(side)),('%s_leg_PV_aim_up_loc'%(side),'%s_IK_leg_PV_loc_grp'%(side)),('%s_leg_PV_aim_base_loc'%(side),'%s_IK_leg_PV_loc_grp'%(side)),('%s_leg_PV_aim_world_loc'%(side),'%s_IK_leg_PV_loc_grp'%(side)),('%s_arm_PV_aim_loc'%(side),'%s_IK_arm_PV_loc_grp'%(side)),('%s_arm_PV_aim_up_loc'%(side),'%s_IK_arm_PV_loc_grp'%(side)),('%s_arm_PV_aim_base_loc'%(side),'%s_IK_arm_PV_loc_grp'%(side)),('%s_arm_PV_aim_world_loc'%(side),'%s_IK_arm_PV_loc_grp'%(side)),('%s_IK_leg_ctrl_grp'%(side),'%s_IK_leg_grp'%(side)),('%s_leg_PV_ctrl_grp'%(side),'%s_IK_leg_grp'%(side)),('%s_IK_arm_ctrl_grp'%(side),'%s_IK_arm_grp'%(side)),('%s_arm_PV_ctrl_grp'%(side),'%s_IK_arm_grp'%(side))]
        for each in toParentRevFootLocAndGrp:
            cmds.parent(each[0],each[1])
            
        toParentConIKleg = [('%s_IK_leg_roll_ctrl'%(side),'%s_IK_leg_loc_grp'%(side)),('%s_IK_arm_roll_ctrl'%(side),'%s_IK_arm_loc_grp'%(side)),('%s_IK_leg_ctrl'%(side),'%s_leg_PV_aim_loc'%(side)),('spine_01_bln_jnt','%s_leg_PV_aim_up_loc'%(side)),('world_ctrl','%s_leg_PV_aim_world_loc'%(side)),('%s_IK_arm_ctrl'%(side),'%s_arm_PV_aim_loc'%(side)),('spine_03_bln_jnt','%s_arm_PV_aim_up_loc'%(side)),('world_ctrl','%s_arm_PV_aim_world_loc'%(side)),('spine_01_bln_jnt','%s_IK_leg_ctrl_grp'%(side)),('world_ctrl','%s_IK_leg_ctrl_grp'%(side)),('%s_shoulder_ctrl'%(side),'%s_IK_arm_ctrl_grp'%(side)),('world_ctrl','%s_IK_arm_ctrl_grp'%(side)),('%s_leg_PV_aim_base_loc'%(side),'%s_leg_PV_ctrl_grp'%(side)),('%s_arm_PV_aim_base_loc'%(side),'%s_arm_PV_ctrl_grp'%(side)),('%s_leg_PV_aim_world_loc'%(side),'%s_leg_PV_ctrl_grp'%(side)),('%s_arm_PV_aim_world_loc'%(side),'%s_arm_PV_ctrl_grp'%(side)),('spine_01_bln_jnt','%s_IK_leg_01_jnt'%(side)),('%s_shoulder_ctrl'%(side),'%s_IK_arm_01_jnt'%(side))]
        for each in toParentConIKleg:
            cmds.parentConstraint(each[0],each[1],mo = True)
            
        toOrientIKleg = [('%s_IK_arm_ctrl'%(side),'%s_IK_arm_04_jnt'%(side)),('%s_IK_leg_ctrl'%(side),'%s_IK_leg_04_jnt'%(side))]
        for each in toOrientIKleg:
            cmds.orientConstraint(each[0],each[1],mo=True)
        
        toCreateNode = [('multiplyDivide','%s_leg_rock_mult'%(side)),('condition','%s_leg_rock_con'%(side)),('multiplyDivide','%s_arm_rock_mult'%(side)),('condition','%s_arm_rock_con'%(side)),('reverse','%s_leg_follow_rev'%(side)),('reverse','%s_arm_follow_rev'%(side)),('reverse','%s_leg_PV_follow_rev'%(side)),('reverse','%s_arm_PV_follow_rev'%(side))]
        for each in toCreateNode:
            cmds.shadingNode(each[0],n=each[1],asUtility=1)
        
        list = [('%s_leg_rock_mult.operation'%(side),1),('%s_arm_rock_mult.operation'%(side),1),('%s_leg_rock_con.operation'%(side),2),('%s_arm_rock_con.operation'%(side),2),('%s_leg_rock_mult.input2X'%(side),-1),('%s_arm_rock_mult.input2X'%(side),-1),('%s_leg_rock_con.colorIfFalseR'%(side),0),('%s_arm_rock_con.colorIfFalseR'%(side),0),('%s_leg_PV_ctrl.follow'%(side),1)]
        for each in list:
            cmds.setAttr(each[0],each[1])
        
        toConnectNode = [('%s_IK_leg_ctrl.footRock'%(side),'%s_leg_rock_mult.input1X'%(side)),('%s_IK_leg_ctrl.footRock'%(side),'%s_leg_rock_mult.input1Y'%(side)),('%s_leg_rock_mult.outputX'%(side),'%s_leg_rock_con.colorIfFalseG'%(side)),('%s_leg_rock_mult.outputX'%(side),'%s_leg_rock_con.colorIfTrueR'%(side)),('%s_IK_leg_ctrl.footRock'%(side),'%s_leg_rock_con.firstTerm'%(side)),('%s_leg_rock_con.outColorR'%(side),'%s_leg_roll_out_loc.rotateZ'%(side)),('%s_leg_rock_con.outColorG'%(side),'%s_leg_roll_in_loc.rotateZ'%(side)),('%s_IK_arm_ctrl.footRock'%(side),'%s_arm_rock_mult.input1X'%(side)),('%s_IK_arm_ctrl.footRock'%(side),'%s_arm_rock_mult.input1Y'%(side)),('%s_arm_rock_mult.outputX'%(side),'%s_arm_rock_con.colorIfFalseG'%(side)),('%s_arm_rock_mult.outputX'%(side),'%s_arm_rock_con.colorIfTrueR'%(side)),('%s_IK_arm_ctrl.footRock'%(side),'%s_arm_rock_con.firstTerm'%(side)),('%s_arm_rock_con.outColorR'%(side),'%s_arm_roll_out_loc.rotateZ'%(side)),('%s_arm_rock_con.outColorG'%(side),'%s_arm_roll_in_loc.rotateZ'%(side)),('%s_IK_leg_ctrl.heelLift'%(side),'%s_leg_heel_loc.rotateY'%(side)),('%s_IK_arm_ctrl.heelLift'%(side),'%s_arm_heel_loc.rotateY'%(side)),('%s_IK_leg_ctrl.toeLift'%(side),'%s_leg_toe_lift_loc.rotateY'%(side)),('%s_IK_arm_ctrl.toeLift'%(side),'%s_arm_toe_lift_loc.rotateY'%(side)),('%s_IK_leg_ctrl.follow'%(side),'%s_IK_leg_ctrl_grp_parentConstraint1.spine_01_bln_jntW0'%(side)),('%s_IK_leg_ctrl.follow'%(side),'%s_leg_follow_rev.inputX'%(side)),('%s_leg_follow_rev.outputX'%(side),'%s_IK_leg_ctrl_grp_parentConstraint1.world_ctrlW1'%(side)),('%s_IK_arm_ctrl.follow'%(side),'%s_IK_arm_ctrl_grp_parentConstraint1.%s_shoulder_ctrlW0'%(side,side)),('%s_IK_arm_ctrl.follow'%(side),'%s_arm_follow_rev.inputX'%(side)),('%s_arm_follow_rev.outputX'%(side),'%s_IK_arm_ctrl_grp_parentConstraint1.world_ctrlW1'%(side)),('%s_leg_PV_ctrl.follow'%(side),'%s_leg_PV_ctrl_grp_parentConstraint1.%s_leg_PV_aim_base_locW0'%(side,side)),('%s_leg_PV_ctrl.follow'%(side),'%s_leg_PV_follow_rev.inputX'%(side)),('%s_leg_PV_follow_rev.outputX'%(side),'%s_leg_PV_ctrl_grp_parentConstraint1.%s_leg_PV_aim_world_locW1'%(side,side)),('%s_arm_PV_ctrl.follow'%(side),'%s_arm_PV_ctrl_grp_parentConstraint1.%s_arm_PV_aim_base_locW0'%(side,side)),('%s_arm_PV_ctrl.follow'%(side),'%s_arm_PV_follow_rev.inputX'%(side)),('%s_arm_PV_follow_rev.outputX'%(side),'%s_arm_PV_ctrl_grp_parentConstraint1.%s_arm_PV_aim_world_locW1'%(side,side))]
        for each in toConnectNode:
            cmds.connectAttr(each[0],each[1])
        
        toPointCon = [('%s_IK_leg_01_jnt'%(side),'%s_leg_PV_aim_base_loc'%(side)),('%s_IK_arm_01_jnt'%(side),'%s_arm_PV_aim_base_loc'%(side))]
        for each in toPointCon:
            cmds.pointConstraint(each[0],each[1],mo = False)
            
        cmds.aimConstraint('%s_arm_PV_aim_loc'%(side),'%s_arm_PV_aim_base_loc'%(side),wut = 'object',wuo = '%s_arm_PV_aim_up_loc'%(side),mo = True)
        cmds.aimConstraint('%s_leg_PV_aim_loc'%(side),'%s_leg_PV_aim_base_loc'%(side),wut = 'object',wuo = '%s_leg_PV_aim_up_loc'%(side),mo = True)    

        toScaleCon = [('world_ctrl','%s_IK_leg_jnt_grp'%(side)),('world_ctrl','%s_IK_arm_jnt_grp'%(side)),('world_ctrl','%s_IK_leg_PV_loc_grp'%(side)),('world_ctrl','%s_IK_arm_PV_loc_grp'%(side))]
        for each in toScaleCon:
            cmds.scaleConstraint(each[0],each[1],mo=True)
            
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        
    leftRightIKsetup('l')
    leftRightIKsetup('r')
    
#create IKFK setup#
    def IKFKsetup(side):
        nameOfIKFKjoint = [('%s_bln_leg_01_jnt'%(side)),('%s_bln_leg_02_jnt'%(side)),('%s_bln_leg_03_jnt'%(side)),('%s_bln_leg_04_jnt'%(side)),('%s_bln_arm_01_jnt'%(side)),('%s_bln_arm_02_jnt'%(side)),('%s_bln_arm_03_jnt'%(side)),('%s_bln_arm_04_jnt'%(side))]
        for each in nameOfIKFKjoint:
            cmds.joint(n=each)
        
        nameOfGroup = [('%s_bln_leg_jnt_grp'%(side)),('%s_bln_arm_jnt_grp'%(side))]
        for each in nameOfGroup:
            cmds.group(n=each,em=True)
        
        toParent = [('%s_bln_leg_01_jnt'%(side),'%s_bln_leg_jnt_grp'%(side)),('%s_bln_arm_01_jnt'%(side),'%s_bln_arm_jnt_grp'%(side))]
        for each in toParent:
            cmds.parent(each[0],each[1])
        
        toGetPos = [('%s_leg_01_setup_jnt'%(side),'%s_bln_leg_01_jnt'%(side)),('%s_leg_02_setup_jnt'%(side),'%s_bln_leg_02_jnt'%(side)),('%s_leg_03_setup_jnt'%(side),'%s_bln_leg_03_jnt'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_bln_leg_04_jnt'%(side)),('%s_arm_01_setup_jnt'%(side),'%s_bln_arm_01_jnt'%(side)),('%s_arm_02_setup_jnt'%(side),'%s_bln_arm_02_jnt'%(side)),('%s_arm_03_setup_jnt'%(side),'%s_bln_arm_03_jnt'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_bln_arm_04_jnt'%(side))]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        cmds.makeIdentity('%s_bln_leg_01_jnt'%(side),'%s_bln_arm_01_jnt'%(side),apply=True,translate=True,rotate=True)
        
        toCreateController = [('%s_IKFK_leg_switch'%(side),'%s_IKFK_leg_switch_grp'%(side)),('%s_IKFK_arm_switch'%(side),'%s_IKFK_arm_switch_grp'%(side))]
        for each in toCreateController:
            cmds.curve(n=each[0],d=1,p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
            cmds.group(n=each[1])
        
        toParentCon = [('%s_FK_leg_01_jnt'%(side),'%s_bln_leg_01_jnt'%(side)),('%s_IK_leg_01_jnt'%(side),'%s_bln_leg_01_jnt'%(side)),('%s_FK_leg_02_jnt'%(side),'%s_bln_leg_02_jnt'%(side)),('%s_IK_leg_02_jnt'%(side),'%s_bln_leg_02_jnt'%(side)),('%s_FK_leg_03_jnt'%(side),'%s_bln_leg_03_jnt'%(side)),('%s_IK_leg_03_jnt'%(side),'%s_bln_leg_03_jnt'%(side)),('%s_FK_leg_04_jnt'%(side),'%s_bln_leg_04_jnt'%(side)),('%s_IK_leg_04_jnt'%(side),'%s_bln_leg_04_jnt'%(side)),('%s_FK_arm_01_jnt'%(side),'%s_bln_arm_01_jnt'%(side)),('%s_IK_arm_01_jnt'%(side),'%s_bln_arm_01_jnt'%(side)),('%s_FK_arm_02_jnt'%(side),'%s_bln_arm_02_jnt'%(side)),('%s_IK_arm_02_jnt'%(side),'%s_bln_arm_02_jnt'%(side)),('%s_FK_arm_03_jnt'%(side),'%s_bln_arm_03_jnt'%(side)),('%s_IK_arm_03_jnt'%(side),'%s_bln_arm_03_jnt'%(side)),('%s_FK_arm_04_jnt'%(side),'%s_bln_arm_04_jnt'%(side)),('%s_IK_arm_04_jnt'%(side),'%s_bln_arm_04_jnt'%(side)),('%s_bln_leg_04_jnt'%(side),'%s_IKFK_leg_switch_grp'%(side)),('%s_bln_arm_04_jnt'%(side),'%s_IKFK_arm_switch_grp'%(side))]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo=True)

        toGetPos = [('%s_leg_04_setup_jnt'%(side),'%s_IKFK_leg_switch'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IKFK_arm_switch'%(side))]
        for each in toGetPos:
            forDel = cmds.pointConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        toLockIKFKcontroller = [('%s_IKFK_leg_switch'%(side)),('%s_IKFK_arm_switch'%(side))]
        for each in toLockIKFKcontroller:
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.rotateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.rotateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.rotateZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.translateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.translateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.translateZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,15)
            cmds.addAttr (each,sn='IKFK',min=0,max=1,k=1)
        
        toCreateNode = [('reverse','%s_IKFK_leg_rev'%(side)),('reverse','%s_IKFK_arm_rev'%(side))]
        for each in toCreateNode:
            cmds.shadingNode(each[0],n=each[1],asUtility=1)
            
        toConnectNode = [('%s_IKFK_leg_switch.IKFK'%(side),'%s_bln_leg_01_jnt_parentConstraint1.%s_FK_leg_01_jntW0'%(side,side)),('%s_IKFK_leg_switch.IKFK'%(side),'%s_IKFK_leg_rev.inputX'%(side)),('%s_IKFK_leg_rev.outputX'%(side),'%s_bln_leg_01_jnt_parentConstraint1.%s_IK_leg_01_jntW1'%(side,side)),('%s_IKFK_leg_switch.IKFK'%(side),'%s_bln_leg_02_jnt_parentConstraint1.%s_FK_leg_02_jntW0'%(side,side)),('%s_IKFK_leg_rev.outputX'%(side),'%s_bln_leg_02_jnt_parentConstraint1.%s_IK_leg_02_jntW1'%(side,side)),('%s_IKFK_leg_switch.IKFK'%(side),'%s_bln_leg_03_jnt_parentConstraint1.%s_FK_leg_03_jntW0'%(side,side)),('%s_IKFK_leg_rev.outputX'%(side),'%s_bln_leg_03_jnt_parentConstraint1.%s_IK_leg_03_jntW1'%(side,side)),('%s_IKFK_leg_switch.IKFK'%(side),'%s_bln_leg_04_jnt_parentConstraint1.%s_FK_leg_04_jntW0'%(side,side)),('%s_IKFK_leg_rev.outputX'%(side),'%s_bln_leg_04_jnt_parentConstraint1.%s_IK_leg_04_jntW1'%(side,side)),('%s_IKFK_arm_switch.IKFK'%(side),'%s_bln_arm_01_jnt_parentConstraint1.%s_FK_arm_01_jntW0'%(side,side)),('%s_IKFK_arm_switch.IKFK'%(side),'%s_IKFK_arm_rev.inputX'%(side)),('%s_IKFK_arm_rev.outputX'%(side),'%s_bln_arm_01_jnt_parentConstraint1.%s_IK_arm_01_jntW1'%(side,side)),('%s_IKFK_arm_switch.IKFK'%(side),'%s_bln_arm_02_jnt_parentConstraint1.%s_FK_arm_02_jntW0'%(side,side)),('%s_IKFK_arm_rev.outputX'%(side),'%s_bln_arm_02_jnt_parentConstraint1.%s_IK_arm_02_jntW1'%(side,side)),('%s_IKFK_arm_switch.IKFK'%(side),'%s_bln_arm_03_jnt_parentConstraint1.%s_FK_arm_03_jntW0'%(side,side)),('%s_IKFK_arm_rev.outputX'%(side),'%s_bln_arm_03_jnt_parentConstraint1.%s_IK_arm_03_jntW1'%(side,side)),('%s_IKFK_arm_switch.IKFK'%(side),'%s_bln_arm_04_jnt_parentConstraint1.%s_FK_arm_04_jntW0'%(side,side)),('%s_IKFK_arm_rev.outputX'%(side),'%s_bln_arm_04_jnt_parentConstraint1.%s_IK_arm_04_jntW1'%(side,side)),('%s_IKFK_leg_switch.IKFK'%(side),'%s_FK_leg_01_ctrl_grp.visibility'%(side)),('%s_IKFK_leg_rev.outputX'%(side),'%s_IK_leg_grp.visibility'%(side)),('%s_IKFK_arm_switch.IKFK'%(side),'%s_FK_arm_01_ctrl_grp.visibility'%(side)),('%s_IKFK_arm_rev.outputX'%(side),'%s_IK_arm_grp.visibility'%(side))]
        for each in toConnectNode:
            cmds.connectAttr(each[0],each[1])
            
        toScaleCon = [('%s_bln_leg_04_jnt'%(side),'%s_IKFK_leg_switch_grp'%(side)),('%s_bln_arm_04_jnt'%(side),'%s_IKFK_arm_switch_grp'%(side)),('world_ctrl','%s_bln_leg_04_jnt'%(side)),('world_ctrl','%s_bln_arm_04_jnt'%(side))]
        for each in toScaleCon:
            cmds.scaleConstraint(each[0],each[1],mo=True)
            
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
            
    IKFKsetup('l')
    IKFKsetup('r')
    
#create bind joint#
    def createSpineBindJoint():
        SpineBindJoint = [('root_bind_jnt'),('spine_01_bind_jnt'),('spine_02_bind_jnt'),('tail_01_bind_jnt'),('tail_02_bind_jnt'),('tail_03_bind_jnt'),('tail_04_bind_jnt'),('tail_05_bind_jnt'),('neck_01_bind_jnt'),('neck_02_bind_jnt'),('head_bind_jnt')]
        for each in SpineBindJoint:
            cmds.joint(n=each)
        
        toGetPos = [('spine_01_bln_jnt','root_bind_jnt'),('spine_02_bln_jnt','spine_01_bind_jnt'),('spine_03_bln_jnt','spine_02_bind_jnt'),('tail_bln_01_jnt','tail_01_bind_jnt'),('tail_bln_02_jnt','tail_02_bind_jnt'),('tail_bln_03_jnt','tail_03_bind_jnt'),('tail_bln_04_jnt','tail_04_bind_jnt'),('tail_bln_05_jnt','tail_05_bind_jnt'),('neck_01_jnt','neck_01_bind_jnt'),('neck_02_jnt','neck_02_bind_jnt'),('head_jnt','head_bind_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        toParent = [('tail_01_bind_jnt','root_bind_jnt'),('neck_01_bind_jnt','spine_02_bind_jnt')]
        for each in toParent:
            cmds.parent(each[0],each[1])
        cmds.makeIdentity('root_bind_jnt',apply=True,translate=True,rotate=True)
        
        toParentCon = [('spine_01_bln_jnt','root_bind_jnt'),('spine_02_bln_jnt','spine_01_bind_jnt'),('spine_03_bln_jnt','spine_02_bind_jnt'),('tail_bln_01_jnt','tail_01_bind_jnt'),('tail_bln_02_jnt','tail_02_bind_jnt'),('tail_bln_03_jnt','tail_03_bind_jnt'),('tail_bln_04_jnt','tail_04_bind_jnt'),('tail_bln_05_jnt','tail_05_bind_jnt'),('neck_01_jnt','neck_01_bind_jnt'),('neck_02_jnt','neck_02_bind_jnt'),('head_jnt','head_bind_jnt')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
            
    createSpineBindJoint()
    
    def createLeftRightBindJoint(side):
        LeftRightBindJoint = [('%s_leg_01_bind_jnt'%(side)),('%s_leg_02_bind_jnt'%(side)),('%s_leg_03_bind_jnt'%(side)),('%s_leg_04_bind_jnt'%(side)),('%s_arm_01_bind_jnt'%(side)),('%s_arm_02_bind_jnt'%(side)),('%s_arm_03_bind_jnt'%(side)),('%s_arm_04_bind_jnt'%(side)),('%s_shoulder_bind_jnt'%(side))]
        for each in LeftRightBindJoint:
            cmds.joint(n=each)
        
        toGetPos = [('%s_bln_leg_01_jnt'%(side),'%s_leg_01_bind_jnt'%(side)),('%s_bln_leg_02_jnt'%(side),'%s_leg_02_bind_jnt'%(side)),('%s_bln_leg_03_jnt'%(side),'%s_leg_03_bind_jnt'%(side)),('%s_bln_leg_04_jnt'%(side),'%s_leg_04_bind_jnt'%(side)),('%s_bln_arm_01_jnt'%(side),'%s_arm_01_bind_jnt'%(side)),('%s_bln_arm_02_jnt'%(side),'%s_arm_02_bind_jnt'%(side)),('%s_bln_arm_03_jnt'%(side),'%s_arm_03_bind_jnt'%(side)),('%s_bln_arm_04_jnt'%(side),'%s_arm_04_bind_jnt'%(side)),('%s_shoulder_jnt'%(side),'%s_shoulder_bind_jnt'%(side))]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        cmds.parent('%s_shoulder_bind_jnt'%(side),w=True)
            
        toParent = [('%s_leg_01_bind_jnt'%(side),'root_bind_jnt'),('%s_arm_01_bind_jnt'%(side),'%s_shoulder_bind_jnt'%(side)),('%s_shoulder_bind_jnt'%(side),'spine_02_bind_jnt')]
        for each in toParent:
            cmds.parent(each[0],each[1])
        cmds.makeIdentity('%s_leg_01_bind_jnt'%(side),'%s_arm_01_bind_jnt'%(side),'%s_shoulder_bind_jnt'%(side),apply=True,translate=True,rotate=True)
        
        toParentCon = [('%s_bln_leg_01_jnt'%(side),'%s_leg_01_bind_jnt'%(side)),('%s_bln_leg_02_jnt'%(side),'%s_leg_02_bind_jnt'%(side)),('%s_bln_leg_03_jnt'%(side),'%s_leg_03_bind_jnt'%(side)),('%s_bln_leg_04_jnt'%(side),'%s_leg_04_bind_jnt'%(side)),('%s_bln_arm_01_jnt'%(side),'%s_arm_01_bind_jnt'%(side)),('%s_bln_arm_02_jnt'%(side),'%s_arm_02_bind_jnt'%(side)),('%s_bln_arm_03_jnt'%(side),'%s_arm_03_bind_jnt'%(side)),('%s_bln_arm_04_jnt'%(side),'%s_arm_04_bind_jnt'%(side)),('%s_shoulder_jnt'%(side),'%s_shoulder_bind_jnt'%(side))]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
            
    createLeftRightBindJoint('l')
    createLeftRightBindJoint('r')
    
    def groupAll():
        nameOfGroup = [('ctrl_grp'),('jnt_grp'),('bind_jnt_grp'),('extra'),('mesh'),('rename')]
        for each in nameOfGroup:
            cmds.group(n=each,em=True)
            
        toParentGroup = [('tail_setup_grp','extra'),('spine_IK_setup_grp','extra'),('spine_IK_chest_jnt','jnt_grp'),('spine_IK_root_jnt','jnt_grp'),('spine_IK_jnt_grp','jnt_grp'),('spine_01_FK_jnt','jnt_grp'),('cog_ctrl_grp','world_ctrl'),('l_FK_leg_01_ctrl_grp','world_ctrl'),('r_FK_leg_01_ctrl_grp','world_ctrl'),('l_shoulder_ctrl_grp','world_ctrl'),('r_shoulder_ctrl_grp','world_ctrl'),('tail_ctrl_grp','world_ctrl'),('neck_01_ctrl_grp','world_ctrl'),('l_IK_leg_grp','world_ctrl'),('l_IK_arm_grp','world_ctrl'),('r_IK_leg_grp','world_ctrl'),('r_IK_arm_grp','world_ctrl'),('l_IKFK_leg_switch_grp','world_ctrl'),('r_IKFK_leg_switch_grp','world_ctrl'),('spine_01_setup_jnt','extra'),('world_ctrl_grp','ctrl_grp'),('spine_01_bln_jnt_grp','jnt_grp'),('l_FK_leg_01_jnt','jnt_grp'),('l_FK_arm_01_jnt','jnt_grp'),('l_shoulder_jnt','jnt_grp'),('r_FK_leg_01_jnt','jnt_grp'),('r_FK_arm_01_jnt','jnt_grp'),('r_shoulder_jnt','jnt_grp'),('tail_jnt_grp','jnt_grp'),('neck_01_jnt','jnt_grp'),('l_IK_leg_jnt_grp','jnt_grp'),('l_IK_arm_jnt_grp','jnt_grp'),('r_IK_leg_jnt_grp','jnt_grp'),('r_IK_arm_jnt_grp','jnt_grp'),('l_bln_leg_jnt_grp','jnt_grp'),('l_bln_arm_jnt_grp','jnt_grp'),('r_bln_leg_jnt_grp','jnt_grp'),('r_bln_arm_jnt_grp','jnt_grp'),('l_IK_leg_loc_grp','extra'),('l_IK_arm_loc_grp','extra'),('l_IK_arm_PV_loc_grp','extra'),('l_IK_leg_PV_loc_grp','extra'),('r_IK_leg_loc_grp','extra'),('r_IK_arm_loc_grp','extra'),('r_IK_arm_PV_loc_grp','extra'),('r_IK_leg_PV_loc_grp','extra'),('l_IKFK_arm_switch_grp','world_ctrl'),('r_IKFK_arm_switch_grp','world_ctrl'),('root_bind_jnt','bind_jnt_grp'),('ctrl_grp','rename'),('jnt_grp','rename'),('bind_jnt_grp','rename'),('extra','rename'),('mesh','rename')]
        for each in toParentGroup:
            cmds.parent(each[0],each[1])
            
        cmds.setAttr('jnt_grp.visibility',0)
        cmds.setAttr('extra.visibility',0)
        
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
    
    groupAll()
    
    def progressBarWindowClose():
        # the command to close the progress bar
        cmds.deleteUI('QuadrupedProgress',window=True)
        
    progressBarWindowClose()

#create setup joint function#
def setupjoint():
    #create setup jnt#
    nameOfSpineArmSetupJnt = [('world_setup',(0, 0, 0),(0,0,0)),('cog_setup',(0, 95, 0),(0,0,0)),('pelvis_setup',(0, 95, 0),(0,0,0)),('root_setup',(0, 95, 0),(0,0,0)),('spine_setup',(0, 110, 0),(0,0,0)),('chest_setup',(0, 125, 0),(0,0,0)),('l_shoulder_setup',(7, 140, -5),(0,0,0)),('l_arm_01_setup',(22, 140, -5),(0,0,0)),('l_arm_02_setup',(50, 140, -5),(0,0,0)),('l_elbow_setup',(50, 140, -40),(0,0,0)),('l_arm_03_setup',(74, 140, -5),(0,0,0)),('l_fingers_setup',(110, 140, -5),(0,0,0)),('l_thumb_01_setup',(77, 140, 3),(0,0,0)),('l_thumb_02_setup',(80, 140, 3),(0,0,0)),('l_thumb_03_setup',(83, 140, 3),(0,0,0)),('l_index_01_setup',(80, 140, 0),(0,0,0)),('l_index_02_setup',(85, 140, 0),(0,0,0)),('l_index_03_setup',(90, 140, 0),(0,0,0)),('l_index_04_setup',(95, 140, 0),(0,0,0)),('l_middle_01_setup',(80, 140, -3),(0,0,0)),('l_middle_02_setup',(87, 140, -3),(0,0,0)),('l_middle_03_setup',(94, 140, -3),(0,0,0)),('l_middle_04_setup',(101, 140, -3),(0,0,0)),('l_ring_01_setup',(80, 140, -6),(0,0,0)),('l_ring_02_setup',(86, 140, -6),(0,0,0)),('l_ring_03_setup',(92, 140, -6),(0,0,0)),('l_ring_04_setup',(98, 140, -6),(0,0,0)),('l_pinky_01_setup',(80, 140, -9),(0,0,0)),('l_pinky_02_setup',(84, 140, -9),(0,0,0)),('l_pinky_03_setup',(88, 140, -9),(0,0,0)),('l_pinky_04_setup',(92, 140, -9),(0,0,0)),('r_shoulder_setup',(-7, 140, -5),(180,0,0)),('r_arm_01_setup',(-22, 140, -5),(0,0,0)),('r_arm_02_setup',(-50, 140, -5),(0,0,0)),('r_elbow_setup',(-50, 140, -40),(0,0,0)),('r_arm_03_setup',(-74, 140, -5),(0,0,0)),('r_fingers_setup',(-110, 140, -5),(0,0,0)),('r_thumb_01_setup',(-77, 140, 3),(0,0,0)),('r_thumb_02_setup',(-80, 140, 3),(0,0,0)),('r_thumb_03_setup',(-83, 140, 3),(0,0,0)),('r_index_01_setup',(-80, 140, 0),(0,0,0)),('r_index_02_setup',(-85, 140, 0),(0,0,0)),('r_index_03_setup',(-90, 140, 0),(0,0,0)),('r_index_04_setup',(-95, 140, 0),(0,0,0)),('r_middle_01_setup',(-80, 140, -3),(0,0,0)),('r_middle_02_setup',(-87, 140, -3),(0,0,0)),('r_middle_03_setup',(-94, 140, -3),(0,0,0)),('r_middle_04_setup',(-101, 140, -3),(0,0,0)),('r_ring_01_setup',(-80, 140, -6),(0,0,0)),('r_ring_02_setup',(-86, 140, -6),(0,0,0)),('r_ring_03_setup',(-92, 140, -6),(0,0,0)),('r_ring_04_setup',(-98, 140, -6),(0,0,0)),('r_pinky_01_setup',(-80, 140, -9),(0,0,0)),('r_pinky_02_setup',(-84, 140, -9),(0,0,0)),('r_pinky_03_setup',(-88, 140, -9),(0,0,0)),('r_pinky_04_setup',(-92, 140, -9),(0,0,0)),('l_leg_01_setup',(11, 88, 0),(-90,0,90)),('l_leg_02_setup',(11, 50, 0),(0,0,0)),('l_knee_setup',(11, 50, 40),(0,0,0)),('l_leg_03_setup',(11, 15, 0),(0,0,0)),('l_leg_heel_setup',(11, 3, -5),(0,0,90)),('l_leg_04_setup',(11, 3, 15),(0,0,0)),('l_leg_roll_out_setup',(13, 3, 15),(0,0,0)),('l_leg_roll_in_setup',(9, 3, 15),(0,0,0)),('l_leg_05_setup',(11, 3, 20),(0,0,0)),('l_leg_06_setup',(11, 3, 25),(0,0,0)),('r_leg_01_setup',(-11, 88, 0),(0,0,-90)),('r_leg_02_setup',(-11, 50, 0),(0,0,0)),('r_knee_setup',(-11, 50, 40),(0,0,0)),('r_leg_03_setup',(-11, 15, 0),(0,0,0)),('r_leg_heel_setup',(-11, 3, -5),(0,0,-90)),('r_leg_04_setup',(-11, 3, 15),(0,0,180)),('r_leg_roll_out_setup',(-13, 3, 15),(0,0,-180)),('r_leg_roll_in_setup',(-9, 3, 15),(0,0,0)),('r_leg_05_setup',(-11, 3, 20),(0,0,0)),('r_leg_06_setup',(-11, 3, 25),(0,0,0)),('neck_setup',(0, 145, 0),(0,90,180)),('head_setup',(0, 155, 0),(0,0,0)),('head_end_setup',(0, 170, 0),(0,0,0)),('l_eye_setup',(5, 165, 10),(0,0,0)),('r_eye_setup',(-5, 165, 10),(0,0,0)),('eye_aim_setup',(0, 165, 50),(0,0,0))]
    for each in nameOfSpineArmSetupJnt:
        cmds.joint(n=each[0],p=each[1],o=each[2])
        
    parentJnt = [('root_setup','cog_setup'),('l_arm_03_setup','l_arm_02_setup'),('l_thumb_01_setup','l_arm_03_setup'),('l_index_01_setup','l_arm_03_setup'),('l_middle_01_setup','l_arm_03_setup'),('l_ring_01_setup','l_arm_03_setup'),('l_pinky_01_setup','l_arm_03_setup'),('r_shoulder_setup','chest_setup'),('r_thumb_01_setup','r_arm_03_setup'),('r_index_01_setup','r_arm_03_setup'),('r_middle_01_setup','r_arm_03_setup'),('r_pinky_01_setup','r_arm_03_setup'),('r_ring_01_setup','r_arm_03_setup'),('l_leg_01_setup','pelvis_setup'),('l_leg_03_setup','l_leg_02_setup'),('l_leg_roll_in_setup','l_leg_04_setup'),('l_leg_05_setup','l_leg_04_setup'),('l_leg_04_setup','l_leg_03_setup'),('r_arm_03_setup','r_arm_02_setup'),('r_leg_01_setup','pelvis_setup'),('r_leg_03_setup','r_leg_02_setup'),('r_leg_04_setup','r_leg_03_setup'),('r_leg_roll_in_setup','r_leg_04_setup'),('r_leg_05_setup','r_leg_04_setup'),('neck_setup','chest_setup'),('l_eye_setup','head_setup'),('r_eye_setup','head_setup'),('eye_aim_setup','head_setup')]
    for each in parentJnt:
        cmds.parent(each[0],each[1])
    
    toGetIKrotation = [('l_arm_02_setup','l_leg_02_setup'),('r_arm_02_setup','r_leg_02_setup')]
    for each in toGetIKrotation:
        cmds.setAttr(each[0]+'.rotateY',-5)
        cmds.setAttr(each[1]+'.rotateZ',-2)

    toLockSetupFoot = [('l_leg_04_setup.rotateX'),('l_leg_04_setup.rotateY'),('l_leg_04_setup.rotateZ'),('l_leg_05_setup.rotateX'),('l_leg_05_setup.rotateY'),('l_leg_05_setup.rotateZ'),('l_leg_06_setup.rotateX'),('l_leg_06_setup.rotateY'),('l_leg_06_setup.rotateZ'),('l_leg_04_setup.scaleX'),('l_leg_04_setup.scaleY'),('l_leg_04_setup.scaleZ'),('l_leg_05_setup.scaleX'),('l_leg_05_setup.scaleY'),('l_leg_05_setup.scaleZ'),('l_leg_06_setup.scaleX'),('l_leg_06_setup.scaleY'),('l_leg_06_setup.scaleZ'),('l_leg_roll_out_setup.rotateX'),('l_leg_roll_out_setup.rotateY'),('l_leg_roll_out_setup.rotateZ'),('l_leg_roll_in_setup.rotateX'),('l_leg_roll_in_setup.rotateY'),('l_leg_roll_in_setup.rotateZ'),('l_leg_heel_setup.rotateX'),('l_leg_heel_setup.rotateY'),('l_leg_heel_setup.rotateZ'),('l_leg_roll_out_setup.scaleX'),('l_leg_roll_out_setup.scaleY'),('l_leg_roll_out_setup.scaleZ'),('l_leg_roll_in_setup.scaleX'),('l_leg_roll_in_setup.scaleY'),('l_leg_roll_in_setup.scaleZ'),('l_leg_heel_setup.scaleX'),('l_leg_heel_setup.scaleY'),('l_leg_heel_setup.scaleZ'),('r_leg_04_setup.rotateX'),('r_leg_04_setup.rotateY'),('r_leg_04_setup.rotateZ'),('r_leg_05_setup.rotateX'),('r_leg_05_setup.rotateY'),('r_leg_05_setup.rotateZ'),('r_leg_06_setup.rotateX'),('r_leg_06_setup.rotateY'),('r_leg_06_setup.rotateZ'),('r_leg_04_setup.scaleX'),('r_leg_04_setup.scaleY'),('r_leg_04_setup.scaleZ'),('r_leg_05_setup.scaleX'),('r_leg_05_setup.scaleY'),('r_leg_05_setup.scaleZ'),('r_leg_06_setup.scaleX'),('r_leg_06_setup.scaleY'),('r_leg_06_setup.scaleZ'),('r_leg_roll_out_setup.rotateX'),('r_leg_roll_out_setup.rotateY'),('r_leg_roll_out_setup.rotateZ'),('r_leg_roll_in_setup.rotateX'),('r_leg_roll_in_setup.rotateY'),('r_leg_roll_in_setup.rotateZ'),('r_leg_heel_setup.rotateX'),('r_leg_heel_setup.rotateY'),('r_leg_heel_setup.rotateZ'),('r_leg_roll_out_setup.scaleX'),('r_leg_roll_out_setup.scaleY'),('r_leg_roll_out_setup.scaleZ'),('r_leg_roll_in_setup.scaleX'),('r_leg_roll_in_setup.scaleY'),('r_leg_roll_in_setup.scaleZ'),('r_leg_heel_setup.scaleX'),('r_leg_heel_setup.scaleY'),('r_leg_heel_setup.scaleZ')]
    for each in toLockSetupFoot:
        cmds.setAttr(each, lock = True)
        
    #######################################################################################
def mirrorSetupjoint():
    toUnlockSetupFoot = [('l_leg_04_setup.rotateX'),('l_leg_04_setup.rotateY'),('l_leg_04_setup.rotateZ'),('l_leg_05_setup.rotateX'),('l_leg_05_setup.rotateY'),('l_leg_05_setup.rotateZ'),('l_leg_06_setup.rotateX'),('l_leg_06_setup.rotateY'),('l_leg_06_setup.rotateZ'),('l_leg_04_setup.scaleX'),('l_leg_04_setup.scaleY'),('l_leg_04_setup.scaleZ'),('l_leg_05_setup.scaleX'),('l_leg_05_setup.scaleY'),('l_leg_05_setup.scaleZ'),('l_leg_06_setup.scaleX'),('l_leg_06_setup.scaleY'),('l_leg_06_setup.scaleZ'),('l_leg_roll_out_setup.rotateX'),('l_leg_roll_out_setup.rotateY'),('l_leg_roll_out_setup.rotateZ'),('l_leg_roll_in_setup.rotateX'),('l_leg_roll_in_setup.rotateY'),('l_leg_roll_in_setup.rotateZ'),('l_leg_heel_setup.rotateX'),('l_leg_heel_setup.rotateY'),('l_leg_heel_setup.rotateZ'),('l_leg_roll_out_setup.scaleX'),('l_leg_roll_out_setup.scaleY'),('l_leg_roll_out_setup.scaleZ'),('l_leg_roll_in_setup.scaleX'),('l_leg_roll_in_setup.scaleY'),('l_leg_roll_in_setup.scaleZ'),('l_leg_heel_setup.scaleX'),('l_leg_heel_setup.scaleY'),('l_leg_heel_setup.scaleZ'),('r_leg_04_setup.rotateX'),('r_leg_04_setup.rotateY'),('r_leg_04_setup.rotateZ'),('r_leg_05_setup.rotateX'),('r_leg_05_setup.rotateY'),('r_leg_05_setup.rotateZ'),('r_leg_06_setup.rotateX'),('r_leg_06_setup.rotateY'),('r_leg_06_setup.rotateZ'),('r_leg_04_setup.scaleX'),('r_leg_04_setup.scaleY'),('r_leg_04_setup.scaleZ'),('r_leg_05_setup.scaleX'),('r_leg_05_setup.scaleY'),('r_leg_05_setup.scaleZ'),('r_leg_06_setup.scaleX'),('r_leg_06_setup.scaleY'),('r_leg_06_setup.scaleZ'),('r_leg_roll_out_setup.rotateX'),('r_leg_roll_out_setup.rotateY'),('r_leg_roll_out_setup.rotateZ'),('r_leg_roll_in_setup.rotateX'),('r_leg_roll_in_setup.rotateY'),('r_leg_roll_in_setup.rotateZ'),('r_leg_heel_setup.rotateX'),('r_leg_heel_setup.rotateY'),('r_leg_heel_setup.rotateZ'),('r_leg_roll_out_setup.scaleX'),('r_leg_roll_out_setup.scaleY'),('r_leg_roll_out_setup.scaleZ'),('r_leg_roll_in_setup.scaleX'),('r_leg_roll_in_setup.scaleY'),('r_leg_roll_in_setup.scaleZ'),('r_leg_heel_setup.scaleX'),('r_leg_heel_setup.scaleY'),('r_leg_heel_setup.scaleZ')]
    for each in toUnlockSetupFoot:
        cmds.setAttr(each, lock = False)

    cmds.mirrorJoint('l_shoulder_setup',mb = True,myz = True,sr = ('l_','r_mirror_'))

    #parentConArmJointForPosition#
    parentConArmMirrorJntForPos = [('r_mirror_shoulder_setup','r_shoulder_setup')],[('r_mirror_arm_01_setup','r_arm_01_setup')],[('r_mirror_elbow_setup','r_elbow_setup')],[('r_mirror_arm_02_setup','r_arm_02_setup')],[('r_mirror_arm_03_setup','r_arm_03_setup')],[('r_mirror_fingers_setup','r_fingers_setup')],[('r_mirror_thumb_01_setup','r_thumb_01_setup')],[('r_mirror_thumb_02_setup','r_thumb_02_setup')],[('r_mirror_thumb_03_setup','r_thumb_03_setup')],[('r_mirror_index_01_setup','r_index_01_setup')],[('r_mirror_index_02_setup','r_index_02_setup')],[('r_mirror_index_03_setup','r_index_03_setup')],[('r_mirror_index_04_setup','r_index_04_setup')],[('r_mirror_middle_01_setup','r_middle_01_setup')],[('r_mirror_middle_02_setup','r_middle_02_setup')],[('r_mirror_middle_03_setup','r_middle_03_setup')],[('r_mirror_middle_04_setup','r_middle_04_setup')],[('r_mirror_ring_01_setup','r_ring_01_setup')],[('r_mirror_ring_02_setup','r_ring_02_setup')],[('r_mirror_ring_03_setup','r_ring_03_setup')],[('r_mirror_ring_04_setup','r_ring_04_setup')],[('r_mirror_pinky_01_setup','r_pinky_01_setup')],[('r_mirror_pinky_02_setup','r_pinky_02_setup')],[('r_mirror_pinky_03_setup','r_pinky_03_setup')],[('r_mirror_pinky_04_setup','r_pinky_04_setup')]
    
    for armJnt in parentConArmMirrorJntForPos:
        for jnt in armJnt:
            parentConArmMirrorForDel = cmds.parentConstraint(jnt[0],jnt[1],mo = False)
            cmds.delete(parentConArmMirrorForDel)
            
    cmds.delete('r_mirror_shoulder_setup')
    
    #parentConLegJointForPosition#
    cmds.mirrorJoint('l_leg_01_setup',mb = True,myz = True)
    forDel = cmds.parentConstraint('l_leg_01_setup1','r_leg_01_setup',mo=False)
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_01_setup',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_01_setup.rotateZ',180)
    forDel = cmds.parentConstraint('l_leg_02_setup1','r_leg_02_setup',mo=False)
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_02_setup',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_02_setup.rotateZ',180)
    forDel = cmds.parentConstraint('l_leg_03_setup1','r_leg_03_setup',mo=False)
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_03_setup',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_03_setup.rotateZ',180)
    forDel = cmds.parentConstraint('l_leg_04_setup1','r_leg_04_setup',mo=False)
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_04_setup',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_04_setup.rotateZ',180)
    list = [('l_knee_setup1','r_knee_setup'),('l_leg_heel_setup1','r_leg_heel_setup'),('l_leg_roll_out_setup1','r_leg_roll_out_setup'),('l_leg_roll_in_setup1','r_leg_roll_in_setup'),('l_leg_05_setup1','r_leg_05_setup'),('l_leg_06_setup1','r_leg_06_setup')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1])
        cmds.delete(forDel)
    
    cmds.delete('l_leg_01_setup1')
    
    cmds.mirrorJoint('l_eye_setup',mb = False,myz = True,sr = ('l_','r_mirror_'))
    cmds.parentConstraint('r_mirror_eye_setup','r_eye_setup',mo=False)
    cmds.delete('r_mirror_eye_setup')
    
def buildsetup():
    
    def progressBarWindow():
        # this command opens the window
        window = cmds.window('EugenesProgress',title='Building')
        cmds.columnLayout()
        
        cmds.progressBar('EugenesProgressBar',maxValue=10, width=300)
        
        cmds.showWindow( window )
        
    progressBarWindow()

    def ControllerAttr(controllerName,visKeyableOrnot,scaleXKeyableOrnot,scaleYKeyableOrnot,scaleZKeyableOrnot,rotateXKeyableOrnot,rotateYKeyableOrnot,rotateZKeyableOrnot,visLockOrnot,scaleXLockOrnot,scaleYLockOrnot,scaleZLockOrnot,rotateXLockOrnot,rotateYLockOrnot,rotateZLockOrnot,colorEnableOrnot,colorNumber,translateXKeyableOrnot,translateYKeyableOrnot,translateZKeyableOrnot,translateXLockOrnot,translateYLockOrnot,translateZLockOrnot):
        cmds.setAttr ((controllerName) +'.visibility',keyable = visKeyableOrnot, cb = False, lock = visLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleX',keyable = scaleXKeyableOrnot, cb = False, lock = scaleXLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleY',keyable = scaleYKeyableOrnot, cb = False, lock = scaleYLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleZ',keyable = scaleZKeyableOrnot, cb = False, lock = scaleZLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateX',keyable = rotateXKeyableOrnot, cb = False, lock = rotateXLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateY',keyable = rotateYKeyableOrnot, cb = False, lock = rotateYLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateZ',keyable = rotateZKeyableOrnot, cb = False, lock = rotateZLockOrnot)
        cmds.setAttr ((controllerName) +'.translateX',keyable = translateXKeyableOrnot, cb = False, lock = translateXLockOrnot)
        cmds.setAttr ((controllerName) +'.translateY',keyable = translateYKeyableOrnot, cb = False, lock = translateYLockOrnot)
        cmds.setAttr ((controllerName) +'.translateZ',keyable = translateZKeyableOrnot, cb = False, lock = translateZLockOrnot)
        cmds.setAttr ((controllerName) + '.overrideEnabled' ,colorEnableOrnot) 
        cmds.setAttr ((controllerName) + '.overrideColor' ,colorNumber)
        
    def spineSetup():
        #FK spine#
        toUnlockSetupFoot = [('l_leg_04_setup.rotateX'),('l_leg_04_setup.rotateY'),('l_leg_04_setup.rotateZ'),('l_leg_05_setup.rotateX'),('l_leg_05_setup.rotateY'),('l_leg_05_setup.rotateZ'),('l_leg_06_setup.rotateX'),('l_leg_06_setup.rotateY'),('l_leg_06_setup.rotateZ'),('l_leg_04_setup.scaleX'),('l_leg_04_setup.scaleY'),('l_leg_04_setup.scaleZ'),('l_leg_05_setup.scaleX'),('l_leg_05_setup.scaleY'),('l_leg_05_setup.scaleZ'),('l_leg_06_setup.scaleX'),('l_leg_06_setup.scaleY'),('l_leg_06_setup.scaleZ'),('l_leg_roll_out_setup.rotateX'),('l_leg_roll_out_setup.rotateY'),('l_leg_roll_out_setup.rotateZ'),('l_leg_roll_in_setup.rotateX'),('l_leg_roll_in_setup.rotateY'),('l_leg_roll_in_setup.rotateZ'),('l_leg_heel_setup.rotateX'),('l_leg_heel_setup.rotateY'),('l_leg_heel_setup.rotateZ'),('l_leg_roll_out_setup.scaleX'),('l_leg_roll_out_setup.scaleY'),('l_leg_roll_out_setup.scaleZ'),('l_leg_roll_in_setup.scaleX'),('l_leg_roll_in_setup.scaleY'),('l_leg_roll_in_setup.scaleZ'),('l_leg_heel_setup.scaleX'),('l_leg_heel_setup.scaleY'),('l_leg_heel_setup.scaleZ'),('r_leg_04_setup.rotateX'),('r_leg_04_setup.rotateY'),('r_leg_04_setup.rotateZ'),('r_leg_05_setup.rotateX'),('r_leg_05_setup.rotateY'),('r_leg_05_setup.rotateZ'),('r_leg_06_setup.rotateX'),('r_leg_06_setup.rotateY'),('r_leg_06_setup.rotateZ'),('r_leg_04_setup.scaleX'),('r_leg_04_setup.scaleY'),('r_leg_04_setup.scaleZ'),('r_leg_05_setup.scaleX'),('r_leg_05_setup.scaleY'),('r_leg_05_setup.scaleZ'),('r_leg_06_setup.scaleX'),('r_leg_06_setup.scaleY'),('r_leg_06_setup.scaleZ'),('r_leg_roll_out_setup.rotateX'),('r_leg_roll_out_setup.rotateY'),('r_leg_roll_out_setup.rotateZ'),('r_leg_roll_in_setup.rotateX'),('r_leg_roll_in_setup.rotateY'),('r_leg_roll_in_setup.rotateZ'),('r_leg_heel_setup.rotateX'),('r_leg_heel_setup.rotateY'),('r_leg_heel_setup.rotateZ'),('r_leg_roll_out_setup.scaleX'),('r_leg_roll_out_setup.scaleY'),('r_leg_roll_out_setup.scaleZ'),('r_leg_roll_in_setup.scaleX'),('r_leg_roll_in_setup.scaleY'),('r_leg_roll_in_setup.scaleZ'),('r_leg_heel_setup.scaleX'),('r_leg_heel_setup.scaleY'),('r_leg_heel_setup.scaleZ')]
        for each in toUnlockSetupFoot:
            cmds.setAttr(each, lock = False)
            
        cmds.makeIdentity( 'cog_setup',apply=True,translate=True,rotate=True)
        cmds.curve(p=[(0.0, 0.0, 107.43535641560554),(0.0, 0.0, 107.43535641560554),(24.915725527215045, 0.0, 75.00395255193817),(24.915725527215045, 0.0, 75.00395255193817),(11.244867487196904, 8.522407998048963e-16, 75.00395255193817),(11.244867487196904, 8.522407998048963e-16, 75.00395255193817),(11.245769514449382, -8.522407998048963e-16, 58.21954194768595),(11.245769514449382, -8.522407998048963e-16, 58.21954194768595),(23.21945878815599, 0.0, 56.05673231731379),(42.90396545838193, -6.817926398439171e-15, 42.90396545838193),(56.05673231731379, -1.7044815996097927e-15, 23.219458788155972),(58.21954194768592, -5.113444798829372e-15, 11.245317823980379),(58.21954194768592, -5.113444798829372e-15, 11.245317823980379),(75.00395255193817, 0.0, 11.245307123418877),(75.00395255193817, 0.0, 11.245307123418877),(75.00395255193817, 0.0, 24.915725527215034),(75.00395255193817, 0.0, 24.915725527215034),(107.43535641560554, -2.0453779195317487e-14, 0.0),(107.43535641560554, -2.0453779195317487e-14, 0.0),(75.00395255193817, 0.0, -24.915725527215034),(75.00395255193817, 0.0, -24.915725527215034),(75.00395255193817, 0.0, -11.245149376085063),(75.00395255193817, 0.0, -11.245149376085063),(58.21954194768592, -5.113444798829372e-15, -11.245479986907359),(58.21954194768592, -5.113444798829372e-15, -11.245479986907359),(56.05673231731379, -1.7044815996097927e-15, -23.219458788155972),(42.90396545838193, -6.817926398439171e-15, -42.90396545838193),(23.21945878815599, 0.0, -56.05673231731379),(11.245769514449382, -8.522407998048963e-16, -58.21954194768595),(11.245769514449382, -8.522407998048963e-16, -58.21954194768595),(11.244855432949919, 0.0, -75.00395255193817),(11.244855432949919, 0.0, -75.00395255193817),(24.915725527215045, 0.0, -75.00395255193817),(24.915725527215045, 0.0, -75.00395255193817),(0.0, 0.0, -107.43535641560554),(0.0, 0.0, -107.43535641560554),(-24.915725527215045, 0.0, -75.00395255193817),(-24.915725527215045, 0.0, -75.00395255193817),(-11.245232466589695, 2.9828427993171384e-15, -75.00395255193817),(-11.245232466589695, 2.9828427993171384e-15, -75.00395255193817),(-11.245388215625923, 0.0, -58.21954194768595),(-11.245388215625923, 0.0, -58.21954194768595),(-23.21945878815599, 0.0, -56.05673231731379),(-42.90396545838193, 6.817926398439171e-15, -42.90396545838193),(-56.05673231731379, 1.7044815996097927e-15, -23.219458788155972),(-58.21954194768592, 5.113444798829372e-15, -11.245479986907359),(-58.21954194768592, 5.113444798829372e-15, -11.245479986907359),(-75.00395255193817, 0.0, -11.245144960491917),(-75.00395255193817, 0.0, -11.245144960491917),(-75.00395255193817, 0.0, -24.915725527215034),(-75.00395255193817, 0.0, -24.915725527215034),(-107.43535641560554, 2.0453779195317487e-14, 0.0),(-107.43535641560554, 2.0453779195317487e-14, 0.0),(-75.00395255193817, 0.0, 24.915725527215034),(-75.00395255193817, 0.0, 24.915725527215034),(-75.00395255193817, 0.0, 11.245307273828363),(-75.00395255193817, 0.0, 11.245307273828363),(-58.21954194768592, 5.113444798829372e-15, 11.245317823980379),(-58.21954194768592, 5.113444798829372e-15, 11.245317823980379),(-56.05673231731379, 1.7044815996097927e-15, 23.219458788155972),(-42.90396545838193, 6.817926398439171e-15, 42.90396545838193),(-23.21945878815599, 0.0, 56.05673231731379),(-11.245394640260228, -8.522407998048963e-16, 58.21954194768595),(-11.245394640260228, -8.522407998048963e-16, 58.21954194768595),(-11.245230307139062, 4.2612039990244817e-16, 75.00395255193817),(-11.245230307139062, 4.2612039990244817e-16, 75.00395255193817),(-24.915725527215045, 0.0, 75.00395255193817),(-24.915725527215045, 0.0, 75.00395255193817),(0.0, 0.0, 107.43535641560554)], d=2)
        cmds.rename('main_ctrl')
        cmds.setAttr('main_ctrl.overrideEnabled' ,True) 
        cmds.setAttr('main_ctrl.overrideColor' ,20)
        cmds.setAttr ('main_ctrl.visibility',keyable = False, cb = False, lock = True)
        cmds.group(n='main_ctrl_grp')
        cmds.circle(n='world_ctrl',r=50, nry = 90)
        cmds.setAttr('world_ctrl.overrideEnabled' ,True) 
        cmds.setAttr('world_ctrl.overrideColor' ,20)
        cmds.setAttr ('world_ctrl.visibility',keyable = False, cb = False, lock = True)
        cmds.group(n='world_ctrl_grp')
        cmds.parent('world_ctrl_grp','main_ctrl')
        cmds.curve(d=1, p=[(-4.0751377334481305, 0.0, 24.450826400688754),(-24.450826400688754, 0.0, 4.075137733448116),(-24.450826400688754, 0.0, 8.150275466896261),(-32.601101867585015, 0.0, 0.0),(-24.450826400688754, 0.0, -8.150275466896261),(-24.450826400688754, 0.0, -4.075137733448116),(-4.0751377334481305, 0.0, -24.450826400688754),(-4.0751377334481305, 0.0, -24.450826400688754),(-8.150275466896247, 0.0, -24.450826400688754),(0.0, 0.0, -32.60110186758499),(8.150275466896247, 0.0, -24.450826400688754),(4.0751377334481305, 0.0, -24.450826400688754),(24.450826400688754, 0.0, -4.075137733448116),(24.450826400688754, 0.0, -8.150275466896261),(24.450826400688754, 0.0, -8.150275466896261),(32.60110186758501, 0.0, 0.0),(24.450826400688754, 0.0, 8.150275466896261),(24.450826400688754, 0.0, 4.075137733448116),(4.0751377334481305, 0.0, 24.450826400688754),(4.0751377334481305, 0.0, 24.450826400688754),(8.150275466896247, 0.0, 24.450826400688754),(0.0, 0.0, 32.601101867585015),(-8.150275466896247, 0.0, 24.450826400688754),(-4.0751377334481305, 0.0, 24.450826400688754)])
        cmds.rename('cog_ctrl')
        cmds.setAttr ('cog_ctrl.visibility',keyable = False, cb = False, lock = True)
        cmds.setAttr ('cog_ctrl.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr ('cog_ctrl.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr ('cog_ctrl.scaleZ',keyable = False, cb = False, lock = True)
        cmds.setAttr ('cog_ctrl.overrideEnabled' ,True) 
        cmds.setAttr ('cog_ctrl.overrideColor' ,20)
        cmds.group(n='cog_ctrl_grp',em=True)
        cmds.parent('cog_ctrl','cog_ctrl_grp')
        cmds.group(n='jnt_grp',em=True)
        nameOfFKspineController = [('spine_01_FK_ctrl','spine_01_FK_ctrl_grp'),('spine_02_FK_ctrl','spine_02_FK_ctrl_grp'),('spine_03_FK_ctrl','spine_03_FK_ctrl_grp')]
        for each in nameOfFKspineController:
            cmds.curve(d=1, p=[(-6.5, 2, 18),(6.5, 2, 18),(18, 2, 6.5),(18, 2, -6.5),(6.5, 2, -18),(-6.5, 2, -18),(-18, 2, -6.5),(-18, 2, 6.5),(-6.5, 2, 18),(-6.5, -2, 18),(-18, -2, 6.5),(-18, 2, 6.5),(-18, -2, 6.5),(-18, -2, -6.5),(-18, 2, -6.5),(-18, -2, -6.5),(-6.5, -2, -18),(-6.5, 2, -18),(-6.5, -2, -18),(6.5, -2, -18),(6.5, 2, -18),(6.5, -2, -18),(18, -2, -6.5),(18, 2, -6.5),(18, -2, -6.5),(18, -2, 6.5),(18, 2, 6.5),(18, -2, 6.5),(6.5, -2, 18),(6.5, 2, 18),(6.5, -2, 18),(-6.5, -2, 18)])
            cmds.rename(each[0])
            cmds.group(n=each[1])

        nameOfFKspineJoint = ['spine_FK_01_jnt','spine_FK_02_jnt','spine_FK_03_jnt']
        for each in nameOfFKspineJoint:
            cmds.joint(n=each)
            
        cmds.parent('spine_FK_01_jnt',w=True)
            
        toGetFkspineJointPos = [('root_setup','spine_FK_01_jnt'),('spine_setup','spine_FK_02_jnt'),('chest_setup','spine_FK_03_jnt'),('root_setup','spine_01_FK_ctrl_grp'),('spine_setup','spine_02_FK_ctrl_grp'),('chest_setup','spine_03_FK_ctrl_grp'),('root_setup','cog_ctrl_grp')]
        for each in toGetFkspineJointPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        forParentCon = [('spine_01_FK_ctrl','spine_FK_01_jnt'),('spine_02_FK_ctrl','spine_FK_02_jnt'),('spine_03_FK_ctrl','spine_FK_03_jnt'),('cog_ctrl','spine_01_FK_ctrl_grp')]
        for each in forParentCon:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        toParent = [('spine_03_FK_ctrl_grp','spine_02_FK_ctrl'),('spine_02_FK_ctrl_grp','spine_01_FK_ctrl')]
        for each in toParent:
            cmds.parent(each[0],each[1])
            
        #IK spine#
        cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
        cmds.rename('spine_crv')
        nameOfLoc = ['spine_01_loc','spine_02_loc','spine_03_loc','spine_04_loc','spine_05_loc']
        for each in nameOfLoc:
            cmds.spaceLocator(n=each)
    
        toGetLocPos = [('spine_01_loc.translateY',0),('spine_02_loc.translateY',2.5),('spine_03_loc.translateY',5),('spine_04_loc.translateY',7.5),('spine_05_loc.translateY',10)]
        for each in toGetLocPos:
            cmds.setAttr(each[0],each[1])
    
        toConnectLoc = [('spine_01_loc.worldPosition[0]','spine_crvShape.controlPoints[0]'),('spine_02_loc.worldPosition[0]','spine_crvShape.controlPoints[1]'),('spine_03_loc.worldPosition[0]','spine_crvShape.controlPoints[2]'),('spine_04_loc.worldPosition[0]','spine_crvShape.controlPoints[3]'),('spine_05_loc.worldPosition[0]','spine_crvShape.controlPoints[4]')]
        for each in toConnectLoc:
            cmds.connectAttr(each[0],each[1])
            
        toCreateIKspineController = [('spine_01_IK_ctrl','spine_01_IK_ctrl_grp'),('spine_02_IK_ctrl','spine_02_IK_ctrl_grp'),('spine_03_IK_ctrl','spine_03_IK_ctrl_grp')]
        for each in toCreateIKspineController:
            cmds.circle(n=each[0],r=10,nry = 90)
            cmds.group(n=each[1])
        cmds.delete('world_ctrl','spine_01_IK_ctrl','spine_02_IK_ctrl','spine_03_IK_ctrl',constructionHistory = True)
        
        toCreateJoint = ['spine_IK_chest_jnt','spine_IK_root_jnt','spine_IK_01_jnt','spine_IK_02_jnt','spine_IK_03_jnt','spine_IK_04_jnt','spine_IK_05_jnt','spine_01_length_jnt','spine_02_length_jnt','spine_03_length_jnt','spine_04_length_jnt','spine_05_length_jnt','spine_start_length_jnt','spine_end_length_jnt']
        for each in toCreateJoint:
            cmds.joint(n=each)
            
        cmds.group(n='spine_IK_jnt_grp',em=True)
        cmds.parent('spine_IK_01_jnt','spine_IK_jnt_grp')
        cmds.orientConstraint('cog_ctrl','spine_IK_jnt_grp')
            
        cmds.parent('spine_IK_root_jnt','spine_IK_chest_jnt','spine_01_length_jnt','spine_start_length_jnt',w=True)
        
        toGetPos = [('root_setup','spine_IK_01_jnt'),('root_setup','spine_IK_02_jnt'),('spine_setup','spine_IK_02_jnt'),('spine_setup','spine_IK_03_jnt'),('spine_setup','spine_IK_04_jnt'),('chest_setup','spine_IK_04_jnt'),('chest_setup','spine_IK_05_jnt'),('root_setup','spine_01_IK_ctrl_grp'),('spine_setup','spine_02_IK_ctrl_grp'),('chest_setup','spine_03_IK_ctrl_grp'),('root_setup','spine_start_length_jnt'),('chest_setup','spine_end_length_jnt'),('root_setup','spine_01_length_jnt'),('root_setup','spine_01_loc'),('spine_setup','spine_03_loc'),('chest_setup','spine_05_loc'),('root_setup','spine_IK_root_jnt'),('chest_setup','spine_IK_chest_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        forDelspine_02_lenghtJntParentCon = cmds.parentConstraint('root_setup','spine_02_length_jnt',mo=False)
        forDelspine_02_lenghtJntParentCon = cmds.parentConstraint('spine_setup','spine_02_length_jnt',mo=False)
        forDelspine_03_lenghtJntParentCon = cmds.parentConstraint('spine_setup','spine_03_length_jnt',mo=False)
        forDelspine_04_lenghtJntParentCon = cmds.parentConstraint('spine_setup','spine_04_length_jnt',mo=False)
        forDelspine_04_lenghtJntParentCon = cmds.parentConstraint('chest_setup','spine_04_length_jnt',mo=False)
        forDelspine_05_lenghtJntParentCon = cmds.parentConstraint('chest_setup','spine_05_length_jnt',mo=False)
        cmds.delete(forDelspine_02_lenghtJntParentCon)
        cmds.delete(forDelspine_03_lenghtJntParentCon)
        cmds.delete(forDelspine_04_lenghtJntParentCon)
        cmds.delete(forDelspine_05_lenghtJntParentCon) 
        forDelspine_02_locParentCon = cmds.parentConstraint('root_setup','spine_02_loc',mo=False)
        forDelspine_02_locParentCon = cmds.parentConstraint('spine_setup','spine_02_loc',mo=False)
        forDelspine_04_locParentCon = cmds.parentConstraint('spine_setup','spine_04_loc',mo=False)
        forDelspine_04_locParentCon = cmds.parentConstraint('chest_setup','spine_04_loc',mo=False)
        cmds.delete(forDelspine_02_locParentCon)
        cmds.delete(forDelspine_04_locParentCon)
        
        toParentCon = [('spine_03_IK_ctrl','spine_IK_chest_jnt'),('spine_01_IK_ctrl','spine_IK_root_jnt'),('spine_01_IK_ctrl','spine_01_loc'),('spine_02_IK_ctrl','spine_03_loc'),('spine_03_IK_ctrl','spine_05_loc'),('spine_01_IK_ctrl','spine_02_loc'),('spine_02_IK_ctrl','spine_02_loc'),('spine_02_IK_ctrl','spine_04_loc'),('spine_03_IK_ctrl','spine_04_loc'),('spine_03_IK_ctrl','spine_02_IK_ctrl_grp'),('spine_01_IK_ctrl','spine_02_IK_ctrl_grp'),('cog_ctrl','spine_01_IK_ctrl_grp'),('cog_ctrl','spine_03_IK_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        cmds.select('spine_IK_01_jnt','spine_IK_05_jnt','spine_crv')
        cmds.ikHandle(n='spine_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
        
        createNode = [('multiplyDivide','spine_twist_mult'),('plusMinusAverage','spine_twist_pma'),('multiplyDivide','spine_stretch_01_mult'),('multiplyDivide','spine_stretch_02_mult')]
        for each in createNode:
            cmds.shadingNode(each[0],n=each[1],asUtility=1)
            
        toSetNode = [('spine_twist_mult.input2X',-1),('spine_stretch_01_mult.operation',2),('spine_stretch_01_mult.operation',2)]
        for each in toSetNode:
            cmds.setAttr(each[0],each[1])
        
        cmds.arclen('spine_crv',ch = True)
            
        toConnectAttr = [('spine_01_IK_ctrl.rotateY','spine_twist_mult.input1X'),('spine_03_IK_ctrl.rotateY','spine_twist_pma.input1D[0]'),('spine_01_IK_ctrl.rotateY','spine_ikh.roll'),('spine_twist_pma.output1D','spine_ikh.twist'),('spine_twist_mult.outputX','spine_twist_pma.input1D[1]'),('curveInfo1.arcLength','spine_stretch_01_mult.input1X'),('spine_stretch_01_mult.outputX','spine_stretch_02_mult.input1X'),('spine_02_length_jnt.translateY','spine_stretch_02_mult.input2X'),('spine_stretch_02_mult.outputX','spine_IK_02_jnt.translateY'),('spine_stretch_02_mult.outputX','spine_IK_03_jnt.translateY'),('spine_stretch_02_mult.outputX','spine_IK_04_jnt.translateY'),('spine_stretch_02_mult.outputX','spine_IK_05_jnt.translateY'),('spine_end_length_jnt.translateY','spine_stretch_01_mult.input2X')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
        
        toCreateGroup = ['spine_IK_setup_jnt_grp','spine_IK_ctrl_grp','spine_IK_loc_grp','spine_IK_setup_grp']
        for each in toCreateGroup:
            cmds.group(n=each,em=True)
            
        toParent = [('spine_01_loc','spine_IK_loc_grp'),('spine_02_loc','spine_IK_loc_grp'),('spine_03_loc','spine_IK_loc_grp'),('spine_04_loc','spine_IK_loc_grp'),('spine_05_loc','spine_IK_loc_grp'),('spine_01_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_02_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_03_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_01_length_jnt','spine_IK_setup_jnt_grp'),('spine_start_length_jnt','spine_IK_setup_jnt_grp'),('spine_ikh','spine_IK_setup_grp'),('spine_crv','spine_IK_setup_grp'),('spine_IK_setup_jnt_grp','spine_IK_setup_grp'),('spine_IK_loc_grp','spine_IK_setup_grp')]
        for each in toParent:
            cmds.parent(each[0],each[1])
        
        cmds.scaleConstraint('world_ctrl','spine_IK_setup_jnt_grp',mo=True)
            
        #set IKFK spine controller attributes#
        listOfSpineController = ['spine_01_IK_ctrl','spine_02_IK_ctrl','spine_03_IK_ctrl','spine_01_FK_ctrl','spine_02_FK_ctrl','spine_03_FK_ctrl']
        for each in listOfSpineController:
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,17)
        
        #create IKFK spine bind joint#
        nameOfSpineBindJoint = ['spine_01_bln_jnt','spine_02_bln_jnt','spine_03_bln_jnt']
        for each in nameOfSpineBindJoint:
            cmds.joint(n=each)
            
        cmds.parent('spine_01_bln_jnt',w=True)
        cmds.group(n='spine_01_bln_jnt_grp')
        cmds.scaleConstraint('world_ctrl','spine_01_bln_jnt_grp',mo=True)
            
        toGetSpineBindJointPos = [('root_setup','spine_01_bln_jnt'),('spine_setup','spine_02_bln_jnt'),('chest_setup','spine_03_bln_jnt')]
        for each in toGetSpineBindJointPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        toParentConIKFKspine = [('spine_FK_01_jnt','spine_01_bln_jnt'),('spine_IK_root_jnt','spine_01_bln_jnt'),('spine_FK_02_jnt','spine_02_bln_jnt'),('spine_IK_03_jnt','spine_02_bln_jnt'),('spine_FK_03_jnt','spine_03_bln_jnt'),('spine_IK_chest_jnt','spine_03_bln_jnt')]    
        for each in toParentConIKFKspine:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        cmds.curve(n='spine_ik_fk_switch',d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
        cmds.group(n='spine_ik_fk_switch_grp')
        ControllerAttr('spine_ik_fk_switch',False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,15,False,False,False,True,True,True)
        cmds.parent('spine_ik_fk_switch_grp', 'world_ctrl')
        cmds.addAttr('spine_ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1,dv=1)
        cmds.parentConstraint('spine_02_bln_jnt','spine_ik_fk_switch_grp')
        cmds.shadingNode('reverse',n='spine_ik_rev',asUtility=1)
        
        toConnectAttr = [('spine_ik_fk_switch.IKFK','spine_01_bln_jnt_parentConstraint1.spine_FK_01_jntW0'),('spine_ik_fk_switch.IKFK','spine_ik_rev.inputX'),('spine_ik_rev.outputX','spine_01_bln_jnt_parentConstraint1.spine_IK_root_jntW1'),('spine_ik_fk_switch.IKFK','spine_02_bln_jnt_parentConstraint1.spine_FK_02_jntW0'),('spine_ik_rev.outputX','spine_02_bln_jnt_parentConstraint1.spine_IK_03_jntW1'),('spine_ik_fk_switch.IKFK','spine_03_bln_jnt_parentConstraint1.spine_FK_03_jntW0'),('spine_ik_rev.outputX','spine_03_bln_jnt_parentConstraint1.spine_IK_chest_jntW1'),('spine_ik_rev.outputX','spine_IK_ctrl_grp.visibility'),('spine_ik_fk_switch.IKFK','spine_01_FK_ctrl_grp.visibility')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
        
        #group all spine joint#
        cmds.group(n='spine_jnt_grp',em=True)
        
        spineJointList = [('spine_FK_01_jnt','spine_jnt_grp'),('spine_IK_root_jnt','spine_jnt_grp'),('spine_IK_chest_jnt','spine_jnt_grp'),('spine_IK_jnt_grp','spine_jnt_grp'),('spine_01_bln_jnt_grp','spine_jnt_grp')]
        for each in spineJointList:
            cmds.parent(each[0],each[1])
        # the command to change the progress bar
        cmds.progressBar('EugenesProgressBar', edit=True, step=1)
        
    spineSetup()
        
    def ShoulderSetup(side):
        cmds.curve(d=1, p=[(-5, -10, 10),(-5, 10, 10),(5, 10, 10),(5, -10, 10),(5, -10, -10),(5, 10, -10),(-5, 10, -10),(-5, -10, -10),(-5, -10, 10),(5, -10, 10),(5, 10, 10),(5, 10, -10),(5, -10, -10),(-5, -10, -10),(-5, 10, -10),(-5, 10, 10)])
        cmds.rename('%s_shoulder_ctrl'%(side))
        ControllerAttr('%s_shoulder_ctrl'%(side),False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
        cmds.group(n='%s_shoulder_ctrl_grp'%(side))
        forDel = cmds.parentConstraint('%s_shoulder_setup'%(side),'%s_shoulder_ctrl_grp'%(side),mo=False)
        cmds.delete(forDel)
        cmds.joint(n='%s_shoulder_jnt'%(side))
        cmds.parent('%s_shoulder_ctrl_grp'%(side),'world_ctrl')
        cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_shoulder_jnt'%(side),mo=False)
        cmds.parentConstraint('spine_03_bln_jnt','%s_shoulder_ctrl_grp'%(side),mo=True)
        
    ShoulderSetup('l')
    ShoulderSetup('r')

    def buildBendyArm():
        def FKarmSetup(side):
            #FKarm#
            fkarmcontroller = [('%s_fk_arm_01_ctrl'%(side),'%s_fk_arm_01_ctrl_grp'%(side)),('%s_fk_arm_02_ctrl'%(side),'%s_fk_arm_02_ctrl_grp'%(side)),('%s_fk_arm_03_ctrl'%(side),'%s_fk_arm_03_ctrl_grp'%(side))]
            for each in fkarmcontroller:
                ctrl = cmds.curve(d=1,p=[(0.0, 1.8457071003629746, -6.888272674590291),(0.0, 1.6065215981349992, -5.995620227271308),(0.0, -1.6065234643869502, -5.995624729951774),(0.0, -1.8454397435472047, -6.8872682416730004),(0.0, -5.041829388107622, -5.041831819868864),(0.0, -4.389101595742385, -4.389102497134237),(0.0, -5.995620227271308, -1.6065215981349992),(0.0, -6.888272674590291, -1.8457071003629746),(0.0, -6.8872682416730004, 1.8454397435472047),(0.0, -5.995624729951774, 1.6065234643869502),(0.0, -4.389102497134237, 4.389101595742385),(0.0, -5.041831819868864, 5.041829388107622),(0.0, -1.8457071003629746, 6.888272674590291),(0.0, -1.6065215981349992, 5.995620227271308),(0.0, 1.6065234643869502, 5.995624729951774),(0.0, 1.8454397435472047, 6.8872682416730004),(0.0, 5.041829388107622, 5.041831819868864),(0.0, 4.389101595742385, 4.389102497134237),(0.0, 5.995620227271308, 1.6065215981349992),(0.0, 6.888272674590291, 1.8457071003629746),(0.0, 6.8872682416730004, -1.8454397435472047),(0.0, 5.995624729951774, -1.6065234643869502),(0.0, 4.389102497134237, -4.389101595742385),(0.0, 5.041831819868864, -5.041829388107622),(0.0, 1.8457071003629746, -6.888272674590291)])
                cmds.rename(each[0])
                cmds.group(n=each[1])
                
            createjoint = ['%s_fk_arm_01_jnt'%(side),'%s_fk_arm_02_jnt'%(side),'%s_fk_arm_03_jnt'%(side)]
            for each in createjoint:
                cmds.joint(n=each)
                
            toGetJntPos = ('%s_arm_01_setup'%(side),'%s_fk_arm_01_jnt'%(side)),('%s_arm_02_setup'%(side),'%s_fk_arm_02_jnt'%(side)),('%s_arm_03_setup'%(side),'%s_fk_arm_03_jnt'%(side))
            for each in toGetJntPos:
                forDel = cmds.parentConstraint(each[0],each[1])
                cmds.delete(forDel)
            cmds.parent('%s_fk_arm_01_jnt'%(side),w=True)
                
            toGetCtrlPos = [('%s_arm_01_setup'%(side),'%s_fk_arm_01_ctrl_grp'%(side)),('%s_arm_02_setup'%(side),'%s_fk_arm_02_ctrl_grp'%(side)),('%s_arm_03_setup'%(side),'%s_fk_arm_03_ctrl_grp'%(side))]
            for each in toGetCtrlPos:
                forDel = cmds.parentConstraint(each[0],each[1])
                cmds.delete(forDel)
            
            toParent = [('%s_fk_arm_02_ctrl_grp'%(side),'%s_fk_arm_01_ctrl'%(side)),('%s_fk_arm_03_ctrl_grp'%(side),'%s_fk_arm_02_ctrl'%(side))]
            for each in toParent:
                cmds.parent(each[0],each[1])
                
            toParentCon = [('%s_shoulder_ctrl'%(side),'%s_fk_arm_01_ctrl_grp'%(side)),('%s_fk_arm_01_ctrl'%(side),'%s_fk_arm_01_jnt'%(side)),('%s_fk_arm_02_ctrl'%(side),'%s_fk_arm_02_jnt'%(side)),('%s_fk_arm_03_ctrl'%(side),'%s_fk_arm_03_jnt'%(side))]
            for each in toParentCon:
                cmds.parentConstraint(each[0],each[1],mo=True)
                
            toLockAttr = [('%s_fk_arm_01_ctrl'%(side)),('%s_fk_arm_02_ctrl'%(side)),('%s_fk_arm_03_ctrl'%(side))]
            for each in toLockAttr:
                cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
                cmds.setAttr (each+'.overrideEnabled' ,True) 
                cmds.setAttr (each+'.overrideColor' ,6)
            
        FKarmSetup('l')
        FKarmSetup('r')
        
        def IKarmSetup(side):
            #IKarm#
            cmds.joint(n='%s_ik_01_jnt'%(side))
            forDel = cmds.parentConstraint('%s_arm_01_setup'%(side),'%s_ik_01_jnt'%(side),mo = False)
            cmds.delete(forDel)
            cmds.joint(n='%s_ik_02_jnt'%(side))
            forDel = cmds.parentConstraint('%s_arm_02_setup'%(side),'%s_ik_02_jnt'%(side),mo = False)
            cmds.delete(forDel)
            cmds.joint(n='%s_ik_03_jnt'%(side))
            forDel = cmds.parentConstraint('%s_arm_03_setup'%(side),'%s_ik_03_jnt'%(side),mo = False)
            deleteparent = cmds.delete(forDel)
            cmds.makeIdentity( '%s_ik_01_jnt'%(side), apply=True, translate=True, rotate=True)
            cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_ik_01_jnt'%(side),mo=True)
            cmds.ikHandle( n='%s_arm_ikh'%(side), sj='%s_ik_01_jnt'%(side), ee='%s_ik_03_jnt'%(side) )
            cmds.setAttr('%s_arm_ikh.visibility'%(side),0)
            cmds.curve(d=1, p=[(-5, -5, 5),(-5, 5, 5),(5, 5, 5),(5, -5, 5),(5, -5, -5),(5, 5, -5),(-5, 5, -5),(-5, -5, -5),(-5, -5, 5),(5, -5, 5),(5, 5, 5),(5, 5, -5),(5, -5, -5),(-5, -5, -5),(-5, 5, -5),(-5, 5, 5)])
            cmds.rename('%s_ik_arm_ctrl'%(side))
            ControllerAttr('%s_ik_arm_ctrl'%(side),False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
            cmds.addAttr('%s_ik_arm_ctrl'%(side),sn='stretch',at = 'bool',k=1)
            cmds.addAttr('%s_ik_arm_ctrl'%(side), at = 'enum', keyable=True, en = 'string1:string2:', ln='follow') 
            cmds.addAttr('%s_ik_arm_ctrl'%(side)+'.follow', e=True, en = 'world:shoulder:')
            cmds.orientConstraint('%s_ik_arm_ctrl'%(side), '%s_ik_03_jnt'%(side))
            cmds.group(n='%s_ik_arm_ctrl_grp'%(side))
            forDel = cmds.parentConstraint('%s_arm_03_setup'%(side),'%s_ik_arm_ctrl_grp'%(side),mo = False)
            deleteparent = cmds.delete(forDel)
            cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_ik_arm_ctrl_grp'%(side),mo = True)
            cmds.connectAttr('%s_ik_arm_ctrl.follow'%(side),'%s_ik_arm_ctrl_grp_parentConstraint1.%s_shoulder_ctrlW0'%(side,side))
            cmds.parent('%s_arm_ikh'%(side), '%s_ik_arm_ctrl'%(side))
            cmds.parent('%s_ik_arm_ctrl_grp'%(side),'world_ctrl')
            cmds.curve(d=1, p=[(0.0, 3.468342867164149, 0.0),(0.0, 3.468342867164149, 0.5221724371834184),(0.0, 4.967930096687364, 0.0),(0.5221724371834184, 3.468342867164149, 0.0),(-0.5221724371834184, 3.468342867164149, 0.0),(0.0, 4.967930096687364, 0.0),(0.0, 3.468342867164149, -0.5221724371834184),(0.0, 3.468342867164149, 0.0),(0.0, -3.468342867164149, 0.0),(-0.5221724371834184, -3.468342867164149, 0.0),(0.0, -4.967930096687364, 0.0),(0.0, -3.468342867164149, -0.5221724371834184),(0.0, -3.468342867164149, 0.5221724371834184),(0.0, -4.967930096687364, 0.0),(0.5221724371834184, -3.468342867164149, 0.0),(0.0, -3.468342867164149, 0.0),(0.0, 0.0, 0.0),(-3.468342867164149, 0.0, 0.0),(-3.468342867164149, 0.5221724371834184, 0.0),(-4.967930096687364, 0.0, 0.0),(-3.468342867164149, 0.0, -0.5221724371834184),(-3.468342867164149, 0.0, 0.5221724371834184),(-4.967930096687364, 0.0, 0.0),(-3.468342867164149, -0.5221724371834184, 0.0),(-3.468342867164149, 0.0, 0.0),(3.468342867164149, 0.0, 0.0),(3.468342867164149, 0.0, -0.5221724371834184),(4.967930096687364, 0.0, 0.0),(3.468342867164149, 0.5221724371834184, 0.0),(3.468342867164149, -0.5221724371834184, 0.0),(4.967930096687364, 0.0, 0.0),(3.468342867164149, 0.0, 0.5221724371834184),(3.468342867164149, 0.0, 0.0),(0.0, 0.0, 0.0),(0.0, 0.0, 3.468342867164149),(0.0, 0.5221724371834184, 3.468342867164149),(0.0, 0.0, 4.967930096687364),(0.5221724371834184, 0.0, 3.468342867164149),(-0.5221724371834184, 0.0, 3.468342867164149),(0.0, 0.0, 4.967930096687364),(0.0, -0.5221724371834184, 3.468342867164149),(0.0, 0.0, 3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.5221724371834184, -3.468342867164149),(0.0, 0.0, -4.967930096687364),(-0.5221724371834184, 0.0, -3.468342867164149),(0.5221724371834184, 0.0, -3.468342867164149),(0.0, 0.0, -4.967930096687364),(0.0, -0.5221724371834184, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149),(0.0, 0.0, -3.468342867164149)])
            cmds.rename('%s_elbow_ctrl'%(side))
            ControllerAttr('%s_elbow_ctrl'%(side),False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,6,True,True,True,False,False,False)
            cmds.addAttr('%s_elbow_ctrl'%(side),sn='follow', min = 0, max=1 ,k=1)
            cmds.group(n='%s_elbow_ctrl_grp'%(side))
            cmds.parent('%s_elbow_ctrl_grp'%(side),'world_ctrl')
            forDel = cmds.pointConstraint('%s_elbow_setup'%(side), '%s_elbow_ctrl_grp'%(side))
            deparent = cmds.delete(forDel)
            cmds.poleVectorConstraint( '%s_elbow_ctrl'%(side), '%s_arm_ikh'%(side) )
            cmds.spaceLocator(n='%s_elbow_loc_world'%(side))
            forDel = cmds.parentConstraint('%s_elbow_setup'%(side),'%s_elbow_loc_world'%(side))
            cmds.delete(forDel)
            cmds.spaceLocator(n='%s_elbow_loc_follow'%(side))
            forDel = cmds.parentConstraint('%s_elbow_setup'%(side),'%s_elbow_loc_follow'%(side))
            cmds.delete(forDel)
            cmds.group(n='%s_elbow_loc_grp'%(side))
            cmds.parent('%s_elbow_loc_world'%(side),'%s_elbow_loc_grp'%(side))
            cmds.parentConstraint('%s_ik_arm_ctrl'%(side),'%s_elbow_loc_follow'%(side),mo = True)
            cmds.parentConstraint('%s_elbow_loc_follow'%(side),'%s_elbow_ctrl_grp'%(side),mo = True)
            cmds.parentConstraint('%s_elbow_loc_world'%(side),'%s_elbow_ctrl_grp'%(side),mo = True)
            cmds.parentConstraint('world_ctrl','%s_elbow_loc_world'%(side),mo = True)
            cmds.shadingNode('reverse',n = '%s_elbow_rev'%(side),asUtility=1)
            cmds.connectAttr('%s_elbow_ctrl.follow'%(side), '%s_elbow_ctrl_grp_parentConstraint1.%s_elbow_loc_followW0'%(side,side))
            cmds.connectAttr('%s_elbow_ctrl.follow'%(side), '%s_elbow_rev.inputX'%(side))
            cmds.connectAttr('%s_elbow_rev.outputX'%(side), '%s_elbow_ctrl_grp_parentConstraint1.%s_elbow_loc_worldW1'%(side,side))
            cmds.group(n='%s_ik_arm_jnt_grp'%(side),em=True)
            cmds.parent('%s_ik_01_jnt'%(side),'%s_ik_arm_jnt_grp'%(side))
            cmds.scaleConstraint('world_ctrl','%s_ik_arm_jnt_grp'%(side),mo=True)
            #IKarmPVcrv#
            cmds.curve(d=1, p=[(0, 0, 0),(0, 10, 0)])
            cmds.rename('%s_elbow_direction_crv'%(side))
            nameOfLoc = ['%s_elbow_01_loc'%(side),'%s_elbow_02_loc'%(side)]
            for each in nameOfLoc:
                cmds.spaceLocator(n=each)
        
            toGetLocPos = [('%s_elbow_01_loc.translateY'%(side),0),('%s_elbow_02_loc.translateY'%(side),10)]
            for each in toGetLocPos:
                cmds.setAttr(each[0],each[1])
    
            toConnectLoc = [('%s_elbow_01_loc.worldPosition[0]'%(side),'%s_elbow_direction_crvShape.controlPoints[0]'%(side)),('%s_elbow_02_loc.worldPosition[0]'%(side),'%s_elbow_direction_crvShape.controlPoints[4]'%(side))]
            for each in toConnectLoc:
                cmds.connectAttr(each[0],each[1])
            toSetAttr = [('%s_elbow_direction_crv.overrideEnabled'%(side),1),('%s_elbow_direction_crv.overrideDisplayType'%(side),2),('%s_elbow_01_loc.visibility'%(side),0),('%s_elbow_02_loc.visibility'%(side),0)]
            for each in toSetAttr:
                cmds.setAttr(each[0],each[1])
            
            toGetParent = [('%s_elbow_ctrl'%(side),'%s_elbow_01_loc'%(side)),('%s_ik_02_jnt'%(side),'%s_elbow_02_loc'%(side))]
            for each in toGetParent:
                cmds.parentConstraint(each[0],each[1],mo = False)
            
            cmds.group(n='%s_elbow_direction_crv_grp'%(side),em = True)
            toGetParent = [('%s_elbow_01_loc'%(side),'%s_elbow_direction_crv_grp'%(side)),('%s_elbow_02_loc'%(side),'%s_elbow_direction_crv_grp'%(side)),('%s_elbow_direction_crv'%(side),'%s_elbow_direction_crv_grp'%(side))]
            for each in toGetParent:
                cmds.parent(each[0],each[1])
            
        IKarmSetup('l')
        IKarmSetup('r')
list = [('tail_01_setup_jnt','tail_01_IK_ctrl_grp'),('tail_03_setup_jnt','tail_02_IK_ctrl_grp'),('tail_05_setup_jnt','tail_03_IK_ctrl_grp'),('tail_01_setup_jnt','tail_01_IK_jnt'),('tail_02_setup_jnt','tail_02_IK_jnt'),('tail_03_setup_jnt','tail_03_IK_jnt'),('tail_04_setup_jnt','tail_04_IK_jnt'),('tail_05_setup_jnt','tail_05_IK_jnt'),('tail_01_setup_jnt','tail_01_length_jnt'),('tail_02_setup_jnt','tail_02_length_jnt'),('tail_03_setup_jnt','tail_03_length_jnt'),('tail_04_setup_jnt','tail_04_length_jnt'),('tail_05_setup_jnt','tail_05_length_jnt'),('tail_01_setup_jnt','tail_start_length_jnt'),('tail_05_setup_jnt','tail_end_length_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
        
    cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
    cmds.rename('tail_crv')
    
    nameOfLoc = ['tail_01_loc','tail_02_loc','tail_03_loc','tail_04_loc','tail_05_loc']
    for each in nameOfLoc:
        cmds.spaceLocator(n=each)

    toGetLocPos = [('tail_01_loc.translateY',0),('tail_02_loc.translateY',2.5),('tail_03_loc.translateY',5),('tail_04_loc.translateY',7.5),('tail_05_loc.translateY',10)]
    for each in toGetLocPos:
        cmds.setAttr(each[0],each[1])

    toConnectLoc = [('tail_01_loc.worldPosition[0]','tail_crv.controlPoints[0]'),('tail_02_loc.worldPosition[0]','tail_crv.controlPoints[1]'),('tail_03_loc.worldPosition[0]','tail_crv.controlPoints[2]'),('tail_04_loc.worldPosition[0]','tail_crv.controlPoints[3]'),('tail_05_loc.worldPosition[0]','tail_crv.controlPoints[4]')]
    for each in toConnectLoc:
        cmds.connectAttr(each[0],each[1])
        
    list = [('tail_01_setup_jnt','tail_01_loc'),('tail_02_setup_jnt','tail_02_loc'),('tail_03_setup_jnt','tail_03_loc'),('tail_04_setup_jnt','tail_04_loc'),('tail_05_setup_jnt','tail_05_loc')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
        
    list = [('tail_01_IK_ctrl','tail_01_loc'),('tail_01_IK_ctrl','tail_02_loc'),('tail_02_IK_ctrl','tail_02_loc'),('tail_02_IK_ctrl','tail_03_loc'),('tail_02_IK_ctrl','tail_04_loc'),('tail_03_IK_ctrl','tail_04_loc'),('tail_03_IK_ctrl','tail_05_loc')]
    for each in list:
        cmds.parentConstraint(each[0],each[1],mo=True)
    
    cmds.select('tail_01_IK_jnt','tail_05_IK_jnt','tail_crv')
    cmds.ikHandle(n='tail_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
    
    list = [('multiplyDivide','tail_stretch_01_mult'),('multiplyDivide','tail_stretch_02_mult')]
    for each in list:
        cmds.shadingNode(each[0],n=each[1],asUtility=1)
        
    cmds.setAttr('tail_stretch_01_mult.operation',2)
    cmds.arclen('tail_crv',ch = True)
        
    toConnectAttr = [('tail_03_IK_ctrl.rotateX','tail_ikh.twist'),('curveInfo1.arcLength','tail_stretch_01_mult.input1X'),('tail_stretch_01_mult.outputX','tail_stretch_02_mult.input1X'),('tail_02_length_jnt.translateX','tail_stretch_02_mult.input2X'),('tail_stretch_02_mult.outputX','tail_02_IK_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_03_IK_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_04_IK_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_05_IK_jnt.translateX'),('tail_end_length_jnt.translateX','tail_stretch_01_mult.input2X')]
    for each in toConnectAttr:
        cmds.connectAttr(each[0],each[1])
    
    #create IKFK tail
    list = ['tail_01_bln_jnt','tail_02_bln_jnt','tail_03_bln_jnt','tail_04_bln_jnt','tail_05_bln_jnt']
    for each in list:
        cmds.joint(n=each)
    
    list = [('tail_01_setup_jnt','tail_01_bln_jnt'),('tail_02_setup_jnt','tail_02_bln_jnt'),('tail_03_setup_jnt','tail_03_bln_jnt'),('tail_04_setup_jnt','tail_04_bln_jnt'),('tail_05_setup_jnt','tail_05_bln_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
            
    list = [('tail_01_FK_jnt','tail_01_bln_jnt'),('tail_02_FK_jnt','tail_02_bln_jnt'),('tail_03_FK_jnt','tail_03_bln_jnt'),('tail_04_FK_jnt','tail_04_bln_jnt'),('tail_05_FK_jnt','tail_05_bln_jnt'),('tail_01_IK_jnt','tail_01_bln_jnt'),('tail_02_IK_jnt','tail_02_bln_jnt'),('tail_03_IK_jnt','tail_03_bln_jnt'),('tail_04_IK_jnt','tail_04_bln_jnt'),('tail_05_IK_jnt','tail_05_bln_jnt')]
    for each in list:
        cmds.parentConstraint(each[0],each[1],mo=True)
    
    cmds.curve(n='tail_ik_fk_switch',d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
    cmds.group(n='tail_ik_fk_switch_grp')
    cmds.setAttr('tail_ik_fk_switch.visibility',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.translateX',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.translateY',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.translateZ',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.rotateX',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.rotateY',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.rotateZ',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.scaleX',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.scaleY',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.scaleZ',keyable = False, cb = False, lock = True)
    cmds.setAttr('tail_ik_fk_switch.overrideEnabled' ,True) 
    cmds.setAttr('tail_ik_fk_switch.overrideColor' ,15)
    cmds.addAttr('tail_ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1)
    cmds.parentConstraint('tail_01_bln_jnt','tail_ik_fk_switch_grp')
    cmds.shadingNode('reverse',n='tail_ik_rev',asUtility=1)
    
    toConnectAttr = [('tail_ik_fk_switch.IKFK','tail_01_bln_jnt_parentConstraint1.tail_01_FK_jntW0'),('tail_ik_fk_switch.IKFK','tail_ik_rev.inputX'),('tail_ik_rev.outputX','tail_01_bln_jnt_parentConstraint1.tail_01_IK_jntW1'),('tail_ik_fk_switch.IKFK','tail_02_bln_jnt_parentConstraint1.tail_02_FK_jntW0'),('tail_ik_rev.outputX','tail_02_bln_jnt_parentConstraint1.tail_02_IK_jntW1'),('tail_ik_fk_switch.IKFK','tail_03_bln_jnt_parentConstraint1.tail_03_FK_jntW0'),('tail_ik_rev.outputX','tail_03_bln_jnt_parentConstraint1.tail_03_IK_jntW1'),('tail_ik_fk_switch.IKFK','tail_04_bln_jnt_parentConstraint1.tail_04_FK_jntW0'),('tail_ik_rev.outputX','tail_04_bln_jnt_parentConstraint1.tail_04_IK_jntW1'),('tail_ik_fk_switch.IKFK','tail_05_bln_jnt_parentConstraint1.tail_05_FK_jntW0'),('tail_ik_rev.outputX','tail_05_bln_jnt_parentConstraint1.tail_05_IK_jntW1'),('tail_ik_rev.outputX','tail_01_IK_ctrl_grp.visibility'),('tail_ik_rev.outputX','tail_02_IK_ctrl_grp.visibility'),('tail_ik_rev.outputX','tail_03_IK_ctrl_grp.visibility'),('tail_ik_fk_switch.IKFK','tail_01_FK_ctrl_grp.visibility')]
    for each in toConnectAttr:
        cmds.connectAttr(each[0],each[1])
    
    #create group
    list = ['jnt_grp','extra','ctrl_grp','rename']
    for each in list:
        cmds.group(n=each,em=True)
    
    list = [('tail_01_setup_jnt','extra'),('tail_01_FK_ctrl_grp','ctrl_grp'),('tail_01_FK_jnt','jnt_grp'),('tail_01_IK_ctrl_grp','ctrl_grp'),('tail_02_IK_ctrl_grp','ctrl_grp'),('tail_03_IK_ctrl_grp','ctrl_grp'),('tail_01_IK_jnt','jnt_grp'),('tail_start_length_jnt','extra'),('tail_01_length_jnt','extra'),('tail_crv','extra'),('tail_01_loc','extra'),('tail_02_loc','extra'),('tail_03_loc','extra'),('tail_04_loc','extra'),('tail_05_loc','extra'),('tail_ikh','extra'),('extra','rename'),('jnt_grp','rename'),('ctrl_grp','rename')]
    for each in list:
        cmds.parent(each[0],each[1])
    
    cmds.setAttr('extra.visibility',0)
    
def createLocator():
    
    list = ['start_loc','end_loc']
    for each in list:
        cmds.spaceLocator(n=each)
        cmds.setAttr (each +'.rotateX',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.rotateY',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.rotateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr (each +'.scaleZ',keyable = False, cb = False, lock = True)
    cmds.setAttr('start_loc.translateX',-5)
    cmds.setAttr('end_loc.translateX',10)
    
def createMotionPath():
    def progressBarWindow():
        # this command opens the window
        window = cmds.window('MotionPathSetupProgress',title='Building')
        cmds.columnLayout()
        
        cmds.progressBar('MotionPathSetupProgress',maxValue=10, width=300)
        
        cmds.showWindow( window )
        
    progressBarWindow()
    
    # the command to find value
    list = ['start_loc','end_loc']
    
    for each in list:
        cmds.setAttr(each + '.visibility',0)

    def vector_sub(p1,p2):
        x = p1[0] - p2[0]
        y = p1[1] - p2[1]
        z = p1[2] - p2[2]
        return [x,y,z]

    def vector_add(p1,p2):
        x = p1[0] + p2[0]
        y = p1[1] + p2[1]
        z = p1[2] + p2[2]
        return [x,y,z]

    def vector_div(p,f):
        x = p[0] / f
        y = p[1] / f
        z = p[2] / f
        return [x,y,z]

    def vector_mult(p,f):
        x = p[0] * f
        y = p[1] * f
        z = p[2] * f
        return [x,y,z]
        
    p1 = cmds.xform(list[0], q=1, ws=1, t=1)
    p2 = cmds.xform(list[1], q=1, ws=1, t=1)
    print(p2)
    n = cmds.intField('numbersOfLocator',q=1,value=1)
    direction = vector_sub(p2,p1)
    direction = vector_div(direction,n)
    points = []
    
    for i in range(n):
        p = vector_add(p1,vector_mult(direction,i))
        points.append(p)
    points.append(p2)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to find motion path in between value
    plus = n
    mpInBetween = 1/plus
    
    # the command to create curve
    crv = cmds.curve(d=1, p=[p1,p2])
    cmds.rename('mp_crv')
    cmds.setAttr('.template',1)
    cmds.rebuildCurve('mp_crv',d=2, rt=0, s=n-1)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)

    # the command to create joints
    cmds.joint(n='main_mp_0_jnt',p=[0,0,0])

    number = len(points)
    for each in range(number):
        cmds.joint(n='main_mp_%s_jnt'%(each+1),p=points[each])
        cmds.parent(w=True)
        forDel = cmds.aimConstraint('end_loc','main_mp_%s_jnt'%(each+1),mo=False)
        cmds.delete(forDel)
        
    m=n+1
    
    for each in range(number):
        cmds.parent('main_mp_%s_jnt'%(m-each),'main_mp_%s_jnt'%(n-each))
    
    cmds.parent('main_mp_1_jnt',w=True)
    cmds.delete('main_mp_0_jnt')
    forDel = cmds.orientConstraint('main_mp_1_jnt','main_mp_%s_jnt'%(n+1))
    cmds.delete(forDel)
    cmds.makeIdentity('main_mp_1_jnt',apply=True,translate=True,rotate=True)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to create controllers
    number = len(points)
    for each in range(number):
        ctrl = cmds.curve(n='mp_%s_ctrl'%(each+1),d=1, p=[(0, 0.5, 0.5),(0, -0.5, 0.5),(0, -0.5, -0.5),(0, 0.5, -0.5),(0, 0.5, 0.5)])
        cmds.setAttr (ctrl +'.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr (ctrl +'.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr (ctrl +'.scaleZ',keyable = False, cb = False, lock = True)
        cmds.setAttr (ctrl + ".overrideEnabled" ,True) 
        cmds.setAttr (ctrl + ".overrideColor" ,18)
        cmds.setAttr (ctrl +'.visibility',keyable = False, cb = False, lock = True)
        grp = cmds.group(n='mp_%s_ctrl_grp'%(each+1))
        forDel = cmds.parentConstraint('main_mp_%s_jnt'%(each+1),grp,mo=False)
        cmds.delete(forDel)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to create locator
    number = len(points)
    for each in range(number):
        cmds.spaceLocator(n='aim_up_%s_loc'%(each+1))
        cmds.setAttr('.visibility',0)
        forDel = cmds.parentConstraint('main_mp_%s_jnt'%(each+1),'aim_up_%s_loc'%(each+1),mo=False)
        cmds.delete(forDel)
        cmds.setAttr('aim_up_%s_loc.translateY'%(each+1),2.5)
        cmds.parent('aim_up_%s_loc'%(each+1),'mp_%s_ctrl'%(each+1))
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=2)
    
    # the command to create node and motion path 
    number = len(points)
    for each in range(number):
        jnt = cmds.joint(n='mp_%s_jnt'%(each+1),p=points[each])
        cmds.setAttr('.visibility',0)
        cmds.shadingNode('plusMinusAverage',n = 'mp_%s_plm'%(each+1),asUtility=1)
        cmds.shadingNode('plusMinusAverage',n = 'mp_sec_%s_plm'%(each+1),asUtility=1)
        cmds.pathAnimation('mp_%s_jnt'%(each+1), c='mp_crv',fm=True,wut='objectrotation',wuo='aim_up_%s_loc'%(each+1),f=True,fa='x',ua='y')
        cmds.cutKey('motionPath%s'%(each+1), attribute='uValue', clear = True)
        cmds.connectAttr('mp_%s_ctrl.rotateY'%(each+1),'motionPath%s.upTwist'%(each+1))
        cmds.connectAttr('mp_%s_ctrl.rotateZ'%(each+1),'motionPath%s.sideTwist'%(each+1))
        
    cmds.parent('mp_1_jnt',w=True)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to set value on each motion path
    number = len(points)
    for each in range(number):
        cmds.setAttr('motionPath%s.uValue'%(each+1),mpInBetween*each)
    
    # the command to create extra controller
    cmds.curve(d=1, p=[(0.25, 0, 1.5),(-0.25, 0, 1.5),(-0.25, 0, 0.25),(-1.5, 0, 0.25),(-1.5, 0, -0.25),(-0.25, 0, -0.25),(-0.25, 0, -1.5),(0.25, 0 ,-1.5),(0.25, 0, -0.25),(1.5, 0, -0.25),(1.5, 0, 0.25,),(0.25, 0 ,0.25),(0.25, 0, 1.5)])
    cmds.rename('mp_extra_ctrl')
    cmds.setAttr ('mp_extra_ctrl'+'.translateX',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.translateY',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.translateZ',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.rotateX',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.rotateY',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.rotateZ',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.scaleX',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.scaleY',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+'.scaleZ',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_extra_ctrl'+ ".overrideEnabled" ,True) 
    cmds.setAttr ('mp_extra_ctrl'+ ".overrideColor" ,29)
    cmds.setAttr ('mp_extra_ctrl'+'.visibility',keyable = False, cb = False, lock = True)
    cmds.addAttr('mp_extra_ctrl',sn='motionPath', min = 0, max=10 , k=1, dv=10)
    cmds.group(n='mp_extra_ctrl_grp')
    forDel = cmds.parentConstraint('main_mp_2_jnt','mp_extra_ctrl_grp')
    cmds.delete(forDel)

    # the command to search CV and create cluster
    targetCurve = 'mp_crv'
    curveCVs = cmds.ls('{0}.cv[:]'.format(targetCurve), fl = True)
    for cv in curveCVs:
        cmds.cluster(cv,n='cl1')
        cmds.setAttr('.visibility',0)
    cmds.shadingNode('multiplyDivide',n = 'mp_mult',asUtility=1)
    cmds.setAttr('mp_mult.input2X',10)
    cmds.setAttr('mp_mult.operation',2)
    cmds.connectAttr('mp_extra_ctrl.motionPath','mp_mult.input1X')
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=2)
    
    # the command to set and connect node
    number = len(curveCVs)
    for each in range(number):
        cmds.setAttr('mp_%s_plm.operation'%(each+1), 2)
        cmds.connectAttr('mp_mult.outputX','mp_%s_plm.input1D[0]'%(each+1))
        cmds.setAttr('mp_%s_plm.input1D[1]'%(each+1),1)
        cmds.connectAttr('mp_%s_plm.output1D'%(each+1),'mp_sec_%s_plm.input1D[0]'%(each+1))
        cmds.connectAttr('motionPath%s.uValue'%(each+1),'mp_sec_%s_plm.input1D[1]'%(each+1))
        forDel = cmds.parentConstraint('main_mp_%s_jnt'%(each+1),'cl%sHandle'%(each+1),mo=False)
        cmds.delete(forDel)
        cmds.parent('cl%sHandle'%(each+1),'mp_%s_ctrl'%(each+1))
        cmds.cutKey('mp_%s_plm'%(each+1), attribute='input1D[1]',clear = True)
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to connect node
    number = len(curveCVs)
    for each in range(number):
        cmds.disconnectAttr('motionPath%s.uValue'%(each+1),'mp_sec_%s_plm.input1D[1]'%(each+1))
        cmds.connectAttr('mp_sec_%s_plm.output1D'%(each+1),'motionPath%s.uValue'%(each+1))
        forDel = cmds.parentConstraint('mp_%s_jnt'%(each+1),'main_mp_%s_jnt'%(each+1),mo=True)
        cmds.delete(forDel)
    
    cmds.makeIdentity('main_mp_1_jnt',apply=True,translate=True,rotate=True)
    
    number = len(curveCVs)
    for each in range(number):
        cmds.parentConstraint('mp_%s_jnt'%(each+1),'main_mp_%s_jnt'%(each+1),mo=True)
        
    # the command to create group    
    list = ['ctrl_grp','jnt_grp','setup_grp','mp_grp','setup_jnt_grp']
    for each in list:
        cmds.group(n=each,em=True)
        
    # the command to create main controller
    cmds.circle(n='mp_main_ctrl',r=1,nrx = 90)
    cmds.setAttr ('mp_main_ctrl'+'.scaleX',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_main_ctrl'+'.scaleY',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_main_ctrl'+'.scaleZ',keyable = False, cb = False, lock = True)
    cmds.setAttr ('mp_main_ctrl'+ ".overrideEnabled" ,True) 
    cmds.setAttr ('mp_main_ctrl'+ ".overrideColor" ,29)
    cmds.setAttr ('mp_main_ctrl'+'.visibility',keyable = False, cb = False, lock = True)
    cmds.group(n='mp_main_ctrl_grp')
    forDel = cmds.parentConstraint('main_mp_1_jnt','mp_main_ctrl_grp')
    cmds.delete(forDel)
    cmds.parent('ctrl_grp','mp_main_ctrl')
    cmds.parent('mp_extra_ctrl_grp','mp_main_ctrl')
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=1)
    
    # the command to group controllers and joints
    number = len(curveCVs)
    for each in range(number):
        cmds.parent('mp_%s_ctrl_grp'%(each+1),'ctrl_grp')
        cmds.parent('mp_%s_jnt'%(each+1),'setup_jnt_grp')
    
    # the command to group everything
    list = [('start_loc','setup_grp'),('end_loc','setup_grp'),('mp_crv','setup_grp'),('setup_jnt_grp','setup_grp'),('main_mp_1_jnt','jnt_grp'),('setup_grp','mp_grp'),('jnt_grp','mp_grp'),('mp_main_ctrl_grp','mp_grp')]
    for each in list:
        cmds.parent(each[0],each[1])
    
    # the command to change the progress bar
    cmds.progressBar('MotionPathSetupProgress', edit=True, step=2)
    
    def progressBarWindowClose():
        # the command to close the progress bar
        cmds.deleteUI('MotionPathSetupProgress',window=True)
        
    progressBarWindowClose()

#create quadruped setup joint function#
def BuildQuadrupedSetupJoint():
    nameOfJoint = [('spine_01_setup_jnt',(0, 95, -25),(0,0,0)),('spine_02_setup_jnt',(0, 95, 0),(0,0,0)),('spine_03_setup_jnt',(0, 95, 25),(0,0,0)),('l_leg_01_setup_jnt',(10, 85, -35),(0,0,-90)),('l_leg_02_setup_jnt',(10, 60, -35),(0,0,0)),('l_leg_03_setup_jnt',(10, 30, -35),(0,0,0)),('l_leg_04_setup_jnt',(10, 10, -35),(0,0,0)),('l_leg_05_setup_jnt',(10, 0, -35),(0,0,0)),('l_leg_rock_out_setup_jnt',(15, 0, -35),(0,0,0)),('l_leg_rock_in_setup_jnt',(5, 0, -35),(0,0,0)),('l_leg_heel_setup_jnt',(10, 0, -45),(0,0,0)),('r_leg_01_setup_jnt',(-10, 85, -35),(0,0,0)),('r_leg_02_setup_jnt',(-10, 60, -35),(0,0,0)),('r_leg_03_setup_jnt',(-10, 30, -35),(0,0,0)),('r_leg_04_setup_jnt',(-10, 10, -35),(0,0,0)),('r_leg_05_setup_jnt',(-10, 0, -35),(0,180,0)),('r_leg_rock_out_setup_jnt',(-15, 0, -35),(0,0,0)),('r_leg_rock_in_setup_jnt',(-5, 0, -35),(0,0,0)),('r_leg_heel_setup_jnt',(-10, 0, -45),(0,0,0)),('l_shoulder_setup_jnt',(10, 90, 35),(0,-180,0)),('l_arm_01_setup_jnt',(10, 70, 35),(0,0,0)),('l_arm_02_setup_jnt',(10, 50, 35),(0,0,0)),('l_arm_03_setup_jnt',(10, 25, 35),(0,0,0)),('l_arm_04_setup_jnt',(10, 5, 35),(0,0,0)),('l_arm_05_setup_jnt',(10, 0, 35),(0,0,0)),('l_arm_rock_in_setup_jnt',(5, 0, 35),(0,0,0)),('l_arm_rock_out_setup_jnt',(15, 0, 35),(0,0,0)),('l_arm_heel_setup_jnt',(10, 0, 25),(0,0,0)),('r_shoulder_setup_jnt',(-10, 90, 35),(0,0,0)),('r_arm_01_setup_jnt',(-10, 70, 35),(0,0,0)),('r_arm_02_setup_jnt',(-10, 50, 35),(0,0,0)),('r_arm_03_setup_jnt',(-10, 25, 35),(0,0,0)),('r_arm_04_setup_jnt',(-10, 5, 35),(0,0,0)),('r_arm_05_setup_jnt',(-10, 0, 35),(0,180,0)),('r_arm_rock_in_setup_jnt',(-5, 0, 35),(0,0,0)),('r_arm_rock_out_setup_jnt',(-15, 0, 35),(0,0,0)),('r_arm_heel_setup_jnt',(-10, 0, 25),(0,0,0)),('neck_01_setup_jnt',(0, 105, 35),(0,-180,0)),('neck_02_setup_jnt',(0, 105, 45),(0,0,0)),('head_setup_jnt',(0, 105, 55),(0,0,0)),('head_setup_end_jnt',(0, 105, 75),(0,0,0)),('tail_01_setup_jnt',(0, 95, -35),(0,90,90)),('tail_02_setup_jnt',(0, 95, -45),(0,0,0)),('tail_03_setup_jnt',(0, 95, -55),(0,0,0)),('tail_04_setup_jnt',(0, 95, -65),(0,0,0)),('tail_05_setup_jnt',(0, 95, -75),(0,0,0))]
    for each in nameOfJoint:
        cmds.joint(n=each[0],p=each[1],o=each[2])
        
    toParentJoint = [('l_leg_01_setup_jnt','spine_01_setup_jnt'),('r_leg_01_setup_jnt','spine_01_setup_jnt'),('l_leg_rock_out_setup_jnt','l_leg_04_setup_jnt'),('l_leg_rock_in_setup_jnt','l_leg_04_setup_jnt'),('l_leg_heel_setup_jnt','l_leg_04_setup_jnt'),('r_leg_rock_out_setup_jnt','r_leg_04_setup_jnt'),('r_leg_rock_in_setup_jnt','r_leg_04_setup_jnt'),('r_leg_heel_setup_jnt','r_leg_04_setup_jnt'),('l_shoulder_setup_jnt','spine_03_setup_jnt'),('l_arm_rock_out_setup_jnt','l_arm_04_setup_jnt'),('l_arm_rock_in_setup_jnt','l_arm_04_setup_jnt'),('l_arm_heel_setup_jnt','l_arm_04_setup_jnt'),('r_shoulder_setup_jnt','spine_03_setup_jnt'),('r_arm_rock_out_setup_jnt','r_arm_04_setup_jnt'),('r_arm_rock_in_setup_jnt','r_arm_04_setup_jnt'),('r_arm_heel_setup_jnt','r_arm_04_setup_jnt'),('neck_01_setup_jnt','spine_03_setup_jnt'),('tail_01_setup_jnt','spine_01_setup_jnt')]
    for each in toParentJoint:
        cmds.parent(each[0],each[1])
        
    toSetJointRotation = [('l_leg_01_setup_jnt.rotateY',-15),('l_leg_02_setup_jnt.rotateY',30),('l_leg_03_setup_jnt.rotateY',-30),('r_leg_01_setup_jnt.rotateY',-15),('r_leg_02_setup_jnt.rotateY',30),('r_leg_03_setup_jnt.rotateY',-30),('l_shoulder_setup_jnt.rotateY',-30),('l_arm_01_setup_jnt.rotateY',70),('l_arm_02_setup_jnt.rotateY',-45),('l_arm_03_setup_jnt.rotateY',10),('r_shoulder_setup_jnt.rotateY',-30),('r_arm_01_setup_jnt.rotateY',70),('r_arm_02_setup_jnt.rotateY',-45),('r_arm_03_setup_jnt.rotateY',10),('neck_01_setup_jnt.rotateY',-50),('neck_02_setup_jnt.rotateY',-20),('head_setup_jnt.rotateY',-10)]
    for each in toSetJointRotation:
        cmds.setAttr(each[0],each[1])
        
    nameOfLoc = [('l_leg_PV_setup_loc'),('r_leg_PV_setup_loc'),('l_arm_PV_setup_loc'),('r_arm_PV_setup_loc')]
    for each in nameOfLoc:
        cmds.spaceLocator(n=each)

    toParentLoc = [('l_leg_PV_setup_loc','l_leg_02_setup_jnt'),('r_leg_PV_setup_loc','r_leg_02_setup_jnt'),('l_arm_PV_setup_loc','l_arm_02_setup_jnt'),('r_arm_PV_setup_loc','r_arm_02_setup_jnt')]
    for each in toParentLoc:
        cmds.parent(each[0],each[1])
    
    toGetLocPos = [('l_leg_PV_setup_loc'),('r_leg_PV_setup_loc'),('l_arm_PV_setup_loc'),('r_arm_PV_setup_loc')]
    for each in toGetLocPos:
        cmds.setAttr(each+'.translateX',0)
        cmds.setAttr(each+'.translateY',0)
        cmds.setAttr(each+'.translateZ',0)
        cmds.setAttr(each+'.rotateX',0)
        cmds.setAttr(each+'.rotateZ',0)
    cmds.setAttr('l_leg_PV_setup_loc'+'.translateZ',25)
    cmds.setAttr('r_leg_PV_setup_loc'+'.translateZ',25)
    cmds.setAttr('l_arm_PV_setup_loc'+'.translateZ',-20)
    cmds.setAttr('r_arm_PV_setup_loc'+'.translateZ',-20)
    
#mirror quadruped setup joint#
def MirrorQuadrupedSetupJoint():
    cmds.mirrorJoint('l_leg_01_setup_jnt',mb = True,myz = True,sr = ('l_','r_mirror_'))
    forDel = cmds.parentConstraint('r_mirror_leg_01_setup_jnt','r_leg_01_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_01_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_01_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_leg_02_setup_jnt','r_leg_02_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_02_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_02_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_leg_03_setup_jnt','r_leg_03_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_03_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_03_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_leg_04_setup_jnt','r_leg_04_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_leg_04_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_leg_04_setup_jnt.rotateY',180)
    
    cmds.mirrorJoint('l_shoulder_setup_jnt',mb = True,myz = True,sr = ('l_','r_mirror_'))
    forDel = cmds.parentConstraint('r_mirror_shoulder_setup_jnt','r_shoulder_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_shoulder_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_shoulder_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_arm_01_setup_jnt','r_arm_01_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_arm_01_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_arm_01_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_arm_02_setup_jnt','r_arm_02_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_arm_02_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_arm_02_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_arm_03_setup_jnt','r_arm_03_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_arm_03_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_arm_03_setup_jnt.rotateY',180)
    forDel = cmds.parentConstraint('r_mirror_arm_04_setup_jnt','r_arm_04_setup_jnt')
    cmds.delete(forDel)
    cmds.makeIdentity('r_arm_04_setup_jnt',apply=True,translate=True,rotate=True)
    cmds.setAttr('r_arm_04_setup_jnt.rotateY',180)
    
    list = [('r_mirror_leg_heer_mirror_setup_jnt','r_leg_heel_setup_jnt'),('r_mirror_leg_rock_in_setup_jnt','r_leg_rock_in_setup_jnt'),('r_mirror_leg_rock_out_setup_jnt','r_leg_rock_out_setup_jnt'),('r_mirror_leg_05_setup_jnt','r_leg_05_setup_jnt'),('r_mirror_arm_heer_mirror_setup_jnt','r_arm_heel_setup_jnt'),('r_mirror_arm_rock_in_setup_jnt','r_arm_rock_in_setup_jnt'),('r_mirror_arm_rock_out_setup_jnt','r_arm_rock_out_setup_jnt'),('r_mirror_arm_05_setup_jnt','r_arm_05_setup_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
        
    cmds.delete('r_mirror_shoulder_setup_jnt','r_mirror_leg_01_setup_jnt')

#create quadruped setup rig function#
def BuildQuadrupedSetupRig():
    def progressBarWindow():
        # this command opens the window
        window = cmds.window('QuadrupedProgress',title='Building')
        cmds.columnLayout()
        
        cmds.progressBar('QuadrupedProgressBar',maxValue=10, width=300)
        
        cmds.showWindow( window )
        
    progressBarWindow()
        
    cmds.setAttr('spine_01_setup_jnt.visibility',0)
    
    def spineSetup():
        # FKspine #
        nameOfController = [('spine_01_FK_ctrl','spine_01_FK_ctrl_grp'),('spine_02_FK_ctrl','spine_02_FK_ctrl_grp'),('spine_03_FK_ctrl','spine_03_FK_ctrl_grp')]
        for each in nameOfController:
            cmds.curve(n=each[0],d=1, p=[(12.5, 12.5, 0),(-12.5, 12.5, 0),(-12.5, -12.5, 0),(12.5, -12.5, 0),(12.5, 12.5, 0)])
            cmds.group(n=each[1])

        cmds.circle(n='world_ctrl',r=50, nry = 90)
        cmds.setAttr('world_ctrl.overrideEnabled' ,True) 
        cmds.setAttr('world_ctrl.overrideColor' ,29)
        cmds.setAttr ('world_ctrl.visibility',keyable = False, cb = False, lock = True)
        cmds.group(n='world_ctrl_grp')
        cmds.curve(n='cog_ctrl',d=1, p=[(-3, 0, 18),(-18, 0, 3),(-18, 0, 6),(-24, 0, 0),(-18, 0, -6),(-18, 0, -3),(-3, 0, -18),(-3, 0, -18),(-6, 0, -18),(0, 0, -24),(6, 0, -18),(3, 0, -18),(18, 0, -3),(18, 0, -3),(18, 0, -6),(24, 0, 0),(18, 0, 6),(18, 0, 3),(3, 0, 18),(3, 0, 18),(6, 0, 18),(0, 0, 24),(-6, 0, 18),(-3, 0, 18)])
        cmds.group(n='cog_ctrl_grp',em=1)
        cmds.parent('cog_ctrl','cog_ctrl_grp')
        
        nameOfJoint = [('spine_01_FK_jnt'),('spine_02_FK_jnt'),('spine_03_FK_jnt')]
        for each in nameOfJoint:
            cmds.joint(n=each)
            cmds.parent(w=True)
            
        toGetPos = [('spine_01_setup_jnt','cog_ctrl_grp'),('spine_02_setup_jnt','spine_02_FK_ctrl_grp'),('spine_03_setup_jnt','spine_03_FK_ctrl_grp'),('spine_01_setup_jnt','spine_01_FK_ctrl_grp'),('spine_01_setup_jnt','spine_01_FK_jnt'),('spine_02_setup_jnt','spine_02_FK_jnt'),('spine_03_setup_jnt','spine_03_FK_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
        cmds.makeIdentity('spine_01_FK_jnt',apply=True,translate=True,rotate=True)
        
        toParentCon = [('spine_01_FK_ctrl','spine_01_FK_jnt'),('spine_02_FK_ctrl','spine_02_FK_jnt'),('spine_03_FK_ctrl','spine_03_FK_jnt'),('cog_ctrl','spine_01_FK_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = True)
        
        toParent = [('spine_03_FK_jnt','spine_02_FK_jnt'),('spine_02_FK_jnt','spine_01_FK_jnt'),('spine_03_FK_ctrl_grp','spine_02_FK_ctrl'),('spine_02_FK_ctrl_grp','spine_01_FK_ctrl'),('spine_01_FK_ctrl_grp','world_ctrl')]
        for each in toParent:
            cmds.parent(each[0],each[1])
            
        toLockAttr = [('spine_01_FK_ctrl'),('spine_02_FK_ctrl'),('spine_03_FK_ctrl'),('cog_ctrl')]
        for each in toLockAttr:
            cmds.setAttr(each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,17)
            
        # IKspine #
        cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
        cmds.rename('spine_crv')
        nameOfLoc = ['spine_01_loc','spine_02_loc','spine_03_loc','spine_04_loc','spine_05_loc']
        for each in nameOfLoc:
            cmds.spaceLocator(n=each)
    
        toGetLocPos = [('spine_01_loc.translateY',0),('spine_02_loc.translateY',2.5),('spine_03_loc.translateY',5),('spine_04_loc.translateY',7.5),('spine_05_loc.translateY',10)]
        for each in toGetLocPos:
            cmds.setAttr(each[0],each[1])
    
        toConnectLoc = [('spine_01_loc.worldPosition[0]','spine_crvShape.controlPoints[0]'),('spine_02_loc.worldPosition[0]','spine_crvShape.controlPoints[1]'),('spine_03_loc.worldPosition[0]','spine_crvShape.controlPoints[2]'),('spine_04_loc.worldPosition[0]','spine_crvShape.controlPoints[3]'),('spine_05_loc.worldPosition[0]','spine_crvShape.controlPoints[4]')]
        for each in toConnectLoc:
            cmds.connectAttr(each[0],each[1])
            
        toCreateIKspineController = [('spine_01_IK_ctrl','spine_01_IK_ctrl_grp'),('spine_02_IK_ctrl','spine_02_IK_ctrl_grp'),('spine_03_IK_ctrl','spine_03_IK_ctrl_grp')]
        for each in toCreateIKspineController:
            cmds.circle(n=each[0],r=10,nrz = 90)
            cmds.group(n=each[1])
        cmds.delete('world_ctrl','spine_01_IK_ctrl','spine_02_IK_ctrl','spine_03_IK_ctrl',constructionHistory = True)
        
        toCreateJoint = ['spine_IK_chest_jnt','spine_IK_root_jnt','spine_IK_01_jnt','spine_IK_02_jnt','spine_IK_03_jnt','spine_IK_04_jnt','spine_IK_05_jnt','spine_01_length_jnt','spine_02_length_jnt','spine_03_length_jnt','spine_04_length_jnt','spine_05_length_jnt','spine_start_length_jnt','spine_end_length_jnt']
        for each in toCreateJoint:
            cmds.joint(n=each)
            
        cmds.group(n='spine_IK_jnt_grp',em=True)
        cmds.parent('spine_IK_01_jnt','spine_IK_jnt_grp')
        cmds.orientConstraint('cog_ctrl','spine_IK_jnt_grp')
            
        cmds.parent('spine_IK_root_jnt','spine_IK_chest_jnt','spine_01_length_jnt','spine_start_length_jnt',w=True)
        
        toGetPos = [('spine_01_setup_jnt','spine_IK_01_jnt'),('spine_01_setup_jnt','spine_IK_02_jnt'),('spine_02_setup_jnt','spine_IK_02_jnt'),('spine_02_setup_jnt','spine_IK_03_jnt'),('spine_02_setup_jnt','spine_IK_04_jnt'),('spine_03_setup_jnt','spine_IK_04_jnt'),('spine_03_setup_jnt','spine_IK_05_jnt'),('spine_01_setup_jnt','spine_01_IK_ctrl_grp'),('spine_02_setup_jnt','spine_02_IK_ctrl_grp'),('spine_03_setup_jnt','spine_03_IK_ctrl_grp'),('spine_01_setup_jnt','spine_start_length_jnt'),('spine_03_setup_jnt','spine_end_length_jnt'),('spine_01_setup_jnt','spine_01_length_jnt'),('spine_01_setup_jnt','spine_01_loc'),('spine_02_setup_jnt','spine_03_loc'),('spine_03_setup_jnt','spine_05_loc'),('spine_01_setup_jnt','spine_IK_root_jnt'),('spine_03_setup_jnt','spine_IK_chest_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        forDelspine_02_lenghtJntParentCon = cmds.parentConstraint('spine_01_setup_jnt','spine_02_length_jnt',mo=False)
        forDelspine_02_lenghtJntParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_02_length_jnt',mo=False)
        forDelspine_03_lenghtJntParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_03_length_jnt',mo=False)
        forDelspine_04_lenghtJntParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_04_length_jnt',mo=False)
        forDelspine_04_lenghtJntParentCon = cmds.parentConstraint('spine_03_setup_jnt','spine_04_length_jnt',mo=False)
        forDelspine_05_lenghtJntParentCon = cmds.parentConstraint('spine_03_setup_jnt','spine_05_length_jnt',mo=False)
        cmds.delete(forDelspine_02_lenghtJntParentCon)
        cmds.delete(forDelspine_03_lenghtJntParentCon)
        cmds.delete(forDelspine_04_lenghtJntParentCon)
        cmds.delete(forDelspine_05_lenghtJntParentCon) 
        forDelspine_02_locParentCon = cmds.parentConstraint('spine_01_setup_jnt','spine_02_loc',mo=False)
        forDelspine_02_locParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_02_loc',mo=False)
        forDelspine_04_locParentCon = cmds.parentConstraint('spine_02_setup_jnt','spine_04_loc',mo=False)
        forDelspine_04_locParentCon = cmds.parentConstraint('spine_03_setup_jnt','spine_04_loc',mo=False)
        cmds.delete(forDelspine_02_locParentCon)
        cmds.delete(forDelspine_04_locParentCon)
        
        toParentCon = [('spine_03_IK_ctrl','spine_IK_chest_jnt'),('spine_01_IK_ctrl','spine_IK_root_jnt'),('spine_01_IK_ctrl','spine_01_loc'),('spine_02_IK_ctrl','spine_03_loc'),('spine_03_IK_ctrl','spine_05_loc'),('spine_01_IK_ctrl','spine_02_loc'),('spine_02_IK_ctrl','spine_02_loc'),('spine_02_IK_ctrl','spine_04_loc'),('spine_03_IK_ctrl','spine_04_loc'),('spine_03_IK_ctrl','spine_02_IK_ctrl_grp'),('spine_01_IK_ctrl','spine_02_IK_ctrl_grp'),('cog_ctrl','spine_01_IK_ctrl_grp'),('cog_ctrl','spine_03_IK_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        cmds.select('spine_IK_01_jnt','spine_IK_05_jnt','spine_crv')
        cmds.ikHandle(n='spine_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
        
        createNode = [('multiplyDivide','spine_twist_mult'),('plusMinusAverage','spine_twist_pma'),('multiplyDivide','spine_stretch_01_mult'),('multiplyDivide','spine_stretch_02_mult')]
        for each in createNode:
            cmds.shadingNode(each[0],n=each[1],asUtility=1)
            
        toSetNode = [('spine_twist_mult.input2X',-1),('spine_stretch_01_mult.operation',2),('spine_stretch_01_mult.operation',2)]
        for each in toSetNode:
            cmds.setAttr(each[0],each[1])
        
        cmds.arclen('spine_crv',ch = True)
            
        toConnectAttr = [('spine_01_IK_ctrl.rotateZ','spine_twist_mult.input1X'),('spine_03_IK_ctrl.rotateZ','spine_twist_pma.input1D[0]'),('spine_01_IK_ctrl.rotateZ','spine_ikh.roll'),('spine_twist_pma.output1D','spine_ikh.twist'),('spine_twist_mult.outputX','spine_twist_pma.input1D[1]'),('curveInfo1.arcLength','spine_stretch_01_mult.input1X'),('spine_stretch_01_mult.outputX','spine_stretch_02_mult.input1X'),('spine_02_length_jnt.translateZ','spine_stretch_02_mult.input2X'),('spine_stretch_02_mult.outputX','spine_IK_02_jnt.translateZ'),('spine_stretch_02_mult.outputX','spine_IK_03_jnt.translateZ'),('spine_stretch_02_mult.outputX','spine_IK_04_jnt.translateZ'),('spine_stretch_02_mult.outputX','spine_IK_05_jnt.translateZ'),('spine_end_length_jnt.translateZ','spine_stretch_01_mult.input2X')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
        
        toCreateGroup = ['spine_IK_setup_jnt_grp','spine_IK_ctrl_grp','spine_IK_loc_grp','spine_IK_setup_grp']
        for each in toCreateGroup:
            cmds.group(n=each,em=True)
            
        toParent = [('spine_01_loc','spine_IK_loc_grp'),('spine_02_loc','spine_IK_loc_grp'),('spine_03_loc','spine_IK_loc_grp'),('spine_04_loc','spine_IK_loc_grp'),('spine_05_loc','spine_IK_loc_grp'),('spine_01_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_02_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_03_IK_ctrl_grp','spine_IK_ctrl_grp'),('spine_01_length_jnt','spine_IK_setup_jnt_grp'),('spine_start_length_jnt','spine_IK_setup_jnt_grp'),('spine_ikh','spine_IK_setup_grp'),('spine_crv','spine_IK_setup_grp'),('spine_IK_setup_jnt_grp','spine_IK_setup_grp'),('spine_IK_loc_grp','spine_IK_setup_grp'),('spine_IK_ctrl_grp','world_ctrl')]
        for each in toParent:
            cmds.parent(each[0],each[1])
        
        cmds.scaleConstraint('world_ctrl','spine_IK_setup_jnt_grp',mo=True)
        
        #set IKFK spine controller attributes#
        listOfSpineController = ['cog_ctrl','spine_01_IK_ctrl','spine_02_IK_ctrl','spine_03_IK_ctrl','spine_01_FK_ctrl','spine_02_FK_ctrl','spine_03_FK_ctrl']
        for each in listOfSpineController:
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,17)
        
        #create IKFK spine bind joint#
        nameOfSpineBindJoint = ['spine_01_bln_jnt','spine_02_bln_jnt','spine_03_bln_jnt']
        for each in nameOfSpineBindJoint:
            cmds.joint(n=each)
            
        cmds.parent('spine_01_bln_jnt',w=True)
        cmds.group(n='spine_01_bln_jnt_grp')
        cmds.scaleConstraint('world_ctrl','spine_01_bln_jnt_grp',mo=True)
            
        toGetSpineBindJointPos = [('spine_01_setup_jnt','spine_01_bln_jnt'),('spine_02_setup_jnt','spine_02_bln_jnt'),('spine_03_setup_jnt','spine_03_bln_jnt')]
        for each in toGetSpineBindJointPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        toParentConIKFKspine = [('spine_01_FK_jnt','spine_01_bln_jnt'),('spine_IK_root_jnt','spine_01_bln_jnt'),('spine_02_FK_jnt','spine_02_bln_jnt'),('spine_IK_03_jnt','spine_02_bln_jnt'),('spine_03_FK_jnt','spine_03_bln_jnt'),('spine_IK_chest_jnt','spine_03_bln_jnt')]    
        for each in toParentConIKFKspine:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        cmds.curve(n='spine_ik_fk_switch',d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
        cmds.group(n='spine_ik_fk_switch_grp')
        cmds.setAttr('spine_ik_fk_switch.visibility',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.translateX',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.translateY',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.translateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.rotateX',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.rotateY',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.rotateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.scaleZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('spine_ik_fk_switch.overrideEnabled' ,True) 
        cmds.setAttr('spine_ik_fk_switch.overrideColor' ,15)
        cmds.parent('spine_ik_fk_switch_grp', 'world_ctrl')
        cmds.addAttr('spine_ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1)
        cmds.parentConstraint('spine_02_bln_jnt','spine_ik_fk_switch_grp')
        cmds.shadingNode('reverse',n='spine_ik_rev',asUtility=1)
        
        toConnectAttr = [('spine_ik_fk_switch.IKFK','spine_01_bln_jnt_parentConstraint1.spine_01_FK_jntW0'),('spine_ik_fk_switch.IKFK','spine_ik_rev.inputX'),('spine_ik_rev.outputX','spine_01_bln_jnt_parentConstraint1.spine_IK_root_jntW1'),('spine_ik_fk_switch.IKFK','spine_02_bln_jnt_parentConstraint1.spine_02_FK_jntW0'),('spine_ik_rev.outputX','spine_02_bln_jnt_parentConstraint1.spine_IK_03_jntW1'),('spine_ik_fk_switch.IKFK','spine_03_bln_jnt_parentConstraint1.spine_03_FK_jntW0'),('spine_ik_rev.outputX','spine_03_bln_jnt_parentConstraint1.spine_IK_chest_jntW1'),('spine_ik_rev.outputX','spine_IK_ctrl_grp.visibility'),('spine_ik_fk_switch.IKFK','spine_01_FK_ctrl_grp.visibility')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])

        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        
    spineSetup()
    
    def leftRightFKsetup(side):
        nameOfFKcontroller = [('%s_FK_leg_01_ctrl'%(side),'%s_FK_leg_01_ctrl_grp'%(side)),('%s_FK_leg_02_ctrl'%(side),'%s_FK_leg_02_ctrl_grp'%(side)),('%s_FK_leg_03_ctrl'%(side),'%s_FK_leg_03_ctrl_grp'%(side)),('%s_FK_leg_04_ctrl'%(side),'%s_FK_leg_04_ctrl_grp'%(side)),('%s_FK_arm_01_ctrl'%(side),'%s_FK_arm_01_ctrl_grp'%(side)),('%s_FK_arm_02_ctrl'%(side),'%s_FK_arm_02_ctrl_grp'%(side)),('%s_FK_arm_03_ctrl'%(side),'%s_FK_arm_03_ctrl_grp'%(side)),('%s_FK_arm_04_ctrl'%(side),'%s_FK_arm_04_ctrl_grp'%(side)),('%s_shoulder_ctrl'%(side),'%s_shoulder_ctrl_grp'%(side))]
        for each in nameOfFKcontroller:
            ctrl = cmds.circle(n=each[0],r=5,nrx = 90)
            cmds.delete(ctrl,constructionHistory = True)
            cmds.group(n=each[1])
            
        nameOfJoint = [('%s_FK_leg_01_jnt'%(side)),('%s_FK_leg_02_jnt'%(side)),('%s_FK_leg_03_jnt'%(side)),('%s_FK_leg_04_jnt'%(side)),('%s_FK_arm_01_jnt'%(side)),('%s_FK_arm_02_jnt'%(side)),('%s_FK_arm_03_jnt'%(side)),('%s_FK_arm_04_jnt'%(side)),('%s_shoulder_jnt'%(side))]
        for each in nameOfJoint:
            cmds.joint(n=each)
            cmds.parent(w = True)
            
        togetPos = [('%s_leg_01_setup_jnt'%(side),'%s_FK_leg_01_jnt'%(side)),('%s_leg_02_setup_jnt'%(side),'%s_FK_leg_02_jnt'%(side)),('%s_leg_03_setup_jnt'%(side),'%s_FK_leg_03_jnt'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_FK_leg_04_jnt'%(side)),('%s_leg_01_setup_jnt'%(side),'%s_FK_leg_01_ctrl_grp'%(side)),('%s_leg_02_setup_jnt'%(side),'%s_FK_leg_02_ctrl_grp'%(side)),('%s_leg_03_setup_jnt'%(side),'%s_FK_leg_03_ctrl_grp'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_FK_leg_04_ctrl_grp'%(side)),('%s_arm_01_setup_jnt'%(side),'%s_FK_arm_01_jnt'%(side)),('%s_arm_02_setup_jnt'%(side),'%s_FK_arm_02_jnt'%(side)),('%s_arm_03_setup_jnt'%(side),'%s_FK_arm_03_jnt'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_FK_arm_04_jnt'%(side)),('%s_arm_01_setup_jnt'%(side),'%s_FK_arm_01_ctrl_grp'%(side)),('%s_arm_02_setup_jnt'%(side),'%s_FK_arm_02_ctrl_grp'%(side)),('%s_arm_03_setup_jnt'%(side),'%s_FK_arm_03_ctrl_grp'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_FK_arm_04_ctrl_grp'%(side)),('%s_shoulder_setup_jnt'%(side),'%s_shoulder_jnt'%(side)),('%s_shoulder_setup_jnt'%(side),'%s_shoulder_ctrl_grp'%(side))]
        for each in togetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
            
        toParent = [('%s_FK_leg_04_ctrl_grp'%(side),'%s_FK_leg_03_ctrl'%(side)),('%s_FK_leg_03_ctrl_grp'%(side),'%s_FK_leg_02_ctrl'%(side)),('%s_FK_leg_02_ctrl_grp'%(side),'%s_FK_leg_01_ctrl'%(side)),('%s_FK_leg_04_jnt'%(side),'%s_FK_leg_03_jnt'%(side)),('%s_FK_leg_03_jnt'%(side),'%s_FK_leg_02_jnt'%(side)),('%s_FK_leg_02_jnt'%(side),'%s_FK_leg_01_jnt'%(side)),('%s_FK_arm_04_ctrl_grp'%(side),'%s_FK_arm_03_ctrl'%(side)),('%s_FK_arm_03_ctrl_grp'%(side),'%s_FK_arm_02_ctrl'%(side)),('%s_FK_arm_02_ctrl_grp'%(side),'%s_FK_arm_01_ctrl'%(side)),('%s_FK_arm_04_jnt'%(side),'%s_FK_arm_03_jnt'%(side)),('%s_FK_arm_03_jnt'%(side),'%s_FK_arm_02_jnt'%(side)),('%s_FK_arm_02_jnt'%(side),'%s_FK_arm_01_jnt'%(side)),('%s_FK_arm_01_ctrl_grp'%(side),'%s_shoulder_ctrl'%(side))]
        for each in toParent:
            cmds.parent(each[0],each[1])
            cmds.makeIdentity('%s_FK_leg_01_jnt'%(side),'%s_FK_arm_01_jnt'%(side),'%s_shoulder_jnt'%(side),apply=True,translate=True,rotate=True)
        
        toParentCon = [('%s_FK_leg_01_ctrl'%(side),'%s_FK_leg_01_jnt'%(side)),('%s_FK_leg_02_ctrl'%(side),'%s_FK_leg_02_jnt'%(side)),('%s_FK_leg_03_ctrl'%(side),'%s_FK_leg_03_jnt'%(side)),('%s_FK_leg_04_ctrl'%(side),'%s_FK_leg_04_jnt'%(side)),('%s_FK_arm_01_ctrl'%(side),'%s_FK_arm_01_jnt'%(side)),('%s_FK_arm_02_ctrl'%(side),'%s_FK_arm_02_jnt'%(side)),('%s_FK_arm_03_ctrl'%(side),'%s_FK_arm_03_jnt'%(side)),('%s_FK_arm_04_ctrl'%(side),'%s_FK_arm_04_jnt'%(side)),('%s_shoulder_ctrl'%(side),'%s_shoulder_jnt'%(side)),('spine_03_bln_jnt','%s_shoulder_ctrl_grp'%(side)),('spine_01_bln_jnt','%s_FK_leg_01_ctrl_grp'%(side))]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = True)
            
        toLockAttr = [('%s_FK_leg_01_ctrl'%(side)),('%s_FK_leg_02_ctrl'%(side)),('%s_FK_leg_03_ctrl'%(side)),('%s_FK_leg_04_ctrl'%(side)),('%s_shoulder_ctrl'%(side)),('%s_FK_arm_01_ctrl'%(side)),('%s_FK_arm_02_ctrl'%(side)),('%s_FK_arm_03_ctrl'%(side)),('%s_FK_arm_04_ctrl'%(side))]
        for each in toLockAttr:
            cmds.setAttr(each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
        
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        
    leftRightFKsetup('l')
    leftRightFKsetup('r')
    
    def tailSetup():
        # FK tail 
        nameOfController = [('tail_FK_01_ctrl','tail_FK_01_ctrl_grp'),('tail_FK_02_ctrl','tail_FK_02_ctrl_grp'),('tail_FK_03_ctrl','tail_FK_03_ctrl_grp'),('tail_FK_04_ctrl','tail_FK_04_ctrl_grp'),('tail_FK_05_ctrl','tail_FK_05_ctrl_grp')]
        for each in nameOfController:
            ctrl = cmds.circle(n=each[0],r=5,nrx = 90)
            cmds.delete(ctrl,constructionHistory = True)
            cmds.group(n = each[1])
            
        nameOfJoint = [('tail_FK_01_jnt'),('tail_FK_02_jnt'),('tail_FK_03_jnt'),('tail_FK_04_jnt'),('tail_FK_05_jnt')]
        for each in nameOfJoint:
            cmds.joint(n = each)
            cmds.parent(w = True)
              
        toGetPos = [('tail_01_setup_jnt','tail_FK_01_ctrl_grp'),('tail_02_setup_jnt','tail_FK_02_ctrl_grp'),('tail_03_setup_jnt','tail_FK_03_ctrl_grp'),('tail_04_setup_jnt','tail_FK_04_ctrl_grp'),('tail_05_setup_jnt','tail_FK_05_ctrl_grp'),('tail_01_setup_jnt','tail_FK_01_jnt'),('tail_02_setup_jnt','tail_FK_02_jnt'),('tail_03_setup_jnt','tail_FK_03_jnt'),('tail_04_setup_jnt','tail_FK_04_jnt'),('tail_05_setup_jnt','tail_FK_05_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
            
        toParent = [('tail_FK_05_ctrl_grp','tail_FK_04_ctrl'),('tail_FK_04_ctrl_grp','tail_FK_03_ctrl'),('tail_FK_03_ctrl_grp','tail_FK_02_ctrl'),('tail_FK_02_ctrl_grp','tail_FK_01_ctrl'),('tail_FK_05_jnt','tail_FK_04_jnt'),('tail_FK_04_jnt','tail_FK_03_jnt'),('tail_FK_03_jnt','tail_FK_02_jnt'),('tail_FK_02_jnt','tail_FK_01_jnt')]
        for each in toParent:
            cmds.parent(each[0],each[1])
            cmds.makeIdentity('tail_FK_01_jnt',apply=True,translate=True,rotate=True)
            
        toParentCon = [('tail_FK_01_ctrl','tail_FK_01_jnt'),('tail_FK_02_ctrl','tail_FK_02_jnt'),('tail_FK_03_ctrl','tail_FK_03_jnt'),('tail_FK_04_ctrl','tail_FK_04_jnt'),('tail_FK_05_ctrl','tail_FK_05_jnt'),('spine_01_bln_jnt','tail_FK_01_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = True)
            
        toLockAttr = [('tail_FK_01_ctrl'),('tail_FK_02_ctrl'),('tail_FK_03_ctrl'),('tail_FK_04_ctrl'),('tail_FK_05_ctrl')]
        for each in toLockAttr:
            cmds.setAttr(each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
        
        # IK tail
        list = ['tail_IK_01_jnt','tail_IK_02_jnt','tail_IK_03_jnt','tail_IK_04_jnt','tail_IK_05_jnt','tail_start_length_jnt','tail_end_length_jnt','tail_01_length_jnt','tail_02_length_jnt','tail_03_length_jnt','tail_04_length_jnt','tail_05_length_jnt']
        for each in list:
            cmds.joint(n=each)
            
        list = [('tail_IK_01_ctrl','tail_IK_01_ctrl_grp'),('tail_IK_02_ctrl','tail_IK_02_ctrl_grp'),('tail_IK_03_ctrl','tail_IK_03_ctrl_grp')]
        for each in list:
            cmds.curve(n=each[0],d=1, p=[(-2.5, -5, 5),(-2.5, 5, 5),(2.5, 5, 5),(2.5, -5, 5),(2.5, -5, -5),(2.5, 5, -5),(-2.5, 5, -5),(-2.5, -5, -5),(-2.5, -5, 5),(2.5, -5, 5),(2.5, 5, 5),(2.5, 5, -5),(2.5, -5, -5),(-2.5, -5, -5),(-2.5, 5, -5),(-2.5, 5, 5)])
            cmds.group(n=each[1])
        
        list = [('tail_01_setup_jnt','tail_IK_01_jnt'),('tail_02_setup_jnt','tail_IK_02_jnt'),('tail_03_setup_jnt','tail_IK_03_jnt'),('tail_04_setup_jnt','tail_IK_04_jnt'),('tail_05_setup_jnt','tail_IK_05_jnt'),('tail_01_setup_jnt','tail_IK_01_ctrl_grp'),('tail_03_setup_jnt','tail_IK_02_ctrl_grp'),('tail_05_setup_jnt','tail_IK_03_ctrl_grp'),('tail_01_setup_jnt','tail_01_length_jnt'),('tail_02_setup_jnt','tail_02_length_jnt'),('tail_03_setup_jnt','tail_03_length_jnt'),('tail_04_setup_jnt','tail_04_length_jnt'),('tail_05_setup_jnt','tail_05_length_jnt'),('tail_01_setup_jnt','tail_start_length_jnt'),('tail_05_setup_jnt','tail_end_length_jnt')]
        for each in list:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        cmds.curve(d=3, p=[(0, 0, 0),(0, 2.5, 0),(0, 5, 0),(0, 7.5, 0),(0, 10, 0)])
        cmds.rename('tail_crv')
        
        nameOfLoc = ['tail_01_loc','tail_02_loc','tail_03_loc','tail_04_loc','tail_05_loc']
        for each in nameOfLoc:
            cmds.spaceLocator(n=each)
    
        toGetLocPos = [('tail_01_loc.translateY',0),('tail_02_loc.translateY',2.5),('tail_03_loc.translateY',5),('tail_04_loc.translateY',7.5),('tail_05_loc.translateY',10)]
        for each in toGetLocPos:
            cmds.setAttr(each[0],each[1])
    
        toConnectLoc = [('tail_01_loc.worldPosition[0]','tail_crv.controlPoints[0]'),('tail_02_loc.worldPosition[0]','tail_crv.controlPoints[1]'),('tail_03_loc.worldPosition[0]','tail_crv.controlPoints[2]'),('tail_04_loc.worldPosition[0]','tail_crv.controlPoints[3]'),('tail_05_loc.worldPosition[0]','tail_crv.controlPoints[4]')]
        for each in toConnectLoc:
            cmds.connectAttr(each[0],each[1])
            
        list = ['tail_setup_grp','tail_jnt_grp','tail_ctrl_grp','tail_IK_ctrl_grp','tail_IK_jnt_grp','tail_IK_setup_jnt_grp']
        for each in list:
            cmds.group(n=each,em=True)
  
        cmds.orientConstraint('tail_IK_01_ctrl','tail_IK_jnt_grp',mo=True)
        
        list = [('tail_01_setup_jnt','tail_01_loc'),('tail_02_setup_jnt','tail_02_loc'),('tail_03_setup_jnt','tail_03_loc'),('tail_04_setup_jnt','tail_04_loc'),('tail_05_setup_jnt','tail_05_loc')]
        for each in list:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        list = [('tail_IK_01_ctrl','tail_01_loc'),('tail_IK_01_ctrl','tail_02_loc'),('tail_IK_02_ctrl','tail_02_loc'),('tail_IK_02_ctrl','tail_03_loc'),('tail_IK_02_ctrl','tail_04_loc'),('tail_IK_03_ctrl','tail_04_loc'),('tail_IK_03_ctrl','tail_05_loc'),('tail_IK_01_ctrl','tail_IK_02_ctrl_grp'),('tail_IK_03_ctrl','tail_IK_02_ctrl_grp'),('spine_01_bln_jnt','tail_IK_ctrl_grp')]    
        for each in list:
            cmds.parentConstraint(each[0],each[1],mo=True)
        cmds.select('tail_IK_01_jnt','tail_IK_05_jnt','tail_crv')
        cmds.ikHandle(n='tail_ikh',sol='ikSplineSolver',ccv=0,pcv =0)
        
        createNode = [('multiplyDivide','tail_stretch_01_mult'),('multiplyDivide','tail_stretch_02_mult')]
        for each in createNode:
            cmds.shadingNode(each[0],n=each[1],asUtility=1)
            
        toSetNode = [('tail_stretch_01_mult.operation',2),('tail_stretch_01_mult.operation',2)]
        for each in toSetNode:
            cmds.setAttr(each[0],each[1])
        
        cmds.arclen('tail_crv',ch = True)
            
        toConnectAttr = [('tail_IK_03_ctrl.rotateX','tail_ikh.twist'),('curveInfo2.arcLength','tail_stretch_01_mult.input1X'),('tail_stretch_01_mult.outputX','tail_stretch_02_mult.input1X'),('tail_02_length_jnt.translateX','tail_stretch_02_mult.input2X'),('tail_stretch_02_mult.outputX','tail_IK_02_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_IK_03_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_IK_04_jnt.translateX'),('tail_stretch_02_mult.outputX','tail_IK_05_jnt.translateX'),('tail_end_length_jnt.translateX','tail_stretch_01_mult.input2X')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
            
        # IKFK tail setup
        list = ['tail_bln_01_jnt','tail_bln_02_jnt','tail_bln_03_jnt','tail_bln_04_jnt','tail_bln_05_jnt']
        for each in list:
            cmds.joint(n=each)
            
        list = [('tail_01_setup_jnt','tail_bln_01_jnt'),('tail_02_setup_jnt','tail_bln_02_jnt'),('tail_03_setup_jnt','tail_bln_03_jnt'),('tail_04_setup_jnt','tail_bln_04_jnt'),('tail_05_setup_jnt','tail_bln_05_jnt')]
        for each in list:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        list = [('tail_FK_01_jnt','tail_bln_01_jnt'),('tail_FK_02_jnt','tail_bln_02_jnt'),('tail_FK_03_jnt','tail_bln_03_jnt'),('tail_FK_04_jnt','tail_bln_04_jnt'),('tail_FK_05_jnt','tail_bln_05_jnt'),('tail_IK_01_jnt','tail_bln_01_jnt'),('tail_IK_02_jnt','tail_bln_02_jnt'),('tail_IK_03_jnt','tail_bln_03_jnt'),('tail_IK_04_jnt','tail_bln_04_jnt'),('tail_IK_05_jnt','tail_bln_05_jnt')]
        for each in list:
            cmds.parentConstraint(each[0],each[1],mo=True)
            
        cmds.curve(n='tail_ik_fk_switch',d=1, p=[(1.25, 0, 7.5),(-1.25, 0, 7.5),(-1.25, 0, 1.25),(-7.5, 0, 1.25),(-7.5, 0, -1.25),(-1.25, 0, -1.25),(-1.25, 0, -7.5),(1.25, 0 ,-7.5),(1.25, 0, -1.25),(7.5, 0, -1.25),(7.5, 0, 1.25,),(1.25, 0 ,1.25),(1.25, 0, 7.5)])
        cmds.group(n='tail_ik_fk_switch_grp')
        cmds.setAttr('tail_ik_fk_switch.visibility',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.translateX',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.translateY',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.translateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.rotateX',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.rotateY',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.rotateZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.scaleX',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.scaleY',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.scaleZ',keyable = False, cb = False, lock = True)
        cmds.setAttr('tail_ik_fk_switch.overrideEnabled' ,True) 
        cmds.setAttr('tail_ik_fk_switch.overrideColor' ,15)
        cmds.parent('tail_ik_fk_switch_grp', 'world_ctrl')
        cmds.addAttr('tail_ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1)
        cmds.parentConstraint('tail_bln_01_jnt','tail_ik_fk_switch_grp')
        cmds.shadingNode('reverse',n='tail_ik_rev',asUtility=1)
        
        toConnectAttr = [('tail_ik_fk_switch.IKFK','tail_bln_01_jnt_parentConstraint1.tail_FK_01_jntW0'),('tail_ik_fk_switch.IKFK','tail_ik_rev.inputX'),('tail_ik_rev.outputX','tail_bln_01_jnt_parentConstraint1.tail_IK_01_jntW1'),('tail_ik_fk_switch.IKFK','tail_bln_02_jnt_parentConstraint1.tail_FK_02_jntW0'),('tail_ik_rev.outputX','tail_bln_02_jnt_parentConstraint1.tail_IK_02_jntW1'),('tail_ik_fk_switch.IKFK','tail_bln_03_jnt_parentConstraint1.tail_FK_03_jntW0'),('tail_ik_rev.outputX','tail_bln_03_jnt_parentConstraint1.tail_IK_03_jntW1'),('tail_ik_fk_switch.IKFK','tail_bln_04_jnt_parentConstraint1.tail_FK_04_jntW0'),('tail_ik_rev.outputX','tail_bln_04_jnt_parentConstraint1.tail_IK_04_jntW1'),('tail_ik_fk_switch.IKFK','tail_bln_05_jnt_parentConstraint1.tail_FK_05_jntW0'),('tail_ik_rev.outputX','tail_bln_05_jnt_parentConstraint1.tail_IK_05_jntW1'),('tail_ik_rev.outputX','tail_IK_ctrl_grp.visibility'),('tail_ik_fk_switch.IKFK','tail_FK_01_ctrl_grp.visibility')]
        for each in toConnectAttr:
            cmds.connectAttr(each[0],each[1])
        
        # create tail group
        list = [('tail_IK_01_jnt','tail_IK_jnt_grp'),('tail_start_length_jnt','tail_IK_setup_jnt_grp'),('tail_01_length_jnt','tail_IK_setup_jnt_grp'),('tail_IK_01_ctrl_grp','tail_IK_ctrl_grp'),('tail_IK_02_ctrl_grp','tail_IK_ctrl_grp'),('tail_IK_03_ctrl_grp','tail_IK_ctrl_grp'),('tail_IK_ctrl_grp','tail_ctrl_grp'),('tail_FK_01_ctrl_grp','tail_ctrl_grp'),('tail_ik_fk_switch_grp','tail_ctrl_grp'),('tail_FK_01_jnt','tail_jnt_grp'),('tail_IK_01_jnt','tail_jnt_grp'),('tail_bln_01_jnt','tail_jnt_grp'),('tail_IK_setup_jnt_grp','tail_jnt_grp'),('tail_IK_jnt_grp','tail_jnt_grp'),('tail_crv','tail_setup_grp'),('tail_01_loc','tail_setup_grp'),('tail_02_loc','tail_setup_grp'),('tail_03_loc','tail_setup_grp'),('tail_04_loc','tail_setup_grp'),('tail_05_loc','tail_setup_grp'),('tail_IK_jnt_grp','tail_setup_grp'),('tail_IK_setup_jnt_grp','tail_setup_grp'),('tail_ikh','tail_setup_grp')]
        for each in list:
            cmds.parent(each[0],each[1])
            
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)
        
    tailSetup()
    
    def neckSetup():
        nameOfController = [('neck_01_ctrl','neck_01_ctrl_grp'),('neck_02_ctrl','neck_02_ctrl_grp'),('head_ctrl','head_ctrl_grp')]
        for each in nameOfController:
            cmds.curve(n=each[0],d=1, p=[(12.5, 12.5, 0),(-12.5, 12.5, 0),(-12.5, -12.5, 0),(12.5, -12.5, 0),(12.5, 12.5, 0)])
            cmds.group(n=each[1])
            
        nameOfJoint = [('neck_01_jnt'),('neck_02_jnt'),('head_jnt')]
        for each in nameOfJoint:
            cmds.joint(n=each)
            cmds.parent(w=True)
            
        toGetPos = [('neck_01_setup_jnt','neck_01_ctrl_grp'),('neck_02_setup_jnt','neck_02_ctrl_grp'),('head_setup_jnt','head_ctrl_grp'),('neck_01_setup_jnt','neck_01_jnt'),('neck_02_setup_jnt','neck_02_jnt'),('head_setup_jnt','head_jnt')]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
            
        toParent = [('head_ctrl_grp','neck_02_ctrl'),('neck_02_ctrl_grp','neck_01_ctrl'),('head_jnt','neck_02_jnt'),('neck_02_jnt','neck_01_jnt')]
        for each in toParent:   
            cmds.parent(each[0],each[1])
            cmds.makeIdentity('neck_01_jnt',apply=True,translate=True,rotate=True)
            
        toParentCon = [('neck_01_ctrl','neck_01_jnt'),('neck_02_ctrl','neck_02_jnt'),('head_ctrl','head_jnt'),('spine_03_bln_jnt','neck_01_ctrl_grp')]
        for each in toParentCon:
            cmds.parentConstraint(each[0],each[1],mo = True)
            
        toLockAttr = [('neck_01_ctrl'),('neck_02_ctrl'),('head_ctrl')]
        for each in toLockAttr:
            cmds.setAttr(each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,17)
        
        # the command to change the progress bar
        cmds.progressBar('QuadrupedProgressBar', edit=True, step=1)

    neckSetup()
    
    def leftRightIKsetup(side):
        nameOfJoint = [('%s_IK_leg_01_jnt'%(side)),('%s_IK_leg_02_jnt'%(side)),('%s_IK_leg_03_jnt'%(side)),('%s_IK_leg_04_jnt'%(side)),('%s_IK_arm_01_jnt'%(side)),('%s_IK_arm_02_jnt'%(side)),('%s_IK_arm_03_jnt'%(side)),('%s_IK_arm_04_jnt'%(side))]
        for each in nameOfJoint:
            cmds.joint(n=each)
        
        list = [('%s_IK_leg_roll_ctrl'%(side),'%s_IK_leg_roll_ctrl_grp'%(side)),('%s_IK_arm_roll_ctrl'%(side),'%s_IK_arm_roll_ctrl_grp'%(side))]
        for each in list:
            cmds.curve(d=1, p=[(0.5, 0.5, 0.5),(-0.5, 0.5, 0.5),(-1, 0, 0.5),(-1, 0, 1),(-1.5, -0.5, 0),(-1, 0, -1),(-1, 0, -0.5),(-0.5, 0.5, -0.5),(0.5, 0.5, -0.5),(1, 0, -0.5),(1, 0, -1),(1.5, -0.5, 0),(1, 0, 1),(1, 0, 1),(1, 0, 0.5),(0.5, 0.5, 0.5)],n=each[0])
            cmds.group(n=each[1])
        
        nameOfIKfootController = [('%s_IK_leg_ctrl'%(side),'%s_IK_leg_ctrl_grp'%(side)),('%s_IK_arm_ctrl'%(side),'%s_IK_arm_ctrl_grp'%(side))]
        for each in nameOfIKfootController:
            cmds.curve(n=each[0],d=1, p=[(-5, -5, 5),(-5, 5, 5),(5, 5, 5),(5, -5, 5),(5, -5, -5),(5, 5, -5),(-5, 5, -5),(-5, -5, -5),(-5, -5, 5),(5, -5, 5),(5, 5, 5),(5, 5, -5),(5, -5, -5),(-5, -5, -5),(-5, 5, -5),(-5, 5, 5)])
            cmds.group(n=each[1])
            
        nameOfPVcontroller = [('%s_leg_PV_ctrl'%(side),'%s_leg_PV_ctrl_grp'%(side)),('%s_arm_PV_ctrl'%(side),'%s_arm_PV_ctrl_grp'%(side))]
        for each in nameOfPVcontroller:
            cmds.curve(n=each[0],d = 1, p = [(0, 5, 0), (0, 0, 5), (0, -5, 0), (0, 0, -5), (0, 5, 0), (5, 0, 0), (0, -5, 0), (-5, 0, 0), (0, 0, 5), (5, 0, 0), (0, 0, -5), (-5, 0, 0), (0, 5, 0)])
            cmds.group(n=each[1])
            
        toGetControllerPos = [('%s_leg_04_setup_jnt'%(side),'%s_IK_leg_ctrl_grp'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IK_arm_ctrl_grp'%(side)),('%s_leg_PV_setup_loc'%(side),'%s_leg_PV_ctrl_grp'%(side)),('%s_arm_PV_setup_loc'%(side),'%s_arm_PV_ctrl_grp'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_IK_leg_roll_ctrl_grp'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IK_arm_roll_ctrl_grp'%(side))]
        for each in toGetControllerPos:
            forDel = cmds.pointConstraint(each[0],each[1],mo = False)
            cmds.delete(forDel)
            
        toGetJointPos = [('%s_leg_01_setup_jnt'%(side),'%s_IK_leg_01_jnt'%(side)),('%s_leg_02_setup_jnt'%(side),'%s_IK_leg_02_jnt'%(side)),('%s_leg_03_setup_jnt'%(side),'%s_IK_leg_03_jnt'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_IK_leg_04_jnt'%(side)),('%s_arm_01_setup_jnt'%(side),'%s_IK_arm_01_jnt'%(side)),('%s_arm_02_setup_jnt'%(side),'%s_IK_arm_02_jnt'%(side)),('%s_arm_03_setup_jnt'%(side),'%s_IK_arm_03_jnt'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IK_arm_04_jnt'%(side))]
        for each in toGetJointPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        list = [('%s_IK_leg_roll_ctrl'%(side)),('%s_IK_arm_roll_ctrl'%(side))]
        for each in list:
            cmds.setAttr (each+'.translateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.translateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.translateZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
        
        toLockPVcontroller = [('%s_leg_PV_ctrl'%(side)),('%s_arm_PV_ctrl'%(side))]
        for each in toLockPVcontroller:
            cmds.setAttr (each+'.rotateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.rotateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.rotateZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
            cmds.addAttr (each,sn='follow', min = 0, max=1 ,k=1)
            
        toLockIKcontroller = [('%s_IK_leg_ctrl'%(side)),('%s_IK_arm_ctrl'%(side))]
        for each in toLockIKcontroller:
            cmds.setAttr (each+'.visibility',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.scaleZ',keyable = False, cb = False, lock = True)
            cmds.setAttr (each+'.overrideEnabled' ,True) 
            cmds.setAttr (each+'.overrideColor' ,6)
            cmds.addAttr (each,sn='stretch',at = 'bool',k=1)
            cmds.addAttr (each,sn='heelLift' ,k=1)
            cmds.addAttr (each,sn='toeLift' ,k=1)
            cmds.addAttr (each,sn='footRock' ,k=1)
            
        nameOfLoc = [('%s_leg_heel_loc'%(side)),('%s_leg_toe_lift_loc'%(side)),('%s_leg_roll_out_loc'%(side)),('%s_leg_roll_in_loc'%(side)),('%s_arm_heel_loc'%(side)),('%s_arm_toe_lift_loc'%(side)),('%s_arm_roll_out_loc'%(side)),('%s_arm_roll_in_loc'%(side)),('%s_leg_PV_aim_loc'%(side)),('%s_leg_PV_aim_up_loc'%(side)),('%s_leg_PV_aim_base_loc'%(side)),('%s_leg_PV_aim_world_loc'%(side)),('%s_arm_PV_aim_loc'%(side)),('%s_arm_PV_aim_up_loc'%(side)),('%s_arm_PV_aim_base_loc'%(side)),('%s_arm_PV_aim_world_loc'%(side))]
        for each in nameOfLoc:
            cmds.spaceLocator(n=each)
        
        toGetGrp = [('%s_IK_leg_loc_grp'%(side)),('%s_IK_arm_loc_grp'%(side)),('%s_IK_leg_jnt_grp'%(side)),('%s_IK_arm_jnt_grp'%(side)),('%s_IK_arm_PV_loc_grp'%(side)),('%s_IK_leg_PV_loc_grp'%(side)),('%s_IK_leg_grp'%(side)),('%s_IK_arm_grp'%(side))]
        for each in toGetGrp:
            cmds.group(n=each,em=True)
            
        toGetPos = [('%s_leg_05_setup_jnt'%(side),'%s_leg_toe_lift_loc'%(side)),('%s_leg_heel_setup_jnt'%(side),'%s_leg_heel_loc'%(side)),('%s_leg_rock_out_setup_jnt'%(side),'%s_leg_roll_out_loc'%(side)),('%s_leg_rock_in_setup_jnt'%(side),'%s_leg_roll_in_loc'%(side)),('%s_arm_05_setup_jnt'%(side),'%s_arm_toe_lift_loc'%(side)),('%s_arm_heel_setup_jnt'%(side),'%s_arm_heel_loc'%(side)),('%s_arm_rock_out_setup_jnt'%(side),'%s_arm_roll_out_loc'%(side)),('%s_arm_rock_in_setup_jnt'%(side),'%s_arm_roll_in_loc'%(side)),('%s_leg_04_setup_jnt'%(side),'%s_IK_leg_loc_grp'%(side)),('%s_arm_04_setup_jnt'%(side),'%s_IK_arm_loc_grp'%(side)),('spine_01_bln_jnt','%s_leg_PV_aim_up_loc'%(side)),('%s_IK_leg_01_jnt'%(side),'%s_leg_PV_aim_base_loc'%(side)),('%s_IK_leg_04_jnt'%(side),'%s_leg_PV_aim_loc'%(side)),('%s_leg_PV_ctrl'%(side),'%s_leg_PV_aim_world_loc'%(side)),('spine_03_bln_jnt','%s_arm_PV_aim_up_loc'%(side)),('%s_IK_arm_01_jnt'%(side),'%s_arm_PV_aim_base_loc'%(side)),('%s_IK_arm_04_jnt'%(side),'%s_arm_PV_aim_loc'%(side)),('%s_arm_PV_ctrl'%(side),'%s_arm_PV_aim_world_loc'%(side))]
        for each in toGetPos:
            forDel = cmds.parentConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
        
        list = [('%s_arm_heel_loc'%(side),'%s_IK_arm_loc_grp'%(side)),('%s_leg_heel_loc'%(side),'%s_IK_leg_loc_grp'%(side))]
        for each in list:
            forDel = cmds.orientConstraint(each[0],each[1],mo=False)
            cmds.delete(forDel)
            
        cmds.parent('%s_IK_leg_01_jnt'%(side),'%s_IK_leg_jnt_grp'%(side))
        cmds.parent('%s_IK_arm_01_jnt'%(side),'%s_IK_arm_jnt_grp'%(side))
        cmds.makeIdentity('%s_IK_leg_01_jnt'%(side),'%s_IK_arm_01_jnt'%(side),apply=True,translate=True,rotate=True)
        cmds.addAttr ('%s_IK_leg_ctrl'%(side), at = 'enum', keyable=True, en = 'string1:string2:', ln='follow') 
        cmds.addAttr ('%s_IK_leg_ctrl'%(side)+'.follow', e=True, en = 'world:pelvis:')
        cmds.addAttr ('%s_IK_arm_ctrl'%(side), at = 'enum', keyable=True, en = 'string1:string2:', ln='follow') 
        cmds.addAttr ('%s_IK_arm_ctrl'%(side)+'.follow', e=True, en = 'world:shoulder:')
        cmds.ikHandle(n='%s_leg_upr_ikh'%(side), sj='%s_IK_leg_01_jnt'%(side), ee='%s_IK_leg_03_jnt'%(side),sol='ikRPsolver')
        cmds.ikHandle(n='%s_leg_lwr_ikh'%(side), sj='%s_IK_leg_03_jnt'%(side), ee='%s_IK_leg_04_jnt'%(side),sol='ikRPsolver')
        cmds.ikHandle(n='%s_arm_upr_ikh'%(side), sj='%s_IK_arm_01_jnt'%(side), ee='%s_IK_arm_03_jnt'%(side),sol='ikRPsolver')
        cmds.ikHandle(n='%s_arm_lwr_ikh'%(side), sj='%s_IK_arm_03_jnt'%(side), ee='%s_IK_arm_04_jnt'%(side),sol='ikRPsolver')
        cmds.parentConstraint('%s_shoulder_ctrl'%(side),'%s_IK_arm_01_jnt'%(side),mo = True)
        cmds.poleVectorConstraint('%s_arm_PV_ctrl'%(side),'%s_arm_upr_ikh'%(side))
        cmds.poleVectorConstraint('%s_leg_PV_ctrl'%(side),'%s_leg_upr_ikh'%(side))
from maya import cmds, OpenMaya

def ui():
    if cmds.workspaceControl("Rig Tools",ex = True):
        cmds.deleteUI("Rig Tools")
    myWin = cmds.workspaceControl("Rig Tools")
    myWin = cmds.tabLayout()
    cmds.scrollLayout(': : : : : : : : : : : : : : : : : : : : : : : : Tools : : : : : : : : : : : : : : : : : : : : : : : :',hst=16,vst=16,w=340)
    cmds.columnLayout(adj = True)
    cmds.showWindow("Rig Tools")
    
    cmds.frameLayout(label='Rig Help', collapsable=True, collapse=True,w=330)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to create locator, group, joint, parent and scale constraint.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=5)
    cmds.button('1',vis=False,w=20)
    cmds.button(label='Create Locators', command=create_locator_on_selection,w=139)
    cmds.button('2',vis=False)
    cmds.button(label="Create Group", command=create_group_on_selection,w=139)
    cmds.button('3',vis=False)
    cmds.separator(h=15,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button('4',vis=False)
    cmds.button("Create Joint",c = "jnt()")
    cmds.button('6',vis=False)
    cmds.button("Parent Scale Constraint",c="parentscale()")
    cmds.setParent('..')
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    #Controller tab
    cmds.frameLayout(label='Controller', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nr=4)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.frameLayout(label='Shape', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout( nc=1 )
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to create different type of controller.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=5)
    cmds.button(w=20,vis=False)
    cmds.button("cube",command=create_cube_on_selection,w = 130)
    cmds.button(w=20,vis=False)
    cmds.button("circle",command=create_circle_on_selection,w = 130)
    cmds.button(w=20,vis=False)
    cmds.separator(h=15,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button("square",command=create_square_on_selection)
    cmds.button(w=20,vis=False)
    cmds.button("cross",command=create_x_on_selection)
    cmds.button(w=20,vis=False)
    cmds.separator(h=15,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button("pyramid",command=create_pyramid_on_selection)
    cmds.button(w=20,vis=False)
    cmds.button("trianglecube",command=create_trianglecube_on_selection)
    cmds.setParent('..')
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #Color tab
    cmds.frameLayout(label='Color', collapsable=True, collapse=True,w=310)  
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to change color of selected controller.',align='left')
    cmds.separator(h=10,vis=False)
    cmds.gridLayout(nr=1,nc=10,cellWidthHeight=(31,20))
    backgroundColor = [((0.348,0.057,0.064),"DarkRed()"),((0.081,0.115,0.404),"darkBlue()"),((0.100,0.031,3.658),"blue()"),((0.052,0.013,0.114),"black()"),((0.531,0.091,0.768),"purple()"),((0.288,0.145,0.088),"brown()"),((0.096,0.058,0.049),"darkBrown()"),((0.333,0.089,0.016),"darkOrange()"),((1.240,0.106,0.018),"red()"),((0.294,5.113,0.000),"lightGreen()"),((8.423,2.724,0.000),"yellow()"),((0.423,1.213,8.659),"lightBlue()"),((2.320,0.606,0.574),"pink()"),((1.094,0.572,0.285),"lightOrange()"),((0.175,0.402,0.174),"darkGreen()"),((0.443,0.469,0.104),"darkYellow()"),((0.210,0.448,0.198),"green()"),((0.350,0.109,0.219),"darkPink()"),((0.208,0.096,0.447),"darkPurple()"),((0.147,0.211,0.456),"navy()")]
    for each in backgroundColor:
        cmds.iconTextButton(bgc=each[0],c=each[1])
    cmds.setParent('..')
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    #Lock attributes tab
    cmds.frameLayout(label='Attributes Lock / Unlock', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to lock or unlock attributes of selected controller.',align='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=5)
    cmds.button('1',vis=False,w=17)
    cmds.button("lock / unlock translate",c = "LockTranslate()",w=134)
    cmds.button('2',vis=False,w=17)
    cmds.button("lock / unlock rotate",c = "LockRotate()",w=134)
    cmds.button('3',vis=False,w=17)
    cmds.separator(h=15,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button('4',vis=False,w=17)
    cmds.button("lock / unlock scale",c = "LockScale()")
    cmds.button('5',vis=False,w=17)
    cmds.button("lock / unlock visibility",c = "LockVisibility()")
    cmds.setParent('..')
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    #Mirror controller tab
    cmds.frameLayout(label='Mirror', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to mirror controller.',align='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=7)
    cmds.button(w=10,vis=False)
    cmds.button("Left To Right",c = "MirrorFromLeft()",w=90)
    cmds.button(w=10,vis=False)
    cmds.button("Right To Left",c = "MirrorFromRight()",w=90)
    cmds.button(w=10,vis=False)
    cmds.button("Selected",c = "MirrorFromSelected()",w=90)
    cmds.button(w=10,vis=False)
    cmds.separator(h=5,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #Connect attributes tab
    cmds.frameLayout(label='Connect Attr', collapsable=True, collapse=True)  
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Help to connect atrribute of selected object.',align='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=7)
    cmds.button(w=10,vis=False)
    cmds.button("Connect Translate",c = "ConnectTanslate()",w=96)
    cmds.button(w=10,vis=False)
    cmds.button("Connect Rotate",c = "ConnectRotate()",w=96)
    cmds.button(w=10,vis=False)
    cmds.button("Connect Scale",c = "ConnectScale()",w=96)
    cmds.button(w=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #follicle tab
    cmds.frameLayout(label='Create Follicle', collapsable=True, collapse=True) 
    cmds.rowColumnLayout(nc=1)
    cmds.separator(vis=False)
    cmds.text('Select a plane and locators then click "Create Follicles".',align='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=3)
    cmds.button(w=63,vis=False)
    cmds.button("Create Follicles",c = 'createFollicles()',w=200)
    cmds.button(w=63,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Rename', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nr=5)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    #rename tab#
    cmds.frameLayout(label='Search And Replace', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to search and replace name of selected object.',al='left')
    cmds.rowColumnLayout(nc=4)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.text(label='Search:',w=70,al='left')
    cmds.button(w=20,vis=False)
    cmds.textField('search_field',w=190)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.text(label='Replace:',al='left')
    cmds.button(w=20,vis=False)
    cmds.textField('replace_field')
    cmds.button(vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label='Rename', command='search_replace()')
    cmds.button(vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    # Prefix UI elements
    cmds.frameLayout(label='Add Prefix', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to add prefix name of selected object.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=4)
    cmds.text(label='Prefix:',w=70,al='left')
    cmds.button(w=20,vis=False)
    cmds.textField('prefix_field',w=190)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label='Add Prefix',c='addPrefix()')
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    # Suffix UI elements
    cmds.frameLayout(label='Add Suffix', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to add suffix name of selected object.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=4)
    cmds.text(label='Suffix:',w=70,al = 'left')
    cmds.button(w=20,vis=False)
    cmds.textField('suffix_field',w=190)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.separator(vis=False)
    cmds.button(vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label='Add Suffix',c='addSuffix()')
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #add suffix name#
    cmds.frameLayout(label='Add Prefix or Suffix Name', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to add suffix name of selected object.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=7)
    cmds.button(w=10,vis=False)
    cmds.button(label='_jnt',c='addSuffixJnt()',w=88)
    cmds.button(w=10,vis=False)
    cmds.button(label='_grp',c='addSuffixGrp()',w=88)
    cmds.button(w=10,vis=False)
    cmds.button(label='_ctrl',c='addSuffixCtrl()',w=88)
    cmds.button(w=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #add number suffix name#
    cmds.frameLayout(label='Add Number Suffix Name', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=5,vis=False)
    cmds.text('Help to add number suffix name of selected object.',al='left')
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=4)
    cmds.text(label="Start number:",al='left')
    cmds.button(w=20,vis=False)
    cmds.intField('startNumField',value=1, minValue=1,w=190)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.text(label="Increment:",al='left')
    cmds.button(w=20,vis=False)
    cmds.intField('incrementField',value=1, minValue=1)
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label="Add Suffix", command='add_suffix()')
    cmds.button(w=20,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    #Auto rig tab
    cmds.frameLayout(label='Auto Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nr=4)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.frameLayout(label='Biped', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout( nc=1 )
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=3)
    cmds.text('Biped Setup:',al='left')
    cmds.button("SetupJoint",c = "setupjoint()",w = 150)
    cmds.button(w = 150,vis=0)
    cmds.separator(h=25,w=100)
    cmds.separator()
    cmds.separator()
    cmds.text('Mirror Setup:',al='left')
    cmds.button("MirrorSetupJoint",c = "mirrorSetupjoint()",w = 90)
    cmds.button(w = 150,vis=0)
    cmds.separator(h=25)
    cmds.separator()
    cmds.separator()
    cmds.text('Build Setup:',al='left')
    cmds.button("BuildSetup",c = "buildsetup()",w = 90)
    cmds.button(w = 150,vis=0)
    cmds.separator(h=25)
    cmds.separator()
    cmds.separator()
    cmds.text('Bendy Setup:',al='left')
    cmds.checkBox('bendyArm', label='BendyArm')
    cmds.button(w = 150,vis=0)
    cmds.button(w = 150,vis=0)
    cmds.checkBox('bendyLeg', label='BendyLeg')
    cmds.separator(vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Extra Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.rowColumnLayout(nr=3)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.frameLayout(label='IK Spring Rig', collapsable=True, collapse=True,w=285)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=4)
    cmds.text('IK Spring Setup:',al='left')
    cmds.button(w=40,vis=False)
    cmds.button("BuildIKSpringSetupJoint",c = "BuildIKSpringSetupJoint()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=40,vis=False)
    cmds.button("BuildIKSpringSetupRig",c = "BuildIKSpringSetupRig()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Tail Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Tail Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildTailSetupJoint",c = "BuildTailSetupJoint()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildTailSetupRig",c = "BuildTailSetupRig()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Motion Path Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout(nc=3)
    cmds.text('Path Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("MotionPathSetupLocator",c = "createLocator()",w = 150)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Joints Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.intField('numbersOfLocator',min=1,value=1)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildMotionPathSetupRig",c = "createMotionPath()",w = 150)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Quadruped Rig', collapsable=True, collapse=True)
    cmds.rowColumnLayout( nc=1 )
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Quadruped Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildQuadrupedSetupJoint",c = "BuildQuadrupedSetupJoint()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Mirror Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("MirrorQuadrupedSetupJoint",c = "MirrorQuadrupedSetupJoint()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=60,vis=False)
    cmds.button("BuildQuadrupedRig",c = "BuildQuadrupedSetupRig()",w = 150)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Facial', collapsable=True, collapse=True,w=310)
    cmds.rowColumnLayout(nc=1)
    cmds.rowColumnLayout(nr=3)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.button(w=10,vis=0)
    cmds.frameLayout(label='Eyelid', collapsable=True, collapse=True,w=285)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Eye Locator Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Eye Placement",c = "create_display_eye()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Eye Upper Lid Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Upper Eyelid Vertex",c = "store_vertex_ids()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Eye Lower Lid Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Lower Eyelid Vertex",c = "store_lower_vertex_ids()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Eyelid Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Build Eyelid",c = "create_joints_and_parent_joints()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.text('Eyelid Curve Reverse:',al='left')
    cmds.button(w=20,vis=False)
    cmds.checkBox('reversecrv', label='Reverse Curve')
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Eyelid Rename:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Left Eyelid",c = "rename_left()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.separator(h=20,vis=False)
    cmds.separator(h=20,vis=False)
    cmds.button("Right Eyelid",c = "rename_right()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=10,vis=False)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Lip', collapsable=True, collapse=True,w=285)
    global head_joint_field
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Head Joint Name:',al='left')
    cmds.button(w=5,vis=False)
    head_joint_field = cmds.textField(placeholderText="Enter Head Joint Name")
    cmds.button(w=20,vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(w=20,vis=False)
    cmds.button(label="Store Selected", command=store_head_joint_name)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Lip Upper Curve Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Upper Lip Edge",c = "create_upper_lip_edge()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Lip Lower Curve Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Lower Lip Edge",c = "create_lower_lip_edge()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Lip Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button("Build Lip Setup",c = "build_lip_setup()",w = 150)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.setParent('..')
    cmds.frameLayout(label='Eyebrow and Cheek', collapsable=True, collapse=True,w=285)
    cmds.rowColumnLayout(nc=1)
    cmds.rowColumnLayout(nc=1)
    cmds.separator(h=10,vis=False)
    cmds.rowColumnLayout( nc=4 )
    cmds.text('Inner Eyebrow Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Place Selected", command=build_inner_eyebrow_locator,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Middle Eyebrow Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Place Selected", command=build_middle_eyebrow_locator,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Outer Eyebrow Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Place Selected", command=build_outer_eyebrow_locator,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Cheek Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Place Selected", command=build_cheek_locator,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.text('Build Setup:',al='left')
    cmds.button(w=20,vis=False)
    cmds.button(label="Build All", command=build_all,w = 140)
    cmds.button(w=5,vis=False)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    cmds.separator(h=20)
    
    #locator function#
def create_locator(position):
    locator = cmds.spaceLocator()[0]
    cmds.move(position[0], position[1], position[2], locator)
    return locator

def create_locator_with_values(selected_object):
    position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
    rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
    locator_name = '{}_loc'.format(selected_object)
    locator = create_locator(position)
    cmds.rotate(rotation[0], rotation[1], rotation[2], locator)
    cmds.rename(locator, locator_name)
    return locator

def create_locator_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_locator_with_values(selected_object)
    else:
        create_locator([0, 0, 0])

    #group function#
def create_group_with_values(selected_object=None):
    group_name = selected_object + "_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    cmds.group(empty=True, name=group_name)
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_group_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_values(selected_object)
    else:
        cmds.group(em=True)

    #joint function#
def jnt():
    selected = cmds.ls(sl = True)
    if selected:
        for each in selected:
            cmds.select(each)
            newJoint = cmds.joint(n=each+'_jnt')
            cmds.parent(newJoint,w = True)
    else:
        cmds.joint()
        
    #parentscale function#    
def parentscale():
    lst = cmds.ls(sl = True)
    cmds.parentConstraint(lst,mo = True)
    cmds.scaleConstraint(lst,mo = True)

    #cube function#
def create_group_with_cube_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    cube = cmds.curve(d=1, p=[(-0.5, -0.5, 0.5),(-0.5, 0.5, 0.5),(0.5, 0.5, 0.5),(0.5, -0.5, 0.5),(0.5, -0.5, -0.5),(0.5, 0.5, -0.5),(-0.5, 0.5, -0.5),(-0.5, -0.5, -0.5),(-0.5, -0.5, 0.5),(0.5, -0.5, 0.5),(0.5, 0.5, 0.5),(0.5, 0.5, -0.5),(0.5, -0.5, -0.5),(-0.5, -0.5, -0.5),(-0.5, 0.5, -0.5),(-0.5, 0.5, 0.5)])
    cmds.parent(cube,group)
    cmds.rename(cube,selected_object + '_ctrl')
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_cube_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_cube_values(selected_object)
    else:
        cmds.curve(d=1, p=[(-0.5, -0.5, 0.5),(-0.5, 0.5, 0.5),(0.5, 0.5, 0.5),(0.5, -0.5, 0.5),(0.5, -0.5, -0.5),(0.5, 0.5, -0.5),(-0.5, 0.5, -0.5),(-0.5, -0.5, -0.5),(-0.5, -0.5, 0.5),(0.5, -0.5, 0.5),(0.5, 0.5, 0.5),(0.5, 0.5, -0.5),(0.5, -0.5, -0.5),(-0.5, -0.5, -0.5),(-0.5, 0.5, -0.5),(-0.5, 0.5, 0.5)])
        cmds.group()
        
    #circle function#
def create_group_with_circle_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    curvecircle = cmds.circle()[0]
    cmds.delete(curvecircle,constructionHistory = True)
    cmds.parent(curvecircle,group)
    cmds.rename(curvecircle,selected_object + '_ctrl')
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_circle_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_circle_values(selected_object)
    else:
        ctrl = cmds.circle()
        cmds.group()
        cmds.delete(ctrl,constructionHistory = True)
        
    #square function#
def create_group_with_square_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    square = cmds.curve(d=1, p=[(0.5, 0, 0.5),(-0.5, 0, 0.5),(-0.5, 0, -0.5),(0.5, 0, -0.5),(0.5, 0, 0.5)])
    cmds.parent(square,group)
    cmds.rename(square,selected_object + '_ctrl')
    
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_square_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_square_values(selected_object)
    else:
        cmds.curve(d=1, p=[(0.5, 0, 0.5),(-0.5, 0, 0.5),(-0.5, 0, -0.5),(0.5, 0, -0.5),(0.5, 0, 0.5)])
        cmds.group()
        
    #X function#
def create_group_with_x_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    x = cmds.curve(d=1, p=[(0.25, 0, 1.5),(-0.25, 0, 1.5),(-0.25, 0, 0.25),(-1.5, 0, 0.25),(-1.5, 0, -0.25),(-0.25, 0, -0.25),(-0.25, 0, -1.5),(0.25, 0 ,-1.5),(0.25, 0, -0.25),(1.5, 0, -0.25),(1.5, 0, 0.25,),(0.25, 0 ,0.25),(0.25, 0, 1.5)])
    cmds.parent(x,group)
    cmds.rename(x,selected_object + '_ctrl')
    
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_x_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_x_values(selected_object)
    else:
        cmds.curve(d=1, p=[(0.25, 0, 1.5),(-0.25, 0, 1.5),(-0.25, 0, 0.25),(-1.5, 0, 0.25),(-1.5, 0, -0.25),(-0.25, 0, -0.25),(-0.25, 0, -1.5),(0.25, 0 ,-1.5),(0.25, 0, -0.25),(1.5, 0, -0.25),(1.5, 0, 0.25,),(0.25, 0 ,0.25),(0.25, 0, 1.5)])
        cmds.group()
        
    #pyramid function#
def create_group_with_pyramid_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    pyramid = cmds.curve(d=1, p=[(1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, 1), (1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, -1), (1, -0.75, -1), (0, 0.5, 0), (1, -0.75, -1), (1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, 1), (-1, -0.75, -1)])
    cmds.parent(pyramid,group)
    cmds.rename(pyramid,selected_object + '_ctrl')
    
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_pyramid_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_pyramid_values(selected_object)
    else:
        cmds.curve(d=1, p=[(1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, 1), (1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, -1), (1, -0.75, -1), (0, 0.5, 0), (1, -0.75, -1), (1, -0.75, 1), (0, 0.5, 0), (-1, -0.75, 1), (-1, -0.75, -1)])
        cmds.group()

    #trianglecube function#
def create_group_with_trianglecube_values(selected_object=None):
    group_name = selected_object + "_ctrl_grp" if selected_object else "group"
    if cmds.objExists(group_name):
        group_name = cmds.rename(group_name, "{}_1".format(group_name))
    group = cmds.group(empty=True, name=group_name)
    trianglecube = cmds.curve(d = 1, p = [(0, 0.5, 0), (0, 0, 0.5), (0, -0.5, 0), (0, 0, -0.5), (0, 0.5, 0), (0.5, 0, 0), (0, -0.5, 0), (-0.5, 0, 0), (0, 0, 0.5), (0.5, 0, 0), (0, 0, -0.5), (-0.5, 0, 0), (0, 0.5, 0)])
    cmds.parent(trianglecube,group)
    cmds.rename(trianglecube,selected_object + '_ctrl')
    
    if selected_object:
        position = cmds.xform(selected_object, query=True, worldSpace=True, translation=True)
        rotation = cmds.xform(selected_object, query=True, worldSpace=True, rotation=True)
        cmds.move(position[0], position[1], position[2], group_name)
        cmds.rotate(rotation[0], rotation[1], rotation[2], group_name)
    return group_name

def create_trianglecube_on_selection(*args):
    selected_objects = cmds.ls(selection=True)
    if selected_objects:
        for selected_object in selected_objects:
            create_group_with_trianglecube_values(selected_object)
    else:
        cmds.curve(d = 1, p = [(0, 0.5, 0), (0, 0, 0.5), (0, -0.5, 0), (0, 0, -0.5), (0, 0.5, 0), (0.5, 0, 0), (0, -0.5, 0), (-0.5, 0, 0), (0, 0, 0.5), (0.5, 0, 0), (0, 0, -0.5), (-0.5, 0, 0), (0, 0.5, 0)])
        cmds.group()
        
#dark red function#
def DarkRed():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,4)
		
#dark blue function#
def darkBlue():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,5)
    
#blue function#
def blue():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,6)
		
#black function#
def black():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,8)
		
#pink function#
def purple():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,9)
		
#brown function#
def brown():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,10)
		
#dark brown function#
def darkBrown():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,11)
		
#dark orange function#
def darkOrange():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,12)
		
#red function#
def red():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,13)
		
#light green function#
def lightGreen():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,14)
		
#yellow function#
def yellow():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,17)

#lightblue function#
def lightBlue():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,18)
		
#pink function#
def pink():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,20)
		
#light orange function#
def lightOrange():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,21)
		
#dark green function#
def darkGreen():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,7)
		
#dark yellow function#
def darkYellow():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,25)
		
#green function#
def green():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,26)
		
#dark pink function#
def darkPink():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,31)
		
#dark purple function#
def darkPurple():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,30)

#navy function#
def navy():
	sel = cmds. ls(sl = True)
	shape =cmds.listRelatives(sel, shapes = True)
	for node in shape:
		cmds.setAttr(node + ".overrideEnabled" ,True) 
		cmds.setAttr(node + ".overrideColor" ,29)

	#lock translate function#
def LockTranslate():
    sel = cmds.ls(sl = True)
    for obj in sel:
        lockOrNot = cmds.getAttr (obj +'.translateX',lock = True)
        if lockOrNot == False:
            cmds.setAttr (obj +'.translateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.translateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.translateZ',keyable = False, cb = False, lock = True)
        else:
            cmds.setAttr (obj +'.translateX',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.translateY',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.translateZ',keyable = True, cb = False, lock = False)

	#lock rotate function#
def LockRotate():
    sel = cmds.ls(sl = True)
    for obj in sel:
        lockOrNot = cmds.getAttr (obj +'.rotateX',lock = True)
        if lockOrNot == False:
            cmds.setAttr (obj +'.rotateX',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.rotateY',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.rotateZ',keyable = False, cb = False, lock = True)
        else:
            cmds.setAttr (obj +'.rotateX',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.rotateY',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.rotateZ',keyable = True, cb = False, lock = False)

	#lock scale function#
def LockScale():
    sel = cmds.ls(sl = True)
    for obj in sel:
        lockOrNot = cmds.getAttr (obj +'.scaleX',lock = True)
        if lockOrNot == False:
            cmds.setAttr (obj +'.scaleX',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.scaleY',keyable = False, cb = False, lock = True)
            cmds.setAttr (obj +'.scaleZ',keyable = False, cb = False, lock = True)
        else:
            cmds.setAttr (obj +'.scaleX',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.scaleY',keyable = True, cb = False, lock = False)
            cmds.setAttr (obj +'.scaleZ',keyable = True, cb = False, lock = False)


	#lock visibility function#
def LockVisibility():
    sel = cmds.ls(sl = True)
    for obj in sel:
        lockOrNot = cmds.getAttr (obj +'.visibility',lock = True)
        if lockOrNot == False:
            cmds.setAttr (obj +'.visibility',keyable = False, cb = False, lock = True)
        else:
            cmds.setAttr (obj +'.visibility',keyable = True, cb = False, lock = False)
    	
    #connect tanslation function#
def ConnectTanslate():
    selection = cmds.ls(selection=True)
    if len(selection) != 2:
        cmds.warning("Please select exactly two objects.")
    else:
        source_obj = selection[0]
        destination_obj = selection[1]
        
    attrs = ["translateX", "translateY", "translateZ"]
    
    for attr in attrs:
        cmds.connectAttr(source_obj + "." + attr, destination_obj + "." + attr)
        
    #connect roration function#
def ConnectRotate():
    selection = cmds.ls(selection=True)
    if len(selection) != 2:
        cmds.warning("Please select exactly two objects.")
    else:
        source_obj = selection[0]
        destination_obj = selection[1]
        
    attrs = ["rotateX", "rotateY", "rotateZ"]
    
    for attr in attrs:
        cmds.connectAttr(source_obj + "." + attr, destination_obj + "." + attr)
        
    #connect scaling function#
def ConnectScale():
    selection = cmds.ls(selection=True)
    if len(selection) != 2:
        cmds.warning("Please select exactly two objects.")
    else:
        source_obj = selection[0]
        destination_obj = selection[1]
        
    attrs = ["scaleX", "scaleY", "scaleZ"]
    
    for attr in attrs:
        cmds.connectAttr(source_obj + "." + attr, destination_obj + "." + attr)
        
    # Mirror controllers function
def MirrorFromLeft():
    # Define your left and right prefixes
    left_prefix = "l_"
    right_prefix = "r_"

    # Get a list of NURBS curves with the left prefix
    left_curves = cmds.ls(left_prefix + "*", type="nurbsCurve")

    # Specify the names of the curves to skip
    curves_to_skip = ["r_elbow_direction_crvShape", "l_elbow_direction_crvShape","r_knee_direction_crvShape","l_knee_direction_crvShape","r_lwr_bendy_arm_crvShape","l_lwr_bendy_arm_crvShape","r_lwr_bendy_leg_crvShape","l_lwr_bendy_leg_crvShape","r_upr_bendy_arm_crvShape","l_upr_bendy_arm_crvShape","r_upr_bendy_leg_crvShape","l_upr_bendy_leg_crvShape"]

    # Iterate through the left curves
    for left_curve in left_curves:
        # Check if the curve is in the list of curves to skip
        if left_curve in curves_to_skip:
            print(f"Skipping {left_curve}.")
            continue

        # Construct the corresponding right curve name
        right_curve = left_curve.replace(left_prefix, right_prefix)

        # Check if the right curve exists
        if cmds.objExists(right_curve):
            # Retrieve the CVs from the left curve
            left_cvs = cmds.getAttr(f"{left_curve}.cv[*]")

            # Get the number of CVs
            num_cvs = len(left_cvs)

            # Apply the copied CVs to the right curve
            for i in range(num_cvs):
                target_cv_attr = "{0}.cv[{1}]".format(right_curve, i)
                cmds.setAttr(target_cv_attr, *left_cvs[i], type="double3")

            print("CVs copied from '{0}' to '{1}'.".format(left_curve, right_curve))
        else:
            cmds.warning("Corresponding right curve '{0}' not found for '{1}'. Skipping.".format(right_curve, left_curve))

    print("CV copy completed.")
    
def MirrorFromRight():
    # Define your left and right prefixes
    left_prefix = "l_"
    right_prefix = "r_"

    # Get a list of NURBS curves with the left prefix
    right_curves = cmds.ls(right_prefix + "*", type="nurbsCurve")

    # Specify the names of the curves to skip
    curves_to_skip = ["r_elbow_direction_crvShape", "l_elbow_direction_crvShape","r_knee_direction_crvShape","l_knee_direction_crvShape","r_lwr_bendy_arm_crvShape","l_lwr_bendy_arm_crvShape","r_lwr_bendy_leg_crvShape","l_lwr_bendy_leg_crvShape","r_upr_bendy_arm_crvShape","l_upr_bendy_arm_crvShape","r_upr_bendy_leg_crvShape","l_upr_bendy_leg_crvShape"]

    # Iterate through the left curves
    for right_curve in right_curves:
        # Check if the curve is in the list of curves to skip
        if right_curve in curves_to_skip:
            print(f"Skipping {right_curve}.")
            continue

        # Construct the corresponding right curve name
        left_curve = right_curve.replace(right_prefix, left_prefix)

        # Check if the right curve exists
        if cmds.objExists(left_curve):
            # Retrieve the CVs from the left curve
            right_cvs = cmds.getAttr(f"{right_curve}.cv[*]")

            # Get the number of CVs
            num_cvs = len(right_cvs)

            # Apply the copied CVs to the right curve
            for i in range(num_cvs):
                target_cv_attr = "{0}.cv[{1}]".format(left_curve, i)
                cmds.setAttr(target_cv_attr, *right_cvs[i], type="double3")

            print("CVs copied from '{0}' to '{1}'.".format(right_curve, left_curve))
        else:
            cmds.warning("Corresponding left curve '{0}' not found for '{1}'. Skipping.".format(left_curve, right_curve))

    print("CV copy completed.")
def MirrorFromSelected():
    # Get the selected control shapes (NURBS curves)
    selected_objects = cmds.ls(selection=True)

    # Ensure there are exactly two selected control shapes
    if len(selected_objects) != 2:
        cmds.warning("Please select exactly two NURBS curves to copy from and copy to.")
    else:
        # Sort the selected objects
        selected_objects.sort()

        # Extract CVs from the first selected control shape
        source_cvs = cmds.getAttr(f"{selected_objects[0]}.cp[*]")

        # Extract the number of CVs in the source curve
        num_cvs = len(source_cvs)

        # Apply the copied CVs to the second selected control shape
        for i in range(num_cvs):
            target_cv_attr = "{0}.cp[{1}]".format(selected_objects[1], i)
            cmds.setAttr(target_cv_attr, *source_cvs[i])

        print("CVs copied from '{0}' to '{1}'.".format(selected_objects[0], selected_objects[1]))
 
    #create follicles function#    
def createFollicles(*args):
    sel = cmds.ls(selection=True)
    if len(sel) < 2:
        cmds.warning('Please select a plane and at least one locator.')
        return
    plane = sel[0]
    locators = sel[1:]

    minX, minY, minZ, maxX, maxY, maxZ = cmds.xform(plane, q=True, ws=True, bb=True)
    width = maxX - minX
    height = maxZ - minZ
    
    for loc in locators:
        posX, posY, posZ = cmds.xform(loc, q=True, ws=True, translation=True)
        
        u = (posX - minX) / width
        v = (posZ - minZ) / height
        follicleX = u * width + minX
        follicleY = maxY
        follicleZ = v * height + minZ
        
        follicle = cmds.createNode('follicle')
        cmds.connectAttr('%s.outMesh' % plane, '%s.inputMesh' % follicle)
        cmds.connectAttr('%s.worldMatrix[0]' % plane, '%s.inputWorldMatrix' % follicle)
        cmds.setAttr('%s.parameterU' % follicle, u)
        cmds.setAttr('%s.parameterV' % follicle, v)
        
        cmds.move(follicleX, follicleY, follicleZ, follicle)
        cmds.setAttr('%s.visibility' % follicle, 0)
        
        follicleTransform = cmds.listRelatives(follicle, parent=True)[0]
        cmds.connectAttr('%s.outTranslate' % follicle, '%s.translate' % follicleTransform)
        cmds.connectAttr('%s.outRotate' % follicle, '%s.rotate' % follicleTransform)
        
    #rename function#
def search_replace():
    selection = cmds.ls(selection=True)

    search_text = cmds.textField('search_field', query=True, text=True)
    replace_text = cmds.textField('replace_field', query=True, text=True)

    for node in selection:
        new_name = node.replace(search_text, replace_text)
        cmds.rename(node, new_name)
    
    cmds.textField('search_field',edit=True,text = '')
    cmds.textField('replace_field',edit=True,text = '')
    #prefix and suffix functions#
def addPrefix():
    selection = cmds.ls(selection=True)
    prefix = cmds.textField('prefix_field', query=True, text=True)
    for node in selection:
        new_name = prefix + node
        cmds.rename(node, new_name)
    cmds.textField('prefix_field',edit=True,text = '')
    
def addSuffix():
    selection = cmds.ls(selection=True)
    suffix = cmds.textField('suffix_field', query=True, text=True)
    for node in selection:
        new_name = node + suffix
        cmds.rename(node, new_name)
    cmds.textField('suffix_field',edit=True,text = '')

def addSuffixJnt():
    selection = cmds.ls(selection=True)
    for node in selection:
        new_name = node + '_jnt'
        cmds.rename(node, new_name)
        
def addSuffixGrp():
    selection = cmds.ls(selection=True)
    for node in selection:
        new_name = node + '_grp'
        cmds.rename(node, new_name)
        
def addSuffixCtrl():
    selection = cmds.ls(selection=True)
    for node in selection:
        new_name = node + '_ctrl'
        cmds.rename(node, new_name)
        
    #add number suffix function#   
def add_suffix():
    start_num = cmds.intField('startNumField', query=True, value=True)
    increment = cmds.intField('incrementField', query=True, value=True)
    
    selected_objects = cmds.ls(selection=True)
    for i, obj in enumerate(selected_objects):
        new_suffix = "_{:02d}".format(start_num + i*increment)
        new_name = obj + new_suffix
        cmds.rename(obj, new_name)
        
    #build IK spring setup joint#
def BuildIKSpringSetupJoint():
    nameOfIKSpringSetupJnt = [('ikSpring_01_setup_jnt',(0,0,0)),('ikSpring_02_setup_jnt',(5,0,0)),('ikSpring_03_setup_jnt',(10,0,0)),('ikSpring_04_setup_jnt',(15,0,0)),('ikSpring_05_setup_jnt',(20,0,0))]
    for each in nameOfIKSpringSetupJnt:
        cmds.joint(n=each[0],p=each[1])
    
    cmds.setAttr('ikSpring_01_setup_jnt.rotateY',30)
    cmds.setAttr('ikSpring_02_setup_jnt.rotateY',-60)
    cmds.setAttr('ikSpring_03_setup_jnt.rotateY',60)
    cmds.setAttr('ikSpring_04_setup_jnt.rotateY',-60)
    
    #build IK spring setup rig#        
def BuildIKSpringSetupRig():
    def ControllerAttr(controllerName,visKeyableOrnot,scaleXKeyableOrnot,scaleYKeyableOrnot,scaleZKeyableOrnot,rotateXKeyableOrnot,rotateYKeyableOrnot,rotateZKeyableOrnot,visLockOrnot,scaleXLockOrnot,scaleYLockOrnot,scaleZLockOrnot,rotateXLockOrnot,rotateYLockOrnot,rotateZLockOrnot,colorEnableOrnot,colorNumber,translateXKeyableOrnot,translateYKeyableOrnot,translateZKeyableOrnot,translateXLockOrnot,translateYLockOrnot,translateZLockOrnot):
        cmds.setAttr ((controllerName) +'.visibility',keyable = visKeyableOrnot, cb = False, lock = visLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleX',keyable = scaleXKeyableOrnot, cb = False, lock = scaleXLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleY',keyable = scaleYKeyableOrnot, cb = False, lock = scaleYLockOrnot)
        cmds.setAttr ((controllerName) +'.scaleZ',keyable = scaleZKeyableOrnot, cb = False, lock = scaleZLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateX',keyable = rotateXKeyableOrnot, cb = False, lock = rotateXLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateY',keyable = rotateYKeyableOrnot, cb = False, lock = rotateYLockOrnot)
        cmds.setAttr ((controllerName) +'.rotateZ',keyable = rotateZKeyableOrnot, cb = False, lock = rotateZLockOrnot)
        cmds.setAttr ((controllerName) +'.translateX',keyable = translateXKeyableOrnot, cb = False, lock = translateXLockOrnot)
        cmds.setAttr ((controllerName) +'.translateY',keyable = translateYKeyableOrnot, cb = False, lock = translateYLockOrnot)
        cmds.setAttr ((controllerName) +'.translateZ',keyable = translateZKeyableOrnot, cb = False, lock = translateZLockOrnot)
        cmds.setAttr ((controllerName) + '.overrideEnabled' ,colorEnableOrnot) 
        cmds.setAttr ((controllerName) + '.overrideColor' ,colorNumber)
        
    nameOfIKSpringSetupRigUprJnt = [('ik_upr_01_jnt'),('ik_upr_02_jnt'),('ik_upr_03_jnt')]
    for each in nameOfIKSpringSetupRigUprJnt:
        cmds.joint(n=each)
        
        
    toGetPosUprJnt = [('ikSpring_01_setup_jnt','ik_upr_01_jnt'),('ikSpring_02_setup_jnt','ik_upr_02_jnt'),('ikSpring_03_setup_jnt','ik_upr_03_jnt')]
    for each in toGetPosUprJnt:
        parentConForDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(parentConForDel)
    orientConForDel = cmds.orientConstraint('ikSpring_02_setup_jnt','ik_upr_03_jnt',mo=False)
    cmds.delete(orientConForDel)
    cmds.makeIdentity( 'ik_upr_01_jnt', apply=True, translate=True, rotate=True )
    
    nameOfIKSpringSetupRigLwrJnt = [('ik_lwr_01_jnt'),('ik_lwr_02_jnt'),('ik_lwr_03_jnt')]
    for each in nameOfIKSpringSetupRigLwrJnt:
        cmds.joint(n=each)
        cmds.parent(w=True)
    
    toGetPosLwrJnt = [('ikSpring_03_setup_jnt','ik_lwr_01_jnt'),('ikSpring_04_setup_jnt','ik_lwr_02_jnt'),('ikSpring_05_setup_jnt','ik_lwr_03_jnt')]
    for each in toGetPosLwrJnt:
        parentConForDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(parentConForDel)
        
    nameOfFKSetupJnt = [('fk_01_jnt'),('fk_02_jnt'),('fk_03_jnt'),('fk_04_jnt'),('fk_05_jnt')]
    for each in nameOfFKSetupJnt:
        cmds.joint(n=each)
        cmds.parent(w=True)
    
    toGetPosFKJnt = [('ikSpring_01_setup_jnt','fk_01_jnt'),('ikSpring_02_setup_jnt','fk_02_jnt'),('ikSpring_03_setup_jnt','fk_03_jnt'),('ikSpring_04_setup_jnt','fk_04_jnt'),('ikSpring_05_setup_jnt','fk_05_jnt')]
    for each in toGetPosFKJnt:
        parentConForDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(parentConForDel)
        
    nameOfIKSpringSetupRigJnt = [('ikSpring_01_jnt'),('ikSpring_02_jnt'),('ikSpring_03_jnt'),('ikSpring_04_jnt'),('ikSpring_05_jnt')]
    for each in nameOfIKSpringSetupRigJnt:
        cmds.joint(n=each)
        cmds.parent(w=True)
        
    toGetPosIKSpringJnt = [('ikSpring_01_setup_jnt','ikSpring_01_jnt'),('ikSpring_02_setup_jnt','ikSpring_02_jnt'),('ikSpring_03_setup_jnt','ikSpring_03_jnt'),('ikSpring_04_setup_jnt','ikSpring_04_jnt'),('ikSpring_05_setup_jnt','ikSpring_05_jnt')]
    for each in toGetPosIKSpringJnt:
        parentConForDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(parentConForDel)
    
    toParent = [('fk_05_jnt','fk_04_jnt'),('fk_04_jnt','fk_03_jnt'),('fk_03_jnt','fk_02_jnt'),('fk_02_jnt','fk_01_jnt'),('ik_lwr_03_jnt','ik_lwr_02_jnt'),('ik_lwr_02_jnt','ik_lwr_01_jnt'),('ikSpring_05_jnt','ikSpring_04_jnt'),('ikSpring_04_jnt','ikSpring_03_jnt'),('ikSpring_03_jnt','ikSpring_02_jnt'),('ikSpring_02_jnt','ikSpring_01_jnt')]
    for each in toParent:
        cmds.parent(each[0],each[1])
        cmds.makeIdentity( 'ik_lwr_01_jnt','fk_01_jnt','ikSpring_01_jnt', apply=True, translate=True, rotate=True )
    #ik Rig#
    cmds.ikHandle(n='upr_ikh', sj='ik_upr_01_jnt', ee='ik_upr_03_jnt')
    cmds.ikHandle(n='lwr_ikh', sj='ik_lwr_01_jnt', ee='ik_lwr_03_jnt')
    cmds.ikHandle(n='spring_ikh', sj='ikSpring_01_jnt', ee='ikSpring_05_jnt',sol='ikSpringSolver')
    cmds.curve(d=1, p=[(-1, -1, 1),(-1, 1, 1),(1, 1, 1),(1, -1, 1),(1, -1, -1),(1, 1, -1),(-1, 1, -1),(-1, -1, -1),(-1, -1, 1),(1, -1, 1),(1, 1, 1),(1, 1, -1),(1, -1, -1),(-1, -1, -1),(-1, 1, -1),(-1, 1, 1)])
    cmds.rename('ik_mid_ctrl')
    ControllerAttr('ik_mid_ctrl',False,False,False,False,False,False,False,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
    cmds.group()
    cmds.rename('ik_mid_ctrl_grp')
    parentCon = cmds.parentConstraint('ik_upr_03_jnt','ik_mid_ctrl_grp',mo = False)
    cmds.delete(parentCon)
    cmds.curve(d=1, p=[(-1, -1, 1),(-1, 1, 1),(1, 1, 1),(1, -1, 1),(1, -1, -1),(1, 1, -1),(-1, 1, -1),(-1, -1, -1),(-1, -1, 1),(1, -1, 1),(1, 1, 1),(1, 1, -1),(1, -1, -1),(-1, -1, -1),(-1, 1, -1),(-1, 1, 1)])
    cmds.rename('ik_inr_ctrl')
    ControllerAttr('ik_inr_ctrl',False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
    cmds.group()
    cmds.rename('ik_inr_ctrl_grp')
    parentCon = cmds.parentConstraint('ik_lwr_03_jnt','ik_inr_ctrl_grp',mo = False)
    cmds.delete(parentCon)
    cmds.curve(d=1, p=[(-2, -2, 2),(-2, 2, 2),(2, 2, 2),(2, -2, 2),(2, -2, -2),(2, 2, -2),(-2, 2, -2),(-2, -2, -2),(-2, -2, 2),(2, -2, 2),(2, 2, 2),(2, 2, -2),(2, -2, -2),(-2, -2, -2),(-2, 2, -2),(-2, 2, 2)])
    cmds.rename('ik_ctrl')
    ControllerAttr('ik_ctrl',False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
    cmds.group()
    cmds.rename('ik_ctrl_grp')
    parentCon = cmds.parentConstraint('ik_lwr_03_jnt','ik_ctrl_grp',mo = False)
    cmds.delete(parentCon)
    cmds.pointConstraint('ik_ctrl','spring_ikh',mo = True)
    cmds.parentConstraint('ikSpring_05_jnt','ik_inr_ctrl_grp',mo = True)
    cmds.parentConstraint('ikSpring_03_jnt','ik_mid_ctrl_grp',mo = True)
    cmds.pointConstraint('ik_mid_ctrl','upr_ikh',mo = True)
    cmds.pointConstraint('ik_inr_ctrl','lwr_ikh',mo = True)
    cmds.pointConstraint('ik_mid_ctrl','ik_lwr_01_jnt',mo = True)
    cmds.orientConstraint('ik_inr_ctrl','ik_lwr_03_jnt',mo = True)
    
    #fk Rig#
    nameOfFKctrl = [('fk_01_ctrl','fk_01_ctrl_grp'),('fk_02_ctrl','fk_02_ctrl_grp'),('fk_03_ctrl','fk_03_ctrl_grp'),('fk_04_ctrl','fk_04_ctrl_grp'),('fk_05_ctrl','fk_05_ctrl_grp')]
    for each in nameOfFKctrl:
        FKctrl = cmds.circle(n=each[0],r=1,nrx = 90)
        cmds.group(n=each[1])
        ControllerAttr(each[0],False,False,False,False,True,True,True,True,True,True,True,False,False,False,True,6,True,True,True,False,False,False)
    
    toGetPosOfFKctrl = [('ikSpring_01_setup_jnt','fk_01_ctrl_grp'),('ikSpring_02_setup_jnt','fk_02_ctrl_grp'),('ikSpring_03_setup_jnt','fk_03_ctrl_grp'),('ikSpring_04_setup_jnt','fk_04_ctrl_grp'),('ikSpring_05_setup_jnt','fk_05_ctrl_grp')]
    for each in toGetPosOfFKctrl:
        parentCon = cmds.parentConstraint(each[0],each[1],mo = False)
        cmds.delete(parentCon)
        
    toGetParent = [('fk_05_ctrl_grp','fk_04_ctrl'),('fk_04_ctrl_grp','fk_03_ctrl'),('fk_03_ctrl_grp','fk_02_ctrl'),('fk_02_ctrl_grp','fk_01_ctrl')]
    for each in toGetParent:
        cmds.parent(each[0],each[1])
        
    parentCon = [('fk_01_ctrl','fk_01_jnt'),('fk_02_ctrl','fk_02_jnt'),('fk_03_ctrl','fk_03_jnt'),('fk_04_ctrl','fk_04_jnt'),('fk_05_ctrl','fk_05_jnt')]
    for each in parentCon:
        cmds.parentConstraint(each[0],each[1],mo = True)
        
    #IKFK Setup Rig#
    nameOfIKFKSetupJnt = [('bln_01_jnt'),('bln_02_jnt'),('bln_03_jnt'),('bln_04_jnt'),('bln_05_jnt')]
    for each in nameOfIKFKSetupJnt:
        cmds.joint(n=each)
        cmds.parent(w = True)
        
    toGetPosOfIKFKjnt = [('ikSpring_01_setup_jnt','bln_01_jnt'),('ikSpring_02_setup_jnt','bln_02_jnt'),('ikSpring_03_setup_jnt','bln_03_jnt'),('ikSpring_04_setup_jnt','bln_04_jnt'),('ikSpring_05_setup_jnt','bln_05_jnt')]
    for each in toGetPosOfIKFKjnt:
        parentCon = cmds.parentConstraint(each[0],each[1])
        cmds.delete(parentCon)
        
    toGetParent = [('bln_05_jnt','bln_04_jnt'),('bln_04_jnt','bln_03_jnt'),('bln_03_jnt','bln_02_jnt'),('bln_02_jnt','bln_01_jnt')]
    for each in toGetParent:
        cmds.parent(each[0],each[1])
        cmds.makeIdentity( 'bln_01_jnt', apply=True, translate=True, rotate=True )
        
    parentConIKFKjnt = [('ik_upr_01_jnt','bln_01_jnt'),('ik_upr_02_jnt','bln_02_jnt'),('ik_lwr_01_jnt','bln_03_jnt'),('ik_lwr_02_jnt','bln_04_jnt'),('ik_lwr_03_jnt','bln_05_jnt'),('fk_01_jnt','bln_01_jnt'),('fk_02_jnt','bln_02_jnt'),('fk_03_jnt','bln_03_jnt'),('fk_04_jnt','bln_04_jnt'),('fk_05_jnt','bln_05_jnt')]
    for each in parentConIKFKjnt:
        cmds.parentConstraint(each[0],each[1],mo = True)
    
    cmds.curve(d=1, p=[(0.5, 0, 2.25),(-0.5, 0, 2.25),(-0.5, 0, 0.5),(-2.25, 0, 0.5),(-2.25, 0, -0.5),(-0.5, 0, -0.5),(-0.5, 0, -2.25),(0.5, 0 ,-2.25),(0.5, 0, -0.5),(2.25, 0, -0.5),(2.25, 0, 0.5,),(0.5, 0 ,0.5),(0.5, 0, 2.25)])
    cmds.rename('ik_fk_switch')
    ControllerAttr('ik_fk_switch',False,False,False,False,False,False,False,True,True,True,True,True,True,True,True,15,False,False,False,True,True,True)
    cmds.group()
    cmds.rename('ik_fk_switch_grp')
    cmds.addAttr('ik_fk_switch',sn='IKFK', min = 0, max=1 ,k=1)
    cmds.parentConstraint('bln_05_jnt', 'ik_fk_switch_grp')
    cmds.shadingNode('reverse',n = 'ik_fk_rev',asUtility=1)
    
    toConect = [('ik_fk_switch.IKFK','bln_01_jnt_parentConstraint1.fk_01_jntW1'),('ik_fk_switch.IKFK','bln_02_jnt_parentConstraint1.fk_02_jntW1'),('ik_fk_switch.IKFK', 'bln_03_jnt_parentConstraint1.fk_03_jntW1'),('ik_fk_switch.IKFK', 'bln_04_jnt_parentConstraint1.fk_04_jntW1'),('ik_fk_switch.IKFK', 'bln_05_jnt_parentConstraint1.fk_05_jntW1'),('ik_fk_rev.outputX', 'bln_01_jnt_parentConstraint1.ik_upr_01_jntW0'),('ik_fk_rev.outputX', 'bln_02_jnt_parentConstraint1.ik_upr_02_jntW0'),('ik_fk_switch.IKFK', 'ik_fk_rev.inputX'),('ik_fk_rev.outputX', 'bln_03_jnt_parentConstraint1.ik_lwr_01_jntW0'),('ik_fk_rev.outputX', 'bln_04_jnt_parentConstraint1.ik_lwr_02_jntW0'),('ik_fk_rev.outputX', 'bln_05_jnt_parentConstraint1.ik_lwr_03_jntW0'),('ik_fk_switch.IKFK','fk_01_ctrl_grp.visibility'),('ik_fk_rev.outputX','ik_mid_ctrl_grp.visibility'),('ik_fk_rev.outputX','ik_inr_ctrl_grp.visibility'),('ik_fk_rev.outputX','ik_ctrl_grp.visibility')]
    for each in toConect:
        cmds.connectAttr(each[0],each[1])
        
    toHide = [('ikSpring_01_setup_jnt.visibility'),('ik_lwr_01_jnt.visibility'),('fk_01_jnt.visibility'),('ikSpring_01_jnt.visibility'),('ik_upr_01_jnt.visibility'),('upr_ikh.visibility'),('lwr_ikh.visibility'),('spring_ikh.visibility')]
    for each in toHide:
        cmds.setAttr(each,0)
        
    createGroup = ('rig_grp','jnt_grp','rename')
    for each in createGroup:
        cmds.group(w=1,n=each,em=1)
        
    toGroup = [('ikSpring_01_setup_jnt','rig_grp'),('ik_lwr_01_jnt','rig_grp'),('fk_01_jnt','rig_grp'),('ikSpring_01_jnt','rig_grp'),('upr_ikh','rig_grp'),('lwr_ikh','rig_grp'),('spring_ikh','rig_grp'),('fk_01_ctrl_grp','rig_grp'),('ik_mid_ctrl_grp','rig_grp'),('ik_inr_ctrl_grp','rig_grp'),('ik_ctrl_grp','rig_grp'),('ik_fk_switch_grp','rig_grp'),('bln_01_jnt','jnt_grp'),('jnt_grp','rename'),('rig_grp','rename')]
    for each in toGroup:
        cmds.parent(each[0],each[1])

#create tail setup joint function#
def BuildTailSetupJoint():
    list = [('tail_01_setup_jnt',(0, 0, 0)),('tail_02_setup_jnt',(10, 0, 0)),('tail_03_setup_jnt',(20, 0, 0)),('tail_04_setup_jnt',(30, 0, 0)),('tail_05_setup_jnt',(40, 0, 0))]
    for each in list:
        cmds.joint(n=each[0],p=each[1])
        
#create tail setup rig function#
def BuildTailSetupRig():
    #create FK tail setup
    list = ['tail_01_FK_jnt','tail_02_FK_jnt','tail_03_FK_jnt','tail_04_FK_jnt','tail_05_FK_jnt']
    for each in list:
        cmds.joint(n=each)
    
    list = [('tail_01_FK_ctrl','tail_01_FK_ctrl_grp'),('tail_02_FK_ctrl','tail_02_FK_ctrl_grp'),('tail_03_FK_ctrl','tail_03_FK_ctrl_grp'),('tail_04_FK_ctrl','tail_04_FK_ctrl_grp'),('tail_05_FK_ctrl','tail_05_FK_ctrl_grp')]
    for each in list:
        ctrl = cmds.circle(n=each[0],r=5,nrx = 90)
        cmds.delete(ctrl,constructionHistory = True)
        cmds.group(n=each[1])
    
    cmds.parent('tail_01_FK_jnt',w=True)
    
    list = [('tail_01_setup_jnt','tail_01_FK_ctrl_grp'),('tail_02_setup_jnt','tail_02_FK_ctrl_grp'),('tail_03_setup_jnt','tail_03_FK_ctrl_grp'),('tail_04_setup_jnt','tail_04_FK_ctrl_grp'),('tail_05_setup_jnt','tail_05_FK_ctrl_grp'),('tail_01_setup_jnt','tail_01_FK_jnt'),('tail_02_setup_jnt','tail_02_FK_jnt'),('tail_03_setup_jnt','tail_03_FK_jnt'),('tail_04_setup_jnt','tail_04_FK_jnt'),('tail_05_setup_jnt','tail_05_FK_jnt')]
    for each in list:
        forDel = cmds.parentConstraint(each[0],each[1],mo=False)
        cmds.delete(forDel)
    
    list = [('tail_05_FK_ctrl_grp','tail_04_FK_ctrl'),('tail_04_FK_ctrl_grp','tail_03_FK_ctrl'),('tail_03_FK_ctrl_grp','tail_02_FK_ctrl'),('tail_02_FK_ctrl_grp','tail_01_FK_ctrl')]
    for each in list:
        cmds.parent(each[0],each[1])
        
    list = [('tail_01_FK_ctrl','tail_01_FK_jnt'),('tail_02_FK_ctrl','tail_02_FK_jnt'),('tail_03_FK_ctrl','tail_03_FK_jnt'),('tail_04_FK_ctrl','tail_04_FK_jnt'),('tail_05_FK_ctrl','tail_05_FK_jnt')]
    for each in list:
        cmds.parentConstraint(each[0],each[1],mo=True)
    
    #create IK tail
    list = ['tail_01_IK_jnt','tail_02_IK_jnt','tail_03_IK_jnt','tail_04_IK_jnt','tail_05_IK_jnt','tail_01_length_jnt','tail_02_length_jnt','tail_03_length_jnt','tail_04_length_jnt','tail_05_length_jnt','tail_start_length_jnt','tail_end_length_jnt']
    for each in list:
        cmds.joint(n=each)
        
    list = [('tail_01_IK_ctrl','tail_01_IK_ctrl_grp'),('tail_02_IK_ctrl','tail_02_IK_ctrl_grp'),('tail_03_IK_ctrl','tail_03_IK_ctrl_grp')]
    for each in list:
        cmds.curve(n=each[0],d=1, p=[(-2.5, -5, 5),(-2.5, 5, 5),(2.5, 5, 5),(2.5, -5, 5),(2.5, -5, -5),(2.5, 5, -5),(-2.5, 5, -5),(-2.5, -5, -5),(-2.5, -5, 5),(2.5, -5, 5),(2.5, 5, 5),(2.5, 5, -5),(2.5, -5, -5),(-2.5, -5, -5),(-2.5, 5, -5),(-2.5, 5, 5)])
        cmds.group(n=each[1])
        
    cmds.parent('tail_01_IK_jnt','tail_start_length_jnt','tail_01_length_jnt',w=True)
from maya import cmds , OpenMaya

def getUParam( pnt = [], crv = None):

    point = OpenMaya.MPoint(pnt[0],pnt[1],pnt[2])
    curveFn = OpenMaya.MFnNurbsCurve(getDagPath(crv))
    paramUtill=OpenMaya.MScriptUtil()
    paramPtr=paramUtill.asDoublePtr()
    isOnCurve = curveFn.isPointOnCurve(point)
    if isOnCurve == True:
        
        curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )
    else :
        point = curveFn.closestPoint(point,paramPtr,0.001,OpenMaya.MSpace.kObject)
        curveFn.getParamAtPoint(point , paramPtr,0.001,OpenMaya.MSpace.kObject )
    
    param = paramUtill.getDouble(paramPtr)  
    return param

def getDagPath( objectName):
    
    if isinstance(objectName, list)==True:
        oNodeList=[]
        for o in objectName:
            selectionList = OpenMaya.MSelectionList()
            selectionList.add(o)
            oNode = OpenMaya.MDagPath()
            selectionList.getDagPath(0, oNode)
            oNodeList.append(oNode)
        return oNodeList
    else:
        selectionList = OpenMaya.MSelectionList()
        selectionList.add(objectName)
        oNode = OpenMaya.MDagPath()
        selectionList.getDagPath(0, oNode)
        return oNode
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int min_jumps(int nums[], int n) 
{
    if (n <= 1) {
        return 0; // No jumps needed if the array has only one element
    }
    
    // Initialize variables
    int jumps = 0;
    int farthest = 0;
    int current_end = 0;

    for (int i = 0; i < n - 1; i++) 
    {
        // Update the farthest we can reach
        farthest = max(farthest, i + nums[i]);

        // When we reach the end of the current range, we must jump
        if (i == current_end) 
        {
            jumps++;
            current_end = farthest;

            // If we can already reach the last index, break early
            if (current_end >= n - 1) 
            {
                break;
            }
        }
    }

    return jumps;
}

int main() 
{
    int n;
    cout << "Enter the size of the array: ";
    cin >> n;
    
    int nums[n];
    cout << "Enter the elements of the array: ";
    for (int i = 0; i < n; i++) 
    {
        cin >> nums[i];
    }
    
    int result = min_jumps(nums, n);
    cout << "Minimum number of jumps to reach the last index: " << result << endl;

    return 0;
}
ssh-keygen -t ed25519 -C "your_email@example.com"
public with sharing class ImpersonationUtil {
    public static String getImpersonatorEmail() {
        String query = 'SELECT CreatedById FROM AuthSession WHERE UsersId = :UserInfo.getUserId() AND SessionType = \'SubstituteUser\' ORDER BY CreatedDate DESC LIMIT 1';
        AuthSession session = Database.query(query);
        if (session != null) {
            User creator = [SELECT Email FROM User WHERE Id = :session.CreatedById LIMIT 1];
            return creator.Email;
        }
        return null;
    }
}
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>

using namespace std;

// FAP nghĩa là find all path
vector<vector<int>> FAP(int A, int B, vector<vector<int>>& S) {
    deque<vector<int>> dq;
    vector<vector<int>> all;

    dq.push_back({A});
    while (!dq.empty()) {
        vector<int> path = dq.front();
        dq.pop_front();
        int end = path.back();

        if (end == B) {
            all.push_back(path);
        } else {
            for (int i = 0; i < S[end].size(); i++) {
                int nei = S[end][i];
                if (find(path.begin(), path.end(), nei) == path.end()) {
                    vector<int> newpath = path;
                    newpath.push_back(nei);
                    dq.push_back(newpath);
                }
            }
        }
    }

    // In tất cả các đường đi tìm được
    cout << "Tất cả các đường đi từ " << A << " đến " << B << ":\n";
    for (const auto& p : all) {
        for (int i = 0; i < p.size(); i++) {
            cout << p[i];
            if (i < p.size() - 1) cout << " -> ";
        }
        cout << endl;
    }

    return all; // Trả về kết quả tìm được
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> S(n + 1); // Sử dụng vector 2D để lưu đồ thị

    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        S[u].push_back(v);
        S[v].push_back(u); // Đồ thị vô hướng
    }

    int A, B; // Đỉnh bắt đầu A và đỉnh đích B
    cin >> A >> B;

    vector<vector<int>> all = FAP(A, B, S);

    vector<int> LT(n + 1, 0); // Khởi tạo mảng đếm với kích thước n+1
    for (const auto& p : all) {
        for (int i = 0; i < p.size(); i++) {
            LT[p[i]]++;
        }
    }

    int maxx = *max_element(LT.begin(), LT.end());
    for (int i = 0; i < LT.size(); i++) {
        if(i == A || i == B){
            continue;
        }
        else if (LT[i] == maxx) {
            cout << i << " ";
        }
    }
    return 0;
}
$args = [ \
    'title' => 'Test Recurring Event', \
    'status' => 'publish', \
    'start_date' => '2022-09-01 14:00:00',  \
    'end_date' => '2022-09-01 17:00:00',  \
    'timezone' => 'America/New_York', \
    'recurrence' => 'RRULE:FREQ=DAILY;COUNT=10', \
];
$recurring_event = tribe_events()->set_args( $args )->create()->ID;
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":star: What's on in Melbourne this week! :star:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n\n Hey Melbourne, happy Monday! Please see below for what's on this week. "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "Xero Café :coffee:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n :new-thing: *This week we are offering:* \n\n Chocolate Freckle Cookies, Brownies (GF), and Melting Moments Cookies \n\n *Weekly Café Special*: _Turmeric Latte_"
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": " Wednesday, 18th September :calendar-date-18:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n\n:footprint: *STEPtember Afternoon Tea*: From *2pm* in the L3 kitchen + breakout space! \n\n :walking:*STEPtember Office Walk:* Take 30 minutes to join in the STEPtember office walk\n\n:yoga2:*Wellbeing - Yin Yoga & Breathwork*: Confirm your spot <https://docs.google.com/spreadsheets/d/1iKMQtSaawEdJluOmhdi_r_dAifeIg0JGCu7ZSPuwRbo/edit?gid=0#gid=0/|*here*>. Please note we have a maximum of 15 participants per class, a minimum notice period of 4 hours is required if you can no longer attend."
			}
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": "Thursday, 19th September :calendar-date-19:",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":breakfast: *Breakfast*: Provided by *Kartel Catering* from *8:30am - 10:30am* in the Wominjeka Breakout Space.\n\n"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "*Later this month:* We have our Grand Final Eve-Eve BBQ Social on the 26th of September! Make sure to wear your team colours (can be NRL or AFL) and come along for some fun! \n\nStay tuned to this channel for more details, and make sure you're subscribed to the <https://calendar.google.com/calendar/u/0?cid=Y19xczkyMjk5ZGlsODJzMjA4aGt1b3RnM2t1MEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t|*Melbourne Social Calendar*> :party-wx:"
			}
		}
	]
}
from bs4 import BeautifulSoup
import requests
import json

# Initialize the list to store API data
api = []

# Base URL for Yahoo News
base_url = 'https://www.yahoo.com'

# Fetch the main page
url = f'{base_url}/news/'
response = requests.get(url)

# Check if the request was successful
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # Find all news items
    for news_item in soup.find_all('ul', class_='stream-items'):
        for item in news_item.find_all('li', class_='stream-item'):
            
            # Extract the article link
            item_id = item.find('a', class_='js-content-viewer')
            if item_id:
                link = item_id.get('href')
                full_link = f'{base_url}{link}'
                
                # Fetch the article page
                response2 = requests.get(full_link)
                if response2.status_code == 200:
                    soup2 = BeautifulSoup(response2.text, 'html.parser')
                    
                    # Extract article details
                    itemInfo = soup2.find('div', class_='caas-inner-body')
                    if itemInfo:
                        text1 = ''
                        for text in itemInfo.find_all('div', class_='caas-body'):
                            text1 += text.text

                        # Remove "View comments" from the text
                        text1 = text1.replace("View comments", "").strip()

                        # Extract additional details if available
                        image = item.find('img')['src'] if item.find('img') else ''
                        category = item.find('strong', class_='Tt(c)').text if item.find('strong', class_='Tt(c)') else ''
                        ell = item.find('span', class_='Ell').text if item.find('span', class_='Ell') else ''
                        title = item.find('h3', class_='stream-item-title').text if item.find('h3', class_='stream-item-title') else ''
                        description = item.find('p', class_='finance-ticker-fetch-success_D(n)').text if item.find('p', class_='finance-ticker-fetch-success_D(n)') else ''
                        
                        # Append data to the api list
                        api.append({
                            'link': full_link,
                            'image': image,
                            'category': category,
                            'ell': ell,
                            'title': title,
                            'description': description,
                            'text': text1,
                        })

# Convert the api list to a JSON-formatted string
api_json = json.dumps(api, indent=4)

# Write the JSON data to a file
with open('news_data.json', 'w') as file:
    file.write(api_json)

print("Data has been written to news_data.json")
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>

using namespace std;

// FAP nghĩa là find all path
void FAP(int A, int B, vector<vector<int>>& S){
    deque<vector<int> > dq;
    vector<vector<int>> all;

    dq.push_back({A});
    while (!dq.empty()) {
        vector<int> path = dq.front();
        dq.pop_front();
        int end = path.back();

        if (end == B) {
            all.push_back(path);
        } else {
            for (int i = 0; i < S[end].size(); i++) {
                int nei = S[end][i];
                if (find(path.begin(), path.end(), nei) == path.end()) {
                    vector<int> newpath = path;
                    newpath.push_back(nei);
                    dq.push_back(newpath);
                }
            }
        }
    }

    // In tất cả các đường đi tìm được
    cout << "Tất cả các đường đi từ " << A << " đến " << B << ":\n";
    for (const auto& p : all) {
        for (int i = 0; i < p.size(); i++) {
            cout << p[i];
            if (i < p.size() - 1) cout << " -> ";
        }
        cout << endl;
    }
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int> > S(n + 1); // Sử dụng vector 2D để lưu đồ thị

    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        S[u].push_back(v);
        S[v].push_back(u); // Đồ thị vô hướng
    }

    int A, B; // Đỉnh bắt đầu A và đỉnh đích B
    cin >> A >> B;

    FAP(A, B, S);

    return 0;
}
#Open an elevated command prompt:

Dism.exe /online /Cleanup-Image /StartComponentCleanup
package com.example.diceroller

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.Alignment
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.example.diceroller.ui.theme.DiceRollerTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DiceRollerTheme {
                DiceRollerApp()
            }
        }
    }
}


@Composable
fun DiceRollerApp() {
    DiceWithButtonAndImage()
}

@Composable
fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
    var result by remember { mutableStateOf(1) }

    val imageResource = when (result) {
        1 -> R.drawable.dice_1
        2 -> R.drawable.dice_2
        3 -> R.drawable.dice_3
        4 -> R.drawable.dice_4
        5 -> R.drawable.dice_5
        else -> R.drawable.dice_6
    }

    Column(
        modifier = modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Image(
            painter = painterResource(imageResource),
            contentDescription = result.toString()
        )
        Spacer(modifier = Modifier.height(16.dp))
        Button(onClick = { result = (1..6).random() }) {
            Text(text = "roll dice")
        }
    }
}
package com.example.sep11

import android.os.Bundle
import android.widget.Space
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.sep11.ui.theme.Sep11Theme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            //display()
            //RowExample()
            //HelloWorld()
            //ImageExample()
            simpleButton()
        }
    }
}
@Composable
fun display(){
    Column( modifier = Modifier.padding(top = 150.dp, start = 60.dp)) {
        Text(text = "Hello JetPackCompose",
            fontSize = 35.sp,
            color = Color.Red,
        )
        Text(text = "Python",
            color = Color.Blue,
            fontSize = 45.sp,
            )
    }

}

@Composable
fun RowExample(){
    Row(modifier = Modifier.padding(all = 40.dp)){
        Text(text = "Java", color = Color.Green, fontSize = 45.sp)
        Text(text = "Kotlin", color = Color.Magenta, fontSize = 45.sp)
    }
}

@Composable
fun HelloWorld(){
    Box(
        modifier = Modifier.fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        Text(text = "Hello World", color = Color.Red,
            fontWeight = FontWeight.Bold,
        )
    }
}

@Composable
fun ImageExample(){
    Column{
        Image(painter = painterResource(id = R.drawable.java),
            contentDescription = "Java Logo",
            modifier = Modifier.padding(top = 45.dp)
            )
        Spacer(modifier = Modifier.height(45.dp))
        Text(text = "This is a Java Logo")
    }
}

@Composable
fun simpleButton(){

    val context = LocalContext.current
    Button(onClick = {Toast.makeText(context,"Button Clicked", Toast.LENGTH_LONG).show() }) {
        Text(text = "Click Here")
    }
}
package com.example.diceroller

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material3.Button
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.diceroller.ui.theme.DiceRollerTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            DiceRollerTheme {
                 DiceRollerApp()
            }
        }
    }
}

@Preview
@Composable
fun DiceRollerApp() {
    DiceWithButtonAndImage(modifier = Modifier
        .fillMaxSize()
        .wrapContentSize(Alignment.Center)
    )
}
@Composable
fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
    var result by remember { mutableStateOf(1) }
    val imageResource = when (result) {
        1 -> R.drawable.one
        2 -> R.drawable.two
        3 -> R.drawable.three
        4 -> R.drawable.four
        5 -> R.drawable.five
        else -> R.drawable.six
    }
    Column(
        modifier = modifier,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Image(
            painter = painterResource(imageResource),
            contentDescription = result.toString()
        )
        Spacer(modifier = Modifier.height(16.dp))
        Button(onClick = { result = (1..6).random() }) {
            Text(stringResource(R.string.roll))
        }
    }
}
package com.example.diceroller

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.Alignment
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.example.diceroller.ui.theme.DiceRollerTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DiceRollerTheme {
                DiceRollerApp()
            }
        }
    }
}


@Composable
fun DiceRollerApp() {
    DiceWithButtonAndImage()
}

@Composable
fun DiceWithButtonAndImage(modifier: Modifier = Modifier) {
    var result by remember { mutableStateOf(1) }

    val imageResource = when (result) {
        1 -> R.drawable.dice_1
        2 -> R.drawable.dice_2
        3 -> R.drawable.dice_3
        4 -> R.drawable.dice_4
        5 -> R.drawable.dice_5
        else -> R.drawable.dice_6
    }

    Column(
        modifier = modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Image(
            painter = painterResource(imageResource),
            contentDescription = result.toString()
        )
        Spacer(modifier = Modifier.height(16.dp))
        Button(onClick = { result = (1..6).random() }) {
           Text(text = "roll dice")
        }
    }
}
We cannot edit Wix Service pages - as its the inbuilt booking system. The client will have to build out pages with text and button and we can integrate the FH hyperlinks. We cannot build the content for them.
The second page - we can add calendar. but please note FH embeds will NOT lightframe in WIx, due to the CMS limitations
$font-sizes: 12px 14px 16px 18px;

@for $i from 1 through length($font-sizes) {
  .text-#{$i} {
    font-size: nth($font-sizes, $i);  // Retrieves the corresponding font size from the list
  }
}


//generates
.text-1 {
  font-size: 12px;
}

.text-2 {
  font-size: 14px;
}

.text-3 {
  font-size: 16px;
}

.text-4 {
  font-size: 18px;
}
            {data.map((item, index) => (
              <div key={index} className=" overflow-hidden w-[50%] sm:w-1/2 md:w-1/3 lg:w-1/4">
                {item.image_url  && (
                  <div 
                    className="w-[300px] relative h-56 bg-cover bg-center rounded-2xl before:bg-black/30 before:rounded-2xl before:absolute before:inset-0 before:content-['']" 
                    style={{ backgroundImage: `url(${item.image_url})` }}
                    aria-label={item.title}
                  >
                    <div className="absolute bottom-0 right-0 p-4  flex justify-end items-end text-white w-full h-full ">
                      <p className="hover:underline font-semibold">{item.title}</p>
                    </div>
                  </div>
                )}
               
              </div>
            ))}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":star: Boost Day is Here! :star:"
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "Hey Wellington! \n\nIt's Boost Day!\n\nCheck out today's fantastic lineup: "
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":calendar-date-30: Tuesday, 30th July",
				"emoji": true
			}
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": "\n:coffee: *Xero Café*: Café-style beverages and sweet treats.\n:clipboard: *Weekly Café Special*: _Caramel Mocha Latte_.\n:breakfast: *Breakfast*: Provided by *Simply Food* from *8AM - 10AM* in the All Hands.\n:massage:*Wellbeing - Massage*: Book a session <https://www.google.com/|*here*> to relax and unwind."
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "plain_text",
				"text": "Have an amazing Boost Day, Wellington!\n\nLove,\n\nWX  :party-wx:  ",
				"emoji": true
			}
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":newspaper:  STAY IN THE KNOW  :newspaper:"
			}
		},
		{
			"type": "context",
			"elements": [
				{
					"text": "*February 2024*  |   Monthly Spotlight",
					"type": "mrkdwn"
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "FOR YOUR INFORMATION",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\nStay in the loop about what’s happening at the office such as upcoming visitors, onsite meetings, lunches, and more. Don’t miss out—click to subscribe below."
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":google-workspace-calendar:  *DEN Happenings* calendar"
			},
			"accessory": {
				"type": "button",
				"text": {
					"type": "plain_text",
					"text": "Click to subscribe",
					"emoji": true
				},
				"value": "click_me_123",
				"url": "https://calendar.google.com/calendar/u/0?cid=eGVyby5jb21fNXI3dXQzZTEyMGYxbWZqNWFwdGc5MHRtMzRAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ",
				"action_id": "button-action"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "emoji",
							"name": "invite-envelope"
						},
						{
							"type": "text",
							"text": "   "
						},
						{
							"type": "text",
							"text": "You're invited!",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/8",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "emoji",
							"name": "scribble_heart_rainbow"
						},
						{
							"type": "text",
							"text": "  Galentine's Day Happy Hour\n"
						},
						{
							"type": "text",
							"text": "2/13",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": " "
						},
						{
							"type": "emoji",
							"name": "scribble_heart_rainbow"
						},
						{
							"type": "text",
							"text": " Galentine's Day Celebration\n           "
						},
						{
							"type": "emoji",
							"name": "hatching_chick",
							"unicode": "1f423"
						},
						{
							"type": "text",
							"text": " Nancy's Baby Shower\n\n"
						},
						{
							"type": "emoji",
							"name": "announcement-blue"
						},
						{
							"type": "text",
							"text": "   "
						},
						{
							"type": "text",
							"text": "ANNOUNCEMENT",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "emoji",
							"name": "announcement-blue"
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/15",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  Our host for the US Stand Up is Taylor Maiman!\n"
						}
					]
				},
				{
					"type": "rich_text_preformatted",
					"border": 0,
					"elements": [
						{
							"type": "text",
							"text": "If you're keen on leading one, don't hesitate to reach out to wxhelp@xero.com!"
						}
					]
				},
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "2/15",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  Happy Hour Trivia\n"
						},
						{
							"type": "text",
							"text": "2/19",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  President's Day - Office Closed\n"
						},
						{
							"type": "emoji",
							"name": "sticky-note"
						},
						{
							"type": "text",
							"text": " You may still access the office via access card"
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "emoji",
							"name": "date",
							"unicode": "1f4c5"
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "text",
							"text": "TUESDAY BREAKFAST SCHEDULE",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "emoji",
							"name": "date",
							"unicode": "1f4c5"
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/6",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "    "
						},
						{
							"type": "emoji",
							"name": "chinese-lantern"
						},
						{
							"type": "text",
							"text": " "
						},
						{
							"type": "text",
							"text": "OneFold",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/13",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  ",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "Pirate Chef\n\n"
						},
						{
							"type": "text",
							"text": "2/20",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  ",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "The Taqueria\n\n"
						},
						{
							"type": "text",
							"text": "2/27",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  ",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "Trez Banderas"
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "emoji",
							"name": "date",
							"unicode": "1f4c5"
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "text",
							"text": "THURSDAY LUNCH SCHEDULE",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "emoji",
							"name": "date",
							"unicode": "1f4c5"
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/1",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "   "
						},
						{
							"type": "text",
							"text": "Lazo Empanadas",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/8",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "   "
						},
						{
							"type": "emoji",
							"name": "chinese-lantern"
						},
						{
							"type": "text",
							"text": " "
						},
						{
							"type": "text",
							"text": "Zoe Mama",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/13",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": " "
						},
						{
							"type": "emoji",
							"name": "star-party"
						},
						{
							"type": "text",
							"text": " "
						},
						{
							"type": "text",
							"text": "Bonus Lunch: Pizza ",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/15",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "text",
							"text": "Chipotle",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/22",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "text",
							"text": "Hot Chicks Kitchen ",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/29",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "text",
							"text": "Adobo",
							"style": {
								"bold": true
							}
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_quote",
					"elements": [
						{
							"type": "text",
							"text": "WX offers comprehensive event planning services, including:"
						}
					]
				},
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "\n"
						}
					]
				},
				{
					"type": "rich_text_list",
					"style": "bullet",
					"indent": 0,
					"border": 0,
					"elements": [
						{
							"type": "rich_text_section",
							"elements": [
								{
									"type": "text",
									"text": "Assistance with logistics and coordination "
								}
							]
						},
						{
							"type": "rich_text_section",
							"elements": [
								{
									"type": "text",
									"text": "Access to a network of vendors for catering, supply ordering, etc."
								}
							]
						}
					]
				},
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "\nNote: Even if you don’t need our assistance but are using the office space, kindly inform WX."
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "context",
			"elements": [
				{
					"type": "mrkdwn",
					"text": ":pushpin: Have something important to add to our calendar? Get in touch with us at wxhelp@xero.com and let us know. We're here to help!"
				}
			]
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":newspaper:  STAY IN THE KNOW  :newspaper:"
			}
		},
		{
			"type": "context",
			"elements": [
				{
					"text": "*February 2024*  |  Monthly Spotlight",
					"type": "mrkdwn"
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "FOR YOUR INFORMATION",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\nStay in the loop about what’s happening at the office such as upcoming visitors, onsite meetings, lunches, and more. Don’t miss out—click to subscribe below."
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":google-workspace-calendar:  *NYC Happenings* calendar"
			},
			"accessory": {
				"type": "button",
				"text": {
					"type": "plain_text",
					"text": "Click to subscribe",
					"emoji": true
				},
				"value": "click_me_123",
				"url": "https://calendar.google.com/calendar/u/0?cid=Y19iMzQyMGZiNWFjMDU5ZTFlMDM2ZGJkMjEwOTBhODc1YmI3YjJlYzQ3NWY3MTRmZWNjZGNlZjMwNDkzNGQ0ODA2QGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20",
				"action_id": "button-action"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "emoji",
							"name": "office-building"
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "text",
							"text": "Building Announcements ",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "| "
						},
						{
							"type": "emoji",
							"name": "office-building"
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/13",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  Would you like to be our Valentine? Join\nus at the lobby for some sweet treats!\n"
						},
						{
							"type": "text",
							"text": "2/19",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  President's Day, Property Management Office will be closed"
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "emoji",
							"name": "announcement-blue"
						},
						{
							"type": "text",
							"text": "   "
						},
						{
							"type": "text",
							"text": "ANNOUNCEMENT",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "emoji",
							"name": "announcement-blue"
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/15",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  Our host for the US Stand Up is Taylor Maiman!\n"
						}
					]
				},
				{
					"type": "rich_text_preformatted",
					"border": 0,
					"elements": [
						{
							"type": "text",
							"text": "If you're keen on leading one, don't hesitate to reach out to wxhelp@xero.com!"
						}
					]
				},
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "2/21 & 2/22",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  Leadership Onsite"
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "emoji",
							"name": "date",
							"unicode": "1f4c5"
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "text",
							"text": "THURSDAY LUNCH SCHEDULE",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "emoji",
							"name": "date",
							"unicode": "1f4c5"
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/8",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "   "
						},
						{
							"type": "emoji",
							"name": "chinese-lantern"
						},
						{
							"type": "text",
							"text": " "
						},
						{
							"type": "text",
							"text": "Ollie's Sichuan",
							"style": {
								"bold": true,
								"italic": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/15",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "text",
							"text": "Lenwich",
							"style": {
								"bold": true,
								"italic": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/22",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  Chopt Creative Salad Co",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/29",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "text",
							"text": "Sophie's Cuban Cuisine",
							"style": {
								"bold": true
							}
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_quote",
					"elements": [
						{
							"type": "text",
							"text": "WX offers comprehensive event planning services, including:"
						}
					]
				},
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "\n"
						}
					]
				},
				{
					"type": "rich_text_list",
					"style": "bullet",
					"indent": 0,
					"border": 0,
					"elements": [
						{
							"type": "rich_text_section",
							"elements": [
								{
									"type": "text",
									"text": "Assistance with logistics and coordination "
								}
							]
						},
						{
							"type": "rich_text_section",
							"elements": [
								{
									"type": "text",
									"text": "Access to a network of vendors for catering, supply ordering, etc."
								}
							]
						}
					]
				},
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "\nNote: Even if you don’t need our assistance but are using the office space, kindly inform WX."
						}
					]
				}
			]
		},
		{
			"type": "context",
			"elements": [
				{
					"type": "mrkdwn",
					"text": ":pushpin: Have something important to add to our calendar? Get in touch with us at wxhelp@xero.com and let us know. We're here to help!"
				}
			]
		}
	]
}
{
	"blocks": [
		{
			"type": "header",
			"text": {
				"type": "plain_text",
				"text": ":newspaper:  STAY IN THE KNOW  :newspaper:"
			}
		},
		{
			"type": "context",
			"elements": [
				{
					"text": "*February 2024*  |  Monthly Spotlight",
					"type": "mrkdwn"
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "FOR YOUR INFORMATION",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\nStay in the loop about what’s happening at the office such as upcoming visitors, onsite meetings, lunches, and more. Don’t miss out—click to subscribe below."
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "section",
			"text": {
				"type": "mrkdwn",
				"text": ":google-workspace-calendar:  *SFO Happenings* calendar"
			},
			"accessory": {
				"type": "button",
				"text": {
					"type": "plain_text",
					"text": "Click to subscribe",
					"emoji": true
				},
				"value": "click_me_123",
				"url": "https://calendar.google.com/calendar/u/0?cid=Y184MjJkZWFkYWYyMjhiMWNhZmM0NjQ4NTA4MmMzY2E4ZjNlNjgyZDg0NGIzODFmYTYwZjRlNGU1ODUxOTdmNjhhQGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20",
				"action_id": "button-action"
			}
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "emoji",
							"name": "announcement-blue"
						},
						{
							"type": "text",
							"text": "   "
						},
						{
							"type": "text",
							"text": "ANNOUNCEMENT",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "emoji",
							"name": "announcement-blue"
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/15",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  Our host for the US Stand Up is Taylor Maiman!\n"
						}
					]
				},
				{
					"type": "rich_text_preformatted",
					"border": 0,
					"elements": [
						{
							"type": "text",
							"text": "If you're keen on leading one, don't hesitate to reach out to wxhelp@xero.com!"
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "emoji",
							"name": "date",
							"unicode": "1f4c5"
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "text",
							"text": "THURSDAY LUNCH SCHEDULE",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": " | "
						},
						{
							"type": "emoji",
							"name": "date",
							"unicode": "1f4c5"
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/8",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "text",
							"text": " ",
							"style": {
								"bold": true,
								"italic": true
							}
						},
						{
							"type": "emoji",
							"name": "chinese-lantern",
							"style": {
								"bold": true,
								"italic": true
							}
						},
						{
							"type": "text",
							"text": " Little Szechuan",
							"style": {
								"bold": true,
								"italic": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/15",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "text",
							"text": "The Grove - Yerba Buena",
							"style": {
								"bold": true,
								"italic": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/22",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  RT Rotisserie",
							"style": {
								"bold": true
							}
						},
						{
							"type": "text",
							"text": "\n\n"
						},
						{
							"type": "text",
							"text": "2/29",
							"style": {
								"code": true
							}
						},
						{
							"type": "text",
							"text": "  "
						},
						{
							"type": "text",
							"text": "sweetgreen",
							"style": {
								"bold": true
							}
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "rich_text",
			"elements": [
				{
					"type": "rich_text_quote",
					"elements": [
						{
							"type": "text",
							"text": "WX offers comprehensive event planning services, including:"
						}
					]
				},
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "\n"
						}
					]
				},
				{
					"type": "rich_text_list",
					"style": "bullet",
					"indent": 0,
					"border": 0,
					"elements": [
						{
							"type": "rich_text_section",
							"elements": [
								{
									"type": "text",
									"text": "Assistance with logistics and coordination "
								}
							]
						},
						{
							"type": "rich_text_section",
							"elements": [
								{
									"type": "text",
									"text": "Access to a network of vendors for catering, supply ordering, etc."
								}
							]
						}
					]
				},
				{
					"type": "rich_text_section",
					"elements": [
						{
							"type": "text",
							"text": "\nNote: Even if you don’t need our assistance but are using the office space, kindly inform WX."
						}
					]
				}
			]
		},
		{
			"type": "divider"
		},
		{
			"type": "context",
			"elements": [
				{
					"type": "mrkdwn",
					"text": ":pushpin: Have something important to add to our calendar?  Don’t hesitate to reach out if you have any questions or concerns. Get in touch with us at wxhelp@xero.com and let us know. We're here to help!"
				}
			]
		}
	]
}
Unlock the potential of Telegram with our custom Telegram Mini Apps development services. Our skilled developers create versatile, lightweight mini apps that seamlessly integrate with Telegram, enhancing user engagement and offering a unique digital experience. From e-commerce solutions and payment gateways to customer support bots and interactive content, we build Telegram Mini Apps that elevate your business presence on the platform. We focus on delivering secure, scalable, and feature-rich apps that provide a smooth user experience and leverage the vast reach of Telegram’s ecosystem. Transform your business communication and customer interaction with innovative Telegram Mini Apps tailored to your specific needs.
If you’re searching for the best SEO services for your business, NounQ Technologies is a top SEO company in India. By using successive SEO tactics our digital marketing experts  improve the website's organic visibility and maintain high rank in Search Engine. Our experts monitor your campaign manually by identifying areas for improvement and the needs of your targeted clients and work according to it.
Our SEO services are committed towards providing effective and ethical Search Engine Optimization for both small and large scale businesses. Our SEO company works for you to create and promote valuable content according to the needs of clients.
void confirmDialog(
      String req, TicketModel ticket, List<AuthModel> assignToPersonList) {
    try {
      if (req == "Approve") {
        timeDurationController.clear();
        showDialog(
          barrierDismissible: false,
          context: context,
          builder: (context) {
            return StatefulBuilder(
              builder: (context, setState) {
                return AlertDialog(
                  title: Center(
                    child: Text(
                      "Verify",
                      style: Theme.of(context).textTheme.bodyLarge,
                    ),
                  ),
                  content: SizedBox(
                    height: 200,
                    child: Column(
                      children: [
                        DropdownButtonFormField<String>(
                          validator: (value) {
                            if (value == null) {
                              return 'Please select a Person to Assign';
                            }
                            return null;
                          },
                          decoration: InputDecoration(
                            labelText: "Person to Assign",
                            border: OutlineInputBorder(
                              borderRadius: BorderRadius.circular(10),
                            ),
                          ),
                          style: Theme.of(context).textTheme.bodyLarge,
                          iconSize: 30,
                          hint: const Text("Select Person to Assign"),
                          items: assignToPersonList.map((authModel) {
                            return DropdownMenuItem(
                              value: authModel.uid,
                              child: Text(authModel.fullName),
                            );
                          }).toList(),
                          onChanged: (String? value) {
                            setState(() {
                              selectedPerson = value;
                            });
                          },
                        ),
                        const SizedBox(height: 20),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                          children: [
                            ElevatedButton(
                              onPressed: () {
                                setState(() {
                                  isHourly = true;
                                  timeDurationController.clear();
                                });
                              },
                              style: ElevatedButton.styleFrom(
                                backgroundColor: isHourly
                                    ? Color.fromARGB(255, 0, 0, 0)
                                    : Color.fromARGB(255, 17, 17, 17),
                              ),
                              child: const Text("Hourly"),
                            ),
                            ElevatedButton(
                              onPressed: () {
                                setState(() {
                                  isHourly = false;
                                });
                              },
                              style: ElevatedButton.styleFrom(
                                backgroundColor: !isHourly
                                    ? Color.fromARGB(255, 0, 0, 0)
                                    : Color.fromARGB(255, 17, 17, 17),
                              ),
                              child: const Text("Day"),
                            ),
                          ],
                        ),
                        const SizedBox(height: 20),
                        TextField(
                          controller: timeDurationController,
                          keyboardType: TextInputType.number,
                          inputFormatters: [
                            FilteringTextInputFormatter.digitsOnly,
                          ],
                          decoration: InputDecoration(
                            labelText: isHourly
                                ? "Time Duration (Hours)"
                                : "Time Duration (Days)",
                            border: OutlineInputBorder(
                              borderRadius: BorderRadius.circular(10),
                            ),
                          ),
                          // Restrict input based on mode
                          onChanged: (value) {
                            if (value.isNotEmpty) {
                              int enteredValue = int.parse(value);

                              if (isHourly) {
                                // If hourly, restrict between 1 and 7
                                if (enteredValue < 1 || enteredValue > 7) {
                                  timeDurationController.text = "1";
                                }
                              } else {
                                // If day-wise, restrict between 1 and 60
                                if (enteredValue < 1 || enteredValue > 60) {
                                  timeDurationController.text = "1";
                                }
                              }

                              // Set the cursor position at the end of the text
                              timeDurationController.selection =
                                  TextSelection.fromPosition(
                                TextPosition(
                                    offset: timeDurationController.text.length),
                              );
                            }
                          },
                        ),
                      ],
                    ),
                  ),
                  actions: <Widget>[
                    TextButton(
                      child: const Text('Cancel'),
                      onPressed: () {
                        Navigator.pop(context);
                      },
                    ),
                    ElevatedButton(
                      child: const Text('Approve'),
                      onPressed: () async {
                        if (selectedPerson != null &&
                            timeDurationController.text.isNotEmpty) {
                          int timeDuration =
                              int.parse(timeDurationController.text);
                          if (!isHourly) {
                            timeDuration *= 7;
                          }
                          ticket.assignTo = selectedPerson!;
                          ticket.timeDuration = timeDuration;
                          ticket.status = TicketStatus.inProgress;
                          ref
                              .read(ticketControllerProvider)
                              .updateTicket(ref, ticket);
                          ref.invalidate(ticketListStreamProvider);
                          ref.invalidate(ticketsByCreatedByStreamProvider);
                          Navigator.pop(context);
                        } else {
                          log("Error: Please fill all fields.");
                        }
                      },
                    ),
                  ],
                );
              },
            );
          },
        );
      } else if (req == "Reject") {
        TextEditingController rejectReason = TextEditingController();
        final GlobalKey<FormState> _reject = GlobalKey<FormState>();
        showDialog(
          barrierDismissible: false,
          context: context,
          builder: (context) {
            return AlertDialog(
              title: Center(
                child: Text(
                  "Verify",
                  style: Theme.of(context).textTheme.bodyLarge,
                ),
              ),
              content: SizedBox(
                height: 120,
                child: Form(
                  key: _reject,
                  child: TextFormField(
                    validator: (text) {
                      if (text == null || text.isEmpty) {
                        return 'Please enter a reason for rejecting the request';
                      }
                      return null;
                    },
                    controller: rejectReason,
                    keyboardType: TextInputType.text,
                    textCapitalization: TextCapitalization.words,
                    decoration: InputDecoration(
                      labelText: "Reason for Rejection",
                      hintText: "Enter reason to reject the request",
                      border: OutlineInputBorder(
                        borderRadius: BorderRadius.circular(10),
                      ),
                    ),
                  ),
                ),
              ),
              actions: <Widget>[
                TextButton(
                  child: const Text('Cancel'),
                  onPressed: () {
                    Navigator.pop(context);
                  },
                ),
                ElevatedButton(
                  child: const Text('Reject'),
                  onPressed: () async {
                    if (_reject.currentState!.validate()) {
                      ticket.status = TicketStatus.rejected;
                      ticket.rejectionRemark = rejectReason.text;
                      ref
                          .read(ticketControllerProvider)
                          .updateTicket(ref, ticket);
                      ref.invalidate(ticketListStreamProvider);
                      ref.invalidate(ticketsByCreatedByStreamProvider);
                      Navigator.pop(context);
                    }
                  },
                ),
              ],
            );
          },
        );
      }
    } catch (e) {
      log("Error occurred: $e");
    }
  }





void confirmDialog(
    String req, TicketModel ticket, List<AuthModel> assignToPersonList) {
  try {
    if (req == "Approve") {
      timeDurationController.clear();
      showDialog(
        barrierDismissible: false,
        context: context,
        builder: (context) {
          return StatefulBuilder(
            builder: (context, setState) {
              return AlertDialog(
                title: Center(
                  child: Text(
                    "Verify",
                    style: Theme.of(context).textTheme.bodyLarge,
                  ),
                ),
                content: SizedBox(
                  height: 200,
                  child: Column(
                    children: [
                      DropdownButtonFormField<String>(
                        validator: (value) {
                          if (value == null) {
                            return 'Please select a Person to Assign';
                          }
                          return null;
                        },
                        decoration: InputDecoration(
                          labelText: "Person to Assign",
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(10),
                          ),
                        ),
                        style: Theme.of(context).textTheme.bodyLarge,
                        iconSize: 30,
                        hint: const Text("Select Person to Assign"),
                        items: assignToPersonList.map((authModel) {
                          return DropdownMenuItem(
                            value: authModel.uid,
                            child: Text(authModel.fullName),
                          );
                        }).toList(),
                        onChanged: (String? value) {
                          setState(() {
                            selectedPerson = value;
                          });
                        },
                      ),
                      const SizedBox(height: 20),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: [
                          ElevatedButton(
                            onPressed: () {
                              setState(() {
                                isHourly = true;
                                timeDurationController.clear();
                              });
                            },
                            style: ElevatedButton.styleFrom(
                              backgroundColor: isHourly
                                  ? Color.fromARGB(255, 0, 0, 0)
                                  : Color.fromARGB(255, 17, 17, 17),
                            ),
                            child: const Text("Hourly"),
                          ),
                          ElevatedButton(
                            onPressed: () {
                              setState(() {
                                isHourly = false;
                              });
                            },
                            style: ElevatedButton.styleFrom(
                              backgroundColor: !isHourly
                                  ? Color.fromARGB(255, 0, 0, 0)
                                  : Color.fromARGB(255, 17, 17, 17),
                            ),
                            child: const Text("Day"),
                          ),
                        ],
                      ),
                      const SizedBox(height: 20),
                      TextField(
                        controller: timeDurationController,
                        keyboardType: TextInputType.number,
                        inputFormatters: [
                          FilteringTextInputFormatter.digitsOnly,
                        ],
                        decoration: InputDecoration(
                          labelText: isHourly
                              ? "Time Duration (Hours)"
                              : "Time Duration (Days)",
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(10),
                          ),
                        ),
                        onChanged: (value) {
                          if (value.isNotEmpty) {
                            int enteredValue = int.parse(value);

                            if (isHourly) {
                              // If hourly, restrict between 1 and 7
                              if (enteredValue < 1 || enteredValue > 7) {
                                timeDurationController.text = "1";
                              }
                            } else {
                              // If day-wise, restrict between 1 and 60
                              if (enteredValue < 1 || enteredValue > 60) {
                                timeDurationController.text = "1";
                              }
                            }

                            timeDurationController.selection =
                                TextSelection.fromPosition(
                              TextPosition(
                                  offset: timeDurationController.text.length),
                            );
                          }
                        },
                      ),
                    ],
                  ),
                ),
                actions: <Widget>[
                  TextButton(
                    child: const Text('Cancel'),
                    onPressed: () {
                      Navigator.pop(context);
                    },
                  ),
                  ElevatedButton(
                    child: const Text('Approve'),
                    onPressed: () async {
                      if (selectedPerson != null &&
                          timeDurationController.text.isNotEmpty) {
                        int timeDuration = int.parse(timeDurationController.text);
                        ticket.assignTo = selectedPerson!;
                        
                        // Store the current time in assigningTime
                        DateTime assigningTime = DateTime.now();
                        ticket.assigningTime = assigningTime;

                        if (!isHourly) {
                          // Convert days to hours for storing as timeDuration
                          timeDuration *= 24;
                        }

                        // Add timeDuration to assigningTime to calculate estimatedTime
                        ticket.estimatedTime =
                            assigningTime.add(Duration(hours: timeDuration));

                        ticket.timeDuration = timeDuration;
                        ticket.status = TicketStatus.inProgress;

                        ref
                            .read(ticketControllerProvider)
                            .updateTicket(ref, ticket);
                        ref.invalidate(ticketListStreamProvider);
                        ref.invalidate(ticketsByCreatedByStreamProvider);
                        Navigator.pop(context);
                      } else {
                        log("Error: Please fill all fields.");
                      }
                    },
                  ),
                ],
              );
            },
          );
        },
      );
    } else if (req == "Reject") {
      // Code for Reject case
    }
  } catch (e) {
    log("Error occurred: $e");
  }
}
Use Node.js built-in tools with --inspect and Chrome DevTools for profiling.
Use clinic.js for comprehensive performance analysis.
Use memwatch-next for detecting memory leaks.
Use heapdump for taking heap snapshots.
Use autocannon for performance benchmarking.
// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'dart:convert';
import 'dart:ui';

import 'package:enum_to_string/enum_to_string.dart';
import 'package:rrispat_app/src/features/ticket/ticket_enums.dart';

class TicketModel {
  String id;
  String createdBy;
  String userDepartment;
  String assignTo;
  String againstDepartment;
  String hod;
  String subDepartment;
  String teamLead;
  int timeDuration;
  String description;
  DateTime? createdAt;
  TicketStatus status;
  int userRating;
  UserReviewStatus userReviewStatus;
  String rejectionRemark;
  String reviewRemark;
  List<String> solutionRemarks = [];
  DateTime? assigningTime;
  DateTime? estimatedTime;

  TicketModel({
    this.id = '',
    this.createdBy = '',
    this.userDepartment = '',
    this.assignTo = '',
    this.againstDepartment = '',
    this.hod = '',
    this.subDepartment = '',
    this.teamLead = '',
    this.timeDuration = 0,
    this.description = '',
    this.userRating = 0,
    this.rejectionRemark = '',
    this.reviewRemark = '',
    this.solutionRemarks = const [],
    this.userReviewStatus = UserReviewStatus.reviewNotReceived,
    this.createdAt,
    this.assigningTime,
    this.estimatedTime,

    this.status = TicketStatus.created,
    // required this.status,
  });

  TicketModel copyWith({
    String? id,
    String? createdBy,
    String? userDepartment,
    String? assignTo,
    String? againstDepartment,
    String? hod,
    String? subDepartment,
    String? teamLead,
    int? timeDuration,
    String? description,
    int? userRating,
    UserReviewStatus? userReviewStatus,
    String? rejectionRemark,
    String? reviewRemark,
    List<String>? solutionRemarks,
    DateTime? createdAt,
    TicketStatus? status,
  }) {
    return TicketModel(
      id: id ?? this.id,
      createdBy: createdBy ?? this.createdBy,
      userDepartment: userDepartment ?? this.userDepartment,
      assignTo: assignTo ?? this.assignTo,
      againstDepartment: againstDepartment ?? this.againstDepartment,
      hod: hod ?? this.hod,
      subDepartment: subDepartment ?? this.subDepartment,
      teamLead: teamLead ?? this.teamLead,
      timeDuration: timeDuration ?? this.timeDuration,
      description: description ?? this.description,
      userRating: userRating ?? this.userRating,
      userReviewStatus: userReviewStatus ?? this.userReviewStatus,
      rejectionRemark: rejectionRemark ?? this.rejectionRemark,
      reviewRemark: reviewRemark ?? this.reviewRemark,
      solutionRemarks: solutionRemarks ?? this.solutionRemarks,
      createdAt: createdAt ?? this.createdAt,
      status: status ?? this.status,
    );
  }

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'id': id,
      'createdBy': createdBy,
      'userDepartment': userDepartment,
      'assignTo': assignTo,
      'againstDepartment': againstDepartment,
      'hod': hod,
      'subDepartment': subDepartment,
      'teamLead': teamLead,
      'timeDuration': timeDuration,
      'description': description,
      'userRating': userRating,
      'userReviewStatus': userReviewStatus.name,
      'rejectionRemark': rejectionRemark,
      'reviewRemark': reviewRemark,
      'solutionRemarks': solutionRemarks,
      'createdAt': createdAt?.millisecondsSinceEpoch,
      'status': status.name,
    };
  }

  factory TicketModel.fromMap(Map<String, dynamic> map) {
    return TicketModel(
      id: map['_id'] as String,
      createdBy: (map['createdBy'] ?? '') as String,
      userDepartment: (map['userDepartment'] ?? '') as String,
      assignTo: (map['assignTo'] ?? '') as String,
      againstDepartment: (map['againstDepartment'] ?? '') as String,
      hod: (map['hod'] ?? '') as String,
      subDepartment: (map['subDepartment'] ?? '') as String,
      teamLead: (map['teamLead'] ?? '') as String,
      timeDuration: (map['timeDuration'] ?? 0) as int,
      description: (map['description'] ?? '') as String,
      userRating: (map['userRating'] ?? 0) as int,
      rejectionRemark: (map['rejectionRemark'] ?? '') as String,
      reviewRemark: (map['reviewRemark'] ?? '') as String,
      solutionRemarks: List<String>.from(map['solutionRemarks'] ?? []),
      createdAt: DateTime.parse((map['createdAt'])),
      status:
          EnumToString.fromString(TicketStatus.values, map['status'].toString())
              as TicketStatus,
      userReviewStatus: EnumToString.fromString(
              UserReviewStatus.values, map['userReviewStatus'].toString())
          as UserReviewStatus,
    );
  }

  String toJson() => json.encode(toMap());

  factory TicketModel.fromJson(String source) =>
      TicketModel.fromMap(json.decode(source) as Map<String, dynamic>);

  @override
  String toString() {
    return 'TicketModel(id: $id, createdBy: $createdBy, userDepartment: $userDepartment, assignTo: $assignTo, againstDepartment: $againstDepartment, hod: $hod, subDepartment: $subDepartment, teamLead: $teamLead, timeDuration: $timeDuration, description: $description,userRating: $userRating,userReviewStatus: $userReviewStatus, rejectionRemark: $rejectionRemark,reviewRemark: $reviewRemark,solutionRemarks: $solutionRemarks, createdAt: $createdAt, status: $status)';
  }

  @override
  bool operator ==(covariant TicketModel other) {
    if (identical(this, other)) return true;

    return other.id == id &&
        other.createdBy == createdBy &&
        other.userDepartment == userDepartment &&
        other.assignTo == assignTo &&
        other.againstDepartment == againstDepartment &&
        other.hod == hod &&
        other.subDepartment == subDepartment &&
        other.teamLead == teamLead &&
        other.timeDuration == timeDuration &&
        other.description == description &&
        other.userRating == userRating &&
        other.userReviewStatus == userReviewStatus &&
        other.rejectionRemark == rejectionRemark &&
        other.reviewRemark == reviewRemark &&
        other.solutionRemarks == solutionRemarks &&
        other.createdAt == createdAt &&
        other.status == status;
  }

  @override
  int get hashCode {
    return hashList([
      id,
      createdBy,
      userDepartment,
      assignTo,
      againstDepartment,
      hod,
      subDepartment,
      teamLead,
      timeDuration,
      description,
      userRating,
      userReviewStatus,
      rejectionRemark,
      reviewRemark,
      solutionRemarks,
      createdAt,
      status,
    ]);
  }
}
def lines_that_equal(line_to_match, fp):
    return [line for line in fp if line == line_to_match]

def lines_that_contain(string, fp):
    return [line for line in fp if string in line]

def lines_that_start_with(string, fp):
    return [line for line in fp if line.startswith(string)]

def lines_that_end_with(string, fp):
    return [line for line in fp if line.endswith(string)]
star

Thu Sep 12 2024 15:59:19 GMT+0000 (Coordinated Universal Time)

@TechBox #c++

star

Thu Sep 12 2024 14:53:39 GMT+0000 (Coordinated Universal Time)

@miaescapegrowth

star

Thu Sep 12 2024 14:52:12 GMT+0000 (Coordinated Universal Time)

@Shira

star

Thu Sep 12 2024 14:43:54 GMT+0000 (Coordinated Universal Time)

@MinaTimo

star

Thu Sep 12 2024 14:41:36 GMT+0000 (Coordinated Universal Time)

@miaescapegrowth

star

Thu Sep 12 2024 12:48:13 GMT+0000 (Coordinated Universal Time) https://creatiosoft.com/poker-game-development

@Rishabh #poker #pokergame #pokersoftware

star

Thu Sep 12 2024 11:38:21 GMT+0000 (Coordinated Universal Time)

@MinaTimo

star

Thu Sep 12 2024 10:29:50 GMT+0000 (Coordinated Universal Time)

@StephenThevar #nodejs

star

Thu Sep 12 2024 10:01:27 GMT+0000 (Coordinated Universal Time) https://www.coinsclone.com/hire-blockchain-developers/

@AaronMG ##hireblockchaindevelopers ##hiringblockchaindevelopers ##bestblockchaindevelopers

star

Thu Sep 12 2024 08:52:15 GMT+0000 (Coordinated Universal Time)

@Rishi1808

star

Thu Sep 12 2024 08:36:09 GMT+0000 (Coordinated Universal Time)

@maclaw

star

Thu Sep 12 2024 08:06:31 GMT+0000 (Coordinated Universal Time) https://www.coinsclone.com/top-nft-trends/

@LilianAnderson #topnfttrends #nfttrends #nftdevelopment #nftsolutions #tokenization

star

Thu Sep 12 2024 07:14:16 GMT+0000 (Coordinated Universal Time)

@eugene98

star

Thu Sep 12 2024 07:13:38 GMT+0000 (Coordinated Universal Time)

@eugene98

star

Thu Sep 12 2024 07:13:14 GMT+0000 (Coordinated Universal Time)

@eugene98

star

Thu Sep 12 2024 07:12:46 GMT+0000 (Coordinated Universal Time)

@eugene98

star

Thu Sep 12 2024 07:11:08 GMT+0000 (Coordinated Universal Time)

@eugene98

star

Thu Sep 12 2024 07:08:41 GMT+0000 (Coordinated Universal Time)

@eugene98

star

Thu Sep 12 2024 07:07:11 GMT+0000 (Coordinated Universal Time)

@eugene98

star

Thu Sep 12 2024 07:02:52 GMT+0000 (Coordinated Universal Time)

@eugene98

star

Thu Sep 12 2024 06:26:22 GMT+0000 (Coordinated Universal Time)

@Rohan@99

star

Thu Sep 12 2024 06:03:19 GMT+0000 (Coordinated Universal Time)

@Its_my_prime

star

Thu Sep 12 2024 05:44:34 GMT+0000 (Coordinated Universal Time) https://medium.com/@tempmailwithpassword/finding-the-email-of-the-founder-in-salesforce-when-logging-in-as-a-different-user-bea709883ad2

@WayneChung

star

Thu Sep 12 2024 04:49:09 GMT+0000 (Coordinated Universal Time) https://www.vishyat.com/website-designing-services-in-gurgaon/

@vishyatwebggn11 ##webdesigning ##vishyattechnologies

star

Thu Sep 12 2024 03:28:08 GMT+0000 (Coordinated Universal Time) https://www.programiz.com/cpp-programming/online-compiler/

@LizzyTheCatto

star

Thu Sep 12 2024 00:39:38 GMT+0000 (Coordinated Universal Time) https://docs.theeventscalendar.com/apis/custom-tables/events/

@bounty31 #php

star

Wed Sep 11 2024 23:42:07 GMT+0000 (Coordinated Universal Time)

@WXAPAC

star

Wed Sep 11 2024 20:06:12 GMT+0000 (Coordinated Universal Time)

@cx_21 #javascript

star

Wed Sep 11 2024 19:31:10 GMT+0000 (Coordinated Universal Time) https://www.programiz.com/cpp-programming/online-compiler/

@LizzyTheCatto

star

Wed Sep 11 2024 11:20:55 GMT+0000 (Coordinated Universal Time) https://www.tenforums.com/tutorials/82643-clean-up-component-store-winsxs-folder-windows-10-a.html

@Curable1600 #windows

star

Wed Sep 11 2024 10:04:39 GMT+0000 (Coordinated Universal Time)

@chatgpt #kotlin

star

Wed Sep 11 2024 10:03:42 GMT+0000 (Coordinated Universal Time)

@chatgpt #kotlin

star

Wed Sep 11 2024 09:50:03 GMT+0000 (Coordinated Universal Time)

@signup

star

Wed Sep 11 2024 09:48:53 GMT+0000 (Coordinated Universal Time)

@signup

star

Wed Sep 11 2024 07:01:04 GMT+0000 (Coordinated Universal Time)

@Shira

star

Wed Sep 11 2024 00:18:40 GMT+0000 (Coordinated Universal Time)

@davidmchale #scss #loop #list #fonts

star

Tue Sep 10 2024 21:33:49 GMT+0000 (Coordinated Universal Time)

@cx_21 #javascript

star

Tue Sep 10 2024 20:01:51 GMT+0000 (Coordinated Universal Time)

@ncdiep

star

Tue Sep 10 2024 19:59:46 GMT+0000 (Coordinated Universal Time)

@ncdiep

star

Tue Sep 10 2024 19:59:02 GMT+0000 (Coordinated Universal Time)

@ncdiep

star

Tue Sep 10 2024 19:58:23 GMT+0000 (Coordinated Universal Time)

@ncdiep

star

Tue Sep 10 2024 13:30:15 GMT+0000 (Coordinated Universal Time) https://blockchain.oodles.io/telegram-mini-apps-development/?utm_source=thiscodeworks

@arslansiddiqui

star

Tue Sep 10 2024 12:59:53 GMT+0000 (Coordinated Universal Time) https://stackoverflow.com/questions/54087631/paypal-sizeof-parameter-must-be-an-array-or-an-object-that-implements-countab

@zaki

star

Tue Sep 10 2024 11:24:46 GMT+0000 (Coordinated Universal Time) https://magento.stackexchange.com/questions/318291/no-administrators-role-was-found-data-fixture-needs-to-be-run

@zaki

star

Tue Sep 10 2024 10:51:38 GMT+0000 (Coordinated Universal Time) https://nounq.com/seo-services

@deepika

star

Tue Sep 10 2024 10:51:00 GMT+0000 (Coordinated Universal Time)

@Rishi1808

star

Tue Sep 10 2024 10:48:54 GMT+0000 (Coordinated Universal Time)

@StephenThevar

star

Tue Sep 10 2024 09:59:29 GMT+0000 (Coordinated Universal Time)

@Rishi1808

star

Tue Sep 10 2024 08:15:03 GMT+0000 (Coordinated Universal Time) https://stackoverflow.com/questions/15718068/search-file-and-find-exact-match-and-print-line

@rhce143 #python

Save snippets that work with our extensions

Available in the Chrome Web Store Get Firefox Add-on Get VS Code extension