static async audit(artifacts, context) {
    const settings = context.settings;
    const trace = artifacts.Trace;
    const devtoolsLog = artifacts.DevtoolsLog;
    const {URL, SourceMaps} = artifacts;
    const chains =
      await ComputedChains.request({settings, devtoolsLog, trace, URL, SourceMaps}, context);
    let chainCount = 0;
    /**
     * @param {LH.Audit.Details.SimpleCriticalRequestNode} node
     * @param {number} depth
     */
    function walk(node, depth) {
      const childIds = Object.keys(node);

      childIds.forEach(id => {
        const child = node[id];
        if (child.children) {
          walk(child.children, depth + 1);
        } else {
          // if the node doesn't have a children field, then it is a leaf, so +1
          chainCount++;
        }
      }, '');
    }
    // Convert
    const flattenedChains = CriticalRequestChains.flattenRequests(chains);

    // Account for initial navigation
    const initialNavKey = Object.keys(flattenedChains)[0];
    const initialNavChildren = initialNavKey && flattenedChains[initialNavKey].children;
    if (initialNavChildren && Object.keys(initialNavChildren).length > 0) {
      walk(initialNavChildren, 0);
    }

    const longestChain = CriticalRequestChains._getLongestChain(chains);

    return {
      score: Number(chainCount === 0),
      notApplicable: chainCount === 0,
      displayValue: chainCount ? str_(UIStrings.displayValue, {itemCount: chainCount}) : '',
      details: {
        type: 'criticalrequestchain',
        chains: flattenedChains,
        longestChain,
      },
    };
  }
Audits the page to give a score for First Meaningful Paint.
@param {LH.Artifacts} artifacts The artifacts from the gather phase.
@param {LH.Audit.Context} context
@return {Promise<LH.Audit.Product>}