perRowDisabledReasons(inputMeasureMask, outerRowOffset, outerContext, prevStickyCtx, isNested) {
        let context = Util.mergeMaps(outerContext, prevStickyCtx);
        let stickyCtx = new Map(prevStickyCtx);
        for (let row = this.gates.length - 1; row >= 0; row--) {
            let g = this.gates[row];
            if (g !== undefined) {
                for (let {key, val} of g.customColumnContextProvider(row + outerRowOffset, g)) {
                    //noinspection JSUnusedAssignment
                    context.set(key, val);
                    if (!g.isContextTemporary) {
                        stickyCtx.set(key, val);
                    }
                }
            }
        }

        let allReasons = [];
        for (let i = 0; i < this.gates.length; i++) {
            allReasons.push(this._disabledReason(inputMeasureMask, i, outerRowOffset, context, isNested))
        }
        return {allReasons, stickyCtx};
    }
@param {!int} inputMeasureMask
@param {!int} outerRowOffset
@param {!Map.<!string, *>} outerContext
@param {!Map.<!string, *>} prevStickyCtx
@param {!boolean} isNested
@returns {{allReasons: !Array.<undefined|!string>, stickyCtx: !Map<!string, *>}}