code: function _mixinBehaviors(behaviors, klass) {
    for (let i=0; i<behaviors.length; i++) {
      let b = behaviors[i];
      if (b) {
        klass = Array.isArray(b) ? _mixinBehaviors(b, klass) :
          GenerateClassFromInfo(b, klass);
      }
    }
    return klass;
  }
docs: NOTE: 1.x Behaviors were mixed in *in reverse order* and de-duped on the fly. The rule was that behavior properties were copied onto the element prototype if and only if the property did not already exist. Given: Polymer{ behaviors: [A, B, C, A, B]}, property copy order was: (1), B, (2), A, (3) C. This means prototype properties win over B properties win over A win over C. This mirrors what would happen with inheritance if element extended B extended A extended C.  Again given, Polymer{ behaviors: [A, B, C, A, B]}, the resulting `behaviors` array was [C, A, B]. Behavior lifecycle methods were called in behavior array order followed by the element, e.g. (1) C.created, (2) A.created, (3) B.created, (4) element.created. There was no support for super, and "super-behavior" methods were callable only by name).  2.x Behaviors are made into proper mixins which live in the element's prototype chain. Behaviors are placed in the element prototype eldest to youngest and de-duped youngest to oldest: So, first [A, B, C, A, B] becomes [C, A, B] then, the element prototype becomes (oldest) (1) PolymerElement, (2) class(C), (3) class(A), (4) class(B), (5) class(Polymer({...})). Result: This means element properties win over B properties win over A win over C. (same as 1.x) If lifecycle is called (super then me), order is (1) C.created, (2) A.created, (3) B.created, (4) element.created (again same as 1.x)