async _uibAttribObserver(mutations) {
    mutations.forEach(async (m) => {
      log("trace", "uibuilder:_uibAttribObserver", "Mutations ", m)();
      if (m.attributeName && (m.attributeName.startsWith("uib") || m.attributeName.startsWith("data-uib"))) {
        this._uibAttrScanOne(m.target);
      } else if (m.addedNodes.length > 0) {
        m.addedNodes.forEach(async (n) => {
          let aNames = [];
          try {
            aNames = [...n.attributes];
          } catch (e) {
          }
          const intersect = this.arrayIntersect(this.uibAttribs, aNames);
          intersect.forEach(async (el) => {
            this._uibAttrScanOne(el);
          });
          let uibChildren = [];
          if (n.querySelectorAll) uibChildren = n.querySelectorAll(__privateGet(this, _uibAttrSel));
          uibChildren.forEach(async (el) => {
            this._uibAttrScanOne(el);
          });
        });
      }
    });
  }
DOM Mutation observer callback to watch for new/amended elements with uib-* or data-uib-* attributes
WARNING: Mutation observers can receive a LOT of mutations very rapidly. So make sure this runs as fast
         as possible. Async so that calling function does not need to wait.
Observer is set up in the start() function
@param {MutationRecord[]} mutations Array of Mutation Records
@private