'use strict';

(function () {
  'use strict';

  //include Array.map polyfill!

  if (!Array.prototype.map) {

    Array.prototype.map = function (callback, thisArg) {

      var T, A, k;

      if (this == null) {
        throw new TypeError(' this is null or not defined');
      }

      var O = Object(this);

      var len = O.length >>> 0;

      if (typeof callback !== 'function') {
        throw new TypeError(callback + ' is not a function');
      }

      // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
      if (arguments.length > 1) {
        T = thisArg;
      }

      A = new Array(len);

      // 7. Let k be 0
      k = 0;

      // 8. Repeat, while k < len
      while (k < len) {

        var kValue, mappedValue;

        if (k in O) {

          kValue = O[k];

          mappedValue = callback.call(T, kValue, k, O);

          A[k] = mappedValue;
        }
        // d. Increase k by 1.
        k++;
      }

      return A;
    };
  }

  if (!Array.prototype.reduce) {
    Array.prototype.reduce = function (callback /*, initialValue*/) {
      'use strict';

      if (this === null) {
        throw new TypeError('Array.prototype.reduce called on null or undefined');
      }
      if (typeof callback !== 'function') {
        throw new TypeError(callback + ' is not a function');
      }
      var t = Object(this),
          len = t.length >>> 0,
          k = 0,
          value;
      if (arguments.length == 2) {
        value = arguments[1];
      } else {
        while (k < len && !(k in t)) {
          k++;
        }
        if (k >= len) {
          throw new TypeError('Reduce of empty array with no initial value');
        }
        value = t[k++];
      }
      for (; k < len; k++) {
        if (k in t) {
          value = callback(value, t[k], k, t);
        }
      }
      return value;
    };
  }
})();
'use strict';

(function () {
    'use strict';

    /*turn form data into key/values*/

    (function ($) {

        $.fn.serializeObject = function () {

            var o = {};

            var a = this.serializeArray();

            $.each(a, function () {

                if (o[this.name] !== undefined) {

                    if (!o[this.name].push) {

                        o[this.name] = [o[this.name]];
                    }

                    o[this.name].push(this.value || '');
                } else {

                    o[this.name] = this.value || '';
                }
            });

            return o;
        };
    })(jQuery);
})();
'use strict';

(function () {
  'use strict';

  var urlParamArray = ['partnerlastname', 'partnerfirstname', 'optimizely', 'mailcode'];

  function gup(name) {
    name = name.replace(/(\[|\])/g, "\\$1");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(window.location.href);
    return results === null ? "" : results[1];
  }

  function createCookie(name, value, days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else {
        expires = "";
    }
    document.cookie = name + "=" + value + expires + "; path=/";
  };

  (function (params) {

    params.map(function (param) {
      return gup(param) ? jQuery('[name="' + param + '"]').val(gup(param)) : '';
    });
  })(urlParamArray || []);

  (function (_$uqdTopic, $, _$) {

    if (window.location.href.indexOf('/page/cde/Contribution/Charge') > -1) {
      return false;
    }

    var bsdHeaderString = 'bsd-contribution-section-header',
        CONTRIBUTOR = 'contributor',
        AMOUNT = 'amount',
        EMPLOYMENT = 'employment',
        CUSTOM = 'custom',
        PAYMENTINFO = 'paymentinfo',
        // HONOREE = 'honoree',
        // MESSAGE = 'message',
        backBtnString = '<button type="button" class="js-seq-back"><' + '/button>',
        paypalBtn = '<p class="js-pp-button-container">Or, donate to LCV via <a id="pp-btn" href="https://secure.lcv.org/page/contribute/C4DFXXAPPL"><img src="https://s.bsd.net/lcvlive/main/page/-/Wrapper/images/paypal_logo.png"/></a></p>',
        paypalDonation = 'https://secure.lcv.org/page/contribute/C4DFXXAPPL',
        donationAmount = '';

    function createHeaderContainer(stringType) {
      return $('<div/>', {
        "class": bsdHeaderString,
        id: bsdHeaderString + '-' + stringType,
        "data-bsdformsectionname": stringType,
        data: {
          bsdformsectionname: stringType
        }
      });
    }

    function renderTrackerStepHTML(stringName, i, step) {
      return '<li class="step-' + (i + (i <= step ? ' step-live' : '') + (i === step ? ' step-current' : '')) + '" data-stepto="' + i + '"><span>' + i + '<' + '/span>' + stringName + '<' + '/li>';
    }

    function renderStepTracker(stepSelected, qd) {
      var i = 1;
      return $('<ul/>', {
        "class": 'seq-step-tracker',
        html: qd ? '' : renderTrackerStepHTML('Amount', i, stepSelected) + (qd ? '' : renderTrackerStepHTML('Name', ++i, stepSelected)) + renderTrackerStepHTML('Payment', ++i, stepSelected)
      });
    }

    function nextButtonIcon() {
      return '' +
          '<span class="icon">' +
          '<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="15.539px" height="20px" viewBox="0 0 15.539 20" enable-background="new 0 0 15.539 20">' +
          '<polygon points="0,0 16,10 0,20 "></polygon>' +
          '</svg>' +
          '</span>';
    }

    function addNextButtons(nofwd, noback, showAmt) {
      var i = 1,
          amount = $('[name="amount_other"]').val() || $('[name="amount"]:checked').val();
      return $('<div/>', {
          "class": 'next-back-container',
          html: (nofwd ? '' : '<button type="button" class="button js-seq-next">' + (showAmt ? (donateBtnOriginalText + (amount ? (' $' + amount) : '')) : 'Next') + ' ' + nextButtonIcon() + '<' + '/button>') + (noback ? '' : backBtnString)
      });
    }

    function addStepHeaders() {
      var headers = ['Your Donation', 'Your Information', 'Payment Information'];

      $.each(headers, function (index, header) {
          $('.seq-step[data-step="' + (index + 1) + '"]').prepend(
              $('<h1/>', {
                  text: header
              })
          );
      });
  }
  
    function positionHud() {
      $hud.insertBefore('.sequential-donate');
    }

    function getFieldByName(fieldName) {
      var $group = $('<div class="form-field-group field-' + fieldName + '"/>'),
          $field = $form.find('[name=' + fieldName + ']'),
          $label,
          $labelText,
          labelText;

      if (fieldName === 'cc_start_year' || fieldName === 'cc_expir_year') {
        $field.detach().appendTo($group);
      } else {
        $label = $field.parent().find('label');
        if (!$label.length) {
          $label = $form.find('[for="' + fieldName + '"]');
        }
        $label.find('br').remove().end();
        labelText = $label.text();
        $field.attr('placeholder', labelText).parent().children().not('[name="cc_expir_year"],[name="cc_start_year"]').appendTo($group);
        if ( fieldName === 'cc_cvv' ) {
          $field.attr('placeholder', '');
        }
      }
      return $group.get()[0];
    }

    var $body = $('body').addClass('sequential-donate-page').attr('data-seqstep', 1),
        $form = $('#contribution'),
        $originalTable = $form.children('table').hide(),
        $processBtn = $('#processbutton'),
        $hud = $('.js-multistep__hud'),
        $stepFourAlt = document.getElementById('lightbox-custom').innerHTML,
        donateBtnOriginalText = $processBtn.val(),
        pinfoFields = ["firstname", "lastname", "addr1", "city", "state_cd", "zip", "country", "email", "phone"],
        employerFields = ["employer", "occupation"],
        ccFields = ["cc_number", "cc_expir_month", "cc_expir_year", "cc_cvv"],
        maestroFields = ["cc_issue_number", "cc_start_month", "cc_start_year", "cc_cvv_code"],
        customFieldList = $form.find('#bsd-contribution-section-header-custom').next('tr').find('input,select,textarea').get().map(function (el) {
      return $(el).attr('name');
    }),
        $ccTypeChoices = $form.find('#bsd-contribution-card-type td').children(),
        $paymentOptions = $form.find('#payment_options').parent().children(),
        $ccSelector = $form.find('.bsd-creditCardTypeSelector'),
        $employmentSection = $form.find('#bsd-contribution-section-header-employment'),
        $customSection = $form.find('#bsd-contribution-section-header-custom'),
        $recurringSection = $form.find('#recurring_acknowledge').closest('table').addClass('recurring-section'),
        // $honoreeSection = $form.find('#bsd-contribution-section-header-honoree').nextAll(),
        // $messageSection = $form.find('#custom1').closest('table'),
        $seqDonateContainer = $('<ul/>', {
      "class": 'sequential-donate',
      "html": '<li class="seq-step" data-step="1"><' + '/li><li class="seq-step" data-step="2"><' + '/li><li class="seq-step" data-step="3"><' + '/li><li class="seq-step" data-step="4"><' + '/li>'
    }).appendTo($form),
        $stepOne = $seqDonateContainer.find('[data-step="1"]'),
        $stepTwo = $seqDonateContainer.find('[data-step="2"]'),
        $stepThree = $seqDonateContainer.find('[data-step="3"]'),
        $stepFour = $seqDonateContainer.find('[data-step="4"]'),
        $amountsContainer = createHeaderContainer(AMOUNT).appendTo($stepOne),
        $pInfoContainer = createHeaderContainer(CONTRIBUTOR).appendTo($stepTwo),
        $paymentInfoContainer = createHeaderContainer(PAYMENTINFO).appendTo($stepThree),
        // $honoreeContainer = createHeaderContainer(HONOREE).appendTo($stepThree),
        // $messageContainer = createHeaderContainer(MESSAGE).appendTo($stepThree),
        $paymentFields = $('<div/>', {
      "class": "seq-card-fields",
      "id": "payment_options"
    }),
        stepChange = $.Callbacks("unique stopOnFalse"),
        errorTrigger = $.Callbacks("unique stopOnFalse"),


    //state
    step = 1,
        qd = false,
        displayAmt = '',
        firstClick = false;

    // HUD stuff
      positionHud();
      addStepHeaders();

    //the simple ones...
    $pInfoContainer.append($(pinfoFields.map(getFieldByName)));

    $paymentInfoContainer.append($ccTypeChoices).append($ccSelector);

    $paymentFields.append($(ccFields.map(getFieldByName)).wrapAll('<div class="seq-cc-fields"/>').parent());
    if ($form.find('#maestro_solo_fields').length) {
      $paymentFields.append($(maestroFields.map(getFieldByName)).wrapAll('<div class="seq-maestro-fields" id="maestro_solo_fields" style="display:none"/>').parent().wrapAll('<table style="table-layout:fixed;width100%;"/>').parent());
    }

    $paymentOptions.detach().filter('table#payment_options').hide().remove(); //remove the id

    $paymentInfoContainer.append($paymentFields).append($paymentOptions);

    // TESTING
    // $honoreeContainer.append($honoreeSection);
    // $messageContainer.append($messageSection);

    if ($form.find('#bsd-contribution-section-header-employment').length) {
      $employmentSection.find('.contribheader').appendTo($stepThree);
      createHeaderContainer(EMPLOYMENT).append($(employerFields.map(getFieldByName))).appendTo($stepThree);
    }
    if ($form.find('#bsd-contribution-section-header-custom').length) {
      $customSection.find('.contribheader').appendTo($stepThree);
      createHeaderContainer(CUSTOM).append($(customFieldList.map(getFieldByName))).appendTo($stepThree);
    }

    // if ($form.find('#message').length) {
    //   $('#message').closest('.bsd-contribution-section-header').addClass('honoree').hide();
    // }

    $form.find('#bsd-amounts-cont').detach().appendTo($amountsContainer).wrap('<table class="amounts-table"/>');
    $form.find('.amounts-table').after($recurringSection.show());
    $form.find('.amounts').find('tr').eq(0).append($form.find('.amounts').find('tr').eq(1).remove().children());

    // Make sure amount is a valid number
    $form.find('#amount_other').blur(function(){
      $(this).val(sanitizeAmount($(this).val()) || 0);
    });
    
    $form.find('[name="cc_number"]').attr('placeholder', 'Card Number').blur(function(){
      // Allow spaces in CC number, have field correct itself on blur
      $(this).val($(this).val().replace(/[^\d]/g, ""));
    });
    $form.find('#state_cd').prop('required', true).find('option').eq(0).text('State').attr('value', "");

    renderStepTracker(1, false).insertBefore($form);

    $processBtn.appendTo($stepThree);
    $form.find('#processbutton').addClass('hidden-in-steps');
    $stepThree.append(paypalBtn);
    $stepThree.append(addNextButtons(false, false, true));

    $stepTwo.append(addNextButtons());

    $stepOne.append('<div class="qd-payment-info-container"><' + '/div>');
    $stepOne.append(addNextButtons(null, true));

    var monthlyCheckbox = document.getElementById('recurring_acknowledge');

    $form.on( 'change', '#recurring_acknowledge', function () {
      $('.js-pp-button-container').toggle( !this.checked );
    });

    $form.on('input change', '#recurring_acknowledge', function () {
      if (monthlyCheckbox.checked == true || qd) {
        $form.find('#processbutton').removeClass('hidden-in-steps');
        $stepThree.find('.next-back-container').remove();
      } else {
        $form.find('#processbutton').addClass('hidden-in-steps');

        // clear just to be safe (Chrome double adds occasionally)
        $stepThree.find('.next-back-container').remove();

        // add to correct spot on form
        if ( $stepThree.find('.bsd-seq-disclaimer').length ) {
          $stepThree.find('.bsd-seq-disclaimer').before(addNextButtons(false, false, true));
        } else {
          $stepThree.append(addNextButtons(false, false, true));
        }
      }
    });

    if ($stepFourAlt) {
      $stepFour.append('<div class="lightboxstep">' + $stepFourAlt + '<' + '/div>');
    } else {
      $stepFour.append('<div class="lightboxstep"><h1>FINAL STEP: Can you make your support go even further?</h1><p class="js-inline-lightbox__intro-1">If you start a monthly donation right now, <strong>an anonymous donor has agreed to pitch in $100 to LCV</' + 'strong>. It\'s a huge opportunity to take your support for the environment to the next level.</' + 'p><p class="js-inline-lightbox__intro-2">Will you become a monthly donor?</' + 'p><' + '/div>');
    }

    $stepFour.append('<button type="button" class="js-inline-lightbox__yes inline-lightbox__button--yes inline-lightbox__button">YES, start a monthly gift of $<span class="js-inline-lightbox__monthly-amount"></span> instead of my <span class="js-inline-lightbox__type">one-time</span> donation.</button>');

    $stepFour.append('<button type="submit" class="js-inline-lightbox__no inline-lightbox__button--no inline-lightbox__button">NO THANKS, please process my <span class="js-inline-lightbox__type">one-time</span> gift of $<span class="js-inline-lightbox__current-amount"></span>.</button>');

    $form.on('click', '.inline-lightbox__button--yes', function () {
      $form.find('[name="recurring_acknowledge"]').click();
      $form.find('#q_other').click();
      $form.find('#amount_other').val($('.js-inline-lightbox__monthly-amount').html());

      // Store new amount and frequency in sessvars from lightbox
      sessvars.amount = $(".js-inline-lightbox__monthly-amount").text();
      sessvars.frequency = "Monthly";

      //$stepFour.find('.js-inline-lightbox__no').click();
      $processBtn.click();

      return true;
    });

    var $stateCDField = $form.find('.field-state_cd'),
        stateIsReq = $stateCDField.attr('required');

    $form.children('table').detach().remove();

    $form.find('#state_cd').prop('required', true);

    $form.find('[name="country"]').on('change', function () {
      setTimeout(function () {
        var $maybeInput = $stateCDField.find('input');
        if ($maybeInput.length) {
          $maybeInput.addClass('type-text').attr('placeholder', 'State/Region/Province');
          if (stateIsReq) {
            $maybeInput.prop('required', true).attr('pattern', '[\S\s]+').attr('title', 'required field');
          }
        }
      }, 250);
    });
    //events

    $form.on('change input', '[name="amount"], #amt_other_text, #amount_other', function () {
      $body.removeClass('pre-first-click');
      $form.find('.seq-error-message').remove();
      // if(!firstClick && step===1 && !qd){
      //   stepChange.fire(step+1);
      // }
      firstClick = true;

      if($('#pp-btn').length > 0) {
        var paypalUrl = paypalDonation + '?default_amt=' + this.value;
        donationAmount = this.value;
        $('#pp-btn').attr('href', paypalUrl);
      }
    });

    function noAmount(state) {
      if (!state.amount_other && (!state.amount || state.amount === "other")) {
        return true;
      } else {
        return false;
      }
    }

    function sanitizeAmount(amt) {
      return parseFloat(parseFloat(amt.toString().replace(/[^\d.-]/g, '')).toFixed(2).toString().replace('.00', ''));
    }

    function getFrequency(formState) {
      if (formState.recurring_acknowledge) {
          return $('#annual_acknowledge').length ? 'Annual' : 'Monthly';
      }
      return 'One-time';
    }

    stepChange.add(function (newstep) {

      // HUD controls

      var formState = $form.serializeObject(),
          displayAmt = formState.amount === "other" && formState.amount_other || formState.amount;

      if (displayAmt > 0) {
          $hud.toggleClass('multistep__hud--active', newstep > 1 && newstep < 4);
          $hud.find('.js-multistep__hud-type span').text(getFrequency(formState));
          $hud.find('.js-multistep__hud-amount').text('$' + displayAmt);
      }
    });

    stepChange.add(function (newstep) {

      var formState = $form.serializeObject(),
          isError;

      if (formState.amount_other) {
        formState.amount_other = sanitizeAmount(formState.amount_other);
      }

      window.$form = $form;

      console.log('trigger validation', $form, formState);
      $form.find('.seq-error-message').remove();
      $form.find('.seq-error').removeClass('seq-error');

      //trying to go to step 2
      if (step === 1 && newstep > 1) {
        if (noAmount(formState)) {
          errorTrigger.fire('You must choose an amount');
          return false;
        }
      }

      //trying to go to step 3
      if (newstep > 2 && qd === false) {

        var fname = $('#firstname').val(),
            lname = $('#lastname').val(),
            email = $('#email').val(),
            zip = $('#zip').val(),
            addr1 = $('#addr1').val(),
            addr2 = $('#addr2').val(),
            city = $('#city').val(),
            state_cd = $('#state_cd').val(),
            country = $('#country').val(),
            path = document.location.pathname;

        createCookie('firstname', fname, 1);
        createCookie('lastname', lname, 1);
        createCookie('email', email, 1);
        createCookie('zip', zip, 1);
        createCookie('addr1', addr1, 1);
        createCookie('addr2', addr2, 1);
        createCookie('city', city, 1);
        createCookie('state_cd', state_cd, 1);
        createCookie('country', country, 1);
        createCookie('urlslug', path.slice( path.search(/[^/]+$/) ), 1);

        $('#pp-btn').attr('href', paypalDonation + '?&default_amt=' + donationAmount);
        isError = !$stepTwo.find('input,select').filter('[required]').get().map(function (el) {
          var valid = el.validity ? el.validity.valid : el.value !== "",
              $el;
          if (!valid) {
            $el = $(el);
            $el.addClass('seq-error').one('change input', function () {
              $el.removeClass('seq-error');
            });
          }

          return valid;
        }).reduce(function (acc, x) {
          return acc && x;
        }, true);
        if (isError) {
          errorTrigger.fire('Please fill out all required fields.');
          return false;
        }
      }

      if (!formState['full_gift']) {
        displayAmt = formState.amount === "other" && formState.amount_other || formState.amount;

        $processBtn.val(donateBtnOriginalText + ' $' + displayAmt);
      }
      // Store amount and frequency in sessvars
        sessvars.amount = displayAmt;
        sessvars.frequency = getFrequency(formState);

      return newstep;
    });

    stepChange.add(function () {
      var startingAmount = 0;
      var stepFourAmount = 0;

      if ($form.find('#amount_other').val()) {
        startingAmount = $form.find('#amount_other').val();
      } else {
        startingAmount = $form.find('input[name="amount"]:checked').val();
      }

      if (startingAmount < 10) {
        stepFourAmount = 5;
      } else if (startingAmount < 18) {
        stepFourAmount = 6;
      } else if (startingAmount < 25) {
        stepFourAmount = 8;
      } else if (startingAmount < 35) {
        stepFourAmount = 10;
      } else if (startingAmount < 50) {
        stepFourAmount = 12;
      } else if (startingAmount < 75) {
        stepFourAmount = 15;
      } else if (startingAmount < 100) {
        stepFourAmount = 20;
      } else if (startingAmount < 150) {
        stepFourAmount = 25;
      } else if (startingAmount < 200) {
        stepFourAmount = 35;
      } else if (startingAmount < 300) {
        stepFourAmount = 50;
      } else if (startingAmount < 400) {
        stepFourAmount = 75;
      } else if (startingAmount < 500) {
        stepFourAmount = 85;
      } else if (startingAmount < 600) {
        stepFourAmount = 100;
      } else if (startingAmount < 700) {
        stepFourAmount = 125;
      } else if (startingAmount < 800) {
        stepFourAmount = 150;
      } else if (startingAmount < 900) {
        stepFourAmount = 175;
      } else {
        stepFourAmount = 200;
      }

      $stepThree.find('.js-seq-next').html('Donate' + ' $' + startingAmount + ' ' + nextButtonIcon() );
      $stepFour.find('.js-inline-lightbox__monthly-amount').html(stepFourAmount);
      $stepFour.find('.js-inline-lightbox__current-amount').html(startingAmount);
    });

    stepChange.add(function (newstep) {
      step = newstep;
    });

    stepChange.add(function () {
      $body.attr('data-seqstep', step);
    });

    stepChange.add(function () {
      $body.find('.seq-step-tracker').replaceWith(renderStepTracker(step, qd));
    });

    $form.on('click', '.js-seq-next', function () {
      stepChange.fire(step + 1);
    });
    $form.on('click', '.js-seq-back', function () {
      stepChange.fire(step - 1);
    });
    $form.on('click', '.js-multistep__hud-edit', function () {
      stepChange.fire(1);
      return false;
    });

    $body.on('click', '[data-stepto]', function () {
      var tostep = $(this).data('stepto');
      console.log('firing step request', tostep);
      stepChange.fire(tostep);
    });

    errorTrigger.add(function (message) {
      $seqDonateContainer.after($('<div/>', { "class": 'seq-error-message', text: message }));
    });

    $form.find('.contribheader').each(function () {
      var $header = $(this);
      if (jQuery.trim($header.text()) === "") {
        $header.remove();
      }
    });

    

    // // fill for default_amt URL param
    // $('#bsd-contribution-section-header-amount').find('input[name=amount]').each(function(){
    //   var $input = $(this);

    //   if($input.attr('checked') === 'checked') {
    //     $body.removeClass('pre-first-click');
    //   }
    // })

    //UQD adapter

    var $bothNodes = _$('.bsd-contribForm-wrap,body');

    /*set of adapters linking new uqd to old sequential code*/

    //$bothNodes.addClass('qd_loading');

    _$uqdTopic('populated_uqd').add(function () {
      qd = true;
      $body.find('.seq-step-tracker').replaceWith(renderStepTracker(step, qd));
      $body.addClass('qd_form_loaded qd_loaded');
      $body.attr('data-seqstep', 'qd');
      //$stepOne.append($processBtn);
      $stepFour.hide();
      $processBtn.removeClass('hidden-in-steps');
      $('#pp-btn').parent('p').hide();
    });

    _$uqdTopic('populated_noqd').add(function () {
      qd = false;
      $body.find('.seq-step-tracker').replaceWith(renderStepTracker(step, qd));
      $body.addClass('qd_form_loaded');
    });

    //I think this is irrelevant because we handle this now, but these classes might do other things
    //$bothNodes.removeClass('qd_loading').addClass(  ((loggedin)?' qd_not_enabled':' qd_load_failed')  );

    _$uqdTopic('logout').add(function (type) {
      var stepFallback = noAmount($form.serializeObject()) ? 1 : 2;

      if (type === "hard") {
        qd = false;
        $body.attr('data-seqstep', 'qd');
        $body.find('.seq-step-tracker').replaceWith(renderStepTracker(step, qd));
        $body.attr('data-seqstep', stepFallback);

        // update paypal / next button based on recurring status
        $form.find( '#recurring_acknowledge' ).trigger('change')
        
        stepChange.fire(stepFallback);
        $body.removeClass('qd_loaded');
        $stepFour.css('display','');
      } else {
        $body.attr('data-seqstep', 'partial');
      }
      //$stepThree.find('.next-back-container').after($processBtn);
    });
  })(_$.uqdTopic, jQuery, window._$);
})();