controlLinesRanges(columnIndex) {
        let col = this.columns[columnIndex];
        let n = col.gates.length;

        let swapRows = this.colGetEnabledSwapGate(columnIndex);

        let pt = i => new Point(columnIndex, i);
        let hasControllable = i => this.locHasControllableGate(pt(i));
        let hasCoherentControl = i => this.locStartsSingleControlWire(pt(i));
        let hasMeasuredControl = i => this.locStartsDoubleControlWire(pt(i));
        let hasSwap = i => swapRows !== undefined && swapRows.indexOf(i) !== -1;
        let coversCoherentWire = i => this.locClassifyMeasuredIncludingGateExtension(pt(i)) !== true;
        let coversMeasuredWire = i => this.locClassifyMeasuredIncludingGateExtension(pt(i)) !== false;

        // Control connections.
        let result = [
            srcDstMatchInRange(n, hasSwap, hasSwap, false),
            srcDstMatchInRange(n, hasControllable, hasCoherentControl, false),
            srcDstMatchInRange(n, hasControllable, hasMeasuredControl, true),
        ];

        // Input->Output gate connections.
        for (let letter of Gates.InputGates.Letters) {
            let key = `Input Range ${letter}`;
            let altInKey = `Input Default ${letter}`;
            let altOutKey = `Input NO_DEFAULT Range ${letter}`;
            let isInput = i => this.locProvidesStat(pt(i), key) || this.locProvidesStat(pt(i), altInKey);
            let isOutput = i => this.locNeedsStat(pt(i), key) || this.locNeedsStat(pt(i), altOutKey);
            result.push(
                srcDstMatchInRange(n, i => isInput(i) && coversCoherentWire(i), isOutput, false),
                srcDstMatchInRange(n, i => isInput(i) && coversMeasuredWire(i), isOutput, true)
            );
        }

        return result.filter(e => e !== undefined);
    }
@param {!int} columnIndex
@returns {!Array.<!{first: !int, last: !int, measured: !boolean}>}