/// <summary>
		/// Initializes a new instance of the <see cref="SigningBindingElementChain"/> class.
		/// </summary>
		/// <param name="signers">
		/// The signing binding elements that may be used for some outgoing message,
		/// in preferred use order.
		/// </param>
		internal SigningBindingElementChain(ITamperProtectionChannelBindingElement[] signers) {
			Contract.Requires<ArgumentNullException>(signers != null);
			Contract.Requires<ArgumentException>(signers.Length > 0);
			Contract.Requires<ArgumentException>(!signers.Contains(null), MessagingStrings.SequenceContainsNullElement);
			Contract.Requires<ArgumentException>(signers.Select(s => s.Protection).Distinct().Count() == 1, OAuthStrings.SigningElementsMustShareSameProtection);

			this.signers = signers;
		}
        /// <summary>
        /// Initializes a new instance of the <see cref="SigningBindingElementChain"/> class.
        /// </summary>
        /// <param name="signers">
        /// The signing binding elements that may be used for some outgoing message,
        /// in preferred use order.
        /// </param>
        internal SigningBindingElementChain(ITamperProtectionChannelBindingElement[] signers)
        {
            if (signers == null) {
                throw new ArgumentNullException("signers");
            }
            if (signers.Length == 0) {
                throw new ArgumentException(MessagingStrings.SequenceContainsNoElements, "signers");
            }
            if (signers.Contains(null)) {
                throw new ArgumentException(MessagingStrings.SequenceContainsNullElement, "signers");
            }
            MessageProtections protection = signers[0].Protection;
            if (signers.Any(element => element.Protection != protection)) {
                throw new ArgumentException(OAuthStrings.SigningElementsMustShareSameProtection, "signers");
            }

            this.signers = signers;
        }