From 69e4a8fe646b3fd451e30af8e694246e7afadce2 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 30 Jul 2026 12:40:52 +0200 Subject: [PATCH 1/4] Ruby: Fix ExprReturnNode to handle Rescue, Ensure, and Else. --- .../dataflow/internal/DataFlowPrivate.qll | 28 ++++++++++++------- .../implicit-return/implicit-return.expected | 20 +++++++++++++ .../implicit-return/implicit_return.rb | 10 +++---- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 9f3042ebb5b7..466b08922819 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -1643,16 +1643,24 @@ private module ReturnNodes { } } - pragma[noinline] - private AstNode implicitReturn(Callable c, ExprNode n) { - exists(CfgNodes::ExprCfgNode en | - en = n.getExprNode() and - en.getASuccessor().(CfgNodes::AnnotatedExitNode).isNormal() and - n.(NodeImpl).getCfgScope() = c and - result = en.getExpr() - ) + private AstNode desugar(AstNode n) { + result = n.getDesugared() + or + not exists(n.getDesugared()) and + result = n + } + + private Expr getLast(StmtSequence s) { + result = getLast(s.(BodyStmt).getElse()) or - result = implicitReturn(c, n).getParent() + result = getLast(s.(BodyStmt).getARescue().getBody()) + or + not exists(s.(BodyStmt).getElse()) and + exists(Stmt last | last = s.getLastStmt() | + result = getLast(last) + or + result = last and not last instanceof StmtSequence + ) } /** @@ -1661,7 +1669,7 @@ private module ReturnNodes { * last thing that is evaluated in the body of the callable. */ class ExprReturnNode extends SourceReturnNode, ExprNode { - ExprReturnNode() { exists(Callable c | implicitReturn(c, this) = c.getBody().getAStmt()) } + ExprReturnNode() { this.getExprNode().getExpr() = desugar(getLast(any(Callable c).getBody())) } override ReturnKind getKindSource() { exists(CfgScope scope | scope = this.(NodeImpl).getCfgScope() | diff --git a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected index 979cc77777b7..631423bedd17 100644 --- a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected +++ b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit-return.expected @@ -1,10 +1,30 @@ models edges | implicit_return.rb:12:3:12:11 | call to source | implicit_return.rb:15:6:15:11 | call to m_body | provenance | | +| implicit_return.rb:19:3:19:11 | call to source | implicit_return.rb:24:6:24:18 | call to m_body_ensure | provenance | | +| implicit_return.rb:30:3:30:11 | call to source | implicit_return.rb:33:6:33:13 | call to m_rescue | provenance | | +| implicit_return.rb:39:3:39:11 | call to source | implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | provenance | | +| implicit_return.rb:52:3:52:11 | call to source | implicit_return.rb:55:6:55:11 | call to m_else | provenance | | +| implicit_return.rb:63:3:63:11 | call to source | implicit_return.rb:68:6:68:18 | call to m_else_ensure | provenance | | nodes | implicit_return.rb:12:3:12:11 | call to source | semmle.label | call to source | | implicit_return.rb:15:6:15:11 | call to m_body | semmle.label | call to m_body | +| implicit_return.rb:19:3:19:11 | call to source | semmle.label | call to source | +| implicit_return.rb:24:6:24:18 | call to m_body_ensure | semmle.label | call to m_body_ensure | +| implicit_return.rb:30:3:30:11 | call to source | semmle.label | call to source | +| implicit_return.rb:33:6:33:13 | call to m_rescue | semmle.label | call to m_rescue | +| implicit_return.rb:39:3:39:11 | call to source | semmle.label | call to source | +| implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | semmle.label | call to m_rescue_ensure | +| implicit_return.rb:52:3:52:11 | call to source | semmle.label | call to source | +| implicit_return.rb:55:6:55:11 | call to m_else | semmle.label | call to m_else | +| implicit_return.rb:63:3:63:11 | call to source | semmle.label | call to source | +| implicit_return.rb:68:6:68:18 | call to m_else_ensure | semmle.label | call to m_else_ensure | subpaths testFailures #select | implicit_return.rb:15:6:15:11 | call to m_body | implicit_return.rb:12:3:12:11 | call to source | implicit_return.rb:15:6:15:11 | call to m_body | $@ | implicit_return.rb:12:3:12:11 | call to source | call to source | +| implicit_return.rb:24:6:24:18 | call to m_body_ensure | implicit_return.rb:19:3:19:11 | call to source | implicit_return.rb:24:6:24:18 | call to m_body_ensure | $@ | implicit_return.rb:19:3:19:11 | call to source | call to source | +| implicit_return.rb:33:6:33:13 | call to m_rescue | implicit_return.rb:30:3:30:11 | call to source | implicit_return.rb:33:6:33:13 | call to m_rescue | $@ | implicit_return.rb:30:3:30:11 | call to source | call to source | +| implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | implicit_return.rb:39:3:39:11 | call to source | implicit_return.rb:44:6:44:20 | call to m_rescue_ensure | $@ | implicit_return.rb:39:3:39:11 | call to source | call to source | +| implicit_return.rb:55:6:55:11 | call to m_else | implicit_return.rb:52:3:52:11 | call to source | implicit_return.rb:55:6:55:11 | call to m_else | $@ | implicit_return.rb:52:3:52:11 | call to source | call to source | +| implicit_return.rb:68:6:68:18 | call to m_else_ensure | implicit_return.rb:63:3:63:11 | call to source | implicit_return.rb:68:6:68:18 | call to m_else_ensure | $@ | implicit_return.rb:63:3:63:11 | call to source | call to source | diff --git a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb index 2ea215902f02..3ff507723ff1 100644 --- a/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb +++ b/ruby/ql/test/library-tests/dataflow/implicit-return/implicit_return.rb @@ -21,7 +21,7 @@ def m_body_ensure source(20) end -sink(m_body_ensure) # $ MISSING: hasValueFlow=2 +sink(m_body_ensure) # $ hasValueFlow=2 # Implicit return from a `rescue` clause. def m_rescue @@ -30,7 +30,7 @@ def m_rescue source(3) end -sink(m_rescue) # $ MISSING: hasValueFlow=3 +sink(m_rescue) # $ hasValueFlow=3 # Implicit return from a `rescue` clause when an `ensure` clause is present. def m_rescue_ensure @@ -41,7 +41,7 @@ def m_rescue_ensure source(40) end -sink(m_rescue_ensure) # $ MISSING: hasValueFlow=4 +sink(m_rescue_ensure) # $ hasValueFlow=4 # Implicit return from an `else` clause. def m_else @@ -52,7 +52,7 @@ def m_else source(5) end -sink(m_else) # $ MISSING: hasValueFlow=5 +sink(m_else) # $ hasValueFlow=5 # Implicit return from an `else` clause when an `ensure` clause is present. def m_else_ensure @@ -65,4 +65,4 @@ def m_else_ensure nil end -sink(m_else_ensure) # $ MISSING: hasValueFlow=6 +sink(m_else_ensure) # $ hasValueFlow=6 From fff25cf5422083b9426e97347b0f14cc63b0e2c6 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 24 Jun 2026 09:39:56 +0200 Subject: [PATCH 2/4] Ruby: Replace control flow graph with shared implementation. --- ruby/ql/consistency-queries/CfgConsistency.ql | 31 +- .../DataFlowConsistency.ql | 11 - ruby/ql/lib/codeql/ruby/CFG.qll | 1 - ruby/ql/lib/codeql/ruby/ast/Statement.qll | 9 +- .../codeql/ruby/ast/internal/Synthesis.qll | 4 + .../codeql/ruby/controlflow/BasicBlocks.qll | 314 ---- .../lib/codeql/ruby/controlflow/CfgNodes.qll | 394 +---- .../ruby/controlflow/ControlFlowGraph.qll | 24 +- .../ruby/controlflow/ControlFlowGraph2.qll | 522 ++++++ .../ruby/controlflow/internal/Completion.qll | 565 ------ .../internal/ControlFlowGraphImpl.qll | 1510 ----------------- .../ruby/controlflow/internal/Guards.qll | 11 +- .../controlflow/internal/NonReturning.qll | 10 +- .../ruby/controlflow/internal/Splitting.qll | 348 ---- ruby/ql/lib/codeql/ruby/dataflow/SSA.qll | 15 +- .../dataflow/internal/DataFlowDispatch.qll | 4 +- .../dataflow/internal/DataFlowPrivate.qll | 27 +- .../codeql/ruby/dataflow/internal/SsaImpl.qll | 37 +- .../ql/lib/codeql/ruby/frameworks/Sinatra.qll | 2 +- .../ConditionalBypassCustomizations.qll | 4 +- .../ql/lib/ide-contextual-queries/printCfg.ql | 7 +- .../src/experimental/performance/UseDetect.ql | 12 +- .../performance/DatabaseQueryInLoop.ql | 2 +- .../src/queries/variables/DeadStoreOfLocal.ql | 7 +- .../controlflow/graph/BasicBlocks.ql | 9 +- .../library-tests/controlflow/graph/Cfg.ql | 2 +- .../dataflow/barrier-guards/barrier-guards.ql | 3 +- 27 files changed, 679 insertions(+), 3206 deletions(-) delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll create mode 100644 ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph2.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll diff --git a/ruby/ql/consistency-queries/CfgConsistency.ql b/ruby/ql/consistency-queries/CfgConsistency.ql index 5af4f22fc26a..d67d67a8d3fd 100644 --- a/ruby/ql/consistency-queries/CfgConsistency.ql +++ b/ruby/ql/consistency-queries/CfgConsistency.ql @@ -1,31 +1,2 @@ -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::Consistency as Consistency -import Consistency -import codeql.ruby.AST import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.Completion -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl - -/** - * All `Expr` nodes are `PostOrderTree`s - */ -query predicate nonPostOrderExpr(Expr e, string cls) { - cls = e.getPrimaryQlClasses() and - not exists(e.getDesugared()) and - not e instanceof BodyStmt and - exists(AstNode last, Completion c | - CfgImpl::last(e, last, c) and - last != e and - c instanceof NormalCompletion - ) -} - -query predicate scopeNoFirst(CfgScope scope) { - Consistency::scopeNoFirst(scope) and - not scope = any(StmtSequence seq | not exists(seq.getAStmt())) and - not scope = - any(Callable c | - not exists(c.getAParameter()) and - not c.getBody().hasEnsure() and - not exists(c.getBody().getARescue()) - ) -} +import ControlFlow::Consistency diff --git a/ruby/ql/consistency-queries/DataFlowConsistency.ql b/ruby/ql/consistency-queries/DataFlowConsistency.ql index 4e0588d5d4a1..de63a4309b5b 100644 --- a/ruby/ql/consistency-queries/DataFlowConsistency.ql +++ b/ruby/ql/consistency-queries/DataFlowConsistency.ql @@ -22,17 +22,6 @@ private module Input implements InputSig { not isNonConstantExpr(n.asExpr()) } - predicate multipleArgumentCallExclude(ArgumentNode arg, DataFlowCall call) { - // An argument such as `x` in `if not x then ...` has two successors (and hence - // two calls); one for each Boolean outcome of `x`. - exists(CfgNodes::ExprCfgNode n | - arg.argumentOf(call, _) and - n = call.asCall() and - arg.asExpr().getASuccessor(any(ConditionalSuccessor c)).getASuccessor*() = n and - n.getASplit() instanceof Split::ConditionalCompletionSplit - ) - } - predicate uniqueTypeExclude(Node n) { n = any(DataFlow::CallNode call | diff --git a/ruby/ql/lib/codeql/ruby/CFG.qll b/ruby/ql/lib/codeql/ruby/CFG.qll index d3401821f199..5fe7da86df05 100644 --- a/ruby/ql/lib/codeql/ruby/CFG.qll +++ b/ruby/ql/lib/codeql/ruby/CFG.qll @@ -3,4 +3,3 @@ import codeql.Locations import controlflow.ControlFlowGraph import controlflow.CfgNodes as CfgNodes -import controlflow.BasicBlocks diff --git a/ruby/ql/lib/codeql/ruby/ast/Statement.qll b/ruby/ql/lib/codeql/ruby/ast/Statement.qll index dcd51dbb3272..0081fd5d593e 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Statement.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Statement.qll @@ -6,7 +6,6 @@ private import codeql.ruby.CFG private import internal.AST private import internal.TreeSitter private import internal.Variable -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl /** * A statement. @@ -14,14 +13,14 @@ private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl * This is the root QL class for all statements. */ class Stmt extends AstNode, TStmt { + /** Gets the control-flow node for this statement, if any. */ + ControlFlowNode getControlFlowNode() { result.injects(this) } + /** Gets a control-flow node for this statement, if any. */ CfgNodes::AstCfgNode getAControlFlowNode() { result.getAstNode() = this } - /** Gets a control-flow entry node for this statement, if any */ - AstNode getAControlFlowEntryNode() { result = CfgImpl::getAControlFlowEntryNode(this) } - /** Gets the control-flow scope of this statement, if any. */ - CfgScope getCfgScope() { result = CfgImpl::getCfgScope(this) } + CfgScope getCfgScope() { result = getEnclosingCallable(this) } /** Gets the enclosing callable, if any. */ Callable getEnclosingCallable() { result = this.getCfgScope() } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll index f05deae59623..0b45d26ef12a 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll @@ -833,6 +833,10 @@ private module AssignOperationDesugar { ) ) } + + final override predicate excludeFromControlFlowTree(AstNode n) { + n = any(ScopeResolutionAssignOperation sao).getLeftOperand() + } } /** An assignment operation where the left-hand side is a method call. */ diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll deleted file mode 100644 index e085dbd90a38..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ /dev/null @@ -1,314 +0,0 @@ -/** Provides classes representing basic blocks. */ -overlay[local] -module; - -private import codeql.ruby.AST -private import codeql.ruby.ast.internal.AST -private import codeql.ruby.ast.internal.TreeSitter -private import codeql.ruby.controlflow.ControlFlowGraph -private import internal.ControlFlowGraphImpl as CfgImpl -private import CfgNodes -private import CfgImpl::BasicBlocks as BasicBlocksImpl -private import codeql.controlflow.BasicBlock as BB - -/** - * A basic block, that is, a maximal straight-line sequence of control flow nodes - * without branches or joins. - */ -final class BasicBlock extends BasicBlocksImpl::BasicBlock { - /** Gets an immediate successor of this basic block, if any. */ - BasicBlock getASuccessor() { result = super.getASuccessor() } - - /** Gets an immediate successor of this basic block of a given type, if any. */ - BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } - - /** Gets an immediate predecessor of this basic block, if any. */ - BasicBlock getAPredecessor() { result = super.getAPredecessor() } - - /** Gets an immediate predecessor of this basic block of a given type, if any. */ - BasicBlock getAPredecessor(SuccessorType t) { result = super.getAPredecessor(t) } - - // The overrides below are to use `CfgNode` instead of `CfgImpl::Node` - CfgNode getNode(int pos) { result = super.getNode(pos) } - - CfgNode getANode() { result = super.getANode() } - - /** Gets the first control flow node in this basic block. */ - CfgNode getFirstNode() { result = super.getFirstNode() } - - /** Gets the last control flow node in this basic block. */ - CfgNode getLastNode() { result = super.getLastNode() } - - /** - * Holds if this basic block immediately dominates basic block `bb`. - * - * That is, this basic block is the unique basic block satisfying: - * 1. This basic block strictly dominates `bb` - * 2. There exists no other basic block that is strictly dominated by this - * basic block and which strictly dominates `bb`. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 immediately dominates the - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate immediatelyDominates(BasicBlock bb) { super.immediatelyDominates(bb) } - - /** - * Holds if this basic block strictly dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 strictly dominates the - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } - - /** - * Holds if this basic block dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 dominates the basic - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate dominates(BasicBlock bb) { super.dominates(bb) } - - /** - * Holds if `df` is in the dominance frontier of this basic block. - * That is, this basic block dominates a predecessor of `df`, but - * does not dominate `df` itself. - * - * Example: - * - * ```rb - * def m x - * if x < 0 - * x = -x - * if x > 10 - * x = x - 1 - * end - * end - * puts x - * end - * ``` - * - * The basic block on line 8 is in the dominance frontier - * of the basic block starting on line 3 because that block - * dominates the basic block on line 4, which is a predecessor of - * `puts x`. Also, the basic block starting on line 3 does not - * dominate the basic block on line 8. - */ - predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) } - - /** - * Gets the basic block that immediately dominates this basic block, if any. - * - * That is, the result is the unique basic block satisfying: - * 1. The result strictly dominates this basic block. - * 2. There exists no other basic block that is strictly dominated by the - * result and which strictly dominates this basic block. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 is an immediate dominator of - * the basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block, and the `if` block - * is an immediate predecessor of `return 1`). - */ - BasicBlock getImmediateDominator() { result = super.getImmediateDominator() } - - /** - * Holds if the edge with successor type `s` out of this basic block is a - * dominating edge for `dominated`. - * - * That is, all paths reaching `dominated` from the entry point basic - * block must go through the `s` edge out of this basic block. - * - * Edge dominance is similar to node dominance except it concerns edges - * instead of nodes: A basic block is dominated by a _basic block_ `bb` if it - * can only be reached through `bb` and dominated by an _edge_ `e` if it can - * only be reached through `e`. - * - * Note that where all basic blocks (except the entry basic block) are - * strictly dominated by at least one basic block, a basic block may not be - * dominated by any edge. If an edge dominates a basic block `bb`, then - * both endpoints of the edge dominates `bb`. The converse is not the case, - * as there may be multiple paths between the endpoints with none of them - * dominating. - */ - predicate edgeDominates(BasicBlock dominated, SuccessorType s) { - super.edgeDominates(dominated, s) - } - - /** - * Holds if this basic block strictly post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```rb - * def m b - * if b - * puts "b" - * end - * puts "m" - * end - * ``` - * - * The basic block on line 5 strictly post-dominates the basic block on - * line 3 (all paths to the exit point of `m` from `puts "b"` must go - * through `puts "m"`). - */ - predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) } - - /** - * Holds if this basic block post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block. - * - * Example: - * - * ```rb - * def m b - * if b - * puts "b" - * end - * puts "m" - * end - * ``` - * - * The basic block on line 5 post-dominates the basic block on line 3 - * (all paths to the exit point of `m` from `puts "b"` must go through - * `puts "m"`). - */ - predicate postDominates(BasicBlock bb) { super.postDominates(bb) } -} - -/** - * An entry basic block, that is, a basic block whose first node is - * an entry node. - */ -final class EntryBasicBlock extends BasicBlock, BasicBlocksImpl::EntryBasicBlock { } - -/** - * An annotated exit basic block, that is, a basic block that contains an - * annotated exit node. - */ -final class AnnotatedExitBasicBlock extends BasicBlock, BasicBlocksImpl::AnnotatedExitBasicBlock { } - -/** - * An exit basic block, that is, a basic block whose last node is - * an exit node. - */ -final class ExitBasicBlock extends BasicBlock, BasicBlocksImpl::ExitBasicBlock { } - -/** A basic block with more than one predecessor. */ -final class JoinBlock extends BasicBlock, BasicBlocksImpl::JoinBasicBlock { - JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = super.getJoinBlockPredecessor(i) } -} - -/** A basic block that is an immediate predecessor of a join block. */ -final class JoinBlockPredecessor extends BasicBlock, BasicBlocksImpl::JoinPredecessorBasicBlock { } - -/** - * A basic block that terminates in a condition, splitting the subsequent - * control flow. - */ -final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBlock { - /** - * DEPRECATED: Use `edgeDominates` instead. - * - * Holds if basic block `succ` is immediately controlled by this basic - * block with conditional value `s`. That is, `succ` is an immediate - * successor of this block, and `succ` can only be reached from - * the callable entry point by going via the `s` edge out of this basic block. - */ - deprecated predicate immediatelyControls(BasicBlock succ, ConditionalSuccessor s) { - this.getASuccessor(s) = succ and - BasicBlocksImpl::dominatingEdge(this, succ) - } - - /** - * DEPRECATED: Use `edgeDominates` instead. - * - * Holds if basic block `controlled` is controlled by this basic block with - * conditional value `s`. That is, `controlled` can only be reached from the - * callable entry point by going via the `s` edge out of this basic block. - */ - deprecated predicate controls(BasicBlock controlled, ConditionalSuccessor s) { - super.edgeDominates(controlled, s) - } -} - -private class BasicBlockAlias = BasicBlock; - -private class EntryBasicBlockAlias = EntryBasicBlock; - -module Cfg implements BB::CfgSig { - class ControlFlowNode = CfgNode; - - class BasicBlock = BasicBlockAlias; - - class EntryBasicBlock = EntryBasicBlockAlias; - - predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { - BasicBlocksImpl::dominatingEdge(bb1, bb2) - } -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll index 0da31370ff01..72806211f3f7 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll @@ -3,30 +3,9 @@ overlay[local] module; private import codeql.ruby.AST -private import codeql.ruby.controlflow.BasicBlocks private import codeql.ruby.dataflow.SSA private import codeql.ruby.ast.internal.Constant private import ControlFlowGraph -private import internal.ControlFlowGraphImpl as CfgImpl - -/** An entry node for a given scope. */ -class EntryNode extends CfgNode, CfgImpl::EntryNode { - override string getAPrimaryQlClass() { result = "EntryNode" } - - final override EntryBasicBlock getBasicBlock() { result = super.getBasicBlock() } -} - -/** An exit node for a given scope, annotated with the type of exit. */ -class AnnotatedExitNode extends CfgNode, CfgImpl::AnnotatedExitNode { - override string getAPrimaryQlClass() { result = "AnnotatedExitNode" } - - final override AnnotatedExitBasicBlock getBasicBlock() { result = super.getBasicBlock() } -} - -/** An exit node for a given scope. */ -class ExitNode extends CfgNode, CfgImpl::ExitNode { - override string getAPrimaryQlClass() { result = "ExitNode" } -} /** * A node for an AST node. @@ -35,7 +14,11 @@ class ExitNode extends CfgNode, CfgImpl::ExitNode { * (dead) code or not important for control flow, and multiple when there are different * splits for the AST node. */ -class AstCfgNode extends CfgNode, CfgImpl::AstCfgNode { +class AstCfgNode extends CfgNode { + AstCfgNode() { this.injects(_) } + + AstNode getAstNode() { this.injects(result) } + /** Gets the name of the primary QL class for this node. */ overlay[global] override string getAPrimaryQlClass() { result = "AstCfgNode" } @@ -67,10 +50,7 @@ class ReturningCfgNode extends AstCfgNode { ReturningCfgNode() { s = this.getAstNode() } /** Gets the node of the returned value, if any. */ - ExprCfgNode getReturnedValueNode() { - result = this.getAPredecessor() and - result.getAstNode() = s.getValue() - } + ExprCfgNode getReturnedValueNode() { result.getAstNode() = s.getValue() } } /** A control-flow node that wraps a `StringComponent` AST expression. */ @@ -100,108 +80,31 @@ private AstNode desugar(AstNode n) { result = n } -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class ChildMapping extends AstNode { - /** - * Holds if `child` is a (possibly nested) child of this expression - * for which we would like to find a matching CFG child. - */ - abstract predicate relevantChild(AstNode child); - - pragma[nomagic] - abstract predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb); - - /** - * Holds if there is a control-flow path from `cfn` to `cfnChild`, where `cfn` - * is a control-flow node for this expression, and `cfnChild` is a control-flow - * node for `child`. - * - * The path never escapes the syntactic scope of this expression. - */ - cached - predicate hasCfgChild(AstNode child, CfgNode cfn, CfgNode cfnChild) { - this.reachesBasicBlock(child, cfn, cfnChild.getBasicBlock()) and - cfnChild.getAstNode() = desugar(child) - } -} - -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class ExprChildMapping extends Expr, ChildMapping { - pragma[nomagic] - override predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb) { - this.relevantChild(child) and - cfn = this.getAControlFlowNode() and - bb.getANode() = cfn - or - exists(BasicBlock mid | - this.reachesBasicBlock(child, cfn, mid) and - bb = mid.getAPredecessor() and - not mid.getANode().getAstNode() = child - ) - } -} - -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class NonExprChildMapping extends ChildMapping { - NonExprChildMapping() { not this instanceof Expr } - - pragma[nomagic] - override predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb) { - this.relevantChild(child) and - cfn.getAstNode() = this and - bb.getANode() = cfn - or - exists(BasicBlock mid | - this.reachesBasicBlock(child, cfn, mid) and - bb = mid.getASuccessor() and - not mid.getANode().getAstNode() = child - ) - } -} - /** Provides classes for control-flow nodes that wrap AST expressions. */ module ExprNodes { - private class LiteralChildMapping extends ExprChildMapping, Literal { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `Literal` AST expression. */ class LiteralCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "LiteralCfgNode" } - override LiteralChildMapping e; + override Literal e; override Literal getExpr() { result = super.getExpr() } } - private class ControlExprChildMapping extends ExprChildMapping, ControlExpr { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `ControlExpr` AST expression. */ class ControlExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ControlExprCfgNode" } - override ControlExprChildMapping e; + override ControlExpr e; override ControlExpr getExpr() { result = super.getExpr() } } - private class LhsExprChildMapping extends ExprChildMapping, LhsExpr { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `LhsExpr` AST expression. */ class LhsExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "LhsExprCfgNode" } - override LhsExprChildMapping e; + override LhsExpr e; override LhsExpr getExpr() { result = super.getExpr() } @@ -209,34 +112,26 @@ module ExprNodes { Variable getVariable() { result = e.(VariableAccess).getVariable() } } - private class AssignExprChildMapping extends ExprChildMapping, AssignExpr { - override predicate relevantChild(AstNode n) { n = this.getAnOperand() } - } - /** A control-flow node that wraps an `AssignExpr` AST expression. */ class AssignExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "AssignExprCfgNode" } - override AssignExprChildMapping e; + override AssignExpr e; final override AssignExpr getExpr() { result = super.getExpr() } /** Gets the LHS of this assignment. */ - final LhsExprCfgNode getLhs() { e.hasCfgChild(e.getLeftOperand(), this, result) } + final LhsExprCfgNode getLhs() { result.injects(desugar(e.getLeftOperand())) } /** Gets the RHS of this assignment. */ - final ExprCfgNode getRhs() { e.hasCfgChild(e.getRightOperand(), this, result) } - } - - private class OperationExprChildMapping extends ExprChildMapping, Operation { - override predicate relevantChild(AstNode n) { n = this.getAnOperand() } + final ExprCfgNode getRhs() { result.injects(desugar(e.getRightOperand())) } } /** A control-flow node that wraps an `Operation` AST expression. */ class OperationCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "OperationCfgNode" } - override OperationExprChildMapping e; + override Operation e; override Operation getExpr() { result = super.getExpr() } @@ -244,7 +139,7 @@ module ExprNodes { string getOperator() { result = this.getExpr().getOperator() } /** Gets an operand of this operation. */ - final ExprCfgNode getAnOperand() { e.hasCfgChild(e.getAnOperand(), this, result) } + final ExprCfgNode getAnOperand() { result.injects(desugar(e.getAnOperand())) } } /** A control-flow node that wraps a `UnaryOperation` AST expression. */ @@ -258,7 +153,7 @@ module ExprNodes { override UnaryOperation getExpr() { result = super.getExpr() } /** Gets the operand of this unary operation. */ - final ExprCfgNode getOperand() { e.hasCfgChild(uo.getOperand(), this, result) } + final ExprCfgNode getOperand() { result.injects(desugar(uo.getOperand())) } } /** A control-flow node that wraps a `BinaryOperation` AST expression. */ @@ -272,32 +167,22 @@ module ExprNodes { override BinaryOperation getExpr() { result = super.getExpr() } /** Gets the left operand of this binary operation. */ - final ExprCfgNode getLeftOperand() { e.hasCfgChild(bo.getLeftOperand(), this, result) } + final ExprCfgNode getLeftOperand() { result.injects(desugar(bo.getLeftOperand())) } /** Gets the right operand of this binary operation. */ - final ExprCfgNode getRightOperand() { e.hasCfgChild(bo.getRightOperand(), this, result) } - } - - private class BlockArgumentChildMapping extends ExprChildMapping, BlockArgument { - override predicate relevantChild(AstNode n) { n = this.getValue() } + final ExprCfgNode getRightOperand() { result.injects(desugar(bo.getRightOperand())) } } /** A control-flow node that wraps a `BlockArgument` AST expression. */ class BlockArgumentCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "BlockArgumentCfgNode" } - override BlockArgumentChildMapping e; + override BlockArgument e; final override BlockArgument getExpr() { result = super.getExpr() } /** Gets the value of this block argument. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } - } - - private class CallExprChildMapping extends ExprChildMapping, Call { - override predicate relevantChild(AstNode n) { - n = [this.getAnArgument(), this.(MethodCall).getReceiver(), this.(MethodCall).getBlock()] - } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `Call` AST expression. */ @@ -305,12 +190,12 @@ module ExprNodes { overlay[global] override string getAPrimaryQlClass() { result = "CallCfgNode" } - override CallExprChildMapping e; + override Call e; override Call getExpr() { result = super.getExpr() } /** Gets the `n`th argument of this call. */ - final ExprCfgNode getArgument(int n) { e.hasCfgChild(e.getArgument(n), this, result) } + final ExprCfgNode getArgument(int n) { result.injects(desugar(e.getArgument(n))) } /** Gets an argument of this call. */ final ExprCfgNode getAnArgument() { result = this.getArgument(_) } @@ -319,7 +204,7 @@ module ExprNodes { overlay[global] final ExprCfgNode getKeywordArgument(string keyword) { exists(PairCfgNode n | - e.hasCfgChild(e.getAnArgument(), this, n) and + n.injects(desugar(e.getAnArgument())) and n.getKey().getExpr().getConstantValue().isSymbol(keyword) and result = n.getValue() ) @@ -337,10 +222,10 @@ module ExprNodes { final int getNumberOfArguments() { result = e.getNumberOfArguments() } /** Gets the receiver of this call. */ - final ExprCfgNode getReceiver() { e.hasCfgChild(e.(MethodCall).getReceiver(), this, result) } + final ExprCfgNode getReceiver() { result.injects(desugar(e.(MethodCall).getReceiver())) } /** Gets the block of this call. */ - final ExprCfgNode getBlock() { e.hasCfgChild(e.(MethodCall).getBlock(), this, result) } + final ExprCfgNode getBlock() { result.injects(desugar(e.(MethodCall).getBlock())) } } /** A control-flow node that wraps a `MethodCall` AST expression. */ @@ -356,104 +241,54 @@ module ExprNodes { string getMethodName() { result = this.getExpr().getMethodName() } } - private class CaseExprChildMapping extends ExprChildMapping, CaseExpr { - override predicate relevantChild(AstNode e) { e = this.getValue() or e = this.getABranch() } - } - /** A control-flow node that wraps a `CaseExpr` AST expression. */ class CaseExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "CaseExprCfgNode" } - override CaseExprChildMapping e; + override CaseExpr e; final override CaseExpr getExpr() { result = super.getExpr() } /** Gets the expression being compared, if any. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } /** * Gets the `n`th branch of this case expression, either a `when` clause, an `in` clause, or an `else` branch. */ - final AstCfgNode getBranch(int n) { e.hasCfgChild(e.getBranch(n), this, result) } - } - - private class InClauseChildMapping extends NonExprChildMapping, InClause { - override predicate relevantChild(AstNode e) { - e = this.getPattern() or - e = this.getCondition() or - e = this.getBody() - } + final AstCfgNode getBranch(int n) { result.injects(desugar(e.getBranch(n))) } } /** A control-flow node that wraps an `InClause` AST expression. */ class InClauseCfgNode extends AstCfgNode { - private InClauseChildMapping e; + private InClause e; InClauseCfgNode() { e = this.getAstNode() } override string getAPrimaryQlClass() { result = "InClauseCfgNode" } /** Gets the pattern in this `in`-clause. */ - final AstCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } + final AstCfgNode getPattern() { result.injects(desugar(e.getPattern())) } /** Gets the pattern guard condition in this `in` clause, if any. */ - final ExprCfgNode getCondition() { e.hasCfgChild(e.getCondition(), this, result) } + final ExprCfgNode getCondition() { result.injects(desugar(e.getCondition())) } /** Gets the body of this `in`-clause. */ - final ExprCfgNode getBody() { e.hasCfgChild(e.getBody(), this, result) } - } - - // `when` clauses need special treatment, since they are neither pre-order - // nor post-order - private class WhenClauseChildMapping extends WhenClause { - predicate patternReachesBasicBlock(int i, CfgNode cfnPattern, BasicBlock bb) { - exists(Expr pattern | - pattern = this.getPattern(i) and - cfnPattern.getAstNode() = pattern and - bb.getANode() = cfnPattern - ) - or - exists(BasicBlock mid | - this.patternReachesBasicBlock(i, cfnPattern, mid) and - bb = mid.getASuccessor() and - not mid.getANode().getAstNode() = this - ) - } - - predicate bodyReachesBasicBlock(CfgNode cfnBody, BasicBlock bb) { - exists(Stmt body | - body = this.getBody() and - cfnBody.getAstNode() = body and - bb.getANode() = cfnBody - ) - or - exists(BasicBlock mid | - this.bodyReachesBasicBlock(cfnBody, mid) and - bb = mid.getAPredecessor() and - not mid.getANode().getAstNode() = this - ) - } + final ExprCfgNode getBody() { result.injects(desugar(e.getBody())) } } /** A control-flow node that wraps a `WhenClause` AST expression. */ class WhenClauseCfgNode extends AstCfgNode { - private WhenClauseChildMapping e; + private WhenClause e; WhenClauseCfgNode() { e = this.getAstNode() } override string getAPrimaryQlClass() { result = "WhenClauseCfgNode" } /** Gets the body of this `when`-clause. */ - final ExprCfgNode getBody() { - result.getAstNode() = desugar(e.getBody()) and - e.bodyReachesBasicBlock(result, this.getBasicBlock()) - } + final ExprCfgNode getBody() { result.getAstNode() = desugar(e.getBody()) } /** Gets the `i`th pattern this `when`-clause. */ - final ExprCfgNode getPattern(int i) { - result.getAstNode() = desugar(e.getPattern(i)) and - e.patternReachesBasicBlock(i, result, this.getBasicBlock()) - } + final ExprCfgNode getPattern(int i) { result.getAstNode() = desugar(e.getPattern(i)) } } /** A control-flow node that wraps a `CasePattern`. */ @@ -465,41 +300,25 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "CasePatternCfgNode" } } - private class ArrayPatternChildMapping extends NonExprChildMapping, ArrayPattern { - override predicate relevantChild(AstNode e) { - e = this.getPrefixElement(_) or - e = this.getSuffixElement(_) or - e = this.getRestVariableAccess() - } - } - /** A control-flow node that wraps an `ArrayPattern` node. */ class ArrayPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "ArrayPatternCfgNode" } - override ArrayPatternChildMapping e; + override ArrayPattern e; /** Gets the `n`th element of this list pattern's prefix. */ final CasePatternCfgNode getPrefixElement(int n) { - e.hasCfgChild(e.getPrefixElement(n), this, result) + result.injects(desugar(e.getPrefixElement(n))) } /** Gets the `n`th element of this list pattern's suffix. */ final CasePatternCfgNode getSuffixElement(int n) { - e.hasCfgChild(e.getSuffixElement(n), this, result) + result.injects(desugar(e.getSuffixElement(n))) } /** Gets the variable of the rest token, if any. */ final VariableWriteAccessCfgNode getRestVariableAccess() { - e.hasCfgChild(e.getRestVariableAccess(), this, result) - } - } - - private class FindPatternChildMapping extends NonExprChildMapping, FindPattern { - override predicate relevantChild(AstNode e) { - e = this.getElement(_) or - e = this.getPrefixVariableAccess() or - e = this.getSuffixVariableAccess() + result.injects(desugar(e.getRestVariableAccess())) } } @@ -507,26 +326,19 @@ module ExprNodes { class FindPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "FindPatternCfgNode" } - override FindPatternChildMapping e; + override FindPattern e; /** Gets the `n`th element of this find pattern. */ - final CasePatternCfgNode getElement(int n) { e.hasCfgChild(e.getElement(n), this, result) } + final CasePatternCfgNode getElement(int n) { result.injects(desugar(e.getElement(n))) } /** Gets the variable for the prefix of this find pattern, if any. */ final VariableWriteAccessCfgNode getPrefixVariableAccess() { - e.hasCfgChild(e.getPrefixVariableAccess(), this, result) + result.injects(desugar(e.getPrefixVariableAccess())) } /** Gets the variable for the suffix of this find pattern, if any. */ final VariableWriteAccessCfgNode getSuffixVariableAccess() { - e.hasCfgChild(e.getSuffixVariableAccess(), this, result) - } - } - - private class HashPatternChildMapping extends NonExprChildMapping, HashPattern { - override predicate relevantChild(AstNode e) { - e = this.getValue(_) or - e = this.getRestVariableAccess() + result.injects(desugar(e.getSuffixVariableAccess())) } } @@ -534,136 +346,104 @@ module ExprNodes { class HashPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "HashPatternCfgNode" } - override HashPatternChildMapping e; + override HashPattern e; /** Gets the value of the `n`th pair. */ - final CasePatternCfgNode getValue(int n) { e.hasCfgChild(e.getValue(n), this, result) } + final CasePatternCfgNode getValue(int n) { result.injects(desugar(e.getValue(n))) } /** Gets the variable of the keyword rest token, if any. */ final VariableWriteAccessCfgNode getRestVariableAccess() { - e.hasCfgChild(e.getRestVariableAccess(), this, result) + result.injects(desugar(e.getRestVariableAccess())) } } - private class AlternativePatternChildMapping extends NonExprChildMapping, AlternativePattern { - override predicate relevantChild(AstNode e) { e = this.getAnAlternative() } - } - /** A control-flow node that wraps an `AlternativePattern` node. */ class AlternativePatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "AlternativePatternCfgNode" } - override AlternativePatternChildMapping e; + override AlternativePattern e; /** Gets the `n`th alternative. */ - final CasePatternCfgNode getAlternative(int n) { - e.hasCfgChild(e.getAlternative(n), this, result) - } - } - - private class AsPatternChildMapping extends NonExprChildMapping, AsPattern { - override predicate relevantChild(AstNode e) { - e = this.getPattern() or e = this.getVariableAccess() - } + final CasePatternCfgNode getAlternative(int n) { result.injects(desugar(e.getAlternative(n))) } } /** A control-flow node that wraps an `AsPattern` node. */ class AsPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "AsPatternCfgNode" } - override AsPatternChildMapping e; + override AsPattern e; /** Gets the underlying pattern. */ - final CasePatternCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } + final CasePatternCfgNode getPattern() { result.injects(desugar(e.getPattern())) } /** Gets the variable access for this pattern. */ final VariableWriteAccessCfgNode getVariableAccess() { - e.hasCfgChild(e.getVariableAccess(), this, result) + result.injects(desugar(e.getVariableAccess())) } } - private class ParenthesizedPatternChildMapping extends NonExprChildMapping, ParenthesizedPattern { - override predicate relevantChild(AstNode e) { e = this.getPattern() } - } - /** A control-flow node that wraps a `ParenthesizedPattern` node. */ class ParenthesizedPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "ParenthesizedPatternCfgNode" } - override ParenthesizedPatternChildMapping e; + override ParenthesizedPattern e; /** Gets the underlying pattern. */ - final CasePatternCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } - } - - private class ConditionalExprChildMapping extends ExprChildMapping, ConditionalExpr { - override predicate relevantChild(AstNode n) { n = [this.getCondition(), this.getBranch(_)] } + final CasePatternCfgNode getPattern() { result.injects(desugar(e.getPattern())) } } /** A control-flow node that wraps a `ConditionalExpr` AST expression. */ class ConditionalExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ConditionalExprCfgNode" } - override ConditionalExprChildMapping e; + override ConditionalExpr e; final override ConditionalExpr getExpr() { result = super.getExpr() } /** Gets the condition expression. */ - final ExprCfgNode getCondition() { e.hasCfgChild(e.getCondition(), this, result) } + final ExprCfgNode getCondition() { result.injects(desugar(e.getCondition())) } /** * Gets the branch of this conditional expression that is taken when the condition * evaluates to cond, if any. */ - final ExprCfgNode getBranch(boolean cond) { e.hasCfgChild(e.getBranch(cond), this, result) } - } - - private class ConstantAccessChildMapping extends ExprChildMapping, ConstantAccess { - override predicate relevantChild(AstNode n) { n = this.getScopeExpr() } + final ExprCfgNode getBranch(boolean cond) { result.injects(desugar(e.getBranch(cond))) } } - /** A control-flow node that wraps a `ConditionalExpr` AST expression. */ + /** A control-flow node that wraps a `ConstantAccess` AST expression. */ class ConstantAccessCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ConstantAccessCfgNode" } - override ConstantAccessChildMapping e; + override ConstantAccess e; final override ConstantAccess getExpr() { result = super.getExpr() } /** Gets the scope expression. */ - final ExprCfgNode getScopeExpr() { e.hasCfgChild(e.getScopeExpr(), this, result) } - } - - private class StmtSequenceChildMapping extends ExprChildMapping, StmtSequence { - override predicate relevantChild(AstNode n) { n = this.getLastStmt() } + final ExprCfgNode getScopeExpr() { result.injects(desugar(e.getScopeExpr())) } } /** A control-flow node that wraps a `StmtSequence` AST expression. */ class StmtSequenceCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "StmtSequenceCfgNode" } - override StmtSequenceChildMapping e; + override StmtSequence e; final override StmtSequence getExpr() { result = super.getExpr() } /** Gets the last statement in this sequence, if any. */ - final ExprCfgNode getLastStmt() { e.hasCfgChild(e.getLastStmt(), this, result) } - } - - private class ForExprChildMapping extends ExprChildMapping, ForExpr { - override predicate relevantChild(AstNode n) { n = this.getValue() } + final ExprCfgNode getLastStmt() { result.injects(desugar(e.getLastStmt())) } } /** A control-flow node that wraps a `ForExpr` AST expression. */ class ForExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ForExprCfgNode" } - override ForExprChildMapping e; + override ForExpr e; final override ForExpr getExpr() { result = super.getExpr() } /** Gets the value being iterated over. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `ParenthesizedExpr` AST expression. */ @@ -673,27 +453,23 @@ module ExprNodes { ParenthesizedExprCfgNode() { this.getExpr() instanceof ParenthesizedExpr } } - private class PairChildMapping extends ExprChildMapping, Pair { - override predicate relevantChild(AstNode n) { n = [this.getKey(), this.getValue()] } - } - /** A control-flow node that wraps a `Pair` AST expression. */ class PairCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "PairCfgNode" } - override PairChildMapping e; + override Pair e; final override Pair getExpr() { result = super.getExpr() } /** * Gets the key expression of this pair. */ - final ExprCfgNode getKey() { e.hasCfgChild(e.getKey(), this, result) } + final ExprCfgNode getKey() { result.injects(desugar(e.getKey())) } /** * Gets the value expression of this pair. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `VariableAccess` AST expression. */ @@ -728,41 +504,29 @@ module ExprNodes { final override LocalVariable getVariable() { result = super.getVariable() } } - private class InstanceVariableAccessMapping extends ExprChildMapping, InstanceVariableAccess { - override predicate relevantChild(AstNode n) { n = this.getReceiver() } - } - /** A control-flow node that wraps an `InstanceVariableAccess` AST expression. */ class InstanceVariableAccessCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "InstanceVariableAccessCfgNode" } - override InstanceVariableAccessMapping e; + override InstanceVariableAccess e; override InstanceVariableAccess getExpr() { result = super.getExpr() } /** * Gets the synthetic receiver (`self`) of this instance variable access. */ - final CfgNode getReceiver() { e.hasCfgChild(e.getReceiver(), this, result) } - } - - private class SelfVariableAccessMapping extends ExprChildMapping, SelfVariableAccess { - override predicate relevantChild(AstNode n) { none() } + final CfgNode getReceiver() { result.injects(desugar(e.getReceiver())) } } /** A control-flow node that wraps a `SelfVariableAccess` AST expression. */ class SelfVariableAccessCfgNode extends VariableAccessCfgNode { final override string getAPrimaryQlClass() { result = "SelfVariableAccessCfgNode" } - override SelfVariableAccessMapping e; + override SelfVariableAccess e; override SelfVariableAccess getExpr() { result = super.getExpr() } } - private class VariableWriteAccessChildMapping extends ExprChildMapping, VariableWriteAccess { - override predicate relevantChild(AstNode n) { this.isExplicitWrite(n) } - } - /** A control-flow node that wraps a `VariableWriteAccess` AST expression. */ class VariableWriteAccessCfgNode extends VariableAccessCfgNode { /** @@ -784,20 +548,16 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "VariableWriteAccessCfgNode" } - override VariableWriteAccessChildMapping e; + override VariableWriteAccess e; override VariableWriteAccess getExpr() { result = super.getExpr() } } - private class LocalVariableWriteAccessChildMapping extends VariableWriteAccessChildMapping, - LocalVariableWriteAccess - { } - /** A control-flow node that wraps a `LocalVariableWriteAccess` AST expression. */ class LocalVariableWriteAccessCfgNode extends VariableWriteAccessCfgNode { override string getAPrimaryQlClass() { result = "LocalVariableWriteAccessCfgNode" } - override LocalVariableWriteAccessChildMapping e; + override LocalVariableWriteAccess e; final override LocalVariableWriteAccess getExpr() { result = super.getExpr() } @@ -870,20 +630,16 @@ module ExprNodes { } } - private class StringlikeLiteralChildMapping extends ExprChildMapping, StringlikeLiteral { - override predicate relevantChild(AstNode n) { n = this.getComponent(_) } - } - /** A control-flow node that wraps a `StringlikeLiteral` AST expression. */ class StringlikeLiteralCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "StringlikeLiteralCfgNode" } - override StringlikeLiteralChildMapping e; + override StringlikeLiteral e; override StringlikeLiteral getExpr() { result = super.getExpr() } /** Gets the `n`th component of this `StringlikeLiteral` */ - StringComponentCfgNode getComponent(int n) { e.hasCfgChild(e.getComponent(n), this, result) } + StringComponentCfgNode getComponent(int n) { result.injects(desugar(e.getComponent(n))) } /** Gets a component of this `StringlikeLiteral` */ StringComponentCfgNode getAComponent() { result = this.getComponent(_) } @@ -929,15 +685,11 @@ module ExprNodes { final override RelationalOperation getExpr() { result = super.getExpr() } } - private class SplatExprChildMapping extends OperationExprChildMapping, SplatExpr { - override predicate relevantChild(AstNode n) { n = this.getOperand() } - } - /** A control-flow node that wraps a `SplatExpr` AST expression. */ class SplatExprCfgNode extends UnaryOperationCfgNode { override string getAPrimaryQlClass() { result = "SplatExprCfgNode" } - override SplatExprChildMapping e; + override SplatExpr e; final override SplatExpr getExpr() { result = super.getExpr() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 8a7abea30904..02fd1e91ca17 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -4,10 +4,7 @@ module; import codeql.controlflow.SuccessorType private import codeql.ruby.AST -private import codeql.ruby.controlflow.BasicBlocks -private import internal.ControlFlowGraphImpl as CfgImpl -private import internal.Splitting as Splitting -private import internal.Completion +import ControlFlowGraph2 /** * An AST node with an associated control-flow graph. @@ -17,12 +14,12 @@ private import internal.Completion * Note that module declarations are not themselves CFG scopes, as they are part of * the CFG of the enclosing top-level or callable. */ -class CfgScope extends Scope instanceof CfgImpl::CfgScopeImpl { +class CfgScope extends Scope instanceof CfgScopeImpl { /** Gets the CFG scope that this scope is nested under, if any. */ final CfgScope getOuterCfgScope() { exists(AstNode parent | parent = this.getParent() and - result = CfgImpl::getCfgScope(parent) + result = getEnclosingCallable(parent) ) } } @@ -35,14 +32,11 @@ class CfgScope extends Scope instanceof CfgImpl::CfgScopeImpl { * * Only nodes that can be reached from an entry point are included in the CFG. */ -class CfgNode extends CfgImpl::Node { +class CfgNode extends ControlFlowNode { /** Gets the name of the primary QL class for this node. */ overlay[global] string getAPrimaryQlClass() { none() } - /** Gets the file of this control flow node. */ - final File getFile() { result = this.getLocation().getFile() } - /** Gets a successor node of a given type, if any. */ final CfgNode getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } @@ -54,14 +48,4 @@ class CfgNode extends CfgImpl::Node { /** Gets an immediate predecessor, if any. */ final CfgNode getAPredecessor() { result = this.getAPredecessor(_) } - - /** Gets the basic block that this control flow node belongs to. */ - BasicBlock getBasicBlock() { result.getANode() = this } -} - -class Split = Splitting::Split; - -/** Provides different kinds of control flow graph splittings. */ -module Split { - class ConditionalCompletionSplit = Splitting::ConditionalCompletionSplit; } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph2.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph2.qll new file mode 100644 index 000000000000..b8a458c33f20 --- /dev/null +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph2.qll @@ -0,0 +1,522 @@ +/** + * Provides classes representing the control flow graph within callables. + */ +overlay[local] +module; + +private import ruby as R +private import codeql.Locations +private import codeql.controlflow.ControlFlowGraph +private import codeql.controlflow.SuccessorType +private import codeql.ruby.ast.internal.Synthesis +private import codeql.ruby.ast.internal.Scope + +private module Cfg0 = Make0; + +private module Cfg1 = Make1; + +private module Cfg2 = Make2; + +private import Cfg0 +private import Cfg1 +private import Cfg2 +import Public + +private Ast::AstNode desugar(R::Ast::AstNode n) { result = n or result = n.getDesugared() } + +class CfgScopeImpl = Ast::Callable; + +predicate getEnclosingCallable = Ast::getEnclosingCallable/1; + +/** Provides an implementation of the AST signature for Ruby. */ +private module Ast implements AstSig { + private import codeql.ruby.ast.internal.AST + + private predicate additionalExclude(R::Ast::AstNode n) { + n instanceof R::Ast::DestructuredLhsExpr or + exists(n.getDesugared()) + } + + class AstNode extends R::Ast::AstNode { + AstNode() { + not any(Synthesis s).excludeFromControlFlowTree(this) and not additionalExclude(this) + } + } + + private R::Ast::AstNode adjustedGetChild(R::Ast::AstNode parent, int index) { + exists(R::Ast::WhenClause when | parent = when | + when.getPattern(index) = result + or + when.getBody() = result and index = toGenerated(result).getParentIndex() + ) + or + exists(R::Ast::MethodCall call | parent = call and not call instanceof R::Ast::BinaryOperation | + index = -1 and call.getReceiver() = result + or + call.getArgument(index) = result + or + index = call.getNumberOfArguments() and + call.getBlock() = result + ) + or + exists(R::Ast::ClassDeclaration cls | parent = cls | + index = 0 and cls.getScopeExpr() = result + or + index = 1 and cls.getSuperclassExpr() = result + or + cls.getStmt(index - 2) = result + ) + or + exists(R::Ast::ModuleDeclaration mod | parent = mod | + index = 0 and mod.getScopeExpr() = result + or + mod.getStmt(index - 1) = result + ) + or + exists(R::Ast::SingletonClass cls | parent = cls | + index = 0 and cls.getValue() = result + or + cls.getStmt(index - 1) = result + ) + or + exists(R::Ast::SingletonMethod method | parent = method | + index = 0 and method.getObject() = result + ) + or + exists(R::Ast::Pair pair | parent = pair | + index = 0 and pair.getKey() = result + or + index = 1 and pair.getValue() = result + ) + or + exists(R::Ast::ArrayPattern arraypattern | parent = arraypattern | + index = -1 and arraypattern.getClass() = result + or + arraypattern.getPrefixElement(index) = result + or + exists(int restix | restix = count(arraypattern.getPrefixElement(_)) | + restix = index and arraypattern.getRestVariableAccess() = result + or + arraypattern.getSuffixElement(index - restix - 1) = result + ) + ) + or + exists(R::Ast::FindPattern findpattern | parent = findpattern | + index = -2 and findpattern.getClass() = result + or + index = -1 and findpattern.getPrefixVariableAccess() = result + or + findpattern.getElement(index) = result + or + index = 1 + max(int i | exists(findpattern.getElement(i))) and + findpattern.getSuffixVariableAccess() = result + ) + or + exists(R::Ast::HashPattern hashpattern | parent = hashpattern | + index = -1 and hashpattern.getClass() = result + or + exists(int i | + hashpattern.getKey(i) = result and + index = 2 * i + or + hashpattern.getValue(i) = result and + index = 2 * i + 1 + ) + or + index = 2 * count(hashpattern.getValue(_)) and hashpattern.getRestVariableAccess() = result + ) + } + + private R::Ast::AstNode baseGetChild(R::Ast::AstNode parent, int index) { + result = adjustedGetChild(parent, index) + or + not exists(adjustedGetChild(parent, _)) and + not parent instanceof R::Ast::Callable and + ( + synthChild(parent, index, result) + or + result = parent.getAChild() and + not synthChild(parent, _, result) and + toGenerated(result).getParentIndex() = index + ) + } + + AstNode getChild(AstNode parent, int index) { result = desugar(baseGetChild(parent, index)) } + + private R::Ast::Scope parentScope(R::Ast::Scope n) { + result = n.getOuterScope() and + not n instanceof Callable + } + + cached + Callable getEnclosingCallable(AstNode node) { result = parentScope*(scopeOfInclSynth(node)) } + + // TODO: Include EndBlock + class Callable extends AstNode { + Callable() { this instanceof R::Ast::Toplevel or this instanceof R::Ast::Callable } + } + + AstNode callableGetBody(Callable c) { + result = c.(R::Ast::Toplevel).getABeginBlock() or + result = c.(R::Ast::Toplevel).getAStmt() or + result = c.(R::Ast::Callable).getBody() + } + + class Parameter extends AstNode instanceof R::Ast::Parameter { + AstNode getPattern() { + this.(R::Ast::NamedParameter).getDefiningAccess() = result + or + not exists(this.(R::Ast::NamedParameter).getDefiningAccess()) and + this = result + } + + Expr getDefaultValue() { + result = desugar(this.(R::Ast::KeywordParameter).getDefaultValue()) or + result = desugar(this.(R::Ast::OptionalParameter).getDefaultValue()) + } + } + + Parameter callableGetParameter(Callable c, int index) { + c.(R::Ast::Callable).getParameter(index) = result + } + + class Stmt extends AstNode instanceof R::Ast::Stmt { } + + // Most ast nodes in Ruby are both statements and expressions with only a few + // that are only statements. Similarly, most nodes accept statement children, + // but a few only accept expression children. But since this really only + // matters for parsing, we can just treat expressions and statements as the + // same thing to avoid hard-to-find mistakes. + class Expr = Stmt; + + class BlockStmt extends Stmt instanceof R::Ast::StmtSequence { + BlockStmt() { not this instanceof TryStmt } + + Stmt getStmt(int n) { result = desugar(super.getStmt(n)) } + + Stmt getLastStmt() { result = desugar(super.getLastStmt()) } + } + + class ExprStmt extends Stmt { + ExprStmt() { none() } + + Expr getExpr() { none() } + } + + class IfStmt extends Stmt instanceof R::Ast::ConditionalExpr { + IfStmt() { + exists(Stmt branch | + branch = desugar(super.getBranch(_)) and not branch instanceof R::Ast::Expr + ) + } + + Expr getCondition() { result = desugar(super.getCondition()) } + + Stmt getThen() { result = desugar(super.getBranch(true)) } + + Stmt getElse() { result = desugar(super.getBranch(false)) } + } + + class LoopStmt extends Stmt instanceof R::Ast::Loop { + Stmt getBody() { result = desugar(super.getBody()) } + } + + class WhileStmt extends LoopStmt instanceof R::Ast::ConditionalLoop { + WhileStmt() { this instanceof R::Ast::WhileExpr or this instanceof R::Ast::WhileModifierExpr } + + Expr getCondition() { result = desugar(super.getCondition()) } + } + + class UntilStmt extends LoopStmt instanceof R::Ast::ConditionalLoop { + UntilStmt() { this instanceof R::Ast::UntilExpr or this instanceof R::Ast::UntilModifierExpr } + + Expr getCondition() { result = desugar(super.getCondition()) } + } + + class DoStmt extends LoopStmt { + DoStmt() { none() } + + Expr getCondition() { none() } + } + + class ForStmt extends LoopStmt { + ForStmt() { none() } + + AstNode getInit(int index) { none() } + + Expr getCondition() { none() } + + AstNode getUpdate(int index) { none() } + } + + // `ForExpr` would be a match for `ForeachStmt`, but it is desugared. + class ForeachStmt extends LoopStmt { + ForeachStmt() { none() } + + Expr getVariable() { none() } + + Expr getCollection() { none() } + } + + class BreakStmt extends Stmt instanceof R::Ast::BreakStmt { } + + class ContinueStmt extends Stmt instanceof R::Ast::NextStmt { } + + class GotoStmt extends Stmt { + GotoStmt() { none() } + } + + class ReturnStmt extends Stmt instanceof R::Ast::ReturnStmt { + Expr getExpr() { result = desugar(super.getValue()) } + } + + // raise is just a method call + class Throw extends AstNode { + Throw() { none() } + + Expr getExpr() { none() } + } + + class TryStmt extends Stmt instanceof R::Ast::BodyStmt { + TryStmt() { exists(this.getRescue(_)) or exists(this.getElse()) or this.hasEnsure() } + + AstNode getBody(int index) { result = desugar(super.getStmt(index)) } + + CatchClause getCatch(int index) { result = super.getRescue(index) } + + Stmt getFinally() { result = super.getEnsure() } + } + + AstNode getTryElse(TryStmt try) { result = try.(R::Ast::BodyStmt).getElse() } + + class CatchClause extends AstNode instanceof R::Ast::RescueClause { + AstNode getPattern() { result = desugar(super.getPattern()) } + + AstNode getVariable() { result = super.getVariableExpr() } + + Expr getCondition() { none() } + + Stmt getBody() { result = super.getBody() } + } + + class Switch extends AstNode instanceof R::Ast::CaseExpr { + Expr getExpr() { result = desugar(super.getValue()) } + + Case getCase(int index) { result = super.getBranch(index) } + + Stmt getStmt(int index) { none() } + } + + class Case extends AstNode { + Case() { this = any(R::Ast::CaseExpr switch).getABranch() } + + AstNode getPattern(int index) { + desugar(this.(R::Ast::WhenClause).getPattern(index)) = result + or + desugar(this.(R::Ast::InClause).getPattern()) = result and index = 0 + } + + Expr getGuard() { desugar(this.(R::Ast::InClause).getCondition()) = result } + + AstNode getBody() { + desugar(this.(R::Ast::WhenClause).getBody()) = result or + desugar(this.(R::Ast::InClause).getBody()) = result or + desugar(this.(R::Ast::CaseElseBranch).getBody()) = result + } + } + + class DefaultCase extends Case instanceof R::Ast::CaseElseBranch { } + + class ConditionalExpr extends Expr instanceof R::Ast::ConditionalExpr { + ConditionalExpr() { not this instanceof IfStmt } + + Expr getCondition() { result = desugar(super.getCondition()) } + + Expr getThen() { result = desugar(super.getBranch(true)) } + + Expr getElse() { result = desugar(super.getBranch(false)) } + } + + class BinaryExpr extends Expr { + BinaryExpr() { this instanceof R::Ast::BinaryOperation or this instanceof R::Ast::Assignment } + + Expr getLeftOperand() { + result = desugar(this.(R::Ast::BinaryOperation).getLeftOperand()) or + result = desugar(this.(R::Ast::Assignment).getLeftOperand()) + } + + Expr getRightOperand() { + result = desugar(this.(R::Ast::BinaryOperation).getRightOperand()) or + result = desugar(this.(R::Ast::Assignment).getRightOperand()) + } + } + + class LogicalAndExpr extends BinaryExpr instanceof R::Ast::LogicalAndExpr { } + + class LogicalOrExpr extends BinaryExpr instanceof R::Ast::LogicalOrExpr { } + + class NullCoalescingExpr extends BinaryExpr { + NullCoalescingExpr() { none() } + } + + class UnaryExpr extends Expr instanceof R::Ast::UnaryOperation { + Expr getOperand() { result = desugar(super.getOperand()) } + } + + class LogicalNotExpr extends UnaryExpr instanceof R::Ast::NotExpr { } + + class Assignment extends BinaryExpr instanceof R::Ast::Assignment { } + + class AssignExpr extends Assignment instanceof R::Ast::AssignExpr { } + + // Compound assignments are desugared. + class CompoundAssignment extends Assignment { + CompoundAssignment() { none() } + } + + class AssignLogicalAndExpr extends CompoundAssignment { } + + class AssignLogicalOrExpr extends CompoundAssignment { } + + class AssignNullCoalescingExpr extends CompoundAssignment { } + + class BooleanLiteral extends Expr instanceof R::Ast::BooleanLiteral { + boolean getValue() { result = super.getValue() } + } + + class PatternMatchExpr extends Expr { + PatternMatchExpr() { none() } + + Expr getExpr() { none() } + + AstNode getPattern() { none() } + } +} + +private predicate rescuable(R::Ast::AstNode n) { + exists(R::Ast::RescueModifierExpr rescueModifier | n = desugar(rescueModifier.getBody())) + or + exists(Ast::TryStmt try | n = try.getBody(_)) + or + exists(R::Ast::AstNode parent | n = desugar(parent.getAChild()) and rescuable(parent)) +} + +/** + * Holds if `c` happens in an exception-aware context, that is, it may be + * `rescue`d or `ensure`d. In such cases, we assume that the target of `c` + * may raise an exception (in addition to evaluating normally). + */ +private predicate mayRaise(R::Ast::Call c) { rescuable(c) } + +private module Input implements InputSig1, InputSig2 { + private import codeql.util.Void + private import codeql.util.Unit + private import internal.NonReturning + + predicate cfgCachedStageRef() { CfgCachedStage::ref() } + + class Label = Void; + + predicate preOrderExpr(Ast::Expr e) { + e instanceof R::Ast::StmtSequence or + e instanceof R::Ast::RescueClause or + e instanceof R::Ast::ConditionalExpr or + e instanceof R::Ast::Loop or + e instanceof R::Ast::RescueModifierExpr + } + + predicate postOrInOrder(Ast::AstNode n) { + n instanceof R::Ast::Call and + not n instanceof R::Ast::BinaryOperation and + not n instanceof R::Ast::UnaryOperation + or + n instanceof R::Ast::RedoStmt + or + n instanceof R::Ast::RetryStmt + } + + class CallableContext = Unit; + + Ast::AstNode callableGetBodyPart(Ast::Callable c, CallableContext ctx, int index) { + exists(R::Ast::Toplevel t | + c = t and + exists(ctx) + | + result = t.getBeginBlock(index) or + result = desugar(t.getStmt(index - count(t.getABeginBlock()))) + ) + } + + predicate catchAll(Ast::CatchClause catch) { + not exists(catch.(R::Ast::RescueClause).getAnException()) + } + + predicate beginAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + ast.(NonReturningCall).getASuccessorType() = c.asSimpleAbruptCompletion() and + n.isIn(ast) and + always = true + or + mayRaise(ast) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof R::Ast::RedoStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof RedoSuccessor and + always = true + or + ast instanceof R::Ast::RetryStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof RetrySuccessor and + always = true + } + + predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + exists(R::Ast::Callable callable | + callable.getBody() = ast and + n.(NormalExitNodeImpl).getEnclosingCallable() = callable + | + c.asSimpleAbruptCompletion() instanceof BreakSuccessor or + c.asSimpleAbruptCompletion() instanceof ContinueSuccessor or + c.asSimpleAbruptCompletion() instanceof RedoSuccessor + ) + or + exists(R::Ast::RescueModifierExpr rescueModifier | + ast = desugar(rescueModifier.getBody()) and + c.getSuccessorType() instanceof ExceptionSuccessor and + n.isBefore(desugar(rescueModifier.getHandler())) + ) + or + ast = any(Ast::LoopStmt loop).getBody() and + c.asSimpleAbruptCompletion() instanceof RedoSuccessor and + n.isBefore(ast) + or + exists(Ast::TryStmt try | + ast = try.getCatch(_).getBody() and + c.asSimpleAbruptCompletion() instanceof RetrySuccessor and + n.isBefore(try.getBody(0)) + ) + } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Ast::ConditionalExpr ce | + n1.isAfterTrue(ce.getCondition()) and not exists(ce.getThen()) and n2.isAfter(ce) + or + n1.isAfterFalse(ce.getCondition()) and not exists(ce.getElse()) and n2.isAfter(ce) + ) + or + exists(R::Ast::RescueModifierExpr rescueModifier | + n1.isBefore(rescueModifier) and + n2.isBefore(desugar(rescueModifier.getBody())) + or + n1.isAfter(desugar(rescueModifier.getBody())) and + n2.isAfter(rescueModifier) + or + n1.isAfter(desugar(rescueModifier.getHandler())) and + n2.isAfter(rescueModifier) + ) + } +} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll deleted file mode 100644 index bcfe8f98d437..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll +++ /dev/null @@ -1,565 +0,0 @@ -/** - * Provides classes representing control flow completions. - * - * A completion represents how a statement or expression terminates. - */ -overlay[local] -module; - -private import codeql.ruby.AST -private import codeql.ruby.ast.internal.AST -private import codeql.ruby.ast.internal.Control -private import codeql.ruby.controlflow.ControlFlowGraph -private import ControlFlowGraphImpl as CfgImpl -private import NonReturning - -private newtype TCompletion = - TSimpleCompletion() or - TBooleanCompletion(boolean b) { b in [false, true] } or - TMatchingCompletion(boolean isMatch) { isMatch in [false, true] } or - TReturnCompletion() or - TBreakCompletion() or - TNextCompletion() or - TRedoCompletion() or - TRetryCompletion() or - TRaiseCompletion() or // TODO: Add exception type? - TExitCompletion() or - TNestedCompletion(TCompletion inner, TCompletion outer, int nestLevel) { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion and - nestLevel = 0 - or - inner instanceof TBooleanCompletion and - outer instanceof TMatchingCompletion and - nestLevel = 0 - or - inner instanceof NormalCompletion and - nestedEnsureCompletion(outer, nestLevel) - } - -pragma[noinline] -private predicate nestedEnsureCompletion(TCompletion outer, int nestLevel) { - ( - outer = TReturnCompletion() - or - outer = TBreakCompletion() - or - outer = TNextCompletion() - or - outer = TRedoCompletion() - or - outer = TRetryCompletion() - or - outer = TRaiseCompletion() - or - outer = TExitCompletion() - ) and - nestLevel = any(CfgImpl::Trees::BodyStmtTree t).getNestLevel() -} - -pragma[noinline] -private predicate completionIsValidForStmt(AstNode n, Completion c) { - n instanceof BreakStmt and - c = TBreakCompletion() - or - n instanceof NextStmt and - c = TNextCompletion() - or - n instanceof RedoStmt and - c = TRedoCompletion() - or - n instanceof ReturnStmt and - c = TReturnCompletion() -} - -private AstNode getARescuableBodyChild() { - exists(CfgImpl::Trees::BodyStmtTree bst | result = bst.getBodyChild(_, true) | - exists(bst.getARescue()) - or - exists(bst.getEnsure()) - ) - or - result = getARescuableBodyChild().getAChild() -} - -/** - * Holds if `c` happens in an exception-aware context, that is, it may be - * `rescue`d or `ensure`d. In such cases, we assume that the target of `c` - * may raise an exception (in addition to evaluating normally). - */ -private predicate mayRaise(Call c) { c = getARescuableBodyChild() } - -/** A completion of a statement or an expression. */ -abstract class Completion extends TCompletion { - private predicate isValidForSpecific0(AstNode n) { - this = n.(NonReturningCall).getACompletion() - or - completionIsValidForStmt(n, this) - or - mustHaveBooleanCompletion(n) and - ( - exists(boolean value | isBooleanConstant(n, value) | this = TBooleanCompletion(value)) - or - not isBooleanConstant(n, _) and - this = TBooleanCompletion(_) - ) - or - mustHaveMatchingCompletion(n) and - this = TMatchingCompletion(_) - or - n = any(RescueModifierExpr parent).getBody() and - this = [TSimpleCompletion().(TCompletion), TRaiseCompletion()] - } - - private predicate isValidForSpecific(AstNode n) { - this.isValidForSpecific0(n) - or - exists(AstNode other | n = other.getDesugared() and this.isValidForSpecific(other)) - or - mayRaise(n) and - ( - this = TRaiseCompletion() - or - not any(Completion c).isValidForSpecific0(n) and - this = TSimpleCompletion() - ) - } - - /** Holds if this completion is valid for node `n`. */ - predicate isValidFor(AstNode n) { - this.isValidForSpecific(n) - or - not any(Completion c).isValidForSpecific(n) and - this = TSimpleCompletion() - } - - /** - * Holds if this completion will continue a loop when it is the completion - * of a loop body. - */ - predicate continuesLoop() { - this instanceof NormalCompletion or - this instanceof NextCompletion - } - - /** - * Gets the inner completion. This is either the inner completion, - * when the completion is nested, or the completion itself. - */ - Completion getInnerCompletion() { result = this } - - /** - * Gets the outer completion. This is either the outer completion, - * when the completion is nested, or the completion itself. - */ - Completion getOuterCompletion() { result = this } - - /** Gets a successor type that matches this completion. */ - abstract SuccessorType getAMatchingSuccessorType(); - - /** Gets a textual representation of this completion. */ - abstract string toString(); -} - -/** Holds if node `n` has the Boolean constant value `value`. */ -private predicate isBooleanConstant(AstNode n, boolean value) { - mustHaveBooleanCompletion(n) and - ( - n.(BooleanLiteral).isTrue() and - value = true - or - n.(BooleanLiteral).isFalse() and - value = false - ) -} - -/** - * Holds if a normal completion of `n` must be a Boolean completion. - */ -private predicate mustHaveBooleanCompletion(AstNode n) { - inBooleanContext(n) and - not n instanceof NonReturningCall -} - -/** - * Holds if `n` is used in a Boolean context. That is, the value - * that `n` evaluates to determines a true/false branch successor. - */ -private predicate inBooleanContext(AstNode n) { - exists(ConditionalExpr i | - n = i.getCondition() - or - inBooleanContext(i) and - n = i.getBranch(_) - ) - or - n = any(ConditionalLoop parent).getCondition() - or - n = any(InClause parent).getCondition() - or - exists(LogicalAndExpr parent | - n = parent.getLeftOperand() - or - inBooleanContext(parent) and - n = parent.getRightOperand() - ) - or - exists(LogicalOrExpr parent | - n = parent.getLeftOperand() - or - inBooleanContext(parent) and - n = parent.getRightOperand() - ) - or - n = any(NotExpr parent | inBooleanContext(parent)).getOperand() - or - n = any(StmtSequence parent | inBooleanContext(parent)).getLastStmt() - or - exists(CaseExpr c, WhenClause w | - not exists(c.getValue()) and - c.getABranch() = w - | - w.getPattern(_) = n - or - w = n - ) -} - -/** - * Holds if a normal completion of `n` must be a matching completion. - */ -private predicate mustHaveMatchingCompletion(AstNode n) { - inMatchingContext(n) and - not n instanceof NonReturningCall -} - -/** - * Holds if `n` is used in a matching context. That is, whether or - * not the value of `n` matches, determines the successor. - */ -private predicate inMatchingContext(AstNode n) { - n = any(RescueClause r).getException(_) - or - exists(CaseExpr c, WhenClause w | - exists(c.getValue()) and - c.getABranch() = w - | - w.getPattern(_) = n - or - w = n - ) - or - n instanceof CasePattern - or - n = any(ReferencePattern p).getExpr() - or - n.(CfgImpl::Trees::DefaultValueParameterTree).hasDefaultValue() -} - -/** - * A completion that represents normal evaluation of a statement or an - * expression. - */ -abstract class NormalCompletion extends Completion { } - -abstract private class NonNestedNormalCompletion extends NormalCompletion { } - -/** A simple (normal) completion. */ -class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override DirectSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { result = "simple" } -} - -/** - * A completion that represents evaluation of an expression, whose value determines - * the successor. Either a Boolean completion (`BooleanCompletion`), or a matching - * completion (`MatchingCompletion`). - */ -abstract class ConditionalCompletion extends NormalCompletion { - boolean value; - - bindingset[value] - ConditionalCompletion() { any() } - - /** Gets the Boolean value of this conditional completion. */ - final boolean getValue() { result = value } -} - -/** - * A completion that represents evaluation of an expression - * with a Boolean value. - */ -class BooleanCompletion extends ConditionalCompletion, NonNestedNormalCompletion, TBooleanCompletion -{ - BooleanCompletion() { this = TBooleanCompletion(value) } - - /** Gets the dual Boolean completion. */ - BooleanCompletion getDual() { result = TBooleanCompletion(value.booleanNot()) } - - override BooleanSuccessor getAMatchingSuccessorType() { result.getValue() = value } - - override string toString() { result = value.toString() } -} - -/** A Boolean `true` completion. */ -class TrueCompletion extends BooleanCompletion { - TrueCompletion() { this.getValue() = true } -} - -/** A Boolean `false` completion. */ -class FalseCompletion extends BooleanCompletion { - FalseCompletion() { this.getValue() = false } -} - -/** - * A completion that represents evaluation of a matching test, for example - * a test in a `rescue` statement. - */ -class MatchingCompletion extends ConditionalCompletion { - MatchingCompletion() { - this = TMatchingCompletion(value) - or - this = TNestedCompletion(_, TMatchingCompletion(value), _) - } - - override ConditionalSuccessor getAMatchingSuccessorType() { - this = TMatchingCompletion(result.(MatchingSuccessor).getValue()) - } - - override string toString() { if value = true then result = "match" else result = "no-match" } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a return. - */ -class ReturnCompletion extends Completion { - ReturnCompletion() { - this = TReturnCompletion() or - this = TNestedCompletion(_, TReturnCompletion(), _) - } - - override ReturnSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TReturnCompletion() and result = "return" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a break from a loop. - */ -class BreakCompletion extends Completion { - BreakCompletion() { - this = TBreakCompletion() or - this = TNestedCompletion(_, TBreakCompletion(), _) - } - - override BreakSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TBreakCompletion() and result = "break" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a continuation of a loop. - */ -class NextCompletion extends Completion { - NextCompletion() { - this = TNextCompletion() or - this = TNestedCompletion(_, TNextCompletion(), _) - } - - override ContinueSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TNextCompletion() and result = "next" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a redo of a loop iteration. - */ -class RedoCompletion extends Completion { - RedoCompletion() { - this = TRedoCompletion() or - this = TNestedCompletion(_, TRedoCompletion(), _) - } - - override RedoSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRedoCompletion() and result = "redo" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a retry. - */ -class RetryCompletion extends Completion { - RetryCompletion() { - this = TRetryCompletion() or - this = TNestedCompletion(_, TRetryCompletion(), _) - } - - override RetrySuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRetryCompletion() and result = "retry" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a thrown exception. - */ -class RaiseCompletion extends Completion { - RaiseCompletion() { - this = TRaiseCompletion() or - this = TNestedCompletion(_, TRaiseCompletion(), _) - } - - override ExceptionSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRaiseCompletion() and result = "raise" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in an abort/exit. - */ -class ExitCompletion extends Completion { - ExitCompletion() { - this = TExitCompletion() or - this = TNestedCompletion(_, TExitCompletion(), _) - } - - override ExitSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TExitCompletion() and result = "exit" - } -} - -/** - * A nested completion. For example, in - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * break - * end - * end - * puts "done" - * end - * ``` - * - * the `while` loop can have a nested completion where the inner completion - * is a `break` and the outer completion is a simple successor. - */ -abstract class NestedCompletion extends Completion, TNestedCompletion { - Completion inner; - Completion outer; - int nestLevel; - - NestedCompletion() { this = TNestedCompletion(inner, outer, nestLevel) } - - /** Gets a completion that is compatible with the inner completion. */ - Completion getAnInnerCompatibleCompletion() { - result.getOuterCompletion() = this.getInnerCompletion() - } - - /** Gets the level of this nested completion. */ - final int getNestLevel() { result = nestLevel } - - override string toString() { result = outer + " [" + inner + "] (" + nestLevel + ")" } -} - -class NestedBreakCompletion extends NormalCompletion, NestedCompletion { - NestedBreakCompletion() { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion - } - - override BreakCompletion getInnerCompletion() { result = inner } - - override NonNestedNormalCompletion getOuterCompletion() { result = outer } - - override Completion getAnInnerCompatibleCompletion() { - result = inner and - outer = TSimpleCompletion() - or - result = TNestedCompletion(outer, inner, _) - } - - override SuccessorType getAMatchingSuccessorType() { - outer instanceof SimpleCompletion and - result instanceof BreakSuccessor - or - result = outer.(ConditionalCompletion).getAMatchingSuccessorType() - } -} - -class NestedEnsureCompletion extends NestedCompletion { - NestedEnsureCompletion() { - inner instanceof NormalCompletion and - nestedEnsureCompletion(outer, nestLevel) - } - - override NormalCompletion getInnerCompletion() { result = inner } - - override Completion getOuterCompletion() { result = outer } - - override SuccessorType getAMatchingSuccessorType() { none() } -} - -/** - * A completion used for conditions in pattern matching: - * - * ```rb - * in x if x == 5 then puts "five" - * in x unless x == 4 then puts "not four" - * ``` - * - * The outer (Matching) completion indicates whether there is a match, and - * the inner (Boolean) completion indicates what the condition evaluated - * to. - * - * For the condition `x == 5` above, `TNestedCompletion(true, true, 0)` and - * `TNestedCompletion(false, false, 0)` are both valid completions, while - * `TNestedCompletion(true, false, 0)` and `TNestedCompletion(false, true, 0)` - * are valid completions for `x == 4`. - */ -class NestedMatchingCompletion extends NestedCompletion, MatchingCompletion { - NestedMatchingCompletion() { - inner instanceof TBooleanCompletion and - outer instanceof TMatchingCompletion - } - - override BooleanCompletion getInnerCompletion() { result = inner } - - override MatchingCompletion getOuterCompletion() { result = outer } - - override BooleanSuccessor getAMatchingSuccessorType() { - result.getValue() = this.getInnerCompletion().getValue() - } - - override string toString() { result = NestedCompletion.super.toString() } -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll deleted file mode 100644 index e66e8bad0037..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ /dev/null @@ -1,1510 +0,0 @@ -/** - * Provides an implementation for constructing control-flow graphs (CFGs) from - * abstract syntax trees (ASTs), using the shared library from `codeql.controlflow.Cfg`. - */ -overlay[local] -module; - -private import codeql.controlflow.Cfg as CfgShared -private import codeql.ruby.AST -private import codeql.ruby.AST as Ast -private import codeql.ruby.ast.internal.AST as AstInternal -private import codeql.ruby.ast.internal.Scope -private import codeql.ruby.ast.internal.Synthesis -private import codeql.ruby.ast.Scope -private import codeql.ruby.ast.internal.TreeSitter -private import codeql.ruby.ast.internal.Variable -private import codeql.ruby.controlflow.ControlFlowGraph -private import Completion - -class AstNode extends Ast::AstNode { - AstNode() { not any(Synthesis s).excludeFromControlFlowTree(this) } -} - -private module CfgInput implements CfgShared::InputSig { - private import ControlFlowGraphImpl as Impl - private import Completion as Comp - private import codeql.ruby.CFG as Cfg - - class AstNode = Impl::AstNode; - - class Completion = Comp::Completion; - - predicate completionIsNormal(Completion c) { c instanceof Comp::NormalCompletion } - - predicate completionIsSimple(Completion c) { c instanceof Comp::SimpleCompletion } - - predicate completionIsValidFor(Completion c, AstNode e) { c.isValidFor(e) } - - class CfgScope = Cfg::CfgScope; - - CfgScope getCfgScope(AstNode n) { result = Impl::getCfgScope(n) } - - predicate scopeFirst(CfgScope scope, AstNode first) { scope.(Impl::CfgScopeImpl).entry(first) } - - predicate scopeLast(CfgScope scope, AstNode last, Completion c) { - scope.(Impl::CfgScopeImpl).exit(last, c) - } - - private class SuccessorType = Cfg::SuccessorType; - - SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - - private predicate id(Ruby::AstNode node1, Ruby::AstNode node2) { node1 = node2 } - - private predicate idOf(Ruby::AstNode node, int id) = equivalenceRelation(id/2)(node, id) - - int idOfAstNode(AstNode node) { idOf(AstInternal::toGeneratedInclSynth(node), result) } - - int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) } -} - -private module CfgSplittingInput implements CfgShared::SplittingInputSig { - private import Splitting as S - - class SplitKindBase = S::TSplitKind; - - class Split = S::Split; -} - -private module ConditionalCompletionSplittingInput implements - CfgShared::ConditionalCompletionSplittingInputSig -{ - import Splitting::ConditionalCompletionSplitting::ConditionalCompletionSplittingInput -} - -import CfgShared::MakeWithSplitting - -abstract class CfgScopeImpl extends AstNode { - abstract predicate entry(AstNode first); - - abstract predicate exit(AstNode last, Completion c); -} - -private class ToplevelScope extends CfgScopeImpl, Toplevel { - final override predicate entry(AstNode first) { first(this, first) } - - final override predicate exit(AstNode last, Completion c) { last(this, last, c) } -} - -private class EndBlockScope extends CfgScopeImpl, EndBlock { - final override predicate entry(AstNode first) { - first(this.(Trees::EndBlockTree).getBodyChild(0, _), first) - } - - final override predicate exit(AstNode last, Completion c) { - last(this.(Trees::EndBlockTree).getLastBodyChild(), last, c) - or - last(this.(Trees::EndBlockTree).getBodyChild(_, _), last, c) and - not c instanceof NormalCompletion - } -} - -private class CallableScope extends CfgScopeImpl, Callable { - final override predicate entry(AstNode first) { - first(this.(Trees::CallableTree).getBodyChild(0), first) - } - - final override predicate exit(AstNode last, Completion c) { - this.getBody().(Trees::BodyStmtTree).last(last, c) - or - exists(int i | - not exists(this.getBody()) and - last(this.(Trees::CallableTree).getBodyChild(i), last, c) and - not exists(this.(Trees::CallableTree).getBodyChild(i + 1)) - ) - or - exists(AstNode child | - child = this.(Trees::CallableTree).getBodyChild(_) and - not child = this.getBody() and - last(child, last, c) and - not c instanceof NormalCompletion - ) - } -} - -/** Holds if `first` is first executed when entering `scope`. */ -pragma[nomagic] -predicate succEntry(CfgScopeImpl scope, AstNode first) { scope.entry(first) } - -/** Holds if `last` with completion `c` can exit `scope`. */ -pragma[nomagic] -predicate succExit(CfgScopeImpl scope, AstNode last, Completion c) { scope.exit(last, c) } - -/** Defines the CFG by dispatch on the various AST types. */ -module Trees { - private class AliasStmtTree extends StandardPreOrderTree instanceof AliasStmt { - final override ControlFlowTree getChildNode(int i) { - result = super.getNewName() and i = 0 - or - result = super.getOldName() and i = 1 - } - } - - private class ArgumentListTree extends StandardPostOrderTree instanceof ArgumentList { - final override ControlFlowTree getChildNode(int i) { result = super.getElement(i) } - } - - private class AssignExprTree extends StandardPostOrderTree instanceof AssignExpr { - AssignExprTree() { - exists(Expr left | left = super.getLeftOperand() | - left instanceof VariableAccess or - left instanceof ConstantAccess - ) - } - - final override ControlFlowTree getChildNode(int i) { - result = super.getLeftOperand() and i = 0 - or - result = super.getRightOperand() and i = 1 - } - } - - private class BeginTree extends BodyStmtTree instanceof BeginExpr { - final override predicate propagatesAbnormal(AstNode child) { none() } - } - - private class BlockArgumentTree extends StandardPostOrderTree instanceof BlockArgument { - final override ControlFlowTree getChildNode(int i) { result = super.getValue() and i = 0 } - } - - abstract private class NonDefaultValueParameterTree extends ControlFlowTree instanceof NamedParameter - { - final override predicate first(AstNode first) { - super.getDefiningAccess().(ControlFlowTree).first(first) - or - not exists(super.getDefiningAccess()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - super.getDefiningAccess().(ControlFlowTree).last(last, c) - or - not exists(super.getDefiningAccess()) and - last = this and - c.isValidFor(this) - } - - override predicate propagatesAbnormal(AstNode child) { - super.getDefiningAccess().(ControlFlowTree).propagatesAbnormal(child) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class BlockParameterTree extends NonDefaultValueParameterTree instanceof BlockParameter { - } - - class BodyStmtTree extends StmtSequenceTree instanceof BodyStmt { - /** Gets a rescue clause in this block. */ - final RescueClause getARescue() { result = super.getRescue(_) } - - /** Gets the `ensure` clause in this block, if any. */ - final StmtSequence getEnsure() { result = super.getEnsure() } - - override predicate first(AstNode first) { - first(this.getBodyChild(0, _), first) - or - not exists(this.getBodyChild(_, _)) and - first(super.getEnsure(), first) - } - - override predicate last(AstNode last, Completion c) { - exists(boolean ensurable | last = this.getAnEnsurePredecessor(c, ensurable) | - not super.hasEnsure() - or - ensurable = false - ) - or - // If the body completes normally, take the completion from the `ensure` block - this.lastEnsure(last, c, any(NormalCompletion nc), _) - or - // If the `ensure` block completes normally, it inherits any non-normal - // completion from the body - c = - any(NestedEnsureCompletion nec | - this.lastEnsure(last, nec.getAnInnerCompatibleCompletion(), nec.getOuterCompletion(), - nec.getNestLevel()) - ) - or - not exists(this.getBodyChild(_, _)) and - not exists(super.getRescue(_)) and - this.lastEnsure0(last, c) - or - last([super.getEnsure().(AstNode), this.getBodyChild(_, false)], last, c) and - not c instanceof NormalCompletion - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - or - // Exceptional flow from body to first `rescue` - this.lastBody(pred, c, true) and - first(super.getRescue(0), succ) and - c instanceof RaiseCompletion - or - // Flow from one `rescue` clause to the next when there is no match - exists(RescueTree rescue, int i | rescue = super.getRescue(i) | - rescue.lastNoMatch(pred, c) and - first(super.getRescue(i + 1), succ) - ) - or - // Flow from body to `else` block when no exception - this.lastBody(pred, c, _) and - first(super.getElse(), succ) and - c instanceof NormalCompletion - or - // Flow into `ensure` block - pred = this.getAnEnsurePredecessor(c, true) and - first(super.getEnsure(), succ) - } - - /** - * Gets a last element from this block that may finish with completion `c`, such - * that control may be transferred to the `ensure` block (if it exists), but only - * if `ensurable = true`. - */ - pragma[nomagic] - private AstNode getAnEnsurePredecessor(Completion c, boolean ensurable) { - this.lastBody(result, c, ensurable) and - ( - // Any non-throw completion will always continue directly to the `ensure` block, - // unless there is an `else` block - not c instanceof RaiseCompletion and - not exists(super.getElse()) - or - // Any completion will continue to the `ensure` block when there are no `rescue` - // blocks - not exists(super.getRescue(_)) - ) - or - // Last element from any matching `rescue` block continues to the `ensure` block - last(super.getRescue(_), result, c) and - ensurable = true - or - // If the last `rescue` block does not match, continue to the `ensure` block - exists(int lst, MatchingCompletion mc | - super.getRescue(lst).(RescueTree).lastNoMatch(result, mc) and - mc.getValue() = false and - not exists(super.getRescue(lst + 1)) and - c = - any(NestedEnsureCompletion nec | - nec.getOuterCompletion() instanceof RaiseCompletion and - nec.getInnerCompletion() = mc and - nec.getNestLevel() = 0 - ) and - ensurable = true - ) - or - // Last element of `else` block continues to the `ensure` block - last(super.getElse(), result, c) and - ensurable = true - } - - pragma[nomagic] - private predicate lastEnsure0(AstNode last, Completion c) { last(super.getEnsure(), last, c) } - - /** - * Gets a descendant that belongs to the `ensure` block of this block, if any. - * Nested `ensure` blocks are not included. - */ - pragma[nomagic] - AstNode getAnEnsureDescendant() { - result = super.getEnsure() - or - exists(AstNode mid | - mid = this.getAnEnsureDescendant() and - result = mid.getAChild() and - getCfgScope(result) = getCfgScope(mid) and - not exists(BodyStmt nestedBlock | - result = nestedBlock.getEnsure() and - nestedBlock != this - ) - ) - } - - /** - * Holds if `innerBlock` has an `ensure` block and is immediately nested inside the - * `ensure` block of this block. - */ - private predicate nestedEnsure(BodyStmtTree innerBlock) { - exists(StmtSequence innerEnsure | - innerEnsure = this.getAnEnsureDescendant().getAChild() and - getCfgScope(innerEnsure) = getCfgScope(this) and - innerEnsure = innerBlock.getEnsure() - ) - } - - /** - * Gets the `ensure`-nesting level of this block. That is, the number of `ensure` - * blocks that this block is nested under. - */ - int getNestLevel() { result = count(BodyStmtTree outer | outer.nestedEnsure+(this)) } - - pragma[nomagic] - private predicate lastEnsure( - AstNode last, NormalCompletion ensure, Completion outer, int nestLevel - ) { - this.lastEnsure0(last, ensure) and - exists( - this.getAnEnsurePredecessor(any(Completion c0 | outer = c0.getOuterCompletion()), true) - ) and - nestLevel = this.getNestLevel() - } - - /** - * Holds if `last` is a last element in the body of this block. `ensurable` - * indicates whether `last` may be a predecessor of an `ensure` block. - */ - pragma[nomagic] - private predicate lastBody(AstNode last, Completion c, boolean ensurable) { - exists(boolean rescuable | - if c instanceof RaiseCompletion then ensurable = rescuable else ensurable = true - | - last(this.getBodyChild(_, rescuable), last, c) and - not c instanceof NormalCompletion - or - exists(int lst | - last(this.getBodyChild(lst, rescuable), last, c) and - not exists(this.getBodyChild(lst + 1, _)) - ) - ) - } - } - - private class BooleanLiteralTree extends LeafTree instanceof BooleanLiteral { } - - class BraceBlockTree extends CallableTree instanceof BraceBlock { - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getLocalVariable(i - super.getNumberOfParameters()) - or - result = super.getBody() and - i = super.getNumberOfParameters() + count(super.getALocalVariable()) - } - } - - class CallableTree extends PostOrderTree instanceof Callable { - final override predicate propagatesAbnormal(AstNode child) { none() } - - override predicate first(AstNode first) { first = this } - - abstract AstNode getBodyChild(int i); - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(int i | - last(this.getBodyChild(i), pred, c) and - first(this.getBodyChild(i + 1), succ) and - c instanceof NormalCompletion - ) - } - } - - private class CallTree extends StandardPostOrderTree instanceof Call { - CallTree() { - // Logical operations are handled separately - not this instanceof UnaryLogicalOperation and - not this instanceof BinaryLogicalOperation and - // Calls with the `&.` operator are desugared - not this.(MethodCall).isSafeNavigation() - } - - override ControlFlowTree getChildNode(int i) { result = super.getArgument(i) } - } - - private class CaseTree extends PostOrderTree instanceof CaseExpr, AstInternal::TCaseExpr { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getValue() or child = super.getABranch() - } - - final override predicate first(AstNode first) { - first(super.getValue(), first) - or - not exists(super.getValue()) and first(super.getBranch(0), first) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getValue(), pred, c) and - first(super.getBranch(0), succ) and - c instanceof SimpleCompletion - or - exists(int i, WhenTree branch | branch = super.getBranch(i) | - pred = branch and - first(super.getBranch(i + 1), succ) and - c.isValidFor(branch) and - c.(ConditionalCompletion).getValue() = false - ) - or - succ = this and - c instanceof NormalCompletion and - ( - last(super.getValue(), pred, c) and not exists(super.getABranch()) - or - last(super.getABranch().(WhenClause).getBody(), pred, c) - or - exists(int i, ControlFlowTree lastBranch | - lastBranch = super.getBranch(i) and - not exists(super.getBranch(i + 1)) and - last(lastBranch, pred, c) - ) - ) - } - } - - private class CaseMatchTree extends PostOrderTree instanceof CaseExpr, AstInternal::TCaseMatch { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getValue() or child = super.getABranch() - } - - final override predicate first(AstNode first) { first(super.getValue(), first) } - - final override predicate last(AstNode last, Completion c) { - super.last(last, c) - or - not exists(super.getElseBranch()) and - exists(MatchingCompletion lc, AstNode lastBranch | - lastBranch = max(int i | | super.getBranch(i) order by i) and - lc.getValue() = false and - last(lastBranch, last, lc) and - c instanceof RaiseCompletion and - not c instanceof NestedCompletion - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getValue(), pred, c) and - first(super.getBranch(0), succ) and - c instanceof SimpleCompletion - or - exists(int i, AstNode branch | branch = super.getBranch(i) | - last(branch, pred, c) and - first(super.getBranch(i + 1), succ) and - c.(MatchingCompletion).getValue() = false - ) - or - succ = this and - c instanceof NormalCompletion and - ( - last(super.getABranch(), pred, c) and - not c.(MatchingCompletion).getValue() = false - or - last(super.getElseBranch(), pred, c) - ) - } - } - - private class CaseElseBranchTree extends ControlFlowTree instanceof CaseElseBranch { - final override predicate propagatesAbnormal(AstNode child) { child = super.getBody() } - - final override predicate first(AstNode first) { first(super.getBody(), first) } - - final override predicate last(AstNode last, Completion c) { last(super.getBody(), last, c) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class PatternVariableAccessTree extends LocalVariableAccessTree instanceof LocalVariableWriteAccess, - CasePattern - { - final override predicate last(AstNode last, Completion c) { - super.last(last, c) and - c.(MatchingCompletion).getValue() = true - } - } - - private class ArrayPatternTree extends ControlFlowTree instanceof ArrayPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getPrefixElement(_) or - child = super.getRestVariableAccess() or - child = super.getSuffixElement(_) - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | - node = super.getClass() or - node = super.getPrefixElement(_) or - node = super.getSuffixElement(_) - | - last(node, last, c) - ) - ) - or - c.(MatchingCompletion).getValue() = true and - last = this and - c.isValidFor(this) and - not exists(super.getPrefixElement(_)) and - not exists(super.getRestVariableAccess()) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getPrefixElement(i) order by i), last, c) and - not exists(super.getRestVariableAccess()) - or - last(super.getRestVariableAccess(), last, c) and - not exists(super.getSuffixElement(_)) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getSuffixElement(i) order by i), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getPrefixElement(0) - or - not exists(super.getPrefixElement(_)) and - next = super.getRestVariableAccess() - ) - or - last(max(int i | | super.getPrefixElement(i) order by i), pred, c) and - first(super.getRestVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - or - exists(int i | - last(super.getPrefixElement(i), pred, c) and - first(super.getPrefixElement(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - or - last(super.getRestVariableAccess(), pred, c) and - first(super.getSuffixElement(0), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getSuffixElement(i), pred, c) and - first(super.getSuffixElement(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - } - } - - private class FindPatternTree extends ControlFlowTree instanceof FindPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getPrefixVariableAccess() or - child = super.getElement(_) or - child = super.getSuffixVariableAccess() - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - last(super.getSuffixVariableAccess(), last, c) - or - last(max(int i | | super.getElement(i) order by i), last, c) and - not exists(super.getSuffixVariableAccess()) - or - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | node = super.getClass() or node = super.getElement(_) | - last(node, last, c) - ) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getPrefixVariableAccess() - or - not exists(super.getPrefixVariableAccess()) and - next = super.getElement(0) - ) - or - last(super.getPrefixVariableAccess(), pred, c) and - first(super.getElement(0), succ) and - c instanceof SimpleCompletion - or - c.(MatchingCompletion).getValue() = true and - exists(int i | - last(super.getElement(i), pred, c) and - first(super.getElement(i + 1), succ) - ) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getElement(i) order by i), pred, c) and - first(super.getSuffixVariableAccess(), succ) - } - } - - private class HashPatternTree extends ControlFlowTree instanceof HashPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getValue(_) or - child = super.getRestVariableAccess() - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | - node = super.getClass() or - node = super.getValue(_) - | - last(node, last, c) - ) - ) - or - c.(MatchingCompletion).getValue() = true and - last = this and - not exists(super.getValue(_)) and - not exists(super.getRestVariableAccess()) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getValue(i) order by i), last, c) and - not exists(super.getRestVariableAccess()) - or - last(super.getRestVariableAccess(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getValue(0) - or - not exists(super.getValue(_)) and - next = super.getRestVariableAccess() - ) - or - last(max(int i | | super.getValue(i) order by i), pred, c) and - first(super.getRestVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - or - exists(int i | - last(super.getValue(i), pred, c) and - first(super.getValue(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - } - } - - private class LineLiteralTree extends LeafTree instanceof LineLiteral { } - - private class FileLiteralTree extends LeafTree instanceof FileLiteral { } - - private class EncodingLiteralTree extends LeafTree instanceof EncodingLiteral { } - - private class AlternativePatternTree extends PreOrderTree instanceof AlternativePattern { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnAlternative() } - - final override predicate last(AstNode last, Completion c) { - last(super.getAnAlternative(), last, c) and - c.(MatchingCompletion).getValue() = true - or - last(max(int i | | super.getAlternative(i) order by i), last, c) and - c.(MatchingCompletion).getValue() = false - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getAlternative(0), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getAlternative(i), pred, c) and - first(super.getAlternative(i + 1), succ) and - c.(MatchingCompletion).getValue() = false - ) - } - } - - private class AsPatternTree extends PreOrderTree instanceof AsPattern { - final override predicate propagatesAbnormal(AstNode child) { child = super.getPattern() } - - final override predicate last(AstNode last, Completion c) { - last(super.getPattern(), last, c) and - c.(MatchingCompletion).getValue() = false - or - last(super.getVariableAccess(), last, any(SimpleCompletion x)) and - c.(MatchingCompletion).getValue() = true and - not c instanceof NestedCompletion - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - or - last(super.getPattern(), pred, c) and - first(super.getVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - } - } - - private class ParenthesizedPatternTree extends StandardPreOrderTree instanceof ParenthesizedPattern - { - override ControlFlowTree getChildNode(int i) { result = super.getPattern() and i = 0 } - } - - private class ReferencePatternTree extends StandardPreOrderTree instanceof ReferencePattern { - override ControlFlowTree getChildNode(int i) { result = super.getExpr() and i = 0 } - } - - private class InClauseTree extends PreOrderTree instanceof InClause { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getPattern() or - child = super.getCondition() - } - - private predicate lastCondition(AstNode last, BooleanCompletion c, boolean flag) { - last(super.getCondition(), last, c) and - ( - flag = true and super.hasIfCondition() - or - flag = false and super.hasUnlessCondition() - ) - } - - final override predicate last(AstNode last, Completion c) { - last(super.getPattern(), last, c) and - c.(MatchingCompletion).getValue() = false - or - exists(BooleanCompletion bc, boolean flag, MatchingCompletion mc | - this.lastCondition(last, bc, flag) and - c = - any(NestedMatchingCompletion nmc | - nmc.getInnerCompletion() = bc and nmc.getOuterCompletion() = mc - ) - | - mc.getValue() = false and - bc.getValue() = flag.booleanNot() - or - not exists(super.getBody()) and - mc.getValue() = true and - bc.getValue() = flag - ) - or - last(super.getBody(), last, c) - or - not exists(super.getBody()) and - not exists(super.getCondition()) and - last(super.getPattern(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - or - exists(Expr next | - last(super.getPattern(), pred, c) and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getCondition() - or - not exists(super.getCondition()) and next = super.getBody() - ) - or - exists(boolean flag | - this.lastCondition(pred, c, flag) and - c.(BooleanCompletion).getValue() = flag and - first(super.getBody(), succ) - ) - } - } - - private class CharacterTree extends LeafTree instanceof CharacterLiteral { } - - private class ClassDeclarationTree extends NamespaceTree instanceof ClassDeclaration { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getScopeExpr() and i = 0 and rescuable = false - or - result = super.getSuperclassExpr() and - i = count(super.getScopeExpr()) and - rescuable = true - or - result = - super - .getBodyChild(i - count(super.getScopeExpr()) - count(super.getSuperclassExpr()), - rescuable) - } - } - - private class ClassVariableTree extends LeafTree instanceof ClassVariableAccess { } - - private class ConditionalExprTree extends PostOrderTree instanceof ConditionalExpr { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getCondition() or child = super.getBranch(_) - } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(boolean b | - last(super.getCondition(), pred, c) and - b = c.(BooleanCompletion).getValue() - | - first(super.getBranch(b), succ) - or - not exists(super.getBranch(b)) and - succ = this - ) - or - last(super.getBranch(_), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class ConditionalLoopTree extends PostOrderTree instanceof ConditionalLoop { - final override predicate propagatesAbnormal(AstNode child) { child = super.getCondition() } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getCondition(), pred, c) and - super.entersLoopWhenConditionIs(c.(BooleanCompletion).getValue()) and - first(super.getBody(), succ) - or - last(super.getBody(), pred, c) and - first(super.getCondition(), succ) and - c.continuesLoop() - or - last(super.getBody(), pred, c) and - first(super.getBody(), succ) and - c instanceof RedoCompletion - or - succ = this and - ( - last(super.getCondition(), pred, c) and - super.entersLoopWhenConditionIs(c.(BooleanCompletion).getValue().booleanNot()) - or - last(super.getBody(), pred, c) and - not c.continuesLoop() and - not c instanceof BreakCompletion and - not c instanceof RedoCompletion - or - last(super.getBody(), pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion()) - ) - } - } - - private class ConstantAccessTree extends PostOrderTree instanceof ConstantAccess { - ConstantAccessTree() { - not this instanceof ClassDeclaration and - not this instanceof ModuleDeclaration and - // constant accesses with scope expression in compound assignments are desugared - not ( - this = any(AssignOperation op).getLeftOperand() and - exists(super.getScopeExpr()) - ) - } - - final override predicate propagatesAbnormal(AstNode child) { child = super.getScopeExpr() } - - final override predicate first(AstNode first) { - first(super.getScopeExpr(), first) - or - not exists(super.getScopeExpr()) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getScopeExpr(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - /** A parameter that may have a default value. */ - abstract class DefaultValueParameterTree extends ControlFlowTree { - abstract Expr getDefaultValueExpr(); - - abstract AstNode getAccessNode(); - - predicate hasDefaultValue() { exists(this.getDefaultValueExpr()) } - - final override predicate propagatesAbnormal(AstNode child) { - child = this.getDefaultValueExpr() or child = this.getAccessNode() - } - - final override predicate first(AstNode first) { first = this.getAccessNode() } - - final override predicate last(AstNode last, Completion c) { - last(this.getDefaultValueExpr(), last, c) and - c instanceof NormalCompletion - or - last = this.getAccessNode() and - ( - not this.hasDefaultValue() and - c instanceof SimpleCompletion - or - this.hasDefaultValue() and - c.(MatchingCompletion).getValue() = true and - c.isValidFor(this) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this.getAccessNode() and - first(this.getDefaultValueExpr(), succ) and - c.(MatchingCompletion).getValue() = false - } - } - - private class DestructuredParameterTree extends StandardPostOrderTree instanceof DestructuredParameter - { - final override ControlFlowTree getChildNode(int i) { result = super.getElement(i) } - } - - private class DesugaredTree extends ControlFlowTree { - ControlFlowTree desugared; - - DesugaredTree() { desugared = this.getDesugared() } - - final override predicate propagatesAbnormal(AstNode child) { - desugared.propagatesAbnormal(child) - } - - final override predicate first(AstNode first) { desugared.first(first) } - - final override predicate last(AstNode last, Completion c) { desugared.last(last, c) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class DoBlockTree extends CallableTree instanceof DoBlock { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getLocalVariable(i - super.getNumberOfParameters()) - or - result = super.getBody() and - i = super.getNumberOfParameters() + count(super.getALocalVariable()) - } - } - - private class EmptyStatementTree extends LeafTree instanceof EmptyStmt { } - - class EndBlockTree extends StmtSequenceTree instanceof EndBlock { - override predicate first(AstNode first) { first = this } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(super.getBodyChild(i, _), pred, c) and - first(super.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - } - } - - private class ForwardedArgumentsTree extends LeafTree instanceof ForwardedArguments { } - - private class ForwardParameterTree extends LeafTree instanceof ForwardParameter { } - - private class GlobalVariableTree extends LeafTree instanceof GlobalVariableAccess { } - - private class HashSplatNilParameterTree extends LeafTree instanceof HashSplatNilParameter { } - - private class HashSplatParameterTree extends NonDefaultValueParameterTree instanceof HashSplatParameter - { } - - private class HereDocTree extends StandardPostOrderTree instanceof HereDoc { - final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) } - } - - private class InstanceVariableTree extends StandardPostOrderTree instanceof InstanceVariableAccess - { - final override ControlFlowTree getChildNode(int i) { result = super.getReceiver() and i = 0 } - } - - private class KeywordParameterTree extends DefaultValueParameterTree instanceof KeywordParameter { - final override Expr getDefaultValueExpr() { result = super.getDefaultValue() } - - final override AstNode getAccessNode() { result = super.getDefiningAccess() } - } - - private class LambdaTree extends CallableTree instanceof Lambda { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - } - - private class LocalVariableAccessTree extends LeafTree instanceof LocalVariableAccess { } - - private class LogicalAndTree extends PostOrderTree instanceof LogicalAndExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - first(super.getRightOperand(), succ) - or - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - succ = this - or - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class LogicalNotTree extends PostOrderTree instanceof NotExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getOperand() } - - final override predicate first(AstNode first) { first(super.getOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - succ = this and - last(super.getOperand(), pred, c) and - c instanceof NormalCompletion - } - } - - private class LogicalOrTree extends PostOrderTree instanceof LogicalOrExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - first(super.getRightOperand(), succ) - or - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - succ = this - or - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class MethodCallTree extends CallTree instanceof MethodCall { - final override ControlFlowTree getChildNode(int i) { - result = super.getReceiver() and i = 0 - or - result = super.getArgument(i - 1) - or - result = super.getBlock() and i = 1 + super.getNumberOfArguments() - } - } - - private class MethodNameTree extends LeafTree instanceof MethodName, AstInternal::TTokenMethodName - { } - - private class MethodTree extends CallableTree instanceof Method { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - } - - private class ModuleDeclarationTree extends NamespaceTree instanceof ModuleDeclaration { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getScopeExpr() and i = 0 and rescuable = false - or - result = NamespaceTree.super.getBodyChild(i - count(super.getScopeExpr()), rescuable) - } - } - - /** - * Namespaces (i.e. modules or classes) behave like other `BodyStmt`s except they are - * executed in pre-order rather than post-order. We do this in order to insert a write for - * `self` before any subsequent reads in the namespace body. - */ - private class NamespaceTree extends BodyStmtTree instanceof Namespace { - final override predicate first(AstNode first) { first = this } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) - or - pred = this and - super.first(succ) and - c instanceof SimpleCompletion - } - - final override predicate last(AstNode last, Completion c) { - super.last(last, c) - or - not exists(this.getAChild(_)) and - last = this and - c.isValidFor(this) - } - } - - private class NilTree extends LeafTree instanceof NilLiteral { } - - private class NumericLiteralTree extends LeafTree instanceof NumericLiteral { } - - private class OptionalParameterTree extends DefaultValueParameterTree instanceof OptionalParameter - { - final override Expr getDefaultValueExpr() { result = super.getDefaultValue() } - - final override AstNode getAccessNode() { result = super.getDefiningAccess() } - } - - private class PairTree extends StandardPostOrderTree instanceof Pair { - final override ControlFlowTree getChildNode(int i) { - result = super.getKey() and i = 0 - or - result = super.getValue() and i = 1 - } - } - - private class RangeLiteralTree extends StandardPostOrderTree instanceof RangeLiteral { - final override ControlFlowTree getChildNode(int i) { - result = super.getBegin() and i = 0 - or - result = super.getEnd() and i = 1 - } - } - - private class RedoStmtTree extends LeafTree instanceof RedoStmt { } - - private class RescueModifierTree extends PostOrderTree instanceof RescueModifierExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getHandler() } - - final override predicate first(AstNode first) { first(super.getBody(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getBody(), pred, c) and - ( - c instanceof RaiseCompletion and - first(super.getHandler(), succ) - or - not c instanceof RaiseCompletion and - succ = this - ) - or - last(super.getHandler(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class RescueTree extends PostOrderTree instanceof RescueClause { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getAnException() or - child = super.getBody() - } - - final override predicate first(AstNode first) { - first(super.getException(0), first) - or - not exists(super.getException(0)) and - ( - first(super.getVariableExpr(), first) - or - not exists(super.getVariableExpr()) and - ( - first(super.getBody(), first) - or - not exists(super.getBody()) and first = this - ) - ) - } - - private Expr getLastException() { - exists(int i | result = super.getException(i) and not exists(super.getException(i + 1))) - } - - predicate lastNoMatch(AstNode last, Completion c) { - last(this.getLastException(), last, c) and - c.(MatchingCompletion).getValue() = false - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getAnException(), pred, c) and - c.(MatchingCompletion).getValue() = true and - ( - first(super.getVariableExpr(), succ) - or - not exists(super.getVariableExpr()) and - ( - first(super.getBody(), succ) - or - not exists(super.getBody()) and succ = this - ) - ) - or - exists(int i | - last(super.getException(i), pred, c) and - c.(MatchingCompletion).getValue() = false and - first(super.getException(i + 1), succ) - ) - or - last(super.getVariableExpr(), pred, c) and - c instanceof NormalCompletion and - ( - first(super.getBody(), succ) - or - not exists(super.getBody()) and succ = this - ) - or - last(super.getBody(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class RetryStmtTree extends LeafTree instanceof RetryStmt { } - - private class ReturningStmtTree extends StandardPostOrderTree instanceof ReturningStmt { - final override ControlFlowTree getChildNode(int i) { result = super.getValue() and i = 0 } - } - - private class SimpleParameterTree extends NonDefaultValueParameterTree instanceof SimpleParameter { - } - - // Corner case: For duplicated '_' parameters, only the first occurrence has a defining - // access. For subsequent parameters we simply include the parameter itself in the CFG - private class SimpleParameterTreeDupUnderscore extends LeafTree instanceof SimpleParameter { - SimpleParameterTreeDupUnderscore() { not exists(this.getDefiningAccess()) } - } - - private class SingletonClassTree extends BodyStmtTree instanceof SingletonClass { - final override predicate first(AstNode first) { - super.first(first) - or - not exists(this.getAChild(_)) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) - or - succ = this and - super.last(pred, c) - } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.isValidFor(this) - } - - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - ( - result = super.getValue() and i = 0 and rescuable = false - or - result = BodyStmtTree.super.getBodyChild(i - 1, rescuable) - ) - } - } - - private class SingletonMethodTree extends CallableTree instanceof SingletonMethod { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - - override predicate first(AstNode first) { first(super.getObject(), first) } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - CallableTree.super.succ(pred, succ, c) - or - last(super.getObject(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class SplatParameterTree extends NonDefaultValueParameterTree instanceof SplatParameter { - } - - class StmtSequenceTree extends PostOrderTree instanceof StmtSequence { - override predicate propagatesAbnormal(AstNode child) { child = super.getAStmt() } - - override predicate first(AstNode first) { - // If this sequence contains any statements, go to the first one. - first(super.getStmt(0), first) - or - // Otherwise, treat this node as a leaf node. - not exists(super.getStmt(0)) and first = this - } - - /** Gets the `i`th child in the body of this body statement. */ - AstNode getBodyChild(int i, boolean rescuable) { - result = super.getStmt(i) and - rescuable = true - } - - final AstNode getLastBodyChild() { - exists(int i | - result = this.getBodyChild(i, _) and - not exists(this.getBodyChild(i + 1, _)) - ) - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - or - succ = this and - last(this.getLastBodyChild(), pred, c) and - c instanceof NormalCompletion - } - } - - private class StringConcatenationTree extends StandardPostOrderTree instanceof StringConcatenation - { - final override ControlFlowTree getChildNode(int i) { result = super.getString(i) } - } - - private class StringlikeLiteralTree extends StandardPostOrderTree instanceof StringlikeLiteral { - StringlikeLiteralTree() { - not this instanceof HereDoc and - not this instanceof AstInternal::TSimpleSymbolLiteralSynth - } - - final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) } - } - - private class StringComponentTree extends LeafTree instanceof StringComponent { - StringComponentTree() { - // Interpolations contain `StmtSequence`s, so they shouldn't be treated as leaf nodes. - not this instanceof StringInterpolationComponent and - // In the interests of brevity we treat regexes as string literals when constructing the CFG. - // Thus we must exclude regex interpolations here too. - not this instanceof RegExpInterpolationComponent - } - } - - private class ToplevelTree extends BodyStmtTree instanceof Toplevel { - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getBeginBlock(i) and rescuable = true - or - result = BodyStmtTree.super.getBodyChild(i - count(super.getABeginBlock()), rescuable) - } - } - - private class UndefStmtTree extends StandardPreOrderTree instanceof UndefStmt { - final override ControlFlowTree getChildNode(int i) { result = super.getMethodName(i) } - } - - private class WhenTree extends ControlFlowTree instanceof WhenClause { - final override predicate propagatesAbnormal(AstNode child) { - child = [super.getAPattern(), super.getBody()] - } - - final Expr getLastPattern() { - exists(int i | - result = super.getPattern(i) and - not exists(super.getPattern(i + 1)) - ) - } - - final override predicate first(AstNode first) { first(super.getPattern(0), first) } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.isValidFor(this) and - c.(ConditionalCompletion).getValue() = false - or - last(super.getBody(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - c.isValidFor(this) and - c.(ConditionalCompletion).getValue() = true and - first(super.getBody(), succ) - or - exists(int i, Expr p, boolean b | - p = super.getPattern(i) and - last(p, pred, c) and - b = c.(ConditionalCompletion).getValue() - | - b = true and - succ = this - or - b = false and - first(super.getPattern(i + 1), succ) - or - not exists(super.getPattern(i + 1)) and - succ = this - ) - } - } -} - -private Scope parent(Scope n) { - result = n.getOuterScope() and - not n instanceof CfgScopeImpl -} - -cached -private CfgScope getCfgScopeImpl(AstNode n) { result = parent*(scopeOfInclSynth(n)) } - -/** Gets the CFG scope of node `n`. */ -pragma[inline] -CfgScope getCfgScope(AstNode n) { - exists(AstNode n0 | - pragma[only_bind_into](n0) = n and - pragma[only_bind_into](result) = getCfgScopeImpl(n0) - ) -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll index 387fb03dc9a8..245f592abf8e 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll @@ -6,9 +6,18 @@ private import codeql.ruby.CFG /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ pragma[nomagic] predicate guardControlsBlock(CfgNodes::AstCfgNode guard, BasicBlock bb, boolean branch) { - exists(ConditionBlock conditionBlock, ConditionalSuccessor s | + exists(BasicBlock conditionBlock, ConditionalSuccessor s | guard = conditionBlock.getLastNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) ) + or + exists(BasicBlock whenBlock, ConditionalSuccessor s, ControlFlowNode guardNode, int i | + guardNode.isAfter(guard.(CfgNodes::ExprNodes::WhenClauseCfgNode).getAstNode()) and + whenBlock.getNode(i) = guardNode and + i != 0 and + guardNode = any(ControlFlowNode n).getASuccessor(s) and + s.getValue() = branch and + whenBlock.dominates(bb) + ) } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll index 45b299a5d2b7..36061ea5f635 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll @@ -3,22 +3,22 @@ overlay[local] module; private import codeql.ruby.AST -private import Completion +private import codeql.controlflow.SuccessorType /** A call that definitely does not return (conservative analysis). */ abstract class NonReturningCall extends MethodCall { - /** Gets a valid completion for this non-returning call. */ - abstract Completion getACompletion(); + /** Gets a valid successor type for this non-returning call. */ + abstract AbruptSuccessor getASuccessorType(); } private class RaiseCall extends NonReturningCall { RaiseCall() { this.getMethodName() = "raise" } - override RaiseCompletion getACompletion() { not result instanceof NestedCompletion } + override ExceptionSuccessor getASuccessorType() { any() } } private class ExitCall extends NonReturningCall { ExitCall() { this.getMethodName() in ["abort", "exit"] } - override ExitCompletion getACompletion() { not result instanceof NestedCompletion } + override ExitSuccessor getASuccessorType() { any() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll deleted file mode 100644 index 737f450b4f23..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll +++ /dev/null @@ -1,348 +0,0 @@ -/** - * Provides classes and predicates relevant for splitting the control flow graph. - */ -overlay[local] -module; - -private import codeql.ruby.AST as Ast -private import Completion as Comp -private import Comp -private import ControlFlowGraphImpl -private import codeql.ruby.controlflow.ControlFlowGraph - -cached -private module Cached { - cached - newtype TSplitKind = - TConditionalCompletionSplitKind() { forceCachingInSameStage() } or - TEnsureSplitKind(int nestLevel) { nestLevel = any(Trees::BodyStmtTree t).getNestLevel() } - - cached - newtype TSplit = - TConditionalCompletionSplit(ConditionalCompletion c) or - TEnsureSplit(EnsureSplitting::EnsureSplitType type, int nestLevel) { - nestLevel = any(Trees::BodyStmtTree t).getNestLevel() - } -} - -import Cached - -/** A split for a control flow node. */ -class Split extends TSplit { - /** Gets a textual representation of this split. */ - string toString() { none() } -} - -module ConditionalCompletionSplitting { - /** - * A split for conditional completions. For example, in - * - * ```rb - * def method x - * if x < 2 and x > 0 - * puts "x is 1" - * end - * end - * ``` - * - * we record whether `x < 2` and `x > 0` evaluate to `true` or `false`, and - * restrict the edges out of `x < 2 and x > 0` accordingly. - */ - class ConditionalCompletionSplit extends Split, TConditionalCompletionSplit { - ConditionalCompletion completion; - - ConditionalCompletionSplit() { this = TConditionalCompletionSplit(completion) } - - ConditionalCompletion getCompletion() { result = completion } - - override string toString() { result = completion.toString() } - } - - private class ConditionalCompletionSplitKind_ extends SplitKind, TConditionalCompletionSplitKind { - override int getListOrder() { result = 0 } - - override predicate isEnabled(AstNode n) { this.appliesTo(n) } - - override string toString() { result = "ConditionalCompletion" } - } - - module ConditionalCompletionSplittingInput { - private import Completion as Comp - - class ConditionalCompletion = Comp::ConditionalCompletion; - - class ConditionalCompletionSplitKind extends ConditionalCompletionSplitKind_, TSplitKind { } - - class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - - bindingset[parent, parentCompletion] - predicate condPropagateExpr( - AstNode parent, ConditionalCompletion parentCompletion, AstNode child, - ConditionalCompletion childCompletion - ) { - child = parent.(Ast::NotExpr).getOperand() and - childCompletion.(BooleanCompletion).getDual() = parentCompletion - or - childCompletion = parentCompletion and - ( - child = parent.(Ast::LogicalAndExpr).getAnOperand() - or - child = parent.(Ast::LogicalOrExpr).getAnOperand() - or - child = parent.(Ast::StmtSequence).getLastStmt() - or - child = parent.(Ast::ConditionalExpr).getBranch(_) - ) - } - } - - int getNextListOrder() { result = 1 } - - private class ConditionalCompletionSplitImpl extends SplitImplementations::ConditionalCompletionSplitting::ConditionalCompletionSplitImpl - { - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - super.hasEntry(pred, succ, c) - or - // a non-standard case is needed for `when` clauses - succ(pred, succ, c) and - succ instanceof Ast::WhenClause and - c = this.getCompletion() - } - } -} - -class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - -module EnsureSplitting { - /** - * The type of a split `ensure` node. - * - * The type represents one of the possible ways of entering an `ensure` - * block. For example, if a block ends with a `return` statement, then - * the `ensure` block must end with a `return` as well (provided that - * the `ensure` block executes normally). - */ - class EnsureSplitType extends SuccessorType { - EnsureSplitType() { not this instanceof ConditionalSuccessor } - - /** Holds if this split type matches entry into an `ensure` block with completion `c`. */ - predicate isSplitForEntryCompletion(Completion c) { - if c instanceof NormalCompletion - then - // If the entry into the `ensure` block completes with any normal completion, - // it simply means normal execution after the `ensure` block - this instanceof DirectSuccessor - else this = c.getAMatchingSuccessorType() - } - } - - /** A node that belongs to an `ensure` block. */ - private class EnsureNode extends AstNode { - private Trees::BodyStmtTree block; - - EnsureNode() { this = block.getAnEnsureDescendant() } - - int getNestLevel() { result = block.getNestLevel() } - - /** Holds if this node is the entry node in the `ensure` block it belongs to. */ - predicate isEntryNode() { first(block.getEnsure(), this) } - - Ast::BodyStmt getBlock() { result = block } - - pragma[noinline] - predicate isEntered(AstNode pred, int nestLevel, Completion c) { - this.isEntryNode() and - nestLevel = this.getNestLevel() and - succ(pred, this, c) and - // the entry node may be reachable via a backwards loop edge; in this case - // the split has already been entered - not pred = block.getAnEnsureDescendant() - } - } - - /** - * A split for nodes belonging to an `ensure` block, which determines how to - * continue execution after leaving the `ensure` block. For example, in - * - * ```rb - * begin - * if x - * raise "Exception" - * end - * ensure - * puts "Ensure" - * end - * ``` - * - * all control flow nodes in the `ensure` block have two splits: one representing - * normal execution of the body (when `x` evaluates to `true`), and one representing - * exceptional execution of the body (when `x` evaluates to `false`). - */ - class EnsureSplit extends Split, TEnsureSplit { - private EnsureSplitType type; - private int nestLevel; - - EnsureSplit() { this = TEnsureSplit(type, nestLevel) } - - /** - * Gets the type of this `ensure` split, that is, how to continue execution after the - * `ensure` block. - */ - EnsureSplitType getType() { result = type } - - /** Gets the nesting level. */ - int getNestLevel() { result = nestLevel } - - override string toString() { - if type instanceof DirectSuccessor - then result = "" - else - if nestLevel > 0 - then result = "ensure(" + nestLevel + "): " + type.toString() - else result = "ensure: " + type.toString() - } - } - - private int getListOrder(EnsureSplitKind kind) { - result = ConditionalCompletionSplitting::getNextListOrder() + kind.getNestLevel() - } - - int getNextListOrder() { - result = max([getListOrder(_) + 1, ConditionalCompletionSplitting::getNextListOrder()]) - } - - private class EnsureSplitKind extends SplitKind, TEnsureSplitKind { - private int nestLevel; - - EnsureSplitKind() { this = TEnsureSplitKind(nestLevel) } - - /** Gets the nesting level. */ - int getNestLevel() { result = nestLevel } - - override int getListOrder() { result = getListOrder(this) } - - override string toString() { result = "ensure (" + nestLevel + ")" } - } - - private class EnsureSplitImpl extends SplitImpl instanceof EnsureSplit { - override EnsureSplitKind getKind() { result.getNestLevel() = super.getNestLevel() } - - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - succ.(EnsureNode).isEntered(pred, super.getNestLevel(), c) and - super.getType().isSplitForEntryCompletion(c) - } - - override predicate hasEntryScope(CfgScope scope, AstNode first) { none() } - - /** - * Holds if this split applies to `pred`, where `pred` is a valid predecessor. - */ - private predicate appliesToPredecessor(AstNode pred) { - this.appliesTo(pred) and - (succ(pred, _, _) or succExit(_, pred, _)) - } - - pragma[noinline] - private predicate exit0(AstNode pred, Trees::BodyStmtTree block, int nestLevel, Completion c) { - this.appliesToPredecessor(pred) and - nestLevel = block.getNestLevel() and - block.last(pred, c) - } - - /** - * Holds if `pred` may exit this split with completion `c`. The Boolean - * `inherited` indicates whether `c` is an inherited completion from the - * body. - */ - private predicate exit(AstNode pred, Completion c, boolean inherited) { - exists(Trees::BodyStmtTree block, EnsureSplitType type | - this.exit0(pred, block, super.getNestLevel(), c) and - type = super.getType() - | - if last(block.getEnsure(), pred, c) - then - // `ensure` block can itself exit with completion `c`: either `c` must - // match this split, `c` must be an abnormal completion, or this split - // does not require another completion to be recovered - inherited = false and - ( - type = c.getAMatchingSuccessorType() - or - not c instanceof NormalCompletion - or - type instanceof DirectSuccessor - ) - else ( - // `ensure` block can exit with inherited completion `c`, which must - // match this split - inherited = true and - type = c.getAMatchingSuccessorType() and - not type instanceof DirectSuccessor - ) - ) - or - // If this split is normal, and an outer split can exit based on an inherited - // completion, we need to exit this split as well. For example, in - // - // ```rb - // def m(b1, b2) - // if b1 - // return - // end - // ensure - // begin - // if b2 - // raise "Exception" - // end - // ensure - // puts "inner ensure" - // end - // end - // ``` - // - // if the outer split for `puts "inner ensure"` is `return` and the inner split - // is "normal" (corresponding to `b1 = true` and `b2 = false`), then the inner - // split must be able to exit with a `return` completion. - this.appliesToPredecessor(pred) and - exists(EnsureSplitImpl outer | - outer.(EnsureSplit).getNestLevel() = super.getNestLevel() - 1 and - outer.exit(pred, c, inherited) and - super.getType() instanceof DirectSuccessor and - inherited = true - ) - } - - override predicate hasExit(AstNode pred, AstNode succ, Completion c) { - succ(pred, succ, c) and - ( - this.exit(pred, c, _) - or - this.exit(pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _) - ) - } - - override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) { - succExit(scope, last, c) and - ( - this.exit(last, c, _) - or - this.exit(last, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _) - ) - } - - override predicate hasSuccessor(AstNode pred, AstNode succ, Completion c) { - this.appliesToPredecessor(pred) and - succ(pred, succ, c) and - succ = - any(EnsureNode en | - if en.isEntryNode() and en.getBlock() != pred.(EnsureNode).getBlock() - then - // entering a nested `ensure` block - en.getNestLevel() > super.getNestLevel() - else - // staying in the same (possibly nested) `ensure` block as `pred` - en.getNestLevel() >= super.getNestLevel() - ) - } - } -} diff --git a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll index 08ca08732b6b..d95740a8c867 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll @@ -384,20 +384,7 @@ module Ssa { inp = SsaImpl::phiHasInputFromBlock(this, bb) } - private string getSplitString() { - result = this.getBasicBlock().getFirstNode().(CfgNodes::AstCfgNode).getSplitsString() - } - - override string toString() { - exists(string prefix | - prefix = "[" + this.getSplitString() + "] " - or - not exists(this.getSplitString()) and - prefix = "" - | - result = prefix + "phi" - ) - } + override string toString() { result = "phi" } /* * The location of a phi node is the same as the location of the first node diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index 3c647f41bbbe..3d3e8a4d0d04 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -183,7 +183,7 @@ class NormalCall extends DataFlowCall, TNormalCall { override CfgNodes::ExprNodes::CallCfgNode asCall() { result = c } - override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getScope()) } + override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getEnclosingCallable()) } override string toString() { result = c.toString() } @@ -700,7 +700,7 @@ private CfgScope privateFilter(DataFlowCall call) { // This may remove some plausible targets, but also removes a lot of // implausible targets ( - isToplevelMethodInFile(result, call.asCall().getFile()) or + isToplevelMethodInFile(result, call.asCall().getLocation().getFile()) or not isToplevelMethodInFile(result, _) ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 466b08922819..0d3829a1fad2 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -95,7 +95,7 @@ CfgNodes::ExprCfgNode getPostUpdateReverseStep(CfgNodes::ExprCfgNode e) { pragma[nomagic] Ssa::Definition getParameterDef(NamedParameter p) { exists(BasicBlock bb, int i | - bb.getNode(i).getAstNode() = p.getDefiningAccess() and + bb.getNode(i).injects(p.getDefiningAccess()) and result.definesAt(_, bb, i) ) } @@ -285,7 +285,6 @@ predicate isNonConstantExpr(CfgNodes::ExprCfgNode n) { /** Provides logic related to captured variables. */ module VariableCapture { private import codeql.dataflow.VariableCapture as Shared - private import codeql.ruby.controlflow.BasicBlocks as BasicBlocks private predicate closureFlowStep(CfgNodes::ExprCfgNode e1, CfgNodes::ExprCfgNode e2) { e1 = getALastEvalNode(e2) @@ -296,13 +295,11 @@ module VariableCapture { ) } - private module CaptureInput implements Shared::InputSig { + private module CaptureInput implements Shared::InputSig { private import codeql.ruby.controlflow.ControlFlowGraph as Cfg private import TaintTrackingPrivate as TaintTrackingPrivate - Callable basicBlockGetEnclosingCallable(BasicBlocks::Cfg::BasicBlock bb) { - result = bb.getScope() - } + Callable basicBlockGetEnclosingCallable(BasicBlock bb) { result = bb.getScope() } class CapturedVariable extends LocalVariable { CapturedVariable() { @@ -374,7 +371,7 @@ module VariableCapture { class ClosureExpr = CaptureInput::ClosureExpr; - module Flow = Shared::Flow; + module Flow = Shared::Flow; private Flow::ClosureNode asClosureNode(Node n) { result = n.(CaptureNode).getSynthesizedCaptureNode() @@ -854,7 +851,7 @@ class ReturningStatementNode extends NodeImpl, TReturningNode { /** Gets the expression corresponding to this node. */ CfgNodes::ReturningCfgNode getReturningNode() { result = n } - override CfgScope getCfgScopeImpl() { result = n.getScope() } + override CfgScope getCfgScopeImpl() { result = n.getEnclosingCallable() } override Location getLocationImpl() { result = n.getLocation() } @@ -1354,7 +1351,7 @@ module ArgumentNodes { this.sourceArgumentOf(call.asCall(), pos) } - override CfgScope getCfgScopeImpl() { result = yield.getScope() } + override CfgScope getCfgScopeImpl() { result = yield.getEnclosingCallable() } override Location getLocationImpl() { result = yield.getLocation() } } @@ -1384,7 +1381,7 @@ module ArgumentNodes { this.sourceArgumentOf(call.asCall(), pos) } - override CfgScope getCfgScopeImpl() { result = sup.getScope() } + override CfgScope getCfgScopeImpl() { result = sup.getEnclosingCallable() } override Location getLocationImpl() { result = sup.getLocation() } } @@ -1607,7 +1604,7 @@ private module ReturnNodes { private predicate isValid(CfgNodes::ReturningCfgNode node) { exists(ReturningStmt stmt, Callable scope | stmt = node.getAstNode() and - scope = node.getScope() + scope = node.getEnclosingCallable() | stmt instanceof ReturnStmt and (scope instanceof Method or scope instanceof SingletonMethod or scope instanceof Lambda) @@ -1627,8 +1624,8 @@ private module ReturnNodes { class ExplicitReturnNode extends SourceReturnNode, ReturningStatementNode { ExplicitReturnNode() { isValid(n) and - n.getASuccessor().(CfgNodes::AnnotatedExitNode).isNormal() and - n.getScope() instanceof Callable + n.getASuccessor() instanceof ControlFlow::NormalExitNode and + n.getEnclosingCallable() instanceof Callable } override ReturnKind getKindSource() { @@ -2399,9 +2396,7 @@ module TypeInference { private predicate hasTypeCheckedRead( Ssa::Definition def, CfgNodes::ExprCfgNode caseRead, CfgNodes::ExprCfgNode read, Module m ) { - exists( - CfgNodes::ExprCfgNode pattern, ConditionBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case - | + exists(CfgNodes::ExprCfgNode pattern, BasicBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case | m = resolveConstantReadAccess(pattern.getExpr()) and cb.getLastNode() = pattern and cb.edgeDominates(read.getBasicBlock(), any(MatchingSuccessor match | match.getValue() = true)) and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll index 74394150ca32..9f5dfd9dcc25 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll @@ -4,13 +4,11 @@ module; private import codeql.ssa.Ssa as SsaImplCommon private import codeql.ruby.AST private import codeql.ruby.CFG as Cfg -private import codeql.ruby.controlflow.BasicBlocks as BasicBlocks -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl private import codeql.ruby.dataflow.SSA private import codeql.ruby.ast.Variable private import Cfg::CfgNodes::ExprNodes -private class BasicBlock = BasicBlocks::Cfg::BasicBlock; +private class BasicBlock = Cfg::BasicBlock; module SsaInput implements SsaImplCommon::InputSig { private import codeql.ruby.controlflow.ControlFlowGraph as Cfg @@ -25,11 +23,11 @@ module SsaInput implements SsaImplCommon::InputSig { ( exists(Scope scope | scope = v.(SelfVariable).getDeclaringScope() | // We consider the `self` variable to have a single write at the entry to a method block... - scope = bb.(BasicBlocks::EntryBasicBlock).getScope() and + scope = bb.(Cfg::EntryBasicBlock).getScope() and i = 0 or // ...or a class or module block. - bb.getNode(i).getAstNode() = scope.(ModuleBase).getAControlFlowEntryNode() and + bb.getNode(i).isBefore(scope.(ModuleBase)) and not scope instanceof Toplevel // handled by case above ) or @@ -60,7 +58,7 @@ module SsaInput implements SsaImplCommon::InputSig { } } -import SsaImplCommon::Make as Impl +import SsaImplCommon::Make as Impl class Definition = Impl::Definition; @@ -98,12 +96,17 @@ private predicate writesCapturedVariable(Cfg::BasicBlock bb, LocalVariable v) { ) } +private predicate isAnnotatedExitBlock(BasicBlock bb) { + bb.getANode() instanceof Cfg::ControlFlow::AnnotatedExitNode +} + /** * Holds if a pseudo read of captured variable `v` should be inserted * at index `i` in exit block `bb`. */ -private predicate capturedExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, LocalVariable v) { +private predicate capturedExitRead(BasicBlock bb, int i, LocalVariable v) { writesCapturedVariable(bb.getAPredecessor*(), v) and + isAnnotatedExitBlock(bb) and i = bb.length() } @@ -112,13 +115,11 @@ private predicate capturedExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, Local * at index `i` in basic block `bb`. We do this to ensure that namespace * self-variables always get an SSA definition. */ -private predicate namespaceSelfExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, SelfVariable v) { - exists(Namespace ns, AstNode last | +private predicate namespaceSelfExitRead(BasicBlock bb, int i, SelfVariable v) { + exists(Namespace ns, Cfg::ControlFlowNode n | v.getDeclaringScope() = ns and - last = ControlFlowGraphImpl::getAControlFlowExitNode(ns) and - if last = ns - then bb.getNode(i).getAPredecessor().getAstNode() = last - else bb.getNode(i).getAstNode() = last + n.isAfter(ns) and + if n.isBefore(ns) then bb.getNode(i - 1) = n else bb.getNode(i) = n ) } @@ -129,7 +130,8 @@ private predicate namespaceSelfExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, pragma[noinline] private predicate hasCapturedRead(Variable v, Cfg::CfgScope scope) { any(LocalVariableReadAccessCfgNode read | - read.getVariable() = v and scope = read.getScope().getOuterCfgScope*() + read.getVariable() = v and + scope = read.getEnclosingCallable().(Cfg::CfgScope).getOuterCfgScope*() ).getExpr().isCapturedAccess() } @@ -177,7 +179,7 @@ private predicate capturedCallRead(CallCfgNode call, Cfg::BasicBlock bb, int i, private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) { exists(VariableReadAccess read | read.getVariable() = v and - read = bb.getNode(i).getAstNode() + bb.getNode(i).injects(read) ) } @@ -188,7 +190,8 @@ private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) pragma[noinline] private predicate hasCapturedWrite(Variable v, Cfg::CfgScope scope) { any(LocalVariableWriteAccessCfgNode write | - write.getVariable() = v and scope = write.getScope().getOuterCfgScope*() + write.getVariable() = v and + scope = write.getEnclosingCallable().(Cfg::CfgScope).getOuterCfgScope*() ).getExpr().isCapturedAccess() } @@ -393,7 +396,7 @@ class NormalParameter extends Parameter { pragma[nomagic] Definition getParameterDef(NamedParameter p) { exists(Cfg::BasicBlock bb, int i | - bb.getNode(i).getAstNode() = p.getDefiningAccess() and + bb.getNode(i).injects(p.getDefiningAccess()) and result.definesAt(_, bb, i) ) } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll b/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll index eabee2ea5133..3ffdb915c6f3 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll @@ -289,7 +289,7 @@ module Sinatra { private predicate blockPostSelf(DataFlow::PostUpdateNode n, DataFlow::BlockNode b) { exists(SelfVariableAccessCfgNode self | n.getPreUpdateNode().asExpr() = self and - self.getScope() = b.asExpr().getAstNode() + self.getEnclosingCallable() = b.asExpr().getAstNode() ) } diff --git a/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll index a64cd1039c17..cf752c3aaeb1 100644 --- a/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll @@ -46,8 +46,8 @@ module ConditionalBypass { SensitiveAction action; SensitiveActionGuardConditional() { - exists(ConditionBlock cb, BasicBlock controlled | - cb.edgeDominates(controlled, _) and + exists(BasicBlock cb, BasicBlock controlled | + cb.edgeDominates(controlled, any(ConditionalSuccessor s)) and controlled.getANode() = action.asExpr() and cb.getLastNode() = this.asExpr() ) diff --git a/ruby/ql/lib/ide-contextual-queries/printCfg.ql b/ruby/ql/lib/ide-contextual-queries/printCfg.ql index 1c4cec61a3ef..c749f035f748 100644 --- a/ruby/ql/lib/ide-contextual-queries/printCfg.ql +++ b/ruby/ql/lib/ide-contextual-queries/printCfg.ql @@ -8,7 +8,6 @@ */ private import codeql.Locations -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl private import codeql.ruby.controlflow.ControlFlowGraph external string selectedSourceFile(); @@ -23,7 +22,7 @@ external int selectedSourceColumn(); private predicate selectedSourceColumnAlias = selectedSourceColumn/0; -module ViewCfgQueryInput implements ViewCfgQueryInputSig { +module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig { predicate selectedSourceFile = selectedSourceFileAlias/0; predicate selectedSourceLine = selectedSourceLineAlias/0; @@ -31,11 +30,11 @@ module ViewCfgQueryInput implements ViewCfgQueryInputSig { predicate selectedSourceColumn = selectedSourceColumnAlias/0; predicate cfgScopeSpan( - CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + CfgScopeImpl scope, File file, int startLine, int startColumn, int endLine, int endColumn ) { file = scope.getFile() and scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) } } -import ViewCfgQuery +import ControlFlow::ViewCfgQuery diff --git a/ruby/ql/src/experimental/performance/UseDetect.ql b/ruby/ql/src/experimental/performance/UseDetect.ql index 56ab99ae4056..61cf8ccd3f33 100644 --- a/ruby/ql/src/experimental/performance/UseDetect.ql +++ b/ruby/ql/src/experimental/performance/UseDetect.ql @@ -42,13 +42,11 @@ class EndCall extends MethodCall { } Expr getUniqueRead(Expr e) { - forex(CfgNode eNode | eNode.getAstNode() = e | - exists(Ssa::WriteDefinition def | - def.assigns(eNode) and - strictcount(def.getARead()) = 1 and - not def = any(Ssa::PhiNode phi).getAnInput() and - def.getARead().getAstNode() = result - ) + exists(Ssa::WriteDefinition def | + def.assigns(e.getControlFlowNode()) and + strictcount(def.getARead()) = 1 and + not def = any(Ssa::PhiNode phi).getAnInput() and + def.getARead().getAstNode() = result ) } diff --git a/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql b/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql index c81cdd6b2f63..67e9ba4f9c77 100644 --- a/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql +++ b/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql @@ -36,7 +36,7 @@ class LoopingCall extends DataFlow::CallNode { } /** Holds if `c` is executed as part of the body of this loop. */ - predicate executesCall(DataFlow::CallNode c) { c.asExpr().getScope() = loopScope } + predicate executesCall(DataFlow::CallNode c) { c.asExpr().getEnclosingCallable() = loopScope } } /** Holds if `ar` influences a guard that may control the execution of a loop. */ diff --git a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql index 849fb8ecd5a7..70d3191b8a72 100644 --- a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql +++ b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql @@ -19,7 +19,12 @@ import codeql.ruby.ApiGraphs pragma[nomagic] private predicate hasErbResultCall(CfgScope scope) { - scope = API::getTopLevelMember("ERB").getInstance().getAMethodCall("result").asExpr().getScope() + scope = + API::getTopLevelMember("ERB") + .getInstance() + .getAMethodCall("result") + .asExpr() + .getEnclosingCallable() } class RelevantLocalVariableWriteAccess extends LocalVariableWriteAccess { diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql index c99de9bc0a86..de648d227e72 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql @@ -1,5 +1,4 @@ import codeql.ruby.controlflow.ControlFlowGraph -import codeql.ruby.controlflow.BasicBlocks query predicate dominates(BasicBlock bb1, BasicBlock bb2) { bb1.dominates(bb2) } @@ -9,14 +8,10 @@ query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) { bb1.getImmediateDominator() = bb2 } -query predicate controls(ConditionBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { +query predicate controls(BasicBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.edgeDominates(bb2, t) } -query predicate successor(ConditionBlock bb1, BasicBlock bb2, SuccessorType t) { +query predicate successor(BasicBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.getASuccessor(t) = bb2 } - -query predicate joinBlockPredecessor(JoinBlock bb1, BasicBlock bb2, int i) { - bb1.getJoinBlockPredecessor(i) = bb2 -} diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql index 39d0627613e9..54fc30b8eec3 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql @@ -1,2 +1,2 @@ import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput +import ControlFlow::TestOutput diff --git a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql index 86609a73909c..e4f35886dd70 100644 --- a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql +++ b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql @@ -3,7 +3,6 @@ import codeql.ruby.dataflow.internal.DataFlowPublic import codeql.ruby.dataflow.BarrierGuards import codeql.ruby.controlflow.CfgNodes import codeql.ruby.controlflow.ControlFlowGraph -import codeql.ruby.controlflow.BasicBlocks import codeql.ruby.DataFlow import utils.test.InlineExpectationsTest @@ -13,7 +12,7 @@ query predicate newStyleBarrierGuards(DataFlow::Node n) { } query predicate controls(CfgNode condition, BasicBlock bb, ConditionalSuccessor s) { - exists(ConditionBlock cb | + exists(BasicBlock cb | cb.edgeDominates(bb, s) and condition = cb.getLastNode() ) From 6ff59e58391844bd681a3159ea02d974709227ca Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 5 Aug 2026 14:26:05 +0200 Subject: [PATCH 3/4] Ruby: Accept qltest changes due to removed splitting. --- .../dataflow/local/DataflowStep.expected | 615 ++++++----------- .../dataflow/local/Nodes.expected | 64 +- .../dataflow/local/TaintStep.expected | 633 ++++++------------ 3 files changed, 437 insertions(+), 875 deletions(-) diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index 7122b4c0ae2f..9159b37fe73c 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -207,800 +207,700 @@ | UseUseExplosion.rb:20:13:20:17 | [post] self | UseUseExplosion.rb:20:3691:20:3696 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:35:20:39 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:3691:20:3696 | self | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [false] ( ... ) | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [true] ( ... ) | +| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | ( ... ) | | UseUseExplosion.rb:20:26:20:3684 | then ... | UseUseExplosion.rb:20:9:20:3700 | if ... | | UseUseExplosion.rb:20:31:20:3684 | if ... | UseUseExplosion.rb:20:26:20:3684 | then ... | | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:3675:20:3680 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:3675:20:3680 | self | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [false] ( ... ) | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [true] ( ... ) | +| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | ( ... ) | | UseUseExplosion.rb:20:47:20:3668 | then ... | UseUseExplosion.rb:20:31:20:3684 | if ... | | UseUseExplosion.rb:20:52:20:3668 | if ... | UseUseExplosion.rb:20:47:20:3668 | then ... | | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:3659:20:3664 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:3659:20:3664 | self | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [false] ( ... ) | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [true] ( ... ) | +| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | ( ... ) | | UseUseExplosion.rb:20:68:20:3652 | then ... | UseUseExplosion.rb:20:52:20:3668 | if ... | | UseUseExplosion.rb:20:73:20:3652 | if ... | UseUseExplosion.rb:20:68:20:3652 | then ... | | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:3643:20:3648 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:3643:20:3648 | self | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [false] ( ... ) | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [true] ( ... ) | +| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | ( ... ) | | UseUseExplosion.rb:20:89:20:3636 | then ... | UseUseExplosion.rb:20:73:20:3652 | if ... | | UseUseExplosion.rb:20:94:20:3636 | if ... | UseUseExplosion.rb:20:89:20:3636 | then ... | | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:3627:20:3632 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:3627:20:3632 | self | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [false] ( ... ) | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [true] ( ... ) | +| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | ( ... ) | | UseUseExplosion.rb:20:110:20:3620 | then ... | UseUseExplosion.rb:20:94:20:3636 | if ... | | UseUseExplosion.rb:20:115:20:3620 | if ... | UseUseExplosion.rb:20:110:20:3620 | then ... | | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:3611:20:3616 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:3611:20:3616 | self | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [false] ( ... ) | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [true] ( ... ) | +| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | ( ... ) | | UseUseExplosion.rb:20:131:20:3604 | then ... | UseUseExplosion.rb:20:115:20:3620 | if ... | | UseUseExplosion.rb:20:136:20:3604 | if ... | UseUseExplosion.rb:20:131:20:3604 | then ... | | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:3595:20:3600 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:3595:20:3600 | self | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [false] ( ... ) | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [true] ( ... ) | +| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | ( ... ) | | UseUseExplosion.rb:20:152:20:3588 | then ... | UseUseExplosion.rb:20:136:20:3604 | if ... | | UseUseExplosion.rb:20:157:20:3588 | if ... | UseUseExplosion.rb:20:152:20:3588 | then ... | | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:3579:20:3584 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:3579:20:3584 | self | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [false] ( ... ) | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [true] ( ... ) | +| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | ( ... ) | | UseUseExplosion.rb:20:173:20:3572 | then ... | UseUseExplosion.rb:20:157:20:3588 | if ... | | UseUseExplosion.rb:20:178:20:3572 | if ... | UseUseExplosion.rb:20:173:20:3572 | then ... | | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:3563:20:3568 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:3563:20:3568 | self | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [false] ( ... ) | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [true] ( ... ) | +| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | ( ... ) | | UseUseExplosion.rb:20:194:20:3556 | then ... | UseUseExplosion.rb:20:178:20:3572 | if ... | | UseUseExplosion.rb:20:199:20:3556 | if ... | UseUseExplosion.rb:20:194:20:3556 | then ... | | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:3547:20:3552 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:3547:20:3552 | self | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [false] ( ... ) | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [true] ( ... ) | +| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | ( ... ) | | UseUseExplosion.rb:20:215:20:3540 | then ... | UseUseExplosion.rb:20:199:20:3556 | if ... | | UseUseExplosion.rb:20:220:20:3540 | if ... | UseUseExplosion.rb:20:215:20:3540 | then ... | | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:3531:20:3536 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:3531:20:3536 | self | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [false] ( ... ) | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [true] ( ... ) | +| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | ( ... ) | | UseUseExplosion.rb:20:236:20:3524 | then ... | UseUseExplosion.rb:20:220:20:3540 | if ... | | UseUseExplosion.rb:20:241:20:3524 | if ... | UseUseExplosion.rb:20:236:20:3524 | then ... | | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:3515:20:3520 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:3515:20:3520 | self | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [false] ( ... ) | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [true] ( ... ) | +| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | ( ... ) | | UseUseExplosion.rb:20:257:20:3508 | then ... | UseUseExplosion.rb:20:241:20:3524 | if ... | | UseUseExplosion.rb:20:262:20:3508 | if ... | UseUseExplosion.rb:20:257:20:3508 | then ... | | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:3499:20:3504 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:3499:20:3504 | self | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [false] ( ... ) | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [true] ( ... ) | +| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | ( ... ) | | UseUseExplosion.rb:20:278:20:3492 | then ... | UseUseExplosion.rb:20:262:20:3508 | if ... | | UseUseExplosion.rb:20:283:20:3492 | if ... | UseUseExplosion.rb:20:278:20:3492 | then ... | | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:3483:20:3488 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:3483:20:3488 | self | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [false] ( ... ) | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [true] ( ... ) | +| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | ( ... ) | | UseUseExplosion.rb:20:299:20:3476 | then ... | UseUseExplosion.rb:20:283:20:3492 | if ... | | UseUseExplosion.rb:20:304:20:3476 | if ... | UseUseExplosion.rb:20:299:20:3476 | then ... | | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:3467:20:3472 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:3467:20:3472 | self | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [false] ( ... ) | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [true] ( ... ) | +| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | ( ... ) | | UseUseExplosion.rb:20:320:20:3460 | then ... | UseUseExplosion.rb:20:304:20:3476 | if ... | | UseUseExplosion.rb:20:325:20:3460 | if ... | UseUseExplosion.rb:20:320:20:3460 | then ... | | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:3451:20:3456 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:3451:20:3456 | self | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [false] ( ... ) | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [true] ( ... ) | +| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | ( ... ) | | UseUseExplosion.rb:20:341:20:3444 | then ... | UseUseExplosion.rb:20:325:20:3460 | if ... | | UseUseExplosion.rb:20:346:20:3444 | if ... | UseUseExplosion.rb:20:341:20:3444 | then ... | | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:3435:20:3440 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:3435:20:3440 | self | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [false] ( ... ) | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [true] ( ... ) | +| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | ( ... ) | | UseUseExplosion.rb:20:362:20:3428 | then ... | UseUseExplosion.rb:20:346:20:3444 | if ... | | UseUseExplosion.rb:20:367:20:3428 | if ... | UseUseExplosion.rb:20:362:20:3428 | then ... | | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:3419:20:3424 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:3419:20:3424 | self | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [false] ( ... ) | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [true] ( ... ) | +| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | ( ... ) | | UseUseExplosion.rb:20:383:20:3412 | then ... | UseUseExplosion.rb:20:367:20:3428 | if ... | | UseUseExplosion.rb:20:388:20:3412 | if ... | UseUseExplosion.rb:20:383:20:3412 | then ... | | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:3403:20:3408 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:3403:20:3408 | self | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [false] ( ... ) | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [true] ( ... ) | +| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | ( ... ) | | UseUseExplosion.rb:20:404:20:3396 | then ... | UseUseExplosion.rb:20:388:20:3412 | if ... | | UseUseExplosion.rb:20:409:20:3396 | if ... | UseUseExplosion.rb:20:404:20:3396 | then ... | | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:3387:20:3392 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:3387:20:3392 | self | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [false] ( ... ) | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [true] ( ... ) | +| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | ( ... ) | | UseUseExplosion.rb:20:425:20:3380 | then ... | UseUseExplosion.rb:20:409:20:3396 | if ... | | UseUseExplosion.rb:20:430:20:3380 | if ... | UseUseExplosion.rb:20:425:20:3380 | then ... | | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:3371:20:3376 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:3371:20:3376 | self | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [false] ( ... ) | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [true] ( ... ) | +| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | ( ... ) | | UseUseExplosion.rb:20:446:20:3364 | then ... | UseUseExplosion.rb:20:430:20:3380 | if ... | | UseUseExplosion.rb:20:451:20:3364 | if ... | UseUseExplosion.rb:20:446:20:3364 | then ... | | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:3355:20:3360 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:3355:20:3360 | self | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [false] ( ... ) | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [true] ( ... ) | +| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | ( ... ) | | UseUseExplosion.rb:20:467:20:3348 | then ... | UseUseExplosion.rb:20:451:20:3364 | if ... | | UseUseExplosion.rb:20:472:20:3348 | if ... | UseUseExplosion.rb:20:467:20:3348 | then ... | | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:3339:20:3344 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:3339:20:3344 | self | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [false] ( ... ) | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [true] ( ... ) | +| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | ( ... ) | | UseUseExplosion.rb:20:488:20:3332 | then ... | UseUseExplosion.rb:20:472:20:3348 | if ... | | UseUseExplosion.rb:20:493:20:3332 | if ... | UseUseExplosion.rb:20:488:20:3332 | then ... | | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:3323:20:3328 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:3323:20:3328 | self | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [false] ( ... ) | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [true] ( ... ) | +| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | ( ... ) | | UseUseExplosion.rb:20:509:20:3316 | then ... | UseUseExplosion.rb:20:493:20:3332 | if ... | | UseUseExplosion.rb:20:514:20:3316 | if ... | UseUseExplosion.rb:20:509:20:3316 | then ... | | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:3307:20:3312 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:3307:20:3312 | self | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [false] ( ... ) | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [true] ( ... ) | +| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | ( ... ) | | UseUseExplosion.rb:20:530:20:3300 | then ... | UseUseExplosion.rb:20:514:20:3316 | if ... | | UseUseExplosion.rb:20:535:20:3300 | if ... | UseUseExplosion.rb:20:530:20:3300 | then ... | | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:3291:20:3296 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:3291:20:3296 | self | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [false] ( ... ) | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [true] ( ... ) | +| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | ( ... ) | | UseUseExplosion.rb:20:551:20:3284 | then ... | UseUseExplosion.rb:20:535:20:3300 | if ... | | UseUseExplosion.rb:20:556:20:3284 | if ... | UseUseExplosion.rb:20:551:20:3284 | then ... | | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:3275:20:3280 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:3275:20:3280 | self | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [false] ( ... ) | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [true] ( ... ) | +| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | ( ... ) | | UseUseExplosion.rb:20:572:20:3268 | then ... | UseUseExplosion.rb:20:556:20:3284 | if ... | | UseUseExplosion.rb:20:577:20:3268 | if ... | UseUseExplosion.rb:20:572:20:3268 | then ... | | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:3259:20:3264 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:3259:20:3264 | self | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [false] ( ... ) | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [true] ( ... ) | +| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | ( ... ) | | UseUseExplosion.rb:20:593:20:3252 | then ... | UseUseExplosion.rb:20:577:20:3268 | if ... | | UseUseExplosion.rb:20:598:20:3252 | if ... | UseUseExplosion.rb:20:593:20:3252 | then ... | | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:3243:20:3248 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:3243:20:3248 | self | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [false] ( ... ) | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [true] ( ... ) | +| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | ( ... ) | | UseUseExplosion.rb:20:614:20:3236 | then ... | UseUseExplosion.rb:20:598:20:3252 | if ... | | UseUseExplosion.rb:20:619:20:3236 | if ... | UseUseExplosion.rb:20:614:20:3236 | then ... | | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:3227:20:3232 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:3227:20:3232 | self | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [false] ( ... ) | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [true] ( ... ) | +| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | ( ... ) | | UseUseExplosion.rb:20:635:20:3220 | then ... | UseUseExplosion.rb:20:619:20:3236 | if ... | | UseUseExplosion.rb:20:640:20:3220 | if ... | UseUseExplosion.rb:20:635:20:3220 | then ... | | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:3211:20:3216 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:3211:20:3216 | self | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [false] ( ... ) | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [true] ( ... ) | +| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | ( ... ) | | UseUseExplosion.rb:20:656:20:3204 | then ... | UseUseExplosion.rb:20:640:20:3220 | if ... | | UseUseExplosion.rb:20:661:20:3204 | if ... | UseUseExplosion.rb:20:656:20:3204 | then ... | | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:3195:20:3200 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:3195:20:3200 | self | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [false] ( ... ) | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [true] ( ... ) | +| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | ( ... ) | | UseUseExplosion.rb:20:677:20:3188 | then ... | UseUseExplosion.rb:20:661:20:3204 | if ... | | UseUseExplosion.rb:20:682:20:3188 | if ... | UseUseExplosion.rb:20:677:20:3188 | then ... | | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:3179:20:3184 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:3179:20:3184 | self | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [false] ( ... ) | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [true] ( ... ) | +| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | ( ... ) | | UseUseExplosion.rb:20:698:20:3172 | then ... | UseUseExplosion.rb:20:682:20:3188 | if ... | | UseUseExplosion.rb:20:703:20:3172 | if ... | UseUseExplosion.rb:20:698:20:3172 | then ... | | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:3163:20:3168 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:3163:20:3168 | self | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [false] ( ... ) | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [true] ( ... ) | +| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | ( ... ) | | UseUseExplosion.rb:20:719:20:3156 | then ... | UseUseExplosion.rb:20:703:20:3172 | if ... | | UseUseExplosion.rb:20:724:20:3156 | if ... | UseUseExplosion.rb:20:719:20:3156 | then ... | | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:3147:20:3152 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:3147:20:3152 | self | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [false] ( ... ) | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [true] ( ... ) | +| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | ( ... ) | | UseUseExplosion.rb:20:740:20:3140 | then ... | UseUseExplosion.rb:20:724:20:3156 | if ... | | UseUseExplosion.rb:20:745:20:3140 | if ... | UseUseExplosion.rb:20:740:20:3140 | then ... | | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:3131:20:3136 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:3131:20:3136 | self | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [false] ( ... ) | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [true] ( ... ) | +| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | ( ... ) | | UseUseExplosion.rb:20:761:20:3124 | then ... | UseUseExplosion.rb:20:745:20:3140 | if ... | | UseUseExplosion.rb:20:766:20:3124 | if ... | UseUseExplosion.rb:20:761:20:3124 | then ... | | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:3115:20:3120 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:3115:20:3120 | self | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [false] ( ... ) | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [true] ( ... ) | +| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | ( ... ) | | UseUseExplosion.rb:20:782:20:3108 | then ... | UseUseExplosion.rb:20:766:20:3124 | if ... | | UseUseExplosion.rb:20:787:20:3108 | if ... | UseUseExplosion.rb:20:782:20:3108 | then ... | | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:3099:20:3104 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:3099:20:3104 | self | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [false] ( ... ) | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [true] ( ... ) | +| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | ( ... ) | | UseUseExplosion.rb:20:803:20:3092 | then ... | UseUseExplosion.rb:20:787:20:3108 | if ... | | UseUseExplosion.rb:20:808:20:3092 | if ... | UseUseExplosion.rb:20:803:20:3092 | then ... | | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:3083:20:3088 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:3083:20:3088 | self | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [false] ( ... ) | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [true] ( ... ) | +| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | ( ... ) | | UseUseExplosion.rb:20:824:20:3076 | then ... | UseUseExplosion.rb:20:808:20:3092 | if ... | | UseUseExplosion.rb:20:829:20:3076 | if ... | UseUseExplosion.rb:20:824:20:3076 | then ... | | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:3067:20:3072 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:3067:20:3072 | self | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [false] ( ... ) | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [true] ( ... ) | +| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | ( ... ) | | UseUseExplosion.rb:20:845:20:3060 | then ... | UseUseExplosion.rb:20:829:20:3076 | if ... | | UseUseExplosion.rb:20:850:20:3060 | if ... | UseUseExplosion.rb:20:845:20:3060 | then ... | | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:3051:20:3056 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:3051:20:3056 | self | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [false] ( ... ) | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [true] ( ... ) | +| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | ( ... ) | | UseUseExplosion.rb:20:866:20:3044 | then ... | UseUseExplosion.rb:20:850:20:3060 | if ... | | UseUseExplosion.rb:20:871:20:3044 | if ... | UseUseExplosion.rb:20:866:20:3044 | then ... | | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:3035:20:3040 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:3035:20:3040 | self | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [false] ( ... ) | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [true] ( ... ) | +| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | ( ... ) | | UseUseExplosion.rb:20:887:20:3028 | then ... | UseUseExplosion.rb:20:871:20:3044 | if ... | | UseUseExplosion.rb:20:892:20:3028 | if ... | UseUseExplosion.rb:20:887:20:3028 | then ... | | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:3019:20:3024 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:3019:20:3024 | self | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [false] ( ... ) | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [true] ( ... ) | +| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | ( ... ) | | UseUseExplosion.rb:20:908:20:3012 | then ... | UseUseExplosion.rb:20:892:20:3028 | if ... | | UseUseExplosion.rb:20:913:20:3012 | if ... | UseUseExplosion.rb:20:908:20:3012 | then ... | | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:3003:20:3008 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:3003:20:3008 | self | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [false] ( ... ) | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [true] ( ... ) | +| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | ( ... ) | | UseUseExplosion.rb:20:929:20:2996 | then ... | UseUseExplosion.rb:20:913:20:3012 | if ... | | UseUseExplosion.rb:20:934:20:2996 | if ... | UseUseExplosion.rb:20:929:20:2996 | then ... | | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:2987:20:2992 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:2987:20:2992 | self | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [false] ( ... ) | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [true] ( ... ) | +| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | ( ... ) | | UseUseExplosion.rb:20:950:20:2980 | then ... | UseUseExplosion.rb:20:934:20:2996 | if ... | | UseUseExplosion.rb:20:955:20:2980 | if ... | UseUseExplosion.rb:20:950:20:2980 | then ... | | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:2971:20:2976 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:2971:20:2976 | self | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [false] ( ... ) | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [true] ( ... ) | +| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | ( ... ) | | UseUseExplosion.rb:20:971:20:2964 | then ... | UseUseExplosion.rb:20:955:20:2980 | if ... | | UseUseExplosion.rb:20:976:20:2964 | if ... | UseUseExplosion.rb:20:971:20:2964 | then ... | | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:2955:20:2960 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:2955:20:2960 | self | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [false] ( ... ) | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [true] ( ... ) | +| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | ( ... ) | | UseUseExplosion.rb:20:992:20:2948 | then ... | UseUseExplosion.rb:20:976:20:2964 | if ... | | UseUseExplosion.rb:20:997:20:2948 | if ... | UseUseExplosion.rb:20:992:20:2948 | then ... | | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:2939:20:2944 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:2939:20:2944 | self | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [false] ( ... ) | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [true] ( ... ) | +| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | ( ... ) | | UseUseExplosion.rb:20:1013:20:2932 | then ... | UseUseExplosion.rb:20:997:20:2948 | if ... | | UseUseExplosion.rb:20:1018:20:2932 | if ... | UseUseExplosion.rb:20:1013:20:2932 | then ... | | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:2923:20:2928 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:2923:20:2928 | self | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [false] ( ... ) | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [true] ( ... ) | +| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | ( ... ) | | UseUseExplosion.rb:20:1034:20:2916 | then ... | UseUseExplosion.rb:20:1018:20:2932 | if ... | | UseUseExplosion.rb:20:1039:20:2916 | if ... | UseUseExplosion.rb:20:1034:20:2916 | then ... | | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:2907:20:2912 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:2907:20:2912 | self | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [false] ( ... ) | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [true] ( ... ) | +| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | ( ... ) | | UseUseExplosion.rb:20:1055:20:2900 | then ... | UseUseExplosion.rb:20:1039:20:2916 | if ... | | UseUseExplosion.rb:20:1060:20:2900 | if ... | UseUseExplosion.rb:20:1055:20:2900 | then ... | | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:2891:20:2896 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:2891:20:2896 | self | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [false] ( ... ) | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [true] ( ... ) | +| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | ( ... ) | | UseUseExplosion.rb:20:1076:20:2884 | then ... | UseUseExplosion.rb:20:1060:20:2900 | if ... | | UseUseExplosion.rb:20:1081:20:2884 | if ... | UseUseExplosion.rb:20:1076:20:2884 | then ... | | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:2875:20:2880 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:2875:20:2880 | self | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [false] ( ... ) | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [true] ( ... ) | +| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | ( ... ) | | UseUseExplosion.rb:20:1097:20:2868 | then ... | UseUseExplosion.rb:20:1081:20:2884 | if ... | | UseUseExplosion.rb:20:1102:20:2868 | if ... | UseUseExplosion.rb:20:1097:20:2868 | then ... | | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:2859:20:2864 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:2859:20:2864 | self | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [false] ( ... ) | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [true] ( ... ) | +| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | ( ... ) | | UseUseExplosion.rb:20:1118:20:2852 | then ... | UseUseExplosion.rb:20:1102:20:2868 | if ... | | UseUseExplosion.rb:20:1123:20:2852 | if ... | UseUseExplosion.rb:20:1118:20:2852 | then ... | | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:2843:20:2848 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:2843:20:2848 | self | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [false] ( ... ) | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [true] ( ... ) | +| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | ( ... ) | | UseUseExplosion.rb:20:1139:20:2836 | then ... | UseUseExplosion.rb:20:1123:20:2852 | if ... | | UseUseExplosion.rb:20:1144:20:2836 | if ... | UseUseExplosion.rb:20:1139:20:2836 | then ... | | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:2827:20:2832 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:2827:20:2832 | self | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [false] ( ... ) | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [true] ( ... ) | +| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | ( ... ) | | UseUseExplosion.rb:20:1160:20:2820 | then ... | UseUseExplosion.rb:20:1144:20:2836 | if ... | | UseUseExplosion.rb:20:1165:20:2820 | if ... | UseUseExplosion.rb:20:1160:20:2820 | then ... | | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:2811:20:2816 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:2811:20:2816 | self | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [false] ( ... ) | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [true] ( ... ) | +| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | ( ... ) | | UseUseExplosion.rb:20:1181:20:2804 | then ... | UseUseExplosion.rb:20:1165:20:2820 | if ... | | UseUseExplosion.rb:20:1186:20:2804 | if ... | UseUseExplosion.rb:20:1181:20:2804 | then ... | | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:2795:20:2800 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:2795:20:2800 | self | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [false] ( ... ) | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [true] ( ... ) | +| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | ( ... ) | | UseUseExplosion.rb:20:1202:20:2788 | then ... | UseUseExplosion.rb:20:1186:20:2804 | if ... | | UseUseExplosion.rb:20:1207:20:2788 | if ... | UseUseExplosion.rb:20:1202:20:2788 | then ... | | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:2779:20:2784 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:2779:20:2784 | self | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [false] ( ... ) | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [true] ( ... ) | +| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | ( ... ) | | UseUseExplosion.rb:20:1223:20:2772 | then ... | UseUseExplosion.rb:20:1207:20:2788 | if ... | | UseUseExplosion.rb:20:1228:20:2772 | if ... | UseUseExplosion.rb:20:1223:20:2772 | then ... | | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:2763:20:2768 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:2763:20:2768 | self | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [false] ( ... ) | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [true] ( ... ) | +| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | ( ... ) | | UseUseExplosion.rb:20:1244:20:2756 | then ... | UseUseExplosion.rb:20:1228:20:2772 | if ... | | UseUseExplosion.rb:20:1249:20:2756 | if ... | UseUseExplosion.rb:20:1244:20:2756 | then ... | | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:2747:20:2752 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:2747:20:2752 | self | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [false] ( ... ) | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [true] ( ... ) | +| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | ( ... ) | | UseUseExplosion.rb:20:1265:20:2740 | then ... | UseUseExplosion.rb:20:1249:20:2756 | if ... | | UseUseExplosion.rb:20:1270:20:2740 | if ... | UseUseExplosion.rb:20:1265:20:2740 | then ... | | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:2731:20:2736 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:2731:20:2736 | self | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [false] ( ... ) | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [true] ( ... ) | +| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | ( ... ) | | UseUseExplosion.rb:20:1286:20:2724 | then ... | UseUseExplosion.rb:20:1270:20:2740 | if ... | | UseUseExplosion.rb:20:1291:20:2724 | if ... | UseUseExplosion.rb:20:1286:20:2724 | then ... | | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:2715:20:2720 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:2715:20:2720 | self | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [false] ( ... ) | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [true] ( ... ) | +| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | ( ... ) | | UseUseExplosion.rb:20:1307:20:2708 | then ... | UseUseExplosion.rb:20:1291:20:2724 | if ... | | UseUseExplosion.rb:20:1312:20:2708 | if ... | UseUseExplosion.rb:20:1307:20:2708 | then ... | | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:2699:20:2704 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:2699:20:2704 | self | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [false] ( ... ) | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [true] ( ... ) | +| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | ( ... ) | | UseUseExplosion.rb:20:1328:20:2692 | then ... | UseUseExplosion.rb:20:1312:20:2708 | if ... | | UseUseExplosion.rb:20:1333:20:2692 | if ... | UseUseExplosion.rb:20:1328:20:2692 | then ... | | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:2683:20:2688 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:2683:20:2688 | self | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [false] ( ... ) | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [true] ( ... ) | +| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | ( ... ) | | UseUseExplosion.rb:20:1349:20:2676 | then ... | UseUseExplosion.rb:20:1333:20:2692 | if ... | | UseUseExplosion.rb:20:1354:20:2676 | if ... | UseUseExplosion.rb:20:1349:20:2676 | then ... | | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:2667:20:2672 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:2667:20:2672 | self | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [false] ( ... ) | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [true] ( ... ) | +| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | ( ... ) | | UseUseExplosion.rb:20:1370:20:2660 | then ... | UseUseExplosion.rb:20:1354:20:2676 | if ... | | UseUseExplosion.rb:20:1375:20:2660 | if ... | UseUseExplosion.rb:20:1370:20:2660 | then ... | | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:2651:20:2656 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:2651:20:2656 | self | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [false] ( ... ) | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [true] ( ... ) | +| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | ( ... ) | | UseUseExplosion.rb:20:1391:20:2644 | then ... | UseUseExplosion.rb:20:1375:20:2660 | if ... | | UseUseExplosion.rb:20:1396:20:2644 | if ... | UseUseExplosion.rb:20:1391:20:2644 | then ... | | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:2635:20:2640 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:2635:20:2640 | self | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [false] ( ... ) | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [true] ( ... ) | +| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | ( ... ) | | UseUseExplosion.rb:20:1412:20:2628 | then ... | UseUseExplosion.rb:20:1396:20:2644 | if ... | | UseUseExplosion.rb:20:1417:20:2628 | if ... | UseUseExplosion.rb:20:1412:20:2628 | then ... | | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:2619:20:2624 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:2619:20:2624 | self | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [false] ( ... ) | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [true] ( ... ) | +| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | ( ... ) | | UseUseExplosion.rb:20:1433:20:2612 | then ... | UseUseExplosion.rb:20:1417:20:2628 | if ... | | UseUseExplosion.rb:20:1438:20:2612 | if ... | UseUseExplosion.rb:20:1433:20:2612 | then ... | | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:2603:20:2608 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:2603:20:2608 | self | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [false] ( ... ) | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [true] ( ... ) | +| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | ( ... ) | | UseUseExplosion.rb:20:1454:20:2596 | then ... | UseUseExplosion.rb:20:1438:20:2612 | if ... | | UseUseExplosion.rb:20:1459:20:2596 | if ... | UseUseExplosion.rb:20:1454:20:2596 | then ... | | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:2587:20:2592 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:2587:20:2592 | self | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [false] ( ... ) | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [true] ( ... ) | +| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | ( ... ) | | UseUseExplosion.rb:20:1475:20:2580 | then ... | UseUseExplosion.rb:20:1459:20:2596 | if ... | | UseUseExplosion.rb:20:1480:20:2580 | if ... | UseUseExplosion.rb:20:1475:20:2580 | then ... | | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:2571:20:2576 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:2571:20:2576 | self | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [false] ( ... ) | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [true] ( ... ) | +| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | ( ... ) | | UseUseExplosion.rb:20:1496:20:2564 | then ... | UseUseExplosion.rb:20:1480:20:2580 | if ... | | UseUseExplosion.rb:20:1501:20:2564 | if ... | UseUseExplosion.rb:20:1496:20:2564 | then ... | | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:2555:20:2560 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:2555:20:2560 | self | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [false] ( ... ) | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [true] ( ... ) | +| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | ( ... ) | | UseUseExplosion.rb:20:1517:20:2548 | then ... | UseUseExplosion.rb:20:1501:20:2564 | if ... | | UseUseExplosion.rb:20:1522:20:2548 | if ... | UseUseExplosion.rb:20:1517:20:2548 | then ... | | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:2539:20:2544 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:2539:20:2544 | self | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [false] ( ... ) | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [true] ( ... ) | +| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | ( ... ) | | UseUseExplosion.rb:20:1538:20:2532 | then ... | UseUseExplosion.rb:20:1522:20:2548 | if ... | | UseUseExplosion.rb:20:1543:20:2532 | if ... | UseUseExplosion.rb:20:1538:20:2532 | then ... | | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:2523:20:2528 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:2523:20:2528 | self | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [false] ( ... ) | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [true] ( ... ) | +| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | ( ... ) | | UseUseExplosion.rb:20:1559:20:2516 | then ... | UseUseExplosion.rb:20:1543:20:2532 | if ... | | UseUseExplosion.rb:20:1564:20:2516 | if ... | UseUseExplosion.rb:20:1559:20:2516 | then ... | | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:2507:20:2512 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:2507:20:2512 | self | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [false] ( ... ) | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [true] ( ... ) | +| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | ( ... ) | | UseUseExplosion.rb:20:1580:20:2500 | then ... | UseUseExplosion.rb:20:1564:20:2516 | if ... | | UseUseExplosion.rb:20:1585:20:2500 | if ... | UseUseExplosion.rb:20:1580:20:2500 | then ... | | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:2491:20:2496 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:2491:20:2496 | self | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [false] ( ... ) | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [true] ( ... ) | +| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | ( ... ) | | UseUseExplosion.rb:20:1601:20:2484 | then ... | UseUseExplosion.rb:20:1585:20:2500 | if ... | | UseUseExplosion.rb:20:1606:20:2484 | if ... | UseUseExplosion.rb:20:1601:20:2484 | then ... | | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:2475:20:2480 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:2475:20:2480 | self | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [false] ( ... ) | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [true] ( ... ) | +| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | ( ... ) | | UseUseExplosion.rb:20:1622:20:2468 | then ... | UseUseExplosion.rb:20:1606:20:2484 | if ... | | UseUseExplosion.rb:20:1627:20:2468 | if ... | UseUseExplosion.rb:20:1622:20:2468 | then ... | | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:2459:20:2464 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:2459:20:2464 | self | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [false] ( ... ) | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [true] ( ... ) | +| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | ( ... ) | | UseUseExplosion.rb:20:1643:20:2452 | then ... | UseUseExplosion.rb:20:1627:20:2468 | if ... | | UseUseExplosion.rb:20:1648:20:2452 | if ... | UseUseExplosion.rb:20:1643:20:2452 | then ... | | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:2443:20:2448 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:2443:20:2448 | self | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [false] ( ... ) | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [true] ( ... ) | +| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | ( ... ) | | UseUseExplosion.rb:20:1664:20:2436 | then ... | UseUseExplosion.rb:20:1648:20:2452 | if ... | | UseUseExplosion.rb:20:1669:20:2436 | if ... | UseUseExplosion.rb:20:1664:20:2436 | then ... | | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:2427:20:2432 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:2427:20:2432 | self | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [false] ( ... ) | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [true] ( ... ) | +| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | ( ... ) | | UseUseExplosion.rb:20:1685:20:2420 | then ... | UseUseExplosion.rb:20:1669:20:2436 | if ... | | UseUseExplosion.rb:20:1690:20:2420 | if ... | UseUseExplosion.rb:20:1685:20:2420 | then ... | | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:2411:20:2416 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:2411:20:2416 | self | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [false] ( ... ) | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [true] ( ... ) | +| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | ( ... ) | | UseUseExplosion.rb:20:1706:20:2404 | then ... | UseUseExplosion.rb:20:1690:20:2420 | if ... | | UseUseExplosion.rb:20:1711:20:2404 | if ... | UseUseExplosion.rb:20:1706:20:2404 | then ... | | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:2395:20:2400 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:2395:20:2400 | self | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [false] ( ... ) | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [true] ( ... ) | +| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | ( ... ) | | UseUseExplosion.rb:20:1727:20:2388 | then ... | UseUseExplosion.rb:20:1711:20:2404 | if ... | | UseUseExplosion.rb:20:1732:20:2388 | if ... | UseUseExplosion.rb:20:1727:20:2388 | then ... | | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:2379:20:2384 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:2379:20:2384 | self | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [false] ( ... ) | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [true] ( ... ) | +| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | ( ... ) | | UseUseExplosion.rb:20:1748:20:2372 | then ... | UseUseExplosion.rb:20:1732:20:2388 | if ... | | UseUseExplosion.rb:20:1753:20:2372 | if ... | UseUseExplosion.rb:20:1748:20:2372 | then ... | | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:2363:20:2368 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:2363:20:2368 | self | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [false] ( ... ) | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [true] ( ... ) | +| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | ( ... ) | | UseUseExplosion.rb:20:1769:20:2356 | then ... | UseUseExplosion.rb:20:1753:20:2372 | if ... | | UseUseExplosion.rb:20:1774:20:2356 | if ... | UseUseExplosion.rb:20:1769:20:2356 | then ... | | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:2347:20:2352 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:2347:20:2352 | self | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [false] ( ... ) | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [true] ( ... ) | +| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | ( ... ) | | UseUseExplosion.rb:20:1790:20:2340 | then ... | UseUseExplosion.rb:20:1774:20:2356 | if ... | | UseUseExplosion.rb:20:1795:20:2340 | if ... | UseUseExplosion.rb:20:1790:20:2340 | then ... | | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:2331:20:2336 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:2331:20:2336 | self | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [false] ( ... ) | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [true] ( ... ) | +| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | ( ... ) | | UseUseExplosion.rb:20:1811:20:2324 | then ... | UseUseExplosion.rb:20:1795:20:2340 | if ... | | UseUseExplosion.rb:20:1816:20:2324 | if ... | UseUseExplosion.rb:20:1811:20:2324 | then ... | | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:2315:20:2320 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:2315:20:2320 | self | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [false] ( ... ) | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [true] ( ... ) | +| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | ( ... ) | | UseUseExplosion.rb:20:1832:20:2308 | then ... | UseUseExplosion.rb:20:1816:20:2324 | if ... | | UseUseExplosion.rb:20:1837:20:2308 | if ... | UseUseExplosion.rb:20:1832:20:2308 | then ... | | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:2299:20:2304 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:2299:20:2304 | self | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [false] ( ... ) | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [true] ( ... ) | +| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | ( ... ) | | UseUseExplosion.rb:20:1853:20:2292 | then ... | UseUseExplosion.rb:20:1837:20:2308 | if ... | | UseUseExplosion.rb:20:1858:20:2292 | if ... | UseUseExplosion.rb:20:1853:20:2292 | then ... | | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:2283:20:2288 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:2283:20:2288 | self | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [false] ( ... ) | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [true] ( ... ) | +| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | ( ... ) | | UseUseExplosion.rb:20:1874:20:2276 | then ... | UseUseExplosion.rb:20:1858:20:2292 | if ... | | UseUseExplosion.rb:20:1879:20:2276 | if ... | UseUseExplosion.rb:20:1874:20:2276 | then ... | | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:2267:20:2272 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:2267:20:2272 | self | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [false] ( ... ) | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [true] ( ... ) | +| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | ( ... ) | | UseUseExplosion.rb:20:1895:20:2260 | then ... | UseUseExplosion.rb:20:1879:20:2276 | if ... | | UseUseExplosion.rb:20:1900:20:2260 | if ... | UseUseExplosion.rb:20:1895:20:2260 | then ... | | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:2251:20:2256 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:2251:20:2256 | self | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [false] ( ... ) | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [true] ( ... ) | +| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | ( ... ) | | UseUseExplosion.rb:20:1916:20:2244 | then ... | UseUseExplosion.rb:20:1900:20:2260 | if ... | | UseUseExplosion.rb:20:1921:20:2244 | if ... | UseUseExplosion.rb:20:1916:20:2244 | then ... | | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:2235:20:2240 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:2235:20:2240 | self | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [false] ( ... ) | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [true] ( ... ) | +| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | ( ... ) | | UseUseExplosion.rb:20:1936:20:2228 | then ... | UseUseExplosion.rb:20:1921:20:2244 | if ... | | UseUseExplosion.rb:20:1941:20:2228 | if ... | UseUseExplosion.rb:20:1936:20:2228 | then ... | | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:2219:20:2224 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:2219:20:2224 | self | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [false] ( ... ) | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [true] ( ... ) | +| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | ( ... ) | | UseUseExplosion.rb:20:1956:20:2212 | then ... | UseUseExplosion.rb:20:1941:20:2228 | if ... | | UseUseExplosion.rb:20:1961:20:2212 | if ... | UseUseExplosion.rb:20:1956:20:2212 | then ... | | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:2203:20:2208 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:2203:20:2208 | self | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [false] ( ... ) | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [true] ( ... ) | +| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | ( ... ) | | UseUseExplosion.rb:20:1976:20:2196 | then ... | UseUseExplosion.rb:20:1961:20:2212 | if ... | | UseUseExplosion.rb:20:1981:20:2196 | if ... | UseUseExplosion.rb:20:1976:20:2196 | then ... | | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2187:20:2192 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2187:20:2192 | self | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [false] ( ... ) | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [true] ( ... ) | +| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | ( ... ) | | UseUseExplosion.rb:20:1996:20:2180 | then ... | UseUseExplosion.rb:20:1981:20:2196 | if ... | | UseUseExplosion.rb:20:2001:20:2180 | if ... | UseUseExplosion.rb:20:1996:20:2180 | then ... | | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2171:20:2176 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2171:20:2176 | self | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [false] ( ... ) | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [true] ( ... ) | +| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | ( ... ) | | UseUseExplosion.rb:20:2016:20:2164 | then ... | UseUseExplosion.rb:20:2001:20:2180 | if ... | | UseUseExplosion.rb:20:2021:20:2164 | if ... | UseUseExplosion.rb:20:2016:20:2164 | then ... | | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2155:20:2160 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2155:20:2160 | self | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [false] ( ... ) | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [true] ( ... ) | +| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | ( ... ) | | UseUseExplosion.rb:20:2036:20:2148 | then ... | UseUseExplosion.rb:20:2021:20:2164 | if ... | | UseUseExplosion.rb:20:2041:20:2148 | if ... | UseUseExplosion.rb:20:2036:20:2148 | then ... | | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2139:20:2144 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2139:20:2144 | self | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [false] ( ... ) | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [true] ( ... ) | +| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | ( ... ) | | UseUseExplosion.rb:20:2056:20:2132 | then ... | UseUseExplosion.rb:20:2041:20:2148 | if ... | | UseUseExplosion.rb:20:2061:20:2132 | if ... | UseUseExplosion.rb:20:2056:20:2132 | then ... | | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2123:20:2128 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2123:20:2128 | self | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [false] ( ... ) | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [true] ( ... ) | +| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | ( ... ) | | UseUseExplosion.rb:20:2076:20:2116 | then ... | UseUseExplosion.rb:20:2061:20:2132 | if ... | | UseUseExplosion.rb:20:2081:20:2116 | if ... | UseUseExplosion.rb:20:2076:20:2116 | then ... | | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2107:20:2112 | self | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2107:20:2112 | self | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [false] ( ... ) | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [true] ( ... ) | +| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | ( ... ) | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(x) | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | | UseUseExplosion.rb:20:2096:20:2099 | then ... | UseUseExplosion.rb:20:2081:20:2116 | if ... | @@ -1508,798 +1408,698 @@ | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:3691:21:3696 | self | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [false] ( ... ) | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [true] ( ... ) | +| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | ( ... ) | | UseUseExplosion.rb:21:26:21:3684 | then ... | UseUseExplosion.rb:21:9:21:3700 | if ... | | UseUseExplosion.rb:21:31:21:3684 | if ... | UseUseExplosion.rb:21:26:21:3684 | then ... | | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:3675:21:3680 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:3675:21:3680 | self | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [false] ( ... ) | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [true] ( ... ) | +| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | ( ... ) | | UseUseExplosion.rb:21:47:21:3668 | then ... | UseUseExplosion.rb:21:31:21:3684 | if ... | | UseUseExplosion.rb:21:52:21:3668 | if ... | UseUseExplosion.rb:21:47:21:3668 | then ... | | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:3659:21:3664 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:3659:21:3664 | self | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [false] ( ... ) | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [true] ( ... ) | +| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | ( ... ) | | UseUseExplosion.rb:21:68:21:3652 | then ... | UseUseExplosion.rb:21:52:21:3668 | if ... | | UseUseExplosion.rb:21:73:21:3652 | if ... | UseUseExplosion.rb:21:68:21:3652 | then ... | | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:3643:21:3648 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:3643:21:3648 | self | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [false] ( ... ) | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [true] ( ... ) | +| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | ( ... ) | | UseUseExplosion.rb:21:89:21:3636 | then ... | UseUseExplosion.rb:21:73:21:3652 | if ... | | UseUseExplosion.rb:21:94:21:3636 | if ... | UseUseExplosion.rb:21:89:21:3636 | then ... | | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:3627:21:3632 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:3627:21:3632 | self | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [false] ( ... ) | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [true] ( ... ) | +| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | ( ... ) | | UseUseExplosion.rb:21:110:21:3620 | then ... | UseUseExplosion.rb:21:94:21:3636 | if ... | | UseUseExplosion.rb:21:115:21:3620 | if ... | UseUseExplosion.rb:21:110:21:3620 | then ... | | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:3611:21:3616 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:3611:21:3616 | self | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [false] ( ... ) | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [true] ( ... ) | +| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | ( ... ) | | UseUseExplosion.rb:21:131:21:3604 | then ... | UseUseExplosion.rb:21:115:21:3620 | if ... | | UseUseExplosion.rb:21:136:21:3604 | if ... | UseUseExplosion.rb:21:131:21:3604 | then ... | | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:3595:21:3600 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:3595:21:3600 | self | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [false] ( ... ) | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [true] ( ... ) | +| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | ( ... ) | | UseUseExplosion.rb:21:152:21:3588 | then ... | UseUseExplosion.rb:21:136:21:3604 | if ... | | UseUseExplosion.rb:21:157:21:3588 | if ... | UseUseExplosion.rb:21:152:21:3588 | then ... | | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:3579:21:3584 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:3579:21:3584 | self | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [false] ( ... ) | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [true] ( ... ) | +| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | ( ... ) | | UseUseExplosion.rb:21:173:21:3572 | then ... | UseUseExplosion.rb:21:157:21:3588 | if ... | | UseUseExplosion.rb:21:178:21:3572 | if ... | UseUseExplosion.rb:21:173:21:3572 | then ... | | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:3563:21:3568 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:3563:21:3568 | self | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [false] ( ... ) | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [true] ( ... ) | +| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | ( ... ) | | UseUseExplosion.rb:21:194:21:3556 | then ... | UseUseExplosion.rb:21:178:21:3572 | if ... | | UseUseExplosion.rb:21:199:21:3556 | if ... | UseUseExplosion.rb:21:194:21:3556 | then ... | | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:3547:21:3552 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:3547:21:3552 | self | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [false] ( ... ) | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [true] ( ... ) | +| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | ( ... ) | | UseUseExplosion.rb:21:215:21:3540 | then ... | UseUseExplosion.rb:21:199:21:3556 | if ... | | UseUseExplosion.rb:21:220:21:3540 | if ... | UseUseExplosion.rb:21:215:21:3540 | then ... | | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:3531:21:3536 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:3531:21:3536 | self | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [false] ( ... ) | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [true] ( ... ) | +| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | ( ... ) | | UseUseExplosion.rb:21:236:21:3524 | then ... | UseUseExplosion.rb:21:220:21:3540 | if ... | | UseUseExplosion.rb:21:241:21:3524 | if ... | UseUseExplosion.rb:21:236:21:3524 | then ... | | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:3515:21:3520 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:3515:21:3520 | self | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [false] ( ... ) | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [true] ( ... ) | +| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | ( ... ) | | UseUseExplosion.rb:21:257:21:3508 | then ... | UseUseExplosion.rb:21:241:21:3524 | if ... | | UseUseExplosion.rb:21:262:21:3508 | if ... | UseUseExplosion.rb:21:257:21:3508 | then ... | | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:3499:21:3504 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:3499:21:3504 | self | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [false] ( ... ) | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [true] ( ... ) | +| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | ( ... ) | | UseUseExplosion.rb:21:278:21:3492 | then ... | UseUseExplosion.rb:21:262:21:3508 | if ... | | UseUseExplosion.rb:21:283:21:3492 | if ... | UseUseExplosion.rb:21:278:21:3492 | then ... | | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:3483:21:3488 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:3483:21:3488 | self | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [false] ( ... ) | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [true] ( ... ) | +| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | ( ... ) | | UseUseExplosion.rb:21:299:21:3476 | then ... | UseUseExplosion.rb:21:283:21:3492 | if ... | | UseUseExplosion.rb:21:304:21:3476 | if ... | UseUseExplosion.rb:21:299:21:3476 | then ... | | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:3467:21:3472 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:3467:21:3472 | self | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [false] ( ... ) | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [true] ( ... ) | +| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | ( ... ) | | UseUseExplosion.rb:21:320:21:3460 | then ... | UseUseExplosion.rb:21:304:21:3476 | if ... | | UseUseExplosion.rb:21:325:21:3460 | if ... | UseUseExplosion.rb:21:320:21:3460 | then ... | | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:3451:21:3456 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:3451:21:3456 | self | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [false] ( ... ) | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [true] ( ... ) | +| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | ( ... ) | | UseUseExplosion.rb:21:341:21:3444 | then ... | UseUseExplosion.rb:21:325:21:3460 | if ... | | UseUseExplosion.rb:21:346:21:3444 | if ... | UseUseExplosion.rb:21:341:21:3444 | then ... | | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:3435:21:3440 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:3435:21:3440 | self | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [false] ( ... ) | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [true] ( ... ) | +| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | ( ... ) | | UseUseExplosion.rb:21:362:21:3428 | then ... | UseUseExplosion.rb:21:346:21:3444 | if ... | | UseUseExplosion.rb:21:367:21:3428 | if ... | UseUseExplosion.rb:21:362:21:3428 | then ... | | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:3419:21:3424 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:3419:21:3424 | self | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [false] ( ... ) | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [true] ( ... ) | +| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | ( ... ) | | UseUseExplosion.rb:21:383:21:3412 | then ... | UseUseExplosion.rb:21:367:21:3428 | if ... | | UseUseExplosion.rb:21:388:21:3412 | if ... | UseUseExplosion.rb:21:383:21:3412 | then ... | | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:3403:21:3408 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:3403:21:3408 | self | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [false] ( ... ) | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [true] ( ... ) | +| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | ( ... ) | | UseUseExplosion.rb:21:404:21:3396 | then ... | UseUseExplosion.rb:21:388:21:3412 | if ... | | UseUseExplosion.rb:21:409:21:3396 | if ... | UseUseExplosion.rb:21:404:21:3396 | then ... | | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:3387:21:3392 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:3387:21:3392 | self | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [false] ( ... ) | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [true] ( ... ) | +| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | ( ... ) | | UseUseExplosion.rb:21:425:21:3380 | then ... | UseUseExplosion.rb:21:409:21:3396 | if ... | | UseUseExplosion.rb:21:430:21:3380 | if ... | UseUseExplosion.rb:21:425:21:3380 | then ... | | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:3371:21:3376 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:3371:21:3376 | self | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [false] ( ... ) | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [true] ( ... ) | +| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | ( ... ) | | UseUseExplosion.rb:21:446:21:3364 | then ... | UseUseExplosion.rb:21:430:21:3380 | if ... | | UseUseExplosion.rb:21:451:21:3364 | if ... | UseUseExplosion.rb:21:446:21:3364 | then ... | | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:3355:21:3360 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:3355:21:3360 | self | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [false] ( ... ) | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [true] ( ... ) | +| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | ( ... ) | | UseUseExplosion.rb:21:467:21:3348 | then ... | UseUseExplosion.rb:21:451:21:3364 | if ... | | UseUseExplosion.rb:21:472:21:3348 | if ... | UseUseExplosion.rb:21:467:21:3348 | then ... | | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:3339:21:3344 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:3339:21:3344 | self | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [false] ( ... ) | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [true] ( ... ) | +| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | ( ... ) | | UseUseExplosion.rb:21:488:21:3332 | then ... | UseUseExplosion.rb:21:472:21:3348 | if ... | | UseUseExplosion.rb:21:493:21:3332 | if ... | UseUseExplosion.rb:21:488:21:3332 | then ... | | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:3323:21:3328 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:3323:21:3328 | self | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [false] ( ... ) | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [true] ( ... ) | +| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | ( ... ) | | UseUseExplosion.rb:21:509:21:3316 | then ... | UseUseExplosion.rb:21:493:21:3332 | if ... | | UseUseExplosion.rb:21:514:21:3316 | if ... | UseUseExplosion.rb:21:509:21:3316 | then ... | | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:3307:21:3312 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:3307:21:3312 | self | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [false] ( ... ) | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [true] ( ... ) | +| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | ( ... ) | | UseUseExplosion.rb:21:530:21:3300 | then ... | UseUseExplosion.rb:21:514:21:3316 | if ... | | UseUseExplosion.rb:21:535:21:3300 | if ... | UseUseExplosion.rb:21:530:21:3300 | then ... | | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:3291:21:3296 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:3291:21:3296 | self | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [false] ( ... ) | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [true] ( ... ) | +| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | ( ... ) | | UseUseExplosion.rb:21:551:21:3284 | then ... | UseUseExplosion.rb:21:535:21:3300 | if ... | | UseUseExplosion.rb:21:556:21:3284 | if ... | UseUseExplosion.rb:21:551:21:3284 | then ... | | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:3275:21:3280 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:3275:21:3280 | self | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [false] ( ... ) | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [true] ( ... ) | +| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | ( ... ) | | UseUseExplosion.rb:21:572:21:3268 | then ... | UseUseExplosion.rb:21:556:21:3284 | if ... | | UseUseExplosion.rb:21:577:21:3268 | if ... | UseUseExplosion.rb:21:572:21:3268 | then ... | | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:3259:21:3264 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:3259:21:3264 | self | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [false] ( ... ) | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [true] ( ... ) | +| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | ( ... ) | | UseUseExplosion.rb:21:593:21:3252 | then ... | UseUseExplosion.rb:21:577:21:3268 | if ... | | UseUseExplosion.rb:21:598:21:3252 | if ... | UseUseExplosion.rb:21:593:21:3252 | then ... | | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:3243:21:3248 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:3243:21:3248 | self | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [false] ( ... ) | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [true] ( ... ) | +| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | ( ... ) | | UseUseExplosion.rb:21:614:21:3236 | then ... | UseUseExplosion.rb:21:598:21:3252 | if ... | | UseUseExplosion.rb:21:619:21:3236 | if ... | UseUseExplosion.rb:21:614:21:3236 | then ... | | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:3227:21:3232 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:3227:21:3232 | self | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [false] ( ... ) | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [true] ( ... ) | +| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | ( ... ) | | UseUseExplosion.rb:21:635:21:3220 | then ... | UseUseExplosion.rb:21:619:21:3236 | if ... | | UseUseExplosion.rb:21:640:21:3220 | if ... | UseUseExplosion.rb:21:635:21:3220 | then ... | | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:3211:21:3216 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:3211:21:3216 | self | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [false] ( ... ) | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [true] ( ... ) | +| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | ( ... ) | | UseUseExplosion.rb:21:656:21:3204 | then ... | UseUseExplosion.rb:21:640:21:3220 | if ... | | UseUseExplosion.rb:21:661:21:3204 | if ... | UseUseExplosion.rb:21:656:21:3204 | then ... | | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:3195:21:3200 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:3195:21:3200 | self | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [false] ( ... ) | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [true] ( ... ) | +| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | ( ... ) | | UseUseExplosion.rb:21:677:21:3188 | then ... | UseUseExplosion.rb:21:661:21:3204 | if ... | | UseUseExplosion.rb:21:682:21:3188 | if ... | UseUseExplosion.rb:21:677:21:3188 | then ... | | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:3179:21:3184 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:3179:21:3184 | self | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [false] ( ... ) | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [true] ( ... ) | +| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | ( ... ) | | UseUseExplosion.rb:21:698:21:3172 | then ... | UseUseExplosion.rb:21:682:21:3188 | if ... | | UseUseExplosion.rb:21:703:21:3172 | if ... | UseUseExplosion.rb:21:698:21:3172 | then ... | | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:3163:21:3168 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:3163:21:3168 | self | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [false] ( ... ) | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [true] ( ... ) | +| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | ( ... ) | | UseUseExplosion.rb:21:719:21:3156 | then ... | UseUseExplosion.rb:21:703:21:3172 | if ... | | UseUseExplosion.rb:21:724:21:3156 | if ... | UseUseExplosion.rb:21:719:21:3156 | then ... | | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:3147:21:3152 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:3147:21:3152 | self | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [false] ( ... ) | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [true] ( ... ) | +| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | ( ... ) | | UseUseExplosion.rb:21:740:21:3140 | then ... | UseUseExplosion.rb:21:724:21:3156 | if ... | | UseUseExplosion.rb:21:745:21:3140 | if ... | UseUseExplosion.rb:21:740:21:3140 | then ... | | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:3131:21:3136 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:3131:21:3136 | self | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [false] ( ... ) | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [true] ( ... ) | +| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | ( ... ) | | UseUseExplosion.rb:21:761:21:3124 | then ... | UseUseExplosion.rb:21:745:21:3140 | if ... | | UseUseExplosion.rb:21:766:21:3124 | if ... | UseUseExplosion.rb:21:761:21:3124 | then ... | | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:3115:21:3120 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:3115:21:3120 | self | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [false] ( ... ) | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [true] ( ... ) | +| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | ( ... ) | | UseUseExplosion.rb:21:782:21:3108 | then ... | UseUseExplosion.rb:21:766:21:3124 | if ... | | UseUseExplosion.rb:21:787:21:3108 | if ... | UseUseExplosion.rb:21:782:21:3108 | then ... | | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:3099:21:3104 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:3099:21:3104 | self | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [false] ( ... ) | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [true] ( ... ) | +| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | ( ... ) | | UseUseExplosion.rb:21:803:21:3092 | then ... | UseUseExplosion.rb:21:787:21:3108 | if ... | | UseUseExplosion.rb:21:808:21:3092 | if ... | UseUseExplosion.rb:21:803:21:3092 | then ... | | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:3083:21:3088 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:3083:21:3088 | self | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [false] ( ... ) | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [true] ( ... ) | +| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | ( ... ) | | UseUseExplosion.rb:21:824:21:3076 | then ... | UseUseExplosion.rb:21:808:21:3092 | if ... | | UseUseExplosion.rb:21:829:21:3076 | if ... | UseUseExplosion.rb:21:824:21:3076 | then ... | | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:3067:21:3072 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:3067:21:3072 | self | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [false] ( ... ) | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [true] ( ... ) | +| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | ( ... ) | | UseUseExplosion.rb:21:845:21:3060 | then ... | UseUseExplosion.rb:21:829:21:3076 | if ... | | UseUseExplosion.rb:21:850:21:3060 | if ... | UseUseExplosion.rb:21:845:21:3060 | then ... | | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:3051:21:3056 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:3051:21:3056 | self | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [false] ( ... ) | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [true] ( ... ) | +| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | ( ... ) | | UseUseExplosion.rb:21:866:21:3044 | then ... | UseUseExplosion.rb:21:850:21:3060 | if ... | | UseUseExplosion.rb:21:871:21:3044 | if ... | UseUseExplosion.rb:21:866:21:3044 | then ... | | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:3035:21:3040 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:3035:21:3040 | self | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [false] ( ... ) | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [true] ( ... ) | +| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | ( ... ) | | UseUseExplosion.rb:21:887:21:3028 | then ... | UseUseExplosion.rb:21:871:21:3044 | if ... | | UseUseExplosion.rb:21:892:21:3028 | if ... | UseUseExplosion.rb:21:887:21:3028 | then ... | | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:3019:21:3024 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:3019:21:3024 | self | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [false] ( ... ) | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [true] ( ... ) | +| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | ( ... ) | | UseUseExplosion.rb:21:908:21:3012 | then ... | UseUseExplosion.rb:21:892:21:3028 | if ... | | UseUseExplosion.rb:21:913:21:3012 | if ... | UseUseExplosion.rb:21:908:21:3012 | then ... | | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:3003:21:3008 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:3003:21:3008 | self | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [false] ( ... ) | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [true] ( ... ) | +| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | ( ... ) | | UseUseExplosion.rb:21:929:21:2996 | then ... | UseUseExplosion.rb:21:913:21:3012 | if ... | | UseUseExplosion.rb:21:934:21:2996 | if ... | UseUseExplosion.rb:21:929:21:2996 | then ... | | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:2987:21:2992 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:2987:21:2992 | self | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [false] ( ... ) | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [true] ( ... ) | +| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | ( ... ) | | UseUseExplosion.rb:21:950:21:2980 | then ... | UseUseExplosion.rb:21:934:21:2996 | if ... | | UseUseExplosion.rb:21:955:21:2980 | if ... | UseUseExplosion.rb:21:950:21:2980 | then ... | | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:2971:21:2976 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:2971:21:2976 | self | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [false] ( ... ) | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [true] ( ... ) | +| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | ( ... ) | | UseUseExplosion.rb:21:971:21:2964 | then ... | UseUseExplosion.rb:21:955:21:2980 | if ... | | UseUseExplosion.rb:21:976:21:2964 | if ... | UseUseExplosion.rb:21:971:21:2964 | then ... | | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:2955:21:2960 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:2955:21:2960 | self | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [false] ( ... ) | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [true] ( ... ) | +| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | ( ... ) | | UseUseExplosion.rb:21:992:21:2948 | then ... | UseUseExplosion.rb:21:976:21:2964 | if ... | | UseUseExplosion.rb:21:997:21:2948 | if ... | UseUseExplosion.rb:21:992:21:2948 | then ... | | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:2939:21:2944 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:2939:21:2944 | self | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [false] ( ... ) | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [true] ( ... ) | +| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | ( ... ) | | UseUseExplosion.rb:21:1013:21:2932 | then ... | UseUseExplosion.rb:21:997:21:2948 | if ... | | UseUseExplosion.rb:21:1018:21:2932 | if ... | UseUseExplosion.rb:21:1013:21:2932 | then ... | | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:2923:21:2928 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:2923:21:2928 | self | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [false] ( ... ) | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [true] ( ... ) | +| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | ( ... ) | | UseUseExplosion.rb:21:1034:21:2916 | then ... | UseUseExplosion.rb:21:1018:21:2932 | if ... | | UseUseExplosion.rb:21:1039:21:2916 | if ... | UseUseExplosion.rb:21:1034:21:2916 | then ... | | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:2907:21:2912 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:2907:21:2912 | self | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [false] ( ... ) | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [true] ( ... ) | +| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | ( ... ) | | UseUseExplosion.rb:21:1055:21:2900 | then ... | UseUseExplosion.rb:21:1039:21:2916 | if ... | | UseUseExplosion.rb:21:1060:21:2900 | if ... | UseUseExplosion.rb:21:1055:21:2900 | then ... | | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:2891:21:2896 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:2891:21:2896 | self | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [false] ( ... ) | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [true] ( ... ) | +| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | ( ... ) | | UseUseExplosion.rb:21:1076:21:2884 | then ... | UseUseExplosion.rb:21:1060:21:2900 | if ... | | UseUseExplosion.rb:21:1081:21:2884 | if ... | UseUseExplosion.rb:21:1076:21:2884 | then ... | | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:2875:21:2880 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:2875:21:2880 | self | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [false] ( ... ) | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [true] ( ... ) | +| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | ( ... ) | | UseUseExplosion.rb:21:1097:21:2868 | then ... | UseUseExplosion.rb:21:1081:21:2884 | if ... | | UseUseExplosion.rb:21:1102:21:2868 | if ... | UseUseExplosion.rb:21:1097:21:2868 | then ... | | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:2859:21:2864 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:2859:21:2864 | self | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [false] ( ... ) | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [true] ( ... ) | +| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | ( ... ) | | UseUseExplosion.rb:21:1118:21:2852 | then ... | UseUseExplosion.rb:21:1102:21:2868 | if ... | | UseUseExplosion.rb:21:1123:21:2852 | if ... | UseUseExplosion.rb:21:1118:21:2852 | then ... | | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:2843:21:2848 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:2843:21:2848 | self | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [false] ( ... ) | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [true] ( ... ) | +| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | ( ... ) | | UseUseExplosion.rb:21:1139:21:2836 | then ... | UseUseExplosion.rb:21:1123:21:2852 | if ... | | UseUseExplosion.rb:21:1144:21:2836 | if ... | UseUseExplosion.rb:21:1139:21:2836 | then ... | | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:2827:21:2832 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:2827:21:2832 | self | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [false] ( ... ) | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [true] ( ... ) | +| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | ( ... ) | | UseUseExplosion.rb:21:1160:21:2820 | then ... | UseUseExplosion.rb:21:1144:21:2836 | if ... | | UseUseExplosion.rb:21:1165:21:2820 | if ... | UseUseExplosion.rb:21:1160:21:2820 | then ... | | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:2811:21:2816 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:2811:21:2816 | self | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [false] ( ... ) | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [true] ( ... ) | +| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | ( ... ) | | UseUseExplosion.rb:21:1181:21:2804 | then ... | UseUseExplosion.rb:21:1165:21:2820 | if ... | | UseUseExplosion.rb:21:1186:21:2804 | if ... | UseUseExplosion.rb:21:1181:21:2804 | then ... | | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:2795:21:2800 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:2795:21:2800 | self | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [false] ( ... ) | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [true] ( ... ) | +| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | ( ... ) | | UseUseExplosion.rb:21:1202:21:2788 | then ... | UseUseExplosion.rb:21:1186:21:2804 | if ... | | UseUseExplosion.rb:21:1207:21:2788 | if ... | UseUseExplosion.rb:21:1202:21:2788 | then ... | | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:2779:21:2784 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:2779:21:2784 | self | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [false] ( ... ) | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [true] ( ... ) | +| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | ( ... ) | | UseUseExplosion.rb:21:1223:21:2772 | then ... | UseUseExplosion.rb:21:1207:21:2788 | if ... | | UseUseExplosion.rb:21:1228:21:2772 | if ... | UseUseExplosion.rb:21:1223:21:2772 | then ... | | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:2763:21:2768 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:2763:21:2768 | self | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [false] ( ... ) | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [true] ( ... ) | +| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | ( ... ) | | UseUseExplosion.rb:21:1244:21:2756 | then ... | UseUseExplosion.rb:21:1228:21:2772 | if ... | | UseUseExplosion.rb:21:1249:21:2756 | if ... | UseUseExplosion.rb:21:1244:21:2756 | then ... | | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:2747:21:2752 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:2747:21:2752 | self | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [false] ( ... ) | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [true] ( ... ) | +| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | ( ... ) | | UseUseExplosion.rb:21:1265:21:2740 | then ... | UseUseExplosion.rb:21:1249:21:2756 | if ... | | UseUseExplosion.rb:21:1270:21:2740 | if ... | UseUseExplosion.rb:21:1265:21:2740 | then ... | | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:2731:21:2736 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:2731:21:2736 | self | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [false] ( ... ) | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [true] ( ... ) | +| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | ( ... ) | | UseUseExplosion.rb:21:1286:21:2724 | then ... | UseUseExplosion.rb:21:1270:21:2740 | if ... | | UseUseExplosion.rb:21:1291:21:2724 | if ... | UseUseExplosion.rb:21:1286:21:2724 | then ... | | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:2715:21:2720 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:2715:21:2720 | self | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [false] ( ... ) | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [true] ( ... ) | +| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | ( ... ) | | UseUseExplosion.rb:21:1307:21:2708 | then ... | UseUseExplosion.rb:21:1291:21:2724 | if ... | | UseUseExplosion.rb:21:1312:21:2708 | if ... | UseUseExplosion.rb:21:1307:21:2708 | then ... | | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:2699:21:2704 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:2699:21:2704 | self | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [false] ( ... ) | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [true] ( ... ) | +| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | ( ... ) | | UseUseExplosion.rb:21:1328:21:2692 | then ... | UseUseExplosion.rb:21:1312:21:2708 | if ... | | UseUseExplosion.rb:21:1333:21:2692 | if ... | UseUseExplosion.rb:21:1328:21:2692 | then ... | | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:2683:21:2688 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:2683:21:2688 | self | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [false] ( ... ) | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [true] ( ... ) | +| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | ( ... ) | | UseUseExplosion.rb:21:1349:21:2676 | then ... | UseUseExplosion.rb:21:1333:21:2692 | if ... | | UseUseExplosion.rb:21:1354:21:2676 | if ... | UseUseExplosion.rb:21:1349:21:2676 | then ... | | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:2667:21:2672 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:2667:21:2672 | self | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [false] ( ... ) | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [true] ( ... ) | +| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | ( ... ) | | UseUseExplosion.rb:21:1370:21:2660 | then ... | UseUseExplosion.rb:21:1354:21:2676 | if ... | | UseUseExplosion.rb:21:1375:21:2660 | if ... | UseUseExplosion.rb:21:1370:21:2660 | then ... | | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:2651:21:2656 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:2651:21:2656 | self | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [false] ( ... ) | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [true] ( ... ) | +| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | ( ... ) | | UseUseExplosion.rb:21:1391:21:2644 | then ... | UseUseExplosion.rb:21:1375:21:2660 | if ... | | UseUseExplosion.rb:21:1396:21:2644 | if ... | UseUseExplosion.rb:21:1391:21:2644 | then ... | | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:2635:21:2640 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:2635:21:2640 | self | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [false] ( ... ) | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [true] ( ... ) | +| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | ( ... ) | | UseUseExplosion.rb:21:1412:21:2628 | then ... | UseUseExplosion.rb:21:1396:21:2644 | if ... | | UseUseExplosion.rb:21:1417:21:2628 | if ... | UseUseExplosion.rb:21:1412:21:2628 | then ... | | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:2619:21:2624 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:2619:21:2624 | self | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [false] ( ... ) | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [true] ( ... ) | +| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | ( ... ) | | UseUseExplosion.rb:21:1433:21:2612 | then ... | UseUseExplosion.rb:21:1417:21:2628 | if ... | | UseUseExplosion.rb:21:1438:21:2612 | if ... | UseUseExplosion.rb:21:1433:21:2612 | then ... | | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:2603:21:2608 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:2603:21:2608 | self | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [false] ( ... ) | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [true] ( ... ) | +| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | ( ... ) | | UseUseExplosion.rb:21:1454:21:2596 | then ... | UseUseExplosion.rb:21:1438:21:2612 | if ... | | UseUseExplosion.rb:21:1459:21:2596 | if ... | UseUseExplosion.rb:21:1454:21:2596 | then ... | | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:2587:21:2592 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:2587:21:2592 | self | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [false] ( ... ) | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [true] ( ... ) | +| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | ( ... ) | | UseUseExplosion.rb:21:1475:21:2580 | then ... | UseUseExplosion.rb:21:1459:21:2596 | if ... | | UseUseExplosion.rb:21:1480:21:2580 | if ... | UseUseExplosion.rb:21:1475:21:2580 | then ... | | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:2571:21:2576 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:2571:21:2576 | self | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [false] ( ... ) | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [true] ( ... ) | +| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | ( ... ) | | UseUseExplosion.rb:21:1496:21:2564 | then ... | UseUseExplosion.rb:21:1480:21:2580 | if ... | | UseUseExplosion.rb:21:1501:21:2564 | if ... | UseUseExplosion.rb:21:1496:21:2564 | then ... | | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:2555:21:2560 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:2555:21:2560 | self | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [false] ( ... ) | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [true] ( ... ) | +| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | ( ... ) | | UseUseExplosion.rb:21:1517:21:2548 | then ... | UseUseExplosion.rb:21:1501:21:2564 | if ... | | UseUseExplosion.rb:21:1522:21:2548 | if ... | UseUseExplosion.rb:21:1517:21:2548 | then ... | | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:2539:21:2544 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:2539:21:2544 | self | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [false] ( ... ) | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [true] ( ... ) | +| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | ( ... ) | | UseUseExplosion.rb:21:1538:21:2532 | then ... | UseUseExplosion.rb:21:1522:21:2548 | if ... | | UseUseExplosion.rb:21:1543:21:2532 | if ... | UseUseExplosion.rb:21:1538:21:2532 | then ... | | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:2523:21:2528 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:2523:21:2528 | self | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [false] ( ... ) | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [true] ( ... ) | +| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | ( ... ) | | UseUseExplosion.rb:21:1559:21:2516 | then ... | UseUseExplosion.rb:21:1543:21:2532 | if ... | | UseUseExplosion.rb:21:1564:21:2516 | if ... | UseUseExplosion.rb:21:1559:21:2516 | then ... | | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:2507:21:2512 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:2507:21:2512 | self | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [false] ( ... ) | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [true] ( ... ) | +| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | ( ... ) | | UseUseExplosion.rb:21:1580:21:2500 | then ... | UseUseExplosion.rb:21:1564:21:2516 | if ... | | UseUseExplosion.rb:21:1585:21:2500 | if ... | UseUseExplosion.rb:21:1580:21:2500 | then ... | | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:2491:21:2496 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:2491:21:2496 | self | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [false] ( ... ) | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [true] ( ... ) | +| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | ( ... ) | | UseUseExplosion.rb:21:1601:21:2484 | then ... | UseUseExplosion.rb:21:1585:21:2500 | if ... | | UseUseExplosion.rb:21:1606:21:2484 | if ... | UseUseExplosion.rb:21:1601:21:2484 | then ... | | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:2475:21:2480 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:2475:21:2480 | self | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [false] ( ... ) | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [true] ( ... ) | +| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | ( ... ) | | UseUseExplosion.rb:21:1622:21:2468 | then ... | UseUseExplosion.rb:21:1606:21:2484 | if ... | | UseUseExplosion.rb:21:1627:21:2468 | if ... | UseUseExplosion.rb:21:1622:21:2468 | then ... | | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:2459:21:2464 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:2459:21:2464 | self | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [false] ( ... ) | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [true] ( ... ) | +| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | ( ... ) | | UseUseExplosion.rb:21:1643:21:2452 | then ... | UseUseExplosion.rb:21:1627:21:2468 | if ... | | UseUseExplosion.rb:21:1648:21:2452 | if ... | UseUseExplosion.rb:21:1643:21:2452 | then ... | | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:2443:21:2448 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:2443:21:2448 | self | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [false] ( ... ) | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [true] ( ... ) | +| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | ( ... ) | | UseUseExplosion.rb:21:1664:21:2436 | then ... | UseUseExplosion.rb:21:1648:21:2452 | if ... | | UseUseExplosion.rb:21:1669:21:2436 | if ... | UseUseExplosion.rb:21:1664:21:2436 | then ... | | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:2427:21:2432 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:2427:21:2432 | self | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [false] ( ... ) | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [true] ( ... ) | +| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | ( ... ) | | UseUseExplosion.rb:21:1685:21:2420 | then ... | UseUseExplosion.rb:21:1669:21:2436 | if ... | | UseUseExplosion.rb:21:1690:21:2420 | if ... | UseUseExplosion.rb:21:1685:21:2420 | then ... | | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:2411:21:2416 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:2411:21:2416 | self | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [false] ( ... ) | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [true] ( ... ) | +| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | ( ... ) | | UseUseExplosion.rb:21:1706:21:2404 | then ... | UseUseExplosion.rb:21:1690:21:2420 | if ... | | UseUseExplosion.rb:21:1711:21:2404 | if ... | UseUseExplosion.rb:21:1706:21:2404 | then ... | | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:2395:21:2400 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:2395:21:2400 | self | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [false] ( ... ) | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [true] ( ... ) | +| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | ( ... ) | | UseUseExplosion.rb:21:1727:21:2388 | then ... | UseUseExplosion.rb:21:1711:21:2404 | if ... | | UseUseExplosion.rb:21:1732:21:2388 | if ... | UseUseExplosion.rb:21:1727:21:2388 | then ... | | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:2379:21:2384 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:2379:21:2384 | self | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [false] ( ... ) | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [true] ( ... ) | +| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | ( ... ) | | UseUseExplosion.rb:21:1748:21:2372 | then ... | UseUseExplosion.rb:21:1732:21:2388 | if ... | | UseUseExplosion.rb:21:1753:21:2372 | if ... | UseUseExplosion.rb:21:1748:21:2372 | then ... | | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:2363:21:2368 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:2363:21:2368 | self | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [false] ( ... ) | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [true] ( ... ) | +| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | ( ... ) | | UseUseExplosion.rb:21:1769:21:2356 | then ... | UseUseExplosion.rb:21:1753:21:2372 | if ... | | UseUseExplosion.rb:21:1774:21:2356 | if ... | UseUseExplosion.rb:21:1769:21:2356 | then ... | | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:2347:21:2352 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:2347:21:2352 | self | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [false] ( ... ) | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [true] ( ... ) | +| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | ( ... ) | | UseUseExplosion.rb:21:1790:21:2340 | then ... | UseUseExplosion.rb:21:1774:21:2356 | if ... | | UseUseExplosion.rb:21:1795:21:2340 | if ... | UseUseExplosion.rb:21:1790:21:2340 | then ... | | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:2331:21:2336 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:2331:21:2336 | self | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [false] ( ... ) | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [true] ( ... ) | +| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | ( ... ) | | UseUseExplosion.rb:21:1811:21:2324 | then ... | UseUseExplosion.rb:21:1795:21:2340 | if ... | | UseUseExplosion.rb:21:1816:21:2324 | if ... | UseUseExplosion.rb:21:1811:21:2324 | then ... | | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:2315:21:2320 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:2315:21:2320 | self | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [false] ( ... ) | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [true] ( ... ) | +| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | ( ... ) | | UseUseExplosion.rb:21:1832:21:2308 | then ... | UseUseExplosion.rb:21:1816:21:2324 | if ... | | UseUseExplosion.rb:21:1837:21:2308 | if ... | UseUseExplosion.rb:21:1832:21:2308 | then ... | | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:2299:21:2304 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:2299:21:2304 | self | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [false] ( ... ) | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [true] ( ... ) | +| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | ( ... ) | | UseUseExplosion.rb:21:1853:21:2292 | then ... | UseUseExplosion.rb:21:1837:21:2308 | if ... | | UseUseExplosion.rb:21:1858:21:2292 | if ... | UseUseExplosion.rb:21:1853:21:2292 | then ... | | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:2283:21:2288 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:2283:21:2288 | self | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [false] ( ... ) | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [true] ( ... ) | +| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | ( ... ) | | UseUseExplosion.rb:21:1874:21:2276 | then ... | UseUseExplosion.rb:21:1858:21:2292 | if ... | | UseUseExplosion.rb:21:1879:21:2276 | if ... | UseUseExplosion.rb:21:1874:21:2276 | then ... | | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:2267:21:2272 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:2267:21:2272 | self | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [false] ( ... ) | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [true] ( ... ) | +| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | ( ... ) | | UseUseExplosion.rb:21:1895:21:2260 | then ... | UseUseExplosion.rb:21:1879:21:2276 | if ... | | UseUseExplosion.rb:21:1900:21:2260 | if ... | UseUseExplosion.rb:21:1895:21:2260 | then ... | | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:2251:21:2256 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:2251:21:2256 | self | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [false] ( ... ) | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [true] ( ... ) | +| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | ( ... ) | | UseUseExplosion.rb:21:1916:21:2244 | then ... | UseUseExplosion.rb:21:1900:21:2260 | if ... | | UseUseExplosion.rb:21:1921:21:2244 | if ... | UseUseExplosion.rb:21:1916:21:2244 | then ... | | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:2235:21:2240 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:2235:21:2240 | self | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [false] ( ... ) | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [true] ( ... ) | +| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | ( ... ) | | UseUseExplosion.rb:21:1936:21:2228 | then ... | UseUseExplosion.rb:21:1921:21:2244 | if ... | | UseUseExplosion.rb:21:1941:21:2228 | if ... | UseUseExplosion.rb:21:1936:21:2228 | then ... | | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:2219:21:2224 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:2219:21:2224 | self | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [false] ( ... ) | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [true] ( ... ) | +| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | ( ... ) | | UseUseExplosion.rb:21:1956:21:2212 | then ... | UseUseExplosion.rb:21:1941:21:2228 | if ... | | UseUseExplosion.rb:21:1961:21:2212 | if ... | UseUseExplosion.rb:21:1956:21:2212 | then ... | | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:2203:21:2208 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:2203:21:2208 | self | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [false] ( ... ) | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [true] ( ... ) | +| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | ( ... ) | | UseUseExplosion.rb:21:1976:21:2196 | then ... | UseUseExplosion.rb:21:1961:21:2212 | if ... | | UseUseExplosion.rb:21:1981:21:2196 | if ... | UseUseExplosion.rb:21:1976:21:2196 | then ... | | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2187:21:2192 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2187:21:2192 | self | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [false] ( ... ) | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [true] ( ... ) | +| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | ( ... ) | | UseUseExplosion.rb:21:1996:21:2180 | then ... | UseUseExplosion.rb:21:1981:21:2196 | if ... | | UseUseExplosion.rb:21:2001:21:2180 | if ... | UseUseExplosion.rb:21:1996:21:2180 | then ... | | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2171:21:2176 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2171:21:2176 | self | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [false] ( ... ) | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [true] ( ... ) | +| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | ( ... ) | | UseUseExplosion.rb:21:2016:21:2164 | then ... | UseUseExplosion.rb:21:2001:21:2180 | if ... | | UseUseExplosion.rb:21:2021:21:2164 | if ... | UseUseExplosion.rb:21:2016:21:2164 | then ... | | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2155:21:2160 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2155:21:2160 | self | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [false] ( ... ) | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [true] ( ... ) | +| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | ( ... ) | | UseUseExplosion.rb:21:2036:21:2148 | then ... | UseUseExplosion.rb:21:2021:21:2164 | if ... | | UseUseExplosion.rb:21:2041:21:2148 | if ... | UseUseExplosion.rb:21:2036:21:2148 | then ... | | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2139:21:2144 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2139:21:2144 | self | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [false] ( ... ) | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [true] ( ... ) | +| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | ( ... ) | | UseUseExplosion.rb:21:2056:21:2132 | then ... | UseUseExplosion.rb:21:2041:21:2148 | if ... | | UseUseExplosion.rb:21:2061:21:2132 | if ... | UseUseExplosion.rb:21:2056:21:2132 | then ... | | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2123:21:2128 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2123:21:2128 | self | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [false] ( ... ) | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [true] ( ... ) | +| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | ( ... ) | | UseUseExplosion.rb:21:2076:21:2116 | then ... | UseUseExplosion.rb:21:2061:21:2132 | if ... | | UseUseExplosion.rb:21:2081:21:2116 | if ... | UseUseExplosion.rb:21:2076:21:2116 | then ... | | UseUseExplosion.rb:21:2085:21:2089 | [post] self | UseUseExplosion.rb:21:2107:21:2112 | self | | UseUseExplosion.rb:21:2085:21:2089 | self | UseUseExplosion.rb:21:2107:21:2112 | self | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [false] ( ... ) | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [true] ( ... ) | +| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | ( ... ) | | UseUseExplosion.rb:21:2096:21:2099 | then ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2102:21:2112 | else ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2107:21:2112 | call to use | UseUseExplosion.rb:21:2102:21:2112 | else ... | @@ -2836,8 +2636,7 @@ | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:18:133:23 | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:18:133:23 | self | | local_dataflow.rb:133:12:133:12 | [post] x | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | @@ -2848,8 +2647,7 @@ | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:136:7:136:12 | self | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:136:7:136:12 | self | | local_dataflow.rb:133:22:133:22 | [post] x | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | @@ -2894,8 +2692,7 @@ | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | | local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | @@ -2946,8 +2743,7 @@ | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:21:143:26 | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:21:143:26 | self | | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | @@ -2960,8 +2756,7 @@ | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:25:143:25 | [post] x | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(x) | diff --git a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected index 2ce5b9c2f237..797c9852de73 100644 --- a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected +++ b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected @@ -1234,8 +1234,7 @@ arg | local_dataflow.rb:9:12:9:12 | 2 | local_dataflow.rb:9:9:9:15 | call to [] | position 1 | | local_dataflow.rb:9:14:9:14 | 3 | local_dataflow.rb:9:9:9:15 | call to [] | position 2 | | local_dataflow.rb:10:5:13:3 | { ... } | local_dataflow.rb:10:5:13:3 | call to each | block | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | self | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | self | +| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | ! ... | self | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | defined? ... | self | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:10:5:13:3 | call to each | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:11:1:11:2 | call to do | self | @@ -1243,13 +1242,11 @@ arg | local_dataflow.rb:12:3:12:5 | synthetic splat argument | local_dataflow.rb:12:3:12:5 | call to p | synthetic * | | local_dataflow.rb:12:5:12:5 | x | local_dataflow.rb:12:3:12:5 | call to p | position 0 | | local_dataflow.rb:15:1:17:3 | { ... } | local_dataflow.rb:15:1:17:3 | call to each | block | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | self | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | self | +| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | ! ... | self | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | defined? ... | self | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:15:1:17:3 | call to each | self | | local_dataflow.rb:19:1:21:3 | { ... } | local_dataflow.rb:19:1:21:3 | call to each | block | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | self | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | self | +| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | ! ... | self | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | defined? ... | self | | local_dataflow.rb:19:10:19:14 | array | local_dataflow.rb:19:1:21:3 | call to each | self | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | self | @@ -1445,15 +1442,12 @@ arg | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:132:6:132:11 | call to use | self | | local_dataflow.rb:132:6:132:11 | synthetic splat argument | local_dataflow.rb:132:6:132:11 | call to use | synthetic * | | local_dataflow.rb:132:10:132:10 | x | local_dataflow.rb:132:6:132:11 | call to use | position 0 | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | self | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | self | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | call to use | self | | local_dataflow.rb:133:8:133:13 | synthetic splat argument | local_dataflow.rb:133:8:133:13 | call to use | synthetic * | -| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | synthetic * | +| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | ... \|\| ... | synthetic * | | local_dataflow.rb:133:12:133:12 | x | local_dataflow.rb:133:8:133:13 | call to use | position 0 | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | position 0 | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | position 0 | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | call to use | self | | local_dataflow.rb:133:18:133:23 | synthetic splat argument | local_dataflow.rb:133:18:133:23 | call to use | synthetic * | | local_dataflow.rb:133:22:133:22 | x | local_dataflow.rb:133:18:133:23 | call to use | position 0 | @@ -1463,55 +1457,39 @@ arg | local_dataflow.rb:136:7:136:12 | self | local_dataflow.rb:136:7:136:12 | call to use | self | | local_dataflow.rb:136:7:136:12 | synthetic splat argument | local_dataflow.rb:136:7:136:12 | call to use | synthetic * | | local_dataflow.rb:136:11:136:11 | x | local_dataflow.rb:136:7:136:12 | call to use | position 0 | -| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | [false] ... && ... | self | -| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | [true] ... && ... | self | +| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | ... && ... | self | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:10:137:15 | call to use | self | | local_dataflow.rb:137:10:137:15 | synthetic splat argument | local_dataflow.rb:137:10:137:15 | call to use | synthetic * | -| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | [false] ... && ... | synthetic * | -| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | [true] ... && ... | synthetic * | +| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | ... && ... | synthetic * | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | call to use | position 0 | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | position 0 | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | position 0 | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | self | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | self | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | position 0 | +| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | self | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:21:137:26 | call to use | self | | local_dataflow.rb:137:21:137:26 | synthetic splat argument | local_dataflow.rb:137:21:137:26 | call to use | synthetic * | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:21:137:26 | call to use | position 0 | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | synthetic * | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | self | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [true] ! ... | self | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | self | +| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | ... \|\| ... | synthetic * | +| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:9:141:14 | call to use | self | | local_dataflow.rb:141:9:141:14 | synthetic splat argument | local_dataflow.rb:141:9:141:14 | call to use | synthetic * | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:9:141:14 | call to use | position 0 | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | position 0 | -| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | [false] ... && ... | self | -| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | [true] ... && ... | self | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | position 0 | +| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | ... && ... | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | call to use | self | | local_dataflow.rb:141:20:141:25 | synthetic splat argument | local_dataflow.rb:141:20:141:25 | call to use | synthetic * | -| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | [false] ... && ... | synthetic * | -| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | [true] ... && ... | synthetic * | +| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | ... && ... | synthetic * | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | call to use | position 0 | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | position 0 | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | position 0 | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | self | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | self | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | position 0 | +| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | ! ... | self | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:31:141:36 | call to use | self | | local_dataflow.rb:141:31:141:36 | synthetic splat argument | local_dataflow.rb:141:31:141:36 | call to use | synthetic * | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:31:141:36 | call to use | position 0 | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | self | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | self | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | call to use | self | | local_dataflow.rb:143:11:143:16 | synthetic splat argument | local_dataflow.rb:143:11:143:16 | call to use | synthetic * | -| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | synthetic * | +| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | ... \|\| ... | synthetic * | | local_dataflow.rb:143:15:143:15 | x | local_dataflow.rb:143:11:143:16 | call to use | position 0 | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | position 0 | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | position 0 | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | call to use | self | | local_dataflow.rb:143:21:143:26 | synthetic splat argument | local_dataflow.rb:143:21:143:26 | call to use | synthetic * | | local_dataflow.rb:143:25:143:25 | x | local_dataflow.rb:143:21:143:26 | call to use | position 0 | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 353edd203f95..175c3f1e11b0 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -208,8 +208,7 @@ | UseUseExplosion.rb:20:13:20:17 | [post] self | UseUseExplosion.rb:20:3691:20:3696 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:35:20:39 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:3691:20:3696 | self | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [false] ( ... ) | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [true] ( ... ) | +| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | ( ... ) | | UseUseExplosion.rb:20:21:20:23 | 100 | UseUseExplosion.rb:20:13:20:23 | ... > ... | | UseUseExplosion.rb:20:26:20:3684 | then ... | UseUseExplosion.rb:20:9:20:3700 | if ... | | UseUseExplosion.rb:20:31:20:3684 | if ... | UseUseExplosion.rb:20:26:20:3684 | then ... | @@ -218,8 +217,7 @@ | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:3675:20:3680 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:3675:20:3680 | self | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [false] ( ... ) | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [true] ( ... ) | +| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | ( ... ) | | UseUseExplosion.rb:20:43:20:44 | 99 | UseUseExplosion.rb:20:35:20:44 | ... > ... | | UseUseExplosion.rb:20:47:20:3668 | then ... | UseUseExplosion.rb:20:31:20:3684 | if ... | | UseUseExplosion.rb:20:52:20:3668 | if ... | UseUseExplosion.rb:20:47:20:3668 | then ... | @@ -228,8 +226,7 @@ | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:3659:20:3664 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:3659:20:3664 | self | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [false] ( ... ) | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [true] ( ... ) | +| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | ( ... ) | | UseUseExplosion.rb:20:64:20:65 | 98 | UseUseExplosion.rb:20:56:20:65 | ... > ... | | UseUseExplosion.rb:20:68:20:3652 | then ... | UseUseExplosion.rb:20:52:20:3668 | if ... | | UseUseExplosion.rb:20:73:20:3652 | if ... | UseUseExplosion.rb:20:68:20:3652 | then ... | @@ -238,8 +235,7 @@ | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:3643:20:3648 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:3643:20:3648 | self | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [false] ( ... ) | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [true] ( ... ) | +| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | ( ... ) | | UseUseExplosion.rb:20:85:20:86 | 97 | UseUseExplosion.rb:20:77:20:86 | ... > ... | | UseUseExplosion.rb:20:89:20:3636 | then ... | UseUseExplosion.rb:20:73:20:3652 | if ... | | UseUseExplosion.rb:20:94:20:3636 | if ... | UseUseExplosion.rb:20:89:20:3636 | then ... | @@ -248,8 +244,7 @@ | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:3627:20:3632 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:3627:20:3632 | self | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [false] ( ... ) | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [true] ( ... ) | +| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | ( ... ) | | UseUseExplosion.rb:20:106:20:107 | 96 | UseUseExplosion.rb:20:98:20:107 | ... > ... | | UseUseExplosion.rb:20:110:20:3620 | then ... | UseUseExplosion.rb:20:94:20:3636 | if ... | | UseUseExplosion.rb:20:115:20:3620 | if ... | UseUseExplosion.rb:20:110:20:3620 | then ... | @@ -258,8 +253,7 @@ | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:3611:20:3616 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:3611:20:3616 | self | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [false] ( ... ) | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [true] ( ... ) | +| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | ( ... ) | | UseUseExplosion.rb:20:127:20:128 | 95 | UseUseExplosion.rb:20:119:20:128 | ... > ... | | UseUseExplosion.rb:20:131:20:3604 | then ... | UseUseExplosion.rb:20:115:20:3620 | if ... | | UseUseExplosion.rb:20:136:20:3604 | if ... | UseUseExplosion.rb:20:131:20:3604 | then ... | @@ -268,8 +262,7 @@ | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:3595:20:3600 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:3595:20:3600 | self | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [false] ( ... ) | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [true] ( ... ) | +| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | ( ... ) | | UseUseExplosion.rb:20:148:20:149 | 94 | UseUseExplosion.rb:20:140:20:149 | ... > ... | | UseUseExplosion.rb:20:152:20:3588 | then ... | UseUseExplosion.rb:20:136:20:3604 | if ... | | UseUseExplosion.rb:20:157:20:3588 | if ... | UseUseExplosion.rb:20:152:20:3588 | then ... | @@ -278,8 +271,7 @@ | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:3579:20:3584 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:3579:20:3584 | self | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [false] ( ... ) | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [true] ( ... ) | +| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | ( ... ) | | UseUseExplosion.rb:20:169:20:170 | 93 | UseUseExplosion.rb:20:161:20:170 | ... > ... | | UseUseExplosion.rb:20:173:20:3572 | then ... | UseUseExplosion.rb:20:157:20:3588 | if ... | | UseUseExplosion.rb:20:178:20:3572 | if ... | UseUseExplosion.rb:20:173:20:3572 | then ... | @@ -288,8 +280,7 @@ | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:3563:20:3568 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:3563:20:3568 | self | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [false] ( ... ) | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [true] ( ... ) | +| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | ( ... ) | | UseUseExplosion.rb:20:190:20:191 | 92 | UseUseExplosion.rb:20:182:20:191 | ... > ... | | UseUseExplosion.rb:20:194:20:3556 | then ... | UseUseExplosion.rb:20:178:20:3572 | if ... | | UseUseExplosion.rb:20:199:20:3556 | if ... | UseUseExplosion.rb:20:194:20:3556 | then ... | @@ -298,8 +289,7 @@ | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:3547:20:3552 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:3547:20:3552 | self | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [false] ( ... ) | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [true] ( ... ) | +| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | ( ... ) | | UseUseExplosion.rb:20:211:20:212 | 91 | UseUseExplosion.rb:20:203:20:212 | ... > ... | | UseUseExplosion.rb:20:215:20:3540 | then ... | UseUseExplosion.rb:20:199:20:3556 | if ... | | UseUseExplosion.rb:20:220:20:3540 | if ... | UseUseExplosion.rb:20:215:20:3540 | then ... | @@ -308,8 +298,7 @@ | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:3531:20:3536 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:3531:20:3536 | self | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [false] ( ... ) | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [true] ( ... ) | +| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | ( ... ) | | UseUseExplosion.rb:20:232:20:233 | 90 | UseUseExplosion.rb:20:224:20:233 | ... > ... | | UseUseExplosion.rb:20:236:20:3524 | then ... | UseUseExplosion.rb:20:220:20:3540 | if ... | | UseUseExplosion.rb:20:241:20:3524 | if ... | UseUseExplosion.rb:20:236:20:3524 | then ... | @@ -318,8 +307,7 @@ | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:3515:20:3520 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:3515:20:3520 | self | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [false] ( ... ) | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [true] ( ... ) | +| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | ( ... ) | | UseUseExplosion.rb:20:253:20:254 | 89 | UseUseExplosion.rb:20:245:20:254 | ... > ... | | UseUseExplosion.rb:20:257:20:3508 | then ... | UseUseExplosion.rb:20:241:20:3524 | if ... | | UseUseExplosion.rb:20:262:20:3508 | if ... | UseUseExplosion.rb:20:257:20:3508 | then ... | @@ -328,8 +316,7 @@ | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:3499:20:3504 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:3499:20:3504 | self | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [false] ( ... ) | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [true] ( ... ) | +| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | ( ... ) | | UseUseExplosion.rb:20:274:20:275 | 88 | UseUseExplosion.rb:20:266:20:275 | ... > ... | | UseUseExplosion.rb:20:278:20:3492 | then ... | UseUseExplosion.rb:20:262:20:3508 | if ... | | UseUseExplosion.rb:20:283:20:3492 | if ... | UseUseExplosion.rb:20:278:20:3492 | then ... | @@ -338,8 +325,7 @@ | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:3483:20:3488 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:3483:20:3488 | self | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [false] ( ... ) | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [true] ( ... ) | +| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | ( ... ) | | UseUseExplosion.rb:20:295:20:296 | 87 | UseUseExplosion.rb:20:287:20:296 | ... > ... | | UseUseExplosion.rb:20:299:20:3476 | then ... | UseUseExplosion.rb:20:283:20:3492 | if ... | | UseUseExplosion.rb:20:304:20:3476 | if ... | UseUseExplosion.rb:20:299:20:3476 | then ... | @@ -348,8 +334,7 @@ | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:3467:20:3472 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:3467:20:3472 | self | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [false] ( ... ) | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [true] ( ... ) | +| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | ( ... ) | | UseUseExplosion.rb:20:316:20:317 | 86 | UseUseExplosion.rb:20:308:20:317 | ... > ... | | UseUseExplosion.rb:20:320:20:3460 | then ... | UseUseExplosion.rb:20:304:20:3476 | if ... | | UseUseExplosion.rb:20:325:20:3460 | if ... | UseUseExplosion.rb:20:320:20:3460 | then ... | @@ -358,8 +343,7 @@ | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:3451:20:3456 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:3451:20:3456 | self | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [false] ( ... ) | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [true] ( ... ) | +| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | ( ... ) | | UseUseExplosion.rb:20:337:20:338 | 85 | UseUseExplosion.rb:20:329:20:338 | ... > ... | | UseUseExplosion.rb:20:341:20:3444 | then ... | UseUseExplosion.rb:20:325:20:3460 | if ... | | UseUseExplosion.rb:20:346:20:3444 | if ... | UseUseExplosion.rb:20:341:20:3444 | then ... | @@ -368,8 +352,7 @@ | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:3435:20:3440 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:3435:20:3440 | self | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [false] ( ... ) | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [true] ( ... ) | +| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | ( ... ) | | UseUseExplosion.rb:20:358:20:359 | 84 | UseUseExplosion.rb:20:350:20:359 | ... > ... | | UseUseExplosion.rb:20:362:20:3428 | then ... | UseUseExplosion.rb:20:346:20:3444 | if ... | | UseUseExplosion.rb:20:367:20:3428 | if ... | UseUseExplosion.rb:20:362:20:3428 | then ... | @@ -378,8 +361,7 @@ | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:3419:20:3424 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:3419:20:3424 | self | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [false] ( ... ) | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [true] ( ... ) | +| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | ( ... ) | | UseUseExplosion.rb:20:379:20:380 | 83 | UseUseExplosion.rb:20:371:20:380 | ... > ... | | UseUseExplosion.rb:20:383:20:3412 | then ... | UseUseExplosion.rb:20:367:20:3428 | if ... | | UseUseExplosion.rb:20:388:20:3412 | if ... | UseUseExplosion.rb:20:383:20:3412 | then ... | @@ -388,8 +370,7 @@ | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:3403:20:3408 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:3403:20:3408 | self | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [false] ( ... ) | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [true] ( ... ) | +| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | ( ... ) | | UseUseExplosion.rb:20:400:20:401 | 82 | UseUseExplosion.rb:20:392:20:401 | ... > ... | | UseUseExplosion.rb:20:404:20:3396 | then ... | UseUseExplosion.rb:20:388:20:3412 | if ... | | UseUseExplosion.rb:20:409:20:3396 | if ... | UseUseExplosion.rb:20:404:20:3396 | then ... | @@ -398,8 +379,7 @@ | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:3387:20:3392 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:3387:20:3392 | self | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [false] ( ... ) | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [true] ( ... ) | +| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | ( ... ) | | UseUseExplosion.rb:20:421:20:422 | 81 | UseUseExplosion.rb:20:413:20:422 | ... > ... | | UseUseExplosion.rb:20:425:20:3380 | then ... | UseUseExplosion.rb:20:409:20:3396 | if ... | | UseUseExplosion.rb:20:430:20:3380 | if ... | UseUseExplosion.rb:20:425:20:3380 | then ... | @@ -408,8 +388,7 @@ | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:3371:20:3376 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:3371:20:3376 | self | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [false] ( ... ) | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [true] ( ... ) | +| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | ( ... ) | | UseUseExplosion.rb:20:442:20:443 | 80 | UseUseExplosion.rb:20:434:20:443 | ... > ... | | UseUseExplosion.rb:20:446:20:3364 | then ... | UseUseExplosion.rb:20:430:20:3380 | if ... | | UseUseExplosion.rb:20:451:20:3364 | if ... | UseUseExplosion.rb:20:446:20:3364 | then ... | @@ -418,8 +397,7 @@ | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:3355:20:3360 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:3355:20:3360 | self | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [false] ( ... ) | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [true] ( ... ) | +| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | ( ... ) | | UseUseExplosion.rb:20:463:20:464 | 79 | UseUseExplosion.rb:20:455:20:464 | ... > ... | | UseUseExplosion.rb:20:467:20:3348 | then ... | UseUseExplosion.rb:20:451:20:3364 | if ... | | UseUseExplosion.rb:20:472:20:3348 | if ... | UseUseExplosion.rb:20:467:20:3348 | then ... | @@ -428,8 +406,7 @@ | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:3339:20:3344 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:3339:20:3344 | self | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [false] ( ... ) | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [true] ( ... ) | +| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | ( ... ) | | UseUseExplosion.rb:20:484:20:485 | 78 | UseUseExplosion.rb:20:476:20:485 | ... > ... | | UseUseExplosion.rb:20:488:20:3332 | then ... | UseUseExplosion.rb:20:472:20:3348 | if ... | | UseUseExplosion.rb:20:493:20:3332 | if ... | UseUseExplosion.rb:20:488:20:3332 | then ... | @@ -438,8 +415,7 @@ | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:3323:20:3328 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:3323:20:3328 | self | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [false] ( ... ) | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [true] ( ... ) | +| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | ( ... ) | | UseUseExplosion.rb:20:505:20:506 | 77 | UseUseExplosion.rb:20:497:20:506 | ... > ... | | UseUseExplosion.rb:20:509:20:3316 | then ... | UseUseExplosion.rb:20:493:20:3332 | if ... | | UseUseExplosion.rb:20:514:20:3316 | if ... | UseUseExplosion.rb:20:509:20:3316 | then ... | @@ -448,8 +424,7 @@ | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:3307:20:3312 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:3307:20:3312 | self | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [false] ( ... ) | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [true] ( ... ) | +| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | ( ... ) | | UseUseExplosion.rb:20:526:20:527 | 76 | UseUseExplosion.rb:20:518:20:527 | ... > ... | | UseUseExplosion.rb:20:530:20:3300 | then ... | UseUseExplosion.rb:20:514:20:3316 | if ... | | UseUseExplosion.rb:20:535:20:3300 | if ... | UseUseExplosion.rb:20:530:20:3300 | then ... | @@ -458,8 +433,7 @@ | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:3291:20:3296 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:3291:20:3296 | self | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [false] ( ... ) | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [true] ( ... ) | +| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | ( ... ) | | UseUseExplosion.rb:20:547:20:548 | 75 | UseUseExplosion.rb:20:539:20:548 | ... > ... | | UseUseExplosion.rb:20:551:20:3284 | then ... | UseUseExplosion.rb:20:535:20:3300 | if ... | | UseUseExplosion.rb:20:556:20:3284 | if ... | UseUseExplosion.rb:20:551:20:3284 | then ... | @@ -468,8 +442,7 @@ | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:3275:20:3280 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:3275:20:3280 | self | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [false] ( ... ) | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [true] ( ... ) | +| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | ( ... ) | | UseUseExplosion.rb:20:568:20:569 | 74 | UseUseExplosion.rb:20:560:20:569 | ... > ... | | UseUseExplosion.rb:20:572:20:3268 | then ... | UseUseExplosion.rb:20:556:20:3284 | if ... | | UseUseExplosion.rb:20:577:20:3268 | if ... | UseUseExplosion.rb:20:572:20:3268 | then ... | @@ -478,8 +451,7 @@ | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:3259:20:3264 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:3259:20:3264 | self | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [false] ( ... ) | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [true] ( ... ) | +| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | ( ... ) | | UseUseExplosion.rb:20:589:20:590 | 73 | UseUseExplosion.rb:20:581:20:590 | ... > ... | | UseUseExplosion.rb:20:593:20:3252 | then ... | UseUseExplosion.rb:20:577:20:3268 | if ... | | UseUseExplosion.rb:20:598:20:3252 | if ... | UseUseExplosion.rb:20:593:20:3252 | then ... | @@ -488,8 +460,7 @@ | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:3243:20:3248 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:3243:20:3248 | self | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [false] ( ... ) | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [true] ( ... ) | +| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | ( ... ) | | UseUseExplosion.rb:20:610:20:611 | 72 | UseUseExplosion.rb:20:602:20:611 | ... > ... | | UseUseExplosion.rb:20:614:20:3236 | then ... | UseUseExplosion.rb:20:598:20:3252 | if ... | | UseUseExplosion.rb:20:619:20:3236 | if ... | UseUseExplosion.rb:20:614:20:3236 | then ... | @@ -498,8 +469,7 @@ | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:3227:20:3232 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:3227:20:3232 | self | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [false] ( ... ) | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [true] ( ... ) | +| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | ( ... ) | | UseUseExplosion.rb:20:631:20:632 | 71 | UseUseExplosion.rb:20:623:20:632 | ... > ... | | UseUseExplosion.rb:20:635:20:3220 | then ... | UseUseExplosion.rb:20:619:20:3236 | if ... | | UseUseExplosion.rb:20:640:20:3220 | if ... | UseUseExplosion.rb:20:635:20:3220 | then ... | @@ -508,8 +478,7 @@ | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:3211:20:3216 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:3211:20:3216 | self | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [false] ( ... ) | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [true] ( ... ) | +| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | ( ... ) | | UseUseExplosion.rb:20:652:20:653 | 70 | UseUseExplosion.rb:20:644:20:653 | ... > ... | | UseUseExplosion.rb:20:656:20:3204 | then ... | UseUseExplosion.rb:20:640:20:3220 | if ... | | UseUseExplosion.rb:20:661:20:3204 | if ... | UseUseExplosion.rb:20:656:20:3204 | then ... | @@ -518,8 +487,7 @@ | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:3195:20:3200 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:3195:20:3200 | self | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [false] ( ... ) | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [true] ( ... ) | +| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | ( ... ) | | UseUseExplosion.rb:20:673:20:674 | 69 | UseUseExplosion.rb:20:665:20:674 | ... > ... | | UseUseExplosion.rb:20:677:20:3188 | then ... | UseUseExplosion.rb:20:661:20:3204 | if ... | | UseUseExplosion.rb:20:682:20:3188 | if ... | UseUseExplosion.rb:20:677:20:3188 | then ... | @@ -528,8 +496,7 @@ | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:3179:20:3184 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:3179:20:3184 | self | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [false] ( ... ) | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [true] ( ... ) | +| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | ( ... ) | | UseUseExplosion.rb:20:694:20:695 | 68 | UseUseExplosion.rb:20:686:20:695 | ... > ... | | UseUseExplosion.rb:20:698:20:3172 | then ... | UseUseExplosion.rb:20:682:20:3188 | if ... | | UseUseExplosion.rb:20:703:20:3172 | if ... | UseUseExplosion.rb:20:698:20:3172 | then ... | @@ -538,8 +505,7 @@ | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:3163:20:3168 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:3163:20:3168 | self | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [false] ( ... ) | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [true] ( ... ) | +| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | ( ... ) | | UseUseExplosion.rb:20:715:20:716 | 67 | UseUseExplosion.rb:20:707:20:716 | ... > ... | | UseUseExplosion.rb:20:719:20:3156 | then ... | UseUseExplosion.rb:20:703:20:3172 | if ... | | UseUseExplosion.rb:20:724:20:3156 | if ... | UseUseExplosion.rb:20:719:20:3156 | then ... | @@ -548,8 +514,7 @@ | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:3147:20:3152 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:3147:20:3152 | self | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [false] ( ... ) | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [true] ( ... ) | +| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | ( ... ) | | UseUseExplosion.rb:20:736:20:737 | 66 | UseUseExplosion.rb:20:728:20:737 | ... > ... | | UseUseExplosion.rb:20:740:20:3140 | then ... | UseUseExplosion.rb:20:724:20:3156 | if ... | | UseUseExplosion.rb:20:745:20:3140 | if ... | UseUseExplosion.rb:20:740:20:3140 | then ... | @@ -558,8 +523,7 @@ | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:3131:20:3136 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:3131:20:3136 | self | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [false] ( ... ) | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [true] ( ... ) | +| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | ( ... ) | | UseUseExplosion.rb:20:757:20:758 | 65 | UseUseExplosion.rb:20:749:20:758 | ... > ... | | UseUseExplosion.rb:20:761:20:3124 | then ... | UseUseExplosion.rb:20:745:20:3140 | if ... | | UseUseExplosion.rb:20:766:20:3124 | if ... | UseUseExplosion.rb:20:761:20:3124 | then ... | @@ -568,8 +532,7 @@ | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:3115:20:3120 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:3115:20:3120 | self | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [false] ( ... ) | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [true] ( ... ) | +| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | ( ... ) | | UseUseExplosion.rb:20:778:20:779 | 64 | UseUseExplosion.rb:20:770:20:779 | ... > ... | | UseUseExplosion.rb:20:782:20:3108 | then ... | UseUseExplosion.rb:20:766:20:3124 | if ... | | UseUseExplosion.rb:20:787:20:3108 | if ... | UseUseExplosion.rb:20:782:20:3108 | then ... | @@ -578,8 +541,7 @@ | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:3099:20:3104 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:3099:20:3104 | self | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [false] ( ... ) | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [true] ( ... ) | +| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | ( ... ) | | UseUseExplosion.rb:20:799:20:800 | 63 | UseUseExplosion.rb:20:791:20:800 | ... > ... | | UseUseExplosion.rb:20:803:20:3092 | then ... | UseUseExplosion.rb:20:787:20:3108 | if ... | | UseUseExplosion.rb:20:808:20:3092 | if ... | UseUseExplosion.rb:20:803:20:3092 | then ... | @@ -588,8 +550,7 @@ | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:3083:20:3088 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:3083:20:3088 | self | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [false] ( ... ) | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [true] ( ... ) | +| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | ( ... ) | | UseUseExplosion.rb:20:820:20:821 | 62 | UseUseExplosion.rb:20:812:20:821 | ... > ... | | UseUseExplosion.rb:20:824:20:3076 | then ... | UseUseExplosion.rb:20:808:20:3092 | if ... | | UseUseExplosion.rb:20:829:20:3076 | if ... | UseUseExplosion.rb:20:824:20:3076 | then ... | @@ -598,8 +559,7 @@ | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:3067:20:3072 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:3067:20:3072 | self | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [false] ( ... ) | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [true] ( ... ) | +| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | ( ... ) | | UseUseExplosion.rb:20:841:20:842 | 61 | UseUseExplosion.rb:20:833:20:842 | ... > ... | | UseUseExplosion.rb:20:845:20:3060 | then ... | UseUseExplosion.rb:20:829:20:3076 | if ... | | UseUseExplosion.rb:20:850:20:3060 | if ... | UseUseExplosion.rb:20:845:20:3060 | then ... | @@ -608,8 +568,7 @@ | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:3051:20:3056 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:3051:20:3056 | self | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [false] ( ... ) | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [true] ( ... ) | +| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | ( ... ) | | UseUseExplosion.rb:20:862:20:863 | 60 | UseUseExplosion.rb:20:854:20:863 | ... > ... | | UseUseExplosion.rb:20:866:20:3044 | then ... | UseUseExplosion.rb:20:850:20:3060 | if ... | | UseUseExplosion.rb:20:871:20:3044 | if ... | UseUseExplosion.rb:20:866:20:3044 | then ... | @@ -618,8 +577,7 @@ | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:3035:20:3040 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:3035:20:3040 | self | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [false] ( ... ) | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [true] ( ... ) | +| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | ( ... ) | | UseUseExplosion.rb:20:883:20:884 | 59 | UseUseExplosion.rb:20:875:20:884 | ... > ... | | UseUseExplosion.rb:20:887:20:3028 | then ... | UseUseExplosion.rb:20:871:20:3044 | if ... | | UseUseExplosion.rb:20:892:20:3028 | if ... | UseUseExplosion.rb:20:887:20:3028 | then ... | @@ -628,8 +586,7 @@ | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:3019:20:3024 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:3019:20:3024 | self | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [false] ( ... ) | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [true] ( ... ) | +| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | ( ... ) | | UseUseExplosion.rb:20:904:20:905 | 58 | UseUseExplosion.rb:20:896:20:905 | ... > ... | | UseUseExplosion.rb:20:908:20:3012 | then ... | UseUseExplosion.rb:20:892:20:3028 | if ... | | UseUseExplosion.rb:20:913:20:3012 | if ... | UseUseExplosion.rb:20:908:20:3012 | then ... | @@ -638,8 +595,7 @@ | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:3003:20:3008 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:3003:20:3008 | self | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [false] ( ... ) | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [true] ( ... ) | +| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | ( ... ) | | UseUseExplosion.rb:20:925:20:926 | 57 | UseUseExplosion.rb:20:917:20:926 | ... > ... | | UseUseExplosion.rb:20:929:20:2996 | then ... | UseUseExplosion.rb:20:913:20:3012 | if ... | | UseUseExplosion.rb:20:934:20:2996 | if ... | UseUseExplosion.rb:20:929:20:2996 | then ... | @@ -648,8 +604,7 @@ | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:2987:20:2992 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:2987:20:2992 | self | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [false] ( ... ) | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [true] ( ... ) | +| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | ( ... ) | | UseUseExplosion.rb:20:946:20:947 | 56 | UseUseExplosion.rb:20:938:20:947 | ... > ... | | UseUseExplosion.rb:20:950:20:2980 | then ... | UseUseExplosion.rb:20:934:20:2996 | if ... | | UseUseExplosion.rb:20:955:20:2980 | if ... | UseUseExplosion.rb:20:950:20:2980 | then ... | @@ -658,8 +613,7 @@ | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:2971:20:2976 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:2971:20:2976 | self | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [false] ( ... ) | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [true] ( ... ) | +| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | ( ... ) | | UseUseExplosion.rb:20:967:20:968 | 55 | UseUseExplosion.rb:20:959:20:968 | ... > ... | | UseUseExplosion.rb:20:971:20:2964 | then ... | UseUseExplosion.rb:20:955:20:2980 | if ... | | UseUseExplosion.rb:20:976:20:2964 | if ... | UseUseExplosion.rb:20:971:20:2964 | then ... | @@ -668,8 +622,7 @@ | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:2955:20:2960 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:2955:20:2960 | self | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [false] ( ... ) | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [true] ( ... ) | +| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | ( ... ) | | UseUseExplosion.rb:20:988:20:989 | 54 | UseUseExplosion.rb:20:980:20:989 | ... > ... | | UseUseExplosion.rb:20:992:20:2948 | then ... | UseUseExplosion.rb:20:976:20:2964 | if ... | | UseUseExplosion.rb:20:997:20:2948 | if ... | UseUseExplosion.rb:20:992:20:2948 | then ... | @@ -678,8 +631,7 @@ | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:2939:20:2944 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:2939:20:2944 | self | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [false] ( ... ) | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [true] ( ... ) | +| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | ( ... ) | | UseUseExplosion.rb:20:1009:20:1010 | 53 | UseUseExplosion.rb:20:1001:20:1010 | ... > ... | | UseUseExplosion.rb:20:1013:20:2932 | then ... | UseUseExplosion.rb:20:997:20:2948 | if ... | | UseUseExplosion.rb:20:1018:20:2932 | if ... | UseUseExplosion.rb:20:1013:20:2932 | then ... | @@ -688,8 +640,7 @@ | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:2923:20:2928 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:2923:20:2928 | self | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [false] ( ... ) | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [true] ( ... ) | +| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | ( ... ) | | UseUseExplosion.rb:20:1030:20:1031 | 52 | UseUseExplosion.rb:20:1022:20:1031 | ... > ... | | UseUseExplosion.rb:20:1034:20:2916 | then ... | UseUseExplosion.rb:20:1018:20:2932 | if ... | | UseUseExplosion.rb:20:1039:20:2916 | if ... | UseUseExplosion.rb:20:1034:20:2916 | then ... | @@ -698,8 +649,7 @@ | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:2907:20:2912 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:2907:20:2912 | self | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [false] ( ... ) | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [true] ( ... ) | +| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | ( ... ) | | UseUseExplosion.rb:20:1051:20:1052 | 51 | UseUseExplosion.rb:20:1043:20:1052 | ... > ... | | UseUseExplosion.rb:20:1055:20:2900 | then ... | UseUseExplosion.rb:20:1039:20:2916 | if ... | | UseUseExplosion.rb:20:1060:20:2900 | if ... | UseUseExplosion.rb:20:1055:20:2900 | then ... | @@ -708,8 +658,7 @@ | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:2891:20:2896 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:2891:20:2896 | self | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [false] ( ... ) | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [true] ( ... ) | +| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | ( ... ) | | UseUseExplosion.rb:20:1072:20:1073 | 50 | UseUseExplosion.rb:20:1064:20:1073 | ... > ... | | UseUseExplosion.rb:20:1076:20:2884 | then ... | UseUseExplosion.rb:20:1060:20:2900 | if ... | | UseUseExplosion.rb:20:1081:20:2884 | if ... | UseUseExplosion.rb:20:1076:20:2884 | then ... | @@ -718,8 +667,7 @@ | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:2875:20:2880 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:2875:20:2880 | self | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [false] ( ... ) | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [true] ( ... ) | +| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | ( ... ) | | UseUseExplosion.rb:20:1093:20:1094 | 49 | UseUseExplosion.rb:20:1085:20:1094 | ... > ... | | UseUseExplosion.rb:20:1097:20:2868 | then ... | UseUseExplosion.rb:20:1081:20:2884 | if ... | | UseUseExplosion.rb:20:1102:20:2868 | if ... | UseUseExplosion.rb:20:1097:20:2868 | then ... | @@ -728,8 +676,7 @@ | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:2859:20:2864 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:2859:20:2864 | self | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [false] ( ... ) | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [true] ( ... ) | +| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | ( ... ) | | UseUseExplosion.rb:20:1114:20:1115 | 48 | UseUseExplosion.rb:20:1106:20:1115 | ... > ... | | UseUseExplosion.rb:20:1118:20:2852 | then ... | UseUseExplosion.rb:20:1102:20:2868 | if ... | | UseUseExplosion.rb:20:1123:20:2852 | if ... | UseUseExplosion.rb:20:1118:20:2852 | then ... | @@ -738,8 +685,7 @@ | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:2843:20:2848 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:2843:20:2848 | self | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [false] ( ... ) | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [true] ( ... ) | +| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | ( ... ) | | UseUseExplosion.rb:20:1135:20:1136 | 47 | UseUseExplosion.rb:20:1127:20:1136 | ... > ... | | UseUseExplosion.rb:20:1139:20:2836 | then ... | UseUseExplosion.rb:20:1123:20:2852 | if ... | | UseUseExplosion.rb:20:1144:20:2836 | if ... | UseUseExplosion.rb:20:1139:20:2836 | then ... | @@ -748,8 +694,7 @@ | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:2827:20:2832 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:2827:20:2832 | self | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [false] ( ... ) | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [true] ( ... ) | +| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | ( ... ) | | UseUseExplosion.rb:20:1156:20:1157 | 46 | UseUseExplosion.rb:20:1148:20:1157 | ... > ... | | UseUseExplosion.rb:20:1160:20:2820 | then ... | UseUseExplosion.rb:20:1144:20:2836 | if ... | | UseUseExplosion.rb:20:1165:20:2820 | if ... | UseUseExplosion.rb:20:1160:20:2820 | then ... | @@ -758,8 +703,7 @@ | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:2811:20:2816 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:2811:20:2816 | self | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [false] ( ... ) | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [true] ( ... ) | +| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | ( ... ) | | UseUseExplosion.rb:20:1177:20:1178 | 45 | UseUseExplosion.rb:20:1169:20:1178 | ... > ... | | UseUseExplosion.rb:20:1181:20:2804 | then ... | UseUseExplosion.rb:20:1165:20:2820 | if ... | | UseUseExplosion.rb:20:1186:20:2804 | if ... | UseUseExplosion.rb:20:1181:20:2804 | then ... | @@ -768,8 +712,7 @@ | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:2795:20:2800 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:2795:20:2800 | self | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [false] ( ... ) | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [true] ( ... ) | +| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | ( ... ) | | UseUseExplosion.rb:20:1198:20:1199 | 44 | UseUseExplosion.rb:20:1190:20:1199 | ... > ... | | UseUseExplosion.rb:20:1202:20:2788 | then ... | UseUseExplosion.rb:20:1186:20:2804 | if ... | | UseUseExplosion.rb:20:1207:20:2788 | if ... | UseUseExplosion.rb:20:1202:20:2788 | then ... | @@ -778,8 +721,7 @@ | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:2779:20:2784 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:2779:20:2784 | self | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [false] ( ... ) | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [true] ( ... ) | +| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | ( ... ) | | UseUseExplosion.rb:20:1219:20:1220 | 43 | UseUseExplosion.rb:20:1211:20:1220 | ... > ... | | UseUseExplosion.rb:20:1223:20:2772 | then ... | UseUseExplosion.rb:20:1207:20:2788 | if ... | | UseUseExplosion.rb:20:1228:20:2772 | if ... | UseUseExplosion.rb:20:1223:20:2772 | then ... | @@ -788,8 +730,7 @@ | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:2763:20:2768 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:2763:20:2768 | self | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [false] ( ... ) | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [true] ( ... ) | +| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | ( ... ) | | UseUseExplosion.rb:20:1240:20:1241 | 42 | UseUseExplosion.rb:20:1232:20:1241 | ... > ... | | UseUseExplosion.rb:20:1244:20:2756 | then ... | UseUseExplosion.rb:20:1228:20:2772 | if ... | | UseUseExplosion.rb:20:1249:20:2756 | if ... | UseUseExplosion.rb:20:1244:20:2756 | then ... | @@ -798,8 +739,7 @@ | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:2747:20:2752 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:2747:20:2752 | self | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [false] ( ... ) | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [true] ( ... ) | +| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | ( ... ) | | UseUseExplosion.rb:20:1261:20:1262 | 41 | UseUseExplosion.rb:20:1253:20:1262 | ... > ... | | UseUseExplosion.rb:20:1265:20:2740 | then ... | UseUseExplosion.rb:20:1249:20:2756 | if ... | | UseUseExplosion.rb:20:1270:20:2740 | if ... | UseUseExplosion.rb:20:1265:20:2740 | then ... | @@ -808,8 +748,7 @@ | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:2731:20:2736 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:2731:20:2736 | self | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [false] ( ... ) | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [true] ( ... ) | +| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | ( ... ) | | UseUseExplosion.rb:20:1282:20:1283 | 40 | UseUseExplosion.rb:20:1274:20:1283 | ... > ... | | UseUseExplosion.rb:20:1286:20:2724 | then ... | UseUseExplosion.rb:20:1270:20:2740 | if ... | | UseUseExplosion.rb:20:1291:20:2724 | if ... | UseUseExplosion.rb:20:1286:20:2724 | then ... | @@ -818,8 +757,7 @@ | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:2715:20:2720 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:2715:20:2720 | self | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [false] ( ... ) | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [true] ( ... ) | +| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | ( ... ) | | UseUseExplosion.rb:20:1303:20:1304 | 39 | UseUseExplosion.rb:20:1295:20:1304 | ... > ... | | UseUseExplosion.rb:20:1307:20:2708 | then ... | UseUseExplosion.rb:20:1291:20:2724 | if ... | | UseUseExplosion.rb:20:1312:20:2708 | if ... | UseUseExplosion.rb:20:1307:20:2708 | then ... | @@ -828,8 +766,7 @@ | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:2699:20:2704 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:2699:20:2704 | self | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [false] ( ... ) | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [true] ( ... ) | +| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | ( ... ) | | UseUseExplosion.rb:20:1324:20:1325 | 38 | UseUseExplosion.rb:20:1316:20:1325 | ... > ... | | UseUseExplosion.rb:20:1328:20:2692 | then ... | UseUseExplosion.rb:20:1312:20:2708 | if ... | | UseUseExplosion.rb:20:1333:20:2692 | if ... | UseUseExplosion.rb:20:1328:20:2692 | then ... | @@ -838,8 +775,7 @@ | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:2683:20:2688 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:2683:20:2688 | self | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [false] ( ... ) | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [true] ( ... ) | +| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | ( ... ) | | UseUseExplosion.rb:20:1345:20:1346 | 37 | UseUseExplosion.rb:20:1337:20:1346 | ... > ... | | UseUseExplosion.rb:20:1349:20:2676 | then ... | UseUseExplosion.rb:20:1333:20:2692 | if ... | | UseUseExplosion.rb:20:1354:20:2676 | if ... | UseUseExplosion.rb:20:1349:20:2676 | then ... | @@ -848,8 +784,7 @@ | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:2667:20:2672 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:2667:20:2672 | self | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [false] ( ... ) | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [true] ( ... ) | +| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | ( ... ) | | UseUseExplosion.rb:20:1366:20:1367 | 36 | UseUseExplosion.rb:20:1358:20:1367 | ... > ... | | UseUseExplosion.rb:20:1370:20:2660 | then ... | UseUseExplosion.rb:20:1354:20:2676 | if ... | | UseUseExplosion.rb:20:1375:20:2660 | if ... | UseUseExplosion.rb:20:1370:20:2660 | then ... | @@ -858,8 +793,7 @@ | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:2651:20:2656 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:2651:20:2656 | self | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [false] ( ... ) | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [true] ( ... ) | +| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | ( ... ) | | UseUseExplosion.rb:20:1387:20:1388 | 35 | UseUseExplosion.rb:20:1379:20:1388 | ... > ... | | UseUseExplosion.rb:20:1391:20:2644 | then ... | UseUseExplosion.rb:20:1375:20:2660 | if ... | | UseUseExplosion.rb:20:1396:20:2644 | if ... | UseUseExplosion.rb:20:1391:20:2644 | then ... | @@ -868,8 +802,7 @@ | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:2635:20:2640 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:2635:20:2640 | self | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [false] ( ... ) | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [true] ( ... ) | +| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | ( ... ) | | UseUseExplosion.rb:20:1408:20:1409 | 34 | UseUseExplosion.rb:20:1400:20:1409 | ... > ... | | UseUseExplosion.rb:20:1412:20:2628 | then ... | UseUseExplosion.rb:20:1396:20:2644 | if ... | | UseUseExplosion.rb:20:1417:20:2628 | if ... | UseUseExplosion.rb:20:1412:20:2628 | then ... | @@ -878,8 +811,7 @@ | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:2619:20:2624 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:2619:20:2624 | self | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [false] ( ... ) | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [true] ( ... ) | +| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | ( ... ) | | UseUseExplosion.rb:20:1429:20:1430 | 33 | UseUseExplosion.rb:20:1421:20:1430 | ... > ... | | UseUseExplosion.rb:20:1433:20:2612 | then ... | UseUseExplosion.rb:20:1417:20:2628 | if ... | | UseUseExplosion.rb:20:1438:20:2612 | if ... | UseUseExplosion.rb:20:1433:20:2612 | then ... | @@ -888,8 +820,7 @@ | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:2603:20:2608 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:2603:20:2608 | self | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [false] ( ... ) | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [true] ( ... ) | +| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | ( ... ) | | UseUseExplosion.rb:20:1450:20:1451 | 32 | UseUseExplosion.rb:20:1442:20:1451 | ... > ... | | UseUseExplosion.rb:20:1454:20:2596 | then ... | UseUseExplosion.rb:20:1438:20:2612 | if ... | | UseUseExplosion.rb:20:1459:20:2596 | if ... | UseUseExplosion.rb:20:1454:20:2596 | then ... | @@ -898,8 +829,7 @@ | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:2587:20:2592 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:2587:20:2592 | self | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [false] ( ... ) | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [true] ( ... ) | +| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | ( ... ) | | UseUseExplosion.rb:20:1471:20:1472 | 31 | UseUseExplosion.rb:20:1463:20:1472 | ... > ... | | UseUseExplosion.rb:20:1475:20:2580 | then ... | UseUseExplosion.rb:20:1459:20:2596 | if ... | | UseUseExplosion.rb:20:1480:20:2580 | if ... | UseUseExplosion.rb:20:1475:20:2580 | then ... | @@ -908,8 +838,7 @@ | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:2571:20:2576 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:2571:20:2576 | self | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [false] ( ... ) | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [true] ( ... ) | +| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | ( ... ) | | UseUseExplosion.rb:20:1492:20:1493 | 30 | UseUseExplosion.rb:20:1484:20:1493 | ... > ... | | UseUseExplosion.rb:20:1496:20:2564 | then ... | UseUseExplosion.rb:20:1480:20:2580 | if ... | | UseUseExplosion.rb:20:1501:20:2564 | if ... | UseUseExplosion.rb:20:1496:20:2564 | then ... | @@ -918,8 +847,7 @@ | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:2555:20:2560 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:2555:20:2560 | self | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [false] ( ... ) | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [true] ( ... ) | +| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | ( ... ) | | UseUseExplosion.rb:20:1513:20:1514 | 29 | UseUseExplosion.rb:20:1505:20:1514 | ... > ... | | UseUseExplosion.rb:20:1517:20:2548 | then ... | UseUseExplosion.rb:20:1501:20:2564 | if ... | | UseUseExplosion.rb:20:1522:20:2548 | if ... | UseUseExplosion.rb:20:1517:20:2548 | then ... | @@ -928,8 +856,7 @@ | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:2539:20:2544 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:2539:20:2544 | self | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [false] ( ... ) | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [true] ( ... ) | +| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | ( ... ) | | UseUseExplosion.rb:20:1534:20:1535 | 28 | UseUseExplosion.rb:20:1526:20:1535 | ... > ... | | UseUseExplosion.rb:20:1538:20:2532 | then ... | UseUseExplosion.rb:20:1522:20:2548 | if ... | | UseUseExplosion.rb:20:1543:20:2532 | if ... | UseUseExplosion.rb:20:1538:20:2532 | then ... | @@ -938,8 +865,7 @@ | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:2523:20:2528 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:2523:20:2528 | self | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [false] ( ... ) | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [true] ( ... ) | +| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | ( ... ) | | UseUseExplosion.rb:20:1555:20:1556 | 27 | UseUseExplosion.rb:20:1547:20:1556 | ... > ... | | UseUseExplosion.rb:20:1559:20:2516 | then ... | UseUseExplosion.rb:20:1543:20:2532 | if ... | | UseUseExplosion.rb:20:1564:20:2516 | if ... | UseUseExplosion.rb:20:1559:20:2516 | then ... | @@ -948,8 +874,7 @@ | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:2507:20:2512 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:2507:20:2512 | self | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [false] ( ... ) | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [true] ( ... ) | +| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | ( ... ) | | UseUseExplosion.rb:20:1576:20:1577 | 26 | UseUseExplosion.rb:20:1568:20:1577 | ... > ... | | UseUseExplosion.rb:20:1580:20:2500 | then ... | UseUseExplosion.rb:20:1564:20:2516 | if ... | | UseUseExplosion.rb:20:1585:20:2500 | if ... | UseUseExplosion.rb:20:1580:20:2500 | then ... | @@ -958,8 +883,7 @@ | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:2491:20:2496 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:2491:20:2496 | self | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [false] ( ... ) | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [true] ( ... ) | +| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | ( ... ) | | UseUseExplosion.rb:20:1597:20:1598 | 25 | UseUseExplosion.rb:20:1589:20:1598 | ... > ... | | UseUseExplosion.rb:20:1601:20:2484 | then ... | UseUseExplosion.rb:20:1585:20:2500 | if ... | | UseUseExplosion.rb:20:1606:20:2484 | if ... | UseUseExplosion.rb:20:1601:20:2484 | then ... | @@ -968,8 +892,7 @@ | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:2475:20:2480 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:2475:20:2480 | self | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [false] ( ... ) | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [true] ( ... ) | +| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | ( ... ) | | UseUseExplosion.rb:20:1618:20:1619 | 24 | UseUseExplosion.rb:20:1610:20:1619 | ... > ... | | UseUseExplosion.rb:20:1622:20:2468 | then ... | UseUseExplosion.rb:20:1606:20:2484 | if ... | | UseUseExplosion.rb:20:1627:20:2468 | if ... | UseUseExplosion.rb:20:1622:20:2468 | then ... | @@ -978,8 +901,7 @@ | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:2459:20:2464 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:2459:20:2464 | self | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [false] ( ... ) | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [true] ( ... ) | +| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | ( ... ) | | UseUseExplosion.rb:20:1639:20:1640 | 23 | UseUseExplosion.rb:20:1631:20:1640 | ... > ... | | UseUseExplosion.rb:20:1643:20:2452 | then ... | UseUseExplosion.rb:20:1627:20:2468 | if ... | | UseUseExplosion.rb:20:1648:20:2452 | if ... | UseUseExplosion.rb:20:1643:20:2452 | then ... | @@ -988,8 +910,7 @@ | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:2443:20:2448 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:2443:20:2448 | self | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [false] ( ... ) | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [true] ( ... ) | +| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | ( ... ) | | UseUseExplosion.rb:20:1660:20:1661 | 22 | UseUseExplosion.rb:20:1652:20:1661 | ... > ... | | UseUseExplosion.rb:20:1664:20:2436 | then ... | UseUseExplosion.rb:20:1648:20:2452 | if ... | | UseUseExplosion.rb:20:1669:20:2436 | if ... | UseUseExplosion.rb:20:1664:20:2436 | then ... | @@ -998,8 +919,7 @@ | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:2427:20:2432 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:2427:20:2432 | self | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [false] ( ... ) | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [true] ( ... ) | +| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | ( ... ) | | UseUseExplosion.rb:20:1681:20:1682 | 21 | UseUseExplosion.rb:20:1673:20:1682 | ... > ... | | UseUseExplosion.rb:20:1685:20:2420 | then ... | UseUseExplosion.rb:20:1669:20:2436 | if ... | | UseUseExplosion.rb:20:1690:20:2420 | if ... | UseUseExplosion.rb:20:1685:20:2420 | then ... | @@ -1008,8 +928,7 @@ | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:2411:20:2416 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:2411:20:2416 | self | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [false] ( ... ) | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [true] ( ... ) | +| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | ( ... ) | | UseUseExplosion.rb:20:1702:20:1703 | 20 | UseUseExplosion.rb:20:1694:20:1703 | ... > ... | | UseUseExplosion.rb:20:1706:20:2404 | then ... | UseUseExplosion.rb:20:1690:20:2420 | if ... | | UseUseExplosion.rb:20:1711:20:2404 | if ... | UseUseExplosion.rb:20:1706:20:2404 | then ... | @@ -1018,8 +937,7 @@ | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:2395:20:2400 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:2395:20:2400 | self | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [false] ( ... ) | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [true] ( ... ) | +| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | ( ... ) | | UseUseExplosion.rb:20:1723:20:1724 | 19 | UseUseExplosion.rb:20:1715:20:1724 | ... > ... | | UseUseExplosion.rb:20:1727:20:2388 | then ... | UseUseExplosion.rb:20:1711:20:2404 | if ... | | UseUseExplosion.rb:20:1732:20:2388 | if ... | UseUseExplosion.rb:20:1727:20:2388 | then ... | @@ -1028,8 +946,7 @@ | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:2379:20:2384 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:2379:20:2384 | self | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [false] ( ... ) | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [true] ( ... ) | +| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | ( ... ) | | UseUseExplosion.rb:20:1744:20:1745 | 18 | UseUseExplosion.rb:20:1736:20:1745 | ... > ... | | UseUseExplosion.rb:20:1748:20:2372 | then ... | UseUseExplosion.rb:20:1732:20:2388 | if ... | | UseUseExplosion.rb:20:1753:20:2372 | if ... | UseUseExplosion.rb:20:1748:20:2372 | then ... | @@ -1038,8 +955,7 @@ | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:2363:20:2368 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:2363:20:2368 | self | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [false] ( ... ) | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [true] ( ... ) | +| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | ( ... ) | | UseUseExplosion.rb:20:1765:20:1766 | 17 | UseUseExplosion.rb:20:1757:20:1766 | ... > ... | | UseUseExplosion.rb:20:1769:20:2356 | then ... | UseUseExplosion.rb:20:1753:20:2372 | if ... | | UseUseExplosion.rb:20:1774:20:2356 | if ... | UseUseExplosion.rb:20:1769:20:2356 | then ... | @@ -1048,8 +964,7 @@ | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:2347:20:2352 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:2347:20:2352 | self | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [false] ( ... ) | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [true] ( ... ) | +| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | ( ... ) | | UseUseExplosion.rb:20:1786:20:1787 | 16 | UseUseExplosion.rb:20:1778:20:1787 | ... > ... | | UseUseExplosion.rb:20:1790:20:2340 | then ... | UseUseExplosion.rb:20:1774:20:2356 | if ... | | UseUseExplosion.rb:20:1795:20:2340 | if ... | UseUseExplosion.rb:20:1790:20:2340 | then ... | @@ -1058,8 +973,7 @@ | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:2331:20:2336 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:2331:20:2336 | self | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [false] ( ... ) | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [true] ( ... ) | +| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | ( ... ) | | UseUseExplosion.rb:20:1807:20:1808 | 15 | UseUseExplosion.rb:20:1799:20:1808 | ... > ... | | UseUseExplosion.rb:20:1811:20:2324 | then ... | UseUseExplosion.rb:20:1795:20:2340 | if ... | | UseUseExplosion.rb:20:1816:20:2324 | if ... | UseUseExplosion.rb:20:1811:20:2324 | then ... | @@ -1068,8 +982,7 @@ | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:2315:20:2320 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:2315:20:2320 | self | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [false] ( ... ) | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [true] ( ... ) | +| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | ( ... ) | | UseUseExplosion.rb:20:1828:20:1829 | 14 | UseUseExplosion.rb:20:1820:20:1829 | ... > ... | | UseUseExplosion.rb:20:1832:20:2308 | then ... | UseUseExplosion.rb:20:1816:20:2324 | if ... | | UseUseExplosion.rb:20:1837:20:2308 | if ... | UseUseExplosion.rb:20:1832:20:2308 | then ... | @@ -1078,8 +991,7 @@ | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:2299:20:2304 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:2299:20:2304 | self | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [false] ( ... ) | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [true] ( ... ) | +| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | ( ... ) | | UseUseExplosion.rb:20:1849:20:1850 | 13 | UseUseExplosion.rb:20:1841:20:1850 | ... > ... | | UseUseExplosion.rb:20:1853:20:2292 | then ... | UseUseExplosion.rb:20:1837:20:2308 | if ... | | UseUseExplosion.rb:20:1858:20:2292 | if ... | UseUseExplosion.rb:20:1853:20:2292 | then ... | @@ -1088,8 +1000,7 @@ | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:2283:20:2288 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:2283:20:2288 | self | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [false] ( ... ) | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [true] ( ... ) | +| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | ( ... ) | | UseUseExplosion.rb:20:1870:20:1871 | 12 | UseUseExplosion.rb:20:1862:20:1871 | ... > ... | | UseUseExplosion.rb:20:1874:20:2276 | then ... | UseUseExplosion.rb:20:1858:20:2292 | if ... | | UseUseExplosion.rb:20:1879:20:2276 | if ... | UseUseExplosion.rb:20:1874:20:2276 | then ... | @@ -1098,8 +1009,7 @@ | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:2267:20:2272 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:2267:20:2272 | self | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [false] ( ... ) | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [true] ( ... ) | +| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | ( ... ) | | UseUseExplosion.rb:20:1891:20:1892 | 11 | UseUseExplosion.rb:20:1883:20:1892 | ... > ... | | UseUseExplosion.rb:20:1895:20:2260 | then ... | UseUseExplosion.rb:20:1879:20:2276 | if ... | | UseUseExplosion.rb:20:1900:20:2260 | if ... | UseUseExplosion.rb:20:1895:20:2260 | then ... | @@ -1108,8 +1018,7 @@ | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:2251:20:2256 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:2251:20:2256 | self | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [false] ( ... ) | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [true] ( ... ) | +| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | ( ... ) | | UseUseExplosion.rb:20:1912:20:1913 | 10 | UseUseExplosion.rb:20:1904:20:1913 | ... > ... | | UseUseExplosion.rb:20:1916:20:2244 | then ... | UseUseExplosion.rb:20:1900:20:2260 | if ... | | UseUseExplosion.rb:20:1921:20:2244 | if ... | UseUseExplosion.rb:20:1916:20:2244 | then ... | @@ -1118,8 +1027,7 @@ | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:2235:20:2240 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:2235:20:2240 | self | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [false] ( ... ) | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [true] ( ... ) | +| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | ( ... ) | | UseUseExplosion.rb:20:1933:20:1933 | 9 | UseUseExplosion.rb:20:1925:20:1933 | ... > ... | | UseUseExplosion.rb:20:1936:20:2228 | then ... | UseUseExplosion.rb:20:1921:20:2244 | if ... | | UseUseExplosion.rb:20:1941:20:2228 | if ... | UseUseExplosion.rb:20:1936:20:2228 | then ... | @@ -1128,8 +1036,7 @@ | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:2219:20:2224 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:2219:20:2224 | self | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [false] ( ... ) | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [true] ( ... ) | +| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | ( ... ) | | UseUseExplosion.rb:20:1953:20:1953 | 8 | UseUseExplosion.rb:20:1945:20:1953 | ... > ... | | UseUseExplosion.rb:20:1956:20:2212 | then ... | UseUseExplosion.rb:20:1941:20:2228 | if ... | | UseUseExplosion.rb:20:1961:20:2212 | if ... | UseUseExplosion.rb:20:1956:20:2212 | then ... | @@ -1138,8 +1045,7 @@ | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:2203:20:2208 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:2203:20:2208 | self | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [false] ( ... ) | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [true] ( ... ) | +| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | ( ... ) | | UseUseExplosion.rb:20:1973:20:1973 | 7 | UseUseExplosion.rb:20:1965:20:1973 | ... > ... | | UseUseExplosion.rb:20:1976:20:2196 | then ... | UseUseExplosion.rb:20:1961:20:2212 | if ... | | UseUseExplosion.rb:20:1981:20:2196 | if ... | UseUseExplosion.rb:20:1976:20:2196 | then ... | @@ -1148,8 +1054,7 @@ | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2187:20:2192 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2187:20:2192 | self | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [false] ( ... ) | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [true] ( ... ) | +| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | ( ... ) | | UseUseExplosion.rb:20:1993:20:1993 | 6 | UseUseExplosion.rb:20:1985:20:1993 | ... > ... | | UseUseExplosion.rb:20:1996:20:2180 | then ... | UseUseExplosion.rb:20:1981:20:2196 | if ... | | UseUseExplosion.rb:20:2001:20:2180 | if ... | UseUseExplosion.rb:20:1996:20:2180 | then ... | @@ -1158,8 +1063,7 @@ | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2171:20:2176 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2171:20:2176 | self | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [false] ( ... ) | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [true] ( ... ) | +| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | ( ... ) | | UseUseExplosion.rb:20:2013:20:2013 | 5 | UseUseExplosion.rb:20:2005:20:2013 | ... > ... | | UseUseExplosion.rb:20:2016:20:2164 | then ... | UseUseExplosion.rb:20:2001:20:2180 | if ... | | UseUseExplosion.rb:20:2021:20:2164 | if ... | UseUseExplosion.rb:20:2016:20:2164 | then ... | @@ -1168,8 +1072,7 @@ | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2155:20:2160 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2155:20:2160 | self | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [false] ( ... ) | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [true] ( ... ) | +| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | ( ... ) | | UseUseExplosion.rb:20:2033:20:2033 | 4 | UseUseExplosion.rb:20:2025:20:2033 | ... > ... | | UseUseExplosion.rb:20:2036:20:2148 | then ... | UseUseExplosion.rb:20:2021:20:2164 | if ... | | UseUseExplosion.rb:20:2041:20:2148 | if ... | UseUseExplosion.rb:20:2036:20:2148 | then ... | @@ -1178,8 +1081,7 @@ | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2139:20:2144 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2139:20:2144 | self | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [false] ( ... ) | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [true] ( ... ) | +| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | ( ... ) | | UseUseExplosion.rb:20:2053:20:2053 | 3 | UseUseExplosion.rb:20:2045:20:2053 | ... > ... | | UseUseExplosion.rb:20:2056:20:2132 | then ... | UseUseExplosion.rb:20:2041:20:2148 | if ... | | UseUseExplosion.rb:20:2061:20:2132 | if ... | UseUseExplosion.rb:20:2056:20:2132 | then ... | @@ -1188,8 +1090,7 @@ | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2123:20:2128 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2123:20:2128 | self | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [false] ( ... ) | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [true] ( ... ) | +| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | ( ... ) | | UseUseExplosion.rb:20:2073:20:2073 | 2 | UseUseExplosion.rb:20:2065:20:2073 | ... > ... | | UseUseExplosion.rb:20:2076:20:2116 | then ... | UseUseExplosion.rb:20:2061:20:2132 | if ... | | UseUseExplosion.rb:20:2081:20:2116 | if ... | UseUseExplosion.rb:20:2076:20:2116 | then ... | @@ -1198,8 +1099,7 @@ | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2107:20:2112 | self | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2107:20:2112 | self | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [false] ( ... ) | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [true] ( ... ) | +| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | ( ... ) | | UseUseExplosion.rb:20:2093:20:2093 | 1 | UseUseExplosion.rb:20:2085:20:2093 | ... > ... | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(x) | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | @@ -1709,8 +1609,7 @@ | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:3691:21:3696 | self | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [false] ( ... ) | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [true] ( ... ) | +| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | ( ... ) | | UseUseExplosion.rb:21:21:21:23 | 100 | UseUseExplosion.rb:21:13:21:23 | ... > ... | | UseUseExplosion.rb:21:26:21:3684 | then ... | UseUseExplosion.rb:21:9:21:3700 | if ... | | UseUseExplosion.rb:21:31:21:3684 | if ... | UseUseExplosion.rb:21:26:21:3684 | then ... | @@ -1719,8 +1618,7 @@ | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:3675:21:3680 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:3675:21:3680 | self | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [false] ( ... ) | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [true] ( ... ) | +| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | ( ... ) | | UseUseExplosion.rb:21:43:21:44 | 99 | UseUseExplosion.rb:21:35:21:44 | ... > ... | | UseUseExplosion.rb:21:47:21:3668 | then ... | UseUseExplosion.rb:21:31:21:3684 | if ... | | UseUseExplosion.rb:21:52:21:3668 | if ... | UseUseExplosion.rb:21:47:21:3668 | then ... | @@ -1729,8 +1627,7 @@ | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:3659:21:3664 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:3659:21:3664 | self | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [false] ( ... ) | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [true] ( ... ) | +| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | ( ... ) | | UseUseExplosion.rb:21:64:21:65 | 98 | UseUseExplosion.rb:21:56:21:65 | ... > ... | | UseUseExplosion.rb:21:68:21:3652 | then ... | UseUseExplosion.rb:21:52:21:3668 | if ... | | UseUseExplosion.rb:21:73:21:3652 | if ... | UseUseExplosion.rb:21:68:21:3652 | then ... | @@ -1739,8 +1636,7 @@ | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:3643:21:3648 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:3643:21:3648 | self | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [false] ( ... ) | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [true] ( ... ) | +| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | ( ... ) | | UseUseExplosion.rb:21:85:21:86 | 97 | UseUseExplosion.rb:21:77:21:86 | ... > ... | | UseUseExplosion.rb:21:89:21:3636 | then ... | UseUseExplosion.rb:21:73:21:3652 | if ... | | UseUseExplosion.rb:21:94:21:3636 | if ... | UseUseExplosion.rb:21:89:21:3636 | then ... | @@ -1749,8 +1645,7 @@ | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:3627:21:3632 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:3627:21:3632 | self | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [false] ( ... ) | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [true] ( ... ) | +| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | ( ... ) | | UseUseExplosion.rb:21:106:21:107 | 96 | UseUseExplosion.rb:21:98:21:107 | ... > ... | | UseUseExplosion.rb:21:110:21:3620 | then ... | UseUseExplosion.rb:21:94:21:3636 | if ... | | UseUseExplosion.rb:21:115:21:3620 | if ... | UseUseExplosion.rb:21:110:21:3620 | then ... | @@ -1759,8 +1654,7 @@ | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:3611:21:3616 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:3611:21:3616 | self | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [false] ( ... ) | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [true] ( ... ) | +| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | ( ... ) | | UseUseExplosion.rb:21:127:21:128 | 95 | UseUseExplosion.rb:21:119:21:128 | ... > ... | | UseUseExplosion.rb:21:131:21:3604 | then ... | UseUseExplosion.rb:21:115:21:3620 | if ... | | UseUseExplosion.rb:21:136:21:3604 | if ... | UseUseExplosion.rb:21:131:21:3604 | then ... | @@ -1769,8 +1663,7 @@ | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:3595:21:3600 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:3595:21:3600 | self | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [false] ( ... ) | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [true] ( ... ) | +| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | ( ... ) | | UseUseExplosion.rb:21:148:21:149 | 94 | UseUseExplosion.rb:21:140:21:149 | ... > ... | | UseUseExplosion.rb:21:152:21:3588 | then ... | UseUseExplosion.rb:21:136:21:3604 | if ... | | UseUseExplosion.rb:21:157:21:3588 | if ... | UseUseExplosion.rb:21:152:21:3588 | then ... | @@ -1779,8 +1672,7 @@ | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:3579:21:3584 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:3579:21:3584 | self | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [false] ( ... ) | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [true] ( ... ) | +| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | ( ... ) | | UseUseExplosion.rb:21:169:21:170 | 93 | UseUseExplosion.rb:21:161:21:170 | ... > ... | | UseUseExplosion.rb:21:173:21:3572 | then ... | UseUseExplosion.rb:21:157:21:3588 | if ... | | UseUseExplosion.rb:21:178:21:3572 | if ... | UseUseExplosion.rb:21:173:21:3572 | then ... | @@ -1789,8 +1681,7 @@ | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:3563:21:3568 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:3563:21:3568 | self | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [false] ( ... ) | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [true] ( ... ) | +| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | ( ... ) | | UseUseExplosion.rb:21:190:21:191 | 92 | UseUseExplosion.rb:21:182:21:191 | ... > ... | | UseUseExplosion.rb:21:194:21:3556 | then ... | UseUseExplosion.rb:21:178:21:3572 | if ... | | UseUseExplosion.rb:21:199:21:3556 | if ... | UseUseExplosion.rb:21:194:21:3556 | then ... | @@ -1799,8 +1690,7 @@ | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:3547:21:3552 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:3547:21:3552 | self | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [false] ( ... ) | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [true] ( ... ) | +| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | ( ... ) | | UseUseExplosion.rb:21:211:21:212 | 91 | UseUseExplosion.rb:21:203:21:212 | ... > ... | | UseUseExplosion.rb:21:215:21:3540 | then ... | UseUseExplosion.rb:21:199:21:3556 | if ... | | UseUseExplosion.rb:21:220:21:3540 | if ... | UseUseExplosion.rb:21:215:21:3540 | then ... | @@ -1809,8 +1699,7 @@ | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:3531:21:3536 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:3531:21:3536 | self | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [false] ( ... ) | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [true] ( ... ) | +| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | ( ... ) | | UseUseExplosion.rb:21:232:21:233 | 90 | UseUseExplosion.rb:21:224:21:233 | ... > ... | | UseUseExplosion.rb:21:236:21:3524 | then ... | UseUseExplosion.rb:21:220:21:3540 | if ... | | UseUseExplosion.rb:21:241:21:3524 | if ... | UseUseExplosion.rb:21:236:21:3524 | then ... | @@ -1819,8 +1708,7 @@ | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:3515:21:3520 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:3515:21:3520 | self | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [false] ( ... ) | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [true] ( ... ) | +| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | ( ... ) | | UseUseExplosion.rb:21:253:21:254 | 89 | UseUseExplosion.rb:21:245:21:254 | ... > ... | | UseUseExplosion.rb:21:257:21:3508 | then ... | UseUseExplosion.rb:21:241:21:3524 | if ... | | UseUseExplosion.rb:21:262:21:3508 | if ... | UseUseExplosion.rb:21:257:21:3508 | then ... | @@ -1829,8 +1717,7 @@ | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:3499:21:3504 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:3499:21:3504 | self | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [false] ( ... ) | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [true] ( ... ) | +| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | ( ... ) | | UseUseExplosion.rb:21:274:21:275 | 88 | UseUseExplosion.rb:21:266:21:275 | ... > ... | | UseUseExplosion.rb:21:278:21:3492 | then ... | UseUseExplosion.rb:21:262:21:3508 | if ... | | UseUseExplosion.rb:21:283:21:3492 | if ... | UseUseExplosion.rb:21:278:21:3492 | then ... | @@ -1839,8 +1726,7 @@ | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:3483:21:3488 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:3483:21:3488 | self | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [false] ( ... ) | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [true] ( ... ) | +| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | ( ... ) | | UseUseExplosion.rb:21:295:21:296 | 87 | UseUseExplosion.rb:21:287:21:296 | ... > ... | | UseUseExplosion.rb:21:299:21:3476 | then ... | UseUseExplosion.rb:21:283:21:3492 | if ... | | UseUseExplosion.rb:21:304:21:3476 | if ... | UseUseExplosion.rb:21:299:21:3476 | then ... | @@ -1849,8 +1735,7 @@ | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:3467:21:3472 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:3467:21:3472 | self | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [false] ( ... ) | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [true] ( ... ) | +| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | ( ... ) | | UseUseExplosion.rb:21:316:21:317 | 86 | UseUseExplosion.rb:21:308:21:317 | ... > ... | | UseUseExplosion.rb:21:320:21:3460 | then ... | UseUseExplosion.rb:21:304:21:3476 | if ... | | UseUseExplosion.rb:21:325:21:3460 | if ... | UseUseExplosion.rb:21:320:21:3460 | then ... | @@ -1859,8 +1744,7 @@ | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:3451:21:3456 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:3451:21:3456 | self | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [false] ( ... ) | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [true] ( ... ) | +| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | ( ... ) | | UseUseExplosion.rb:21:337:21:338 | 85 | UseUseExplosion.rb:21:329:21:338 | ... > ... | | UseUseExplosion.rb:21:341:21:3444 | then ... | UseUseExplosion.rb:21:325:21:3460 | if ... | | UseUseExplosion.rb:21:346:21:3444 | if ... | UseUseExplosion.rb:21:341:21:3444 | then ... | @@ -1869,8 +1753,7 @@ | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:3435:21:3440 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:3435:21:3440 | self | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [false] ( ... ) | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [true] ( ... ) | +| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | ( ... ) | | UseUseExplosion.rb:21:358:21:359 | 84 | UseUseExplosion.rb:21:350:21:359 | ... > ... | | UseUseExplosion.rb:21:362:21:3428 | then ... | UseUseExplosion.rb:21:346:21:3444 | if ... | | UseUseExplosion.rb:21:367:21:3428 | if ... | UseUseExplosion.rb:21:362:21:3428 | then ... | @@ -1879,8 +1762,7 @@ | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:3419:21:3424 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:3419:21:3424 | self | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [false] ( ... ) | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [true] ( ... ) | +| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | ( ... ) | | UseUseExplosion.rb:21:379:21:380 | 83 | UseUseExplosion.rb:21:371:21:380 | ... > ... | | UseUseExplosion.rb:21:383:21:3412 | then ... | UseUseExplosion.rb:21:367:21:3428 | if ... | | UseUseExplosion.rb:21:388:21:3412 | if ... | UseUseExplosion.rb:21:383:21:3412 | then ... | @@ -1889,8 +1771,7 @@ | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:3403:21:3408 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:3403:21:3408 | self | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [false] ( ... ) | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [true] ( ... ) | +| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | ( ... ) | | UseUseExplosion.rb:21:400:21:401 | 82 | UseUseExplosion.rb:21:392:21:401 | ... > ... | | UseUseExplosion.rb:21:404:21:3396 | then ... | UseUseExplosion.rb:21:388:21:3412 | if ... | | UseUseExplosion.rb:21:409:21:3396 | if ... | UseUseExplosion.rb:21:404:21:3396 | then ... | @@ -1899,8 +1780,7 @@ | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:3387:21:3392 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:3387:21:3392 | self | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [false] ( ... ) | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [true] ( ... ) | +| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | ( ... ) | | UseUseExplosion.rb:21:421:21:422 | 81 | UseUseExplosion.rb:21:413:21:422 | ... > ... | | UseUseExplosion.rb:21:425:21:3380 | then ... | UseUseExplosion.rb:21:409:21:3396 | if ... | | UseUseExplosion.rb:21:430:21:3380 | if ... | UseUseExplosion.rb:21:425:21:3380 | then ... | @@ -1909,8 +1789,7 @@ | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:3371:21:3376 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:3371:21:3376 | self | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [false] ( ... ) | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [true] ( ... ) | +| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | ( ... ) | | UseUseExplosion.rb:21:442:21:443 | 80 | UseUseExplosion.rb:21:434:21:443 | ... > ... | | UseUseExplosion.rb:21:446:21:3364 | then ... | UseUseExplosion.rb:21:430:21:3380 | if ... | | UseUseExplosion.rb:21:451:21:3364 | if ... | UseUseExplosion.rb:21:446:21:3364 | then ... | @@ -1919,8 +1798,7 @@ | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:3355:21:3360 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:3355:21:3360 | self | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [false] ( ... ) | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [true] ( ... ) | +| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | ( ... ) | | UseUseExplosion.rb:21:463:21:464 | 79 | UseUseExplosion.rb:21:455:21:464 | ... > ... | | UseUseExplosion.rb:21:467:21:3348 | then ... | UseUseExplosion.rb:21:451:21:3364 | if ... | | UseUseExplosion.rb:21:472:21:3348 | if ... | UseUseExplosion.rb:21:467:21:3348 | then ... | @@ -1929,8 +1807,7 @@ | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:3339:21:3344 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:3339:21:3344 | self | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [false] ( ... ) | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [true] ( ... ) | +| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | ( ... ) | | UseUseExplosion.rb:21:484:21:485 | 78 | UseUseExplosion.rb:21:476:21:485 | ... > ... | | UseUseExplosion.rb:21:488:21:3332 | then ... | UseUseExplosion.rb:21:472:21:3348 | if ... | | UseUseExplosion.rb:21:493:21:3332 | if ... | UseUseExplosion.rb:21:488:21:3332 | then ... | @@ -1939,8 +1816,7 @@ | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:3323:21:3328 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:3323:21:3328 | self | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [false] ( ... ) | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [true] ( ... ) | +| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | ( ... ) | | UseUseExplosion.rb:21:505:21:506 | 77 | UseUseExplosion.rb:21:497:21:506 | ... > ... | | UseUseExplosion.rb:21:509:21:3316 | then ... | UseUseExplosion.rb:21:493:21:3332 | if ... | | UseUseExplosion.rb:21:514:21:3316 | if ... | UseUseExplosion.rb:21:509:21:3316 | then ... | @@ -1949,8 +1825,7 @@ | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:3307:21:3312 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:3307:21:3312 | self | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [false] ( ... ) | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [true] ( ... ) | +| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | ( ... ) | | UseUseExplosion.rb:21:526:21:527 | 76 | UseUseExplosion.rb:21:518:21:527 | ... > ... | | UseUseExplosion.rb:21:530:21:3300 | then ... | UseUseExplosion.rb:21:514:21:3316 | if ... | | UseUseExplosion.rb:21:535:21:3300 | if ... | UseUseExplosion.rb:21:530:21:3300 | then ... | @@ -1959,8 +1834,7 @@ | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:3291:21:3296 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:3291:21:3296 | self | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [false] ( ... ) | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [true] ( ... ) | +| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | ( ... ) | | UseUseExplosion.rb:21:547:21:548 | 75 | UseUseExplosion.rb:21:539:21:548 | ... > ... | | UseUseExplosion.rb:21:551:21:3284 | then ... | UseUseExplosion.rb:21:535:21:3300 | if ... | | UseUseExplosion.rb:21:556:21:3284 | if ... | UseUseExplosion.rb:21:551:21:3284 | then ... | @@ -1969,8 +1843,7 @@ | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:3275:21:3280 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:3275:21:3280 | self | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [false] ( ... ) | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [true] ( ... ) | +| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | ( ... ) | | UseUseExplosion.rb:21:568:21:569 | 74 | UseUseExplosion.rb:21:560:21:569 | ... > ... | | UseUseExplosion.rb:21:572:21:3268 | then ... | UseUseExplosion.rb:21:556:21:3284 | if ... | | UseUseExplosion.rb:21:577:21:3268 | if ... | UseUseExplosion.rb:21:572:21:3268 | then ... | @@ -1979,8 +1852,7 @@ | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:3259:21:3264 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:3259:21:3264 | self | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [false] ( ... ) | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [true] ( ... ) | +| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | ( ... ) | | UseUseExplosion.rb:21:589:21:590 | 73 | UseUseExplosion.rb:21:581:21:590 | ... > ... | | UseUseExplosion.rb:21:593:21:3252 | then ... | UseUseExplosion.rb:21:577:21:3268 | if ... | | UseUseExplosion.rb:21:598:21:3252 | if ... | UseUseExplosion.rb:21:593:21:3252 | then ... | @@ -1989,8 +1861,7 @@ | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:3243:21:3248 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:3243:21:3248 | self | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [false] ( ... ) | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [true] ( ... ) | +| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | ( ... ) | | UseUseExplosion.rb:21:610:21:611 | 72 | UseUseExplosion.rb:21:602:21:611 | ... > ... | | UseUseExplosion.rb:21:614:21:3236 | then ... | UseUseExplosion.rb:21:598:21:3252 | if ... | | UseUseExplosion.rb:21:619:21:3236 | if ... | UseUseExplosion.rb:21:614:21:3236 | then ... | @@ -1999,8 +1870,7 @@ | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:3227:21:3232 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:3227:21:3232 | self | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [false] ( ... ) | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [true] ( ... ) | +| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | ( ... ) | | UseUseExplosion.rb:21:631:21:632 | 71 | UseUseExplosion.rb:21:623:21:632 | ... > ... | | UseUseExplosion.rb:21:635:21:3220 | then ... | UseUseExplosion.rb:21:619:21:3236 | if ... | | UseUseExplosion.rb:21:640:21:3220 | if ... | UseUseExplosion.rb:21:635:21:3220 | then ... | @@ -2009,8 +1879,7 @@ | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:3211:21:3216 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:3211:21:3216 | self | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [false] ( ... ) | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [true] ( ... ) | +| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | ( ... ) | | UseUseExplosion.rb:21:652:21:653 | 70 | UseUseExplosion.rb:21:644:21:653 | ... > ... | | UseUseExplosion.rb:21:656:21:3204 | then ... | UseUseExplosion.rb:21:640:21:3220 | if ... | | UseUseExplosion.rb:21:661:21:3204 | if ... | UseUseExplosion.rb:21:656:21:3204 | then ... | @@ -2019,8 +1888,7 @@ | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:3195:21:3200 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:3195:21:3200 | self | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [false] ( ... ) | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [true] ( ... ) | +| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | ( ... ) | | UseUseExplosion.rb:21:673:21:674 | 69 | UseUseExplosion.rb:21:665:21:674 | ... > ... | | UseUseExplosion.rb:21:677:21:3188 | then ... | UseUseExplosion.rb:21:661:21:3204 | if ... | | UseUseExplosion.rb:21:682:21:3188 | if ... | UseUseExplosion.rb:21:677:21:3188 | then ... | @@ -2029,8 +1897,7 @@ | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:3179:21:3184 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:3179:21:3184 | self | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [false] ( ... ) | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [true] ( ... ) | +| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | ( ... ) | | UseUseExplosion.rb:21:694:21:695 | 68 | UseUseExplosion.rb:21:686:21:695 | ... > ... | | UseUseExplosion.rb:21:698:21:3172 | then ... | UseUseExplosion.rb:21:682:21:3188 | if ... | | UseUseExplosion.rb:21:703:21:3172 | if ... | UseUseExplosion.rb:21:698:21:3172 | then ... | @@ -2039,8 +1906,7 @@ | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:3163:21:3168 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:3163:21:3168 | self | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [false] ( ... ) | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [true] ( ... ) | +| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | ( ... ) | | UseUseExplosion.rb:21:715:21:716 | 67 | UseUseExplosion.rb:21:707:21:716 | ... > ... | | UseUseExplosion.rb:21:719:21:3156 | then ... | UseUseExplosion.rb:21:703:21:3172 | if ... | | UseUseExplosion.rb:21:724:21:3156 | if ... | UseUseExplosion.rb:21:719:21:3156 | then ... | @@ -2049,8 +1915,7 @@ | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:3147:21:3152 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:3147:21:3152 | self | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [false] ( ... ) | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [true] ( ... ) | +| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | ( ... ) | | UseUseExplosion.rb:21:736:21:737 | 66 | UseUseExplosion.rb:21:728:21:737 | ... > ... | | UseUseExplosion.rb:21:740:21:3140 | then ... | UseUseExplosion.rb:21:724:21:3156 | if ... | | UseUseExplosion.rb:21:745:21:3140 | if ... | UseUseExplosion.rb:21:740:21:3140 | then ... | @@ -2059,8 +1924,7 @@ | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:3131:21:3136 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:3131:21:3136 | self | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [false] ( ... ) | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [true] ( ... ) | +| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | ( ... ) | | UseUseExplosion.rb:21:757:21:758 | 65 | UseUseExplosion.rb:21:749:21:758 | ... > ... | | UseUseExplosion.rb:21:761:21:3124 | then ... | UseUseExplosion.rb:21:745:21:3140 | if ... | | UseUseExplosion.rb:21:766:21:3124 | if ... | UseUseExplosion.rb:21:761:21:3124 | then ... | @@ -2069,8 +1933,7 @@ | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:3115:21:3120 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:3115:21:3120 | self | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [false] ( ... ) | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [true] ( ... ) | +| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | ( ... ) | | UseUseExplosion.rb:21:778:21:779 | 64 | UseUseExplosion.rb:21:770:21:779 | ... > ... | | UseUseExplosion.rb:21:782:21:3108 | then ... | UseUseExplosion.rb:21:766:21:3124 | if ... | | UseUseExplosion.rb:21:787:21:3108 | if ... | UseUseExplosion.rb:21:782:21:3108 | then ... | @@ -2079,8 +1942,7 @@ | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:3099:21:3104 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:3099:21:3104 | self | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [false] ( ... ) | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [true] ( ... ) | +| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | ( ... ) | | UseUseExplosion.rb:21:799:21:800 | 63 | UseUseExplosion.rb:21:791:21:800 | ... > ... | | UseUseExplosion.rb:21:803:21:3092 | then ... | UseUseExplosion.rb:21:787:21:3108 | if ... | | UseUseExplosion.rb:21:808:21:3092 | if ... | UseUseExplosion.rb:21:803:21:3092 | then ... | @@ -2089,8 +1951,7 @@ | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:3083:21:3088 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:3083:21:3088 | self | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [false] ( ... ) | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [true] ( ... ) | +| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | ( ... ) | | UseUseExplosion.rb:21:820:21:821 | 62 | UseUseExplosion.rb:21:812:21:821 | ... > ... | | UseUseExplosion.rb:21:824:21:3076 | then ... | UseUseExplosion.rb:21:808:21:3092 | if ... | | UseUseExplosion.rb:21:829:21:3076 | if ... | UseUseExplosion.rb:21:824:21:3076 | then ... | @@ -2099,8 +1960,7 @@ | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:3067:21:3072 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:3067:21:3072 | self | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [false] ( ... ) | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [true] ( ... ) | +| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | ( ... ) | | UseUseExplosion.rb:21:841:21:842 | 61 | UseUseExplosion.rb:21:833:21:842 | ... > ... | | UseUseExplosion.rb:21:845:21:3060 | then ... | UseUseExplosion.rb:21:829:21:3076 | if ... | | UseUseExplosion.rb:21:850:21:3060 | if ... | UseUseExplosion.rb:21:845:21:3060 | then ... | @@ -2109,8 +1969,7 @@ | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:3051:21:3056 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:3051:21:3056 | self | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [false] ( ... ) | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [true] ( ... ) | +| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | ( ... ) | | UseUseExplosion.rb:21:862:21:863 | 60 | UseUseExplosion.rb:21:854:21:863 | ... > ... | | UseUseExplosion.rb:21:866:21:3044 | then ... | UseUseExplosion.rb:21:850:21:3060 | if ... | | UseUseExplosion.rb:21:871:21:3044 | if ... | UseUseExplosion.rb:21:866:21:3044 | then ... | @@ -2119,8 +1978,7 @@ | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:3035:21:3040 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:3035:21:3040 | self | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [false] ( ... ) | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [true] ( ... ) | +| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | ( ... ) | | UseUseExplosion.rb:21:883:21:884 | 59 | UseUseExplosion.rb:21:875:21:884 | ... > ... | | UseUseExplosion.rb:21:887:21:3028 | then ... | UseUseExplosion.rb:21:871:21:3044 | if ... | | UseUseExplosion.rb:21:892:21:3028 | if ... | UseUseExplosion.rb:21:887:21:3028 | then ... | @@ -2129,8 +1987,7 @@ | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:3019:21:3024 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:3019:21:3024 | self | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [false] ( ... ) | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [true] ( ... ) | +| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | ( ... ) | | UseUseExplosion.rb:21:904:21:905 | 58 | UseUseExplosion.rb:21:896:21:905 | ... > ... | | UseUseExplosion.rb:21:908:21:3012 | then ... | UseUseExplosion.rb:21:892:21:3028 | if ... | | UseUseExplosion.rb:21:913:21:3012 | if ... | UseUseExplosion.rb:21:908:21:3012 | then ... | @@ -2139,8 +1996,7 @@ | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:3003:21:3008 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:3003:21:3008 | self | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [false] ( ... ) | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [true] ( ... ) | +| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | ( ... ) | | UseUseExplosion.rb:21:925:21:926 | 57 | UseUseExplosion.rb:21:917:21:926 | ... > ... | | UseUseExplosion.rb:21:929:21:2996 | then ... | UseUseExplosion.rb:21:913:21:3012 | if ... | | UseUseExplosion.rb:21:934:21:2996 | if ... | UseUseExplosion.rb:21:929:21:2996 | then ... | @@ -2149,8 +2005,7 @@ | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:2987:21:2992 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:2987:21:2992 | self | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [false] ( ... ) | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [true] ( ... ) | +| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | ( ... ) | | UseUseExplosion.rb:21:946:21:947 | 56 | UseUseExplosion.rb:21:938:21:947 | ... > ... | | UseUseExplosion.rb:21:950:21:2980 | then ... | UseUseExplosion.rb:21:934:21:2996 | if ... | | UseUseExplosion.rb:21:955:21:2980 | if ... | UseUseExplosion.rb:21:950:21:2980 | then ... | @@ -2159,8 +2014,7 @@ | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:2971:21:2976 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:2971:21:2976 | self | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [false] ( ... ) | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [true] ( ... ) | +| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | ( ... ) | | UseUseExplosion.rb:21:967:21:968 | 55 | UseUseExplosion.rb:21:959:21:968 | ... > ... | | UseUseExplosion.rb:21:971:21:2964 | then ... | UseUseExplosion.rb:21:955:21:2980 | if ... | | UseUseExplosion.rb:21:976:21:2964 | if ... | UseUseExplosion.rb:21:971:21:2964 | then ... | @@ -2169,8 +2023,7 @@ | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:2955:21:2960 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:2955:21:2960 | self | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [false] ( ... ) | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [true] ( ... ) | +| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | ( ... ) | | UseUseExplosion.rb:21:988:21:989 | 54 | UseUseExplosion.rb:21:980:21:989 | ... > ... | | UseUseExplosion.rb:21:992:21:2948 | then ... | UseUseExplosion.rb:21:976:21:2964 | if ... | | UseUseExplosion.rb:21:997:21:2948 | if ... | UseUseExplosion.rb:21:992:21:2948 | then ... | @@ -2179,8 +2032,7 @@ | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:2939:21:2944 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:2939:21:2944 | self | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [false] ( ... ) | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [true] ( ... ) | +| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | ( ... ) | | UseUseExplosion.rb:21:1009:21:1010 | 53 | UseUseExplosion.rb:21:1001:21:1010 | ... > ... | | UseUseExplosion.rb:21:1013:21:2932 | then ... | UseUseExplosion.rb:21:997:21:2948 | if ... | | UseUseExplosion.rb:21:1018:21:2932 | if ... | UseUseExplosion.rb:21:1013:21:2932 | then ... | @@ -2189,8 +2041,7 @@ | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:2923:21:2928 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:2923:21:2928 | self | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [false] ( ... ) | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [true] ( ... ) | +| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | ( ... ) | | UseUseExplosion.rb:21:1030:21:1031 | 52 | UseUseExplosion.rb:21:1022:21:1031 | ... > ... | | UseUseExplosion.rb:21:1034:21:2916 | then ... | UseUseExplosion.rb:21:1018:21:2932 | if ... | | UseUseExplosion.rb:21:1039:21:2916 | if ... | UseUseExplosion.rb:21:1034:21:2916 | then ... | @@ -2199,8 +2050,7 @@ | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:2907:21:2912 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:2907:21:2912 | self | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [false] ( ... ) | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [true] ( ... ) | +| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | ( ... ) | | UseUseExplosion.rb:21:1051:21:1052 | 51 | UseUseExplosion.rb:21:1043:21:1052 | ... > ... | | UseUseExplosion.rb:21:1055:21:2900 | then ... | UseUseExplosion.rb:21:1039:21:2916 | if ... | | UseUseExplosion.rb:21:1060:21:2900 | if ... | UseUseExplosion.rb:21:1055:21:2900 | then ... | @@ -2209,8 +2059,7 @@ | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:2891:21:2896 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:2891:21:2896 | self | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [false] ( ... ) | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [true] ( ... ) | +| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | ( ... ) | | UseUseExplosion.rb:21:1072:21:1073 | 50 | UseUseExplosion.rb:21:1064:21:1073 | ... > ... | | UseUseExplosion.rb:21:1076:21:2884 | then ... | UseUseExplosion.rb:21:1060:21:2900 | if ... | | UseUseExplosion.rb:21:1081:21:2884 | if ... | UseUseExplosion.rb:21:1076:21:2884 | then ... | @@ -2219,8 +2068,7 @@ | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:2875:21:2880 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:2875:21:2880 | self | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [false] ( ... ) | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [true] ( ... ) | +| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | ( ... ) | | UseUseExplosion.rb:21:1093:21:1094 | 49 | UseUseExplosion.rb:21:1085:21:1094 | ... > ... | | UseUseExplosion.rb:21:1097:21:2868 | then ... | UseUseExplosion.rb:21:1081:21:2884 | if ... | | UseUseExplosion.rb:21:1102:21:2868 | if ... | UseUseExplosion.rb:21:1097:21:2868 | then ... | @@ -2229,8 +2077,7 @@ | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:2859:21:2864 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:2859:21:2864 | self | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [false] ( ... ) | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [true] ( ... ) | +| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | ( ... ) | | UseUseExplosion.rb:21:1114:21:1115 | 48 | UseUseExplosion.rb:21:1106:21:1115 | ... > ... | | UseUseExplosion.rb:21:1118:21:2852 | then ... | UseUseExplosion.rb:21:1102:21:2868 | if ... | | UseUseExplosion.rb:21:1123:21:2852 | if ... | UseUseExplosion.rb:21:1118:21:2852 | then ... | @@ -2239,8 +2086,7 @@ | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:2843:21:2848 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:2843:21:2848 | self | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [false] ( ... ) | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [true] ( ... ) | +| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | ( ... ) | | UseUseExplosion.rb:21:1135:21:1136 | 47 | UseUseExplosion.rb:21:1127:21:1136 | ... > ... | | UseUseExplosion.rb:21:1139:21:2836 | then ... | UseUseExplosion.rb:21:1123:21:2852 | if ... | | UseUseExplosion.rb:21:1144:21:2836 | if ... | UseUseExplosion.rb:21:1139:21:2836 | then ... | @@ -2249,8 +2095,7 @@ | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:2827:21:2832 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:2827:21:2832 | self | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [false] ( ... ) | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [true] ( ... ) | +| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | ( ... ) | | UseUseExplosion.rb:21:1156:21:1157 | 46 | UseUseExplosion.rb:21:1148:21:1157 | ... > ... | | UseUseExplosion.rb:21:1160:21:2820 | then ... | UseUseExplosion.rb:21:1144:21:2836 | if ... | | UseUseExplosion.rb:21:1165:21:2820 | if ... | UseUseExplosion.rb:21:1160:21:2820 | then ... | @@ -2259,8 +2104,7 @@ | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:2811:21:2816 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:2811:21:2816 | self | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [false] ( ... ) | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [true] ( ... ) | +| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | ( ... ) | | UseUseExplosion.rb:21:1177:21:1178 | 45 | UseUseExplosion.rb:21:1169:21:1178 | ... > ... | | UseUseExplosion.rb:21:1181:21:2804 | then ... | UseUseExplosion.rb:21:1165:21:2820 | if ... | | UseUseExplosion.rb:21:1186:21:2804 | if ... | UseUseExplosion.rb:21:1181:21:2804 | then ... | @@ -2269,8 +2113,7 @@ | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:2795:21:2800 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:2795:21:2800 | self | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [false] ( ... ) | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [true] ( ... ) | +| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | ( ... ) | | UseUseExplosion.rb:21:1198:21:1199 | 44 | UseUseExplosion.rb:21:1190:21:1199 | ... > ... | | UseUseExplosion.rb:21:1202:21:2788 | then ... | UseUseExplosion.rb:21:1186:21:2804 | if ... | | UseUseExplosion.rb:21:1207:21:2788 | if ... | UseUseExplosion.rb:21:1202:21:2788 | then ... | @@ -2279,8 +2122,7 @@ | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:2779:21:2784 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:2779:21:2784 | self | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [false] ( ... ) | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [true] ( ... ) | +| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | ( ... ) | | UseUseExplosion.rb:21:1219:21:1220 | 43 | UseUseExplosion.rb:21:1211:21:1220 | ... > ... | | UseUseExplosion.rb:21:1223:21:2772 | then ... | UseUseExplosion.rb:21:1207:21:2788 | if ... | | UseUseExplosion.rb:21:1228:21:2772 | if ... | UseUseExplosion.rb:21:1223:21:2772 | then ... | @@ -2289,8 +2131,7 @@ | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:2763:21:2768 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:2763:21:2768 | self | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [false] ( ... ) | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [true] ( ... ) | +| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | ( ... ) | | UseUseExplosion.rb:21:1240:21:1241 | 42 | UseUseExplosion.rb:21:1232:21:1241 | ... > ... | | UseUseExplosion.rb:21:1244:21:2756 | then ... | UseUseExplosion.rb:21:1228:21:2772 | if ... | | UseUseExplosion.rb:21:1249:21:2756 | if ... | UseUseExplosion.rb:21:1244:21:2756 | then ... | @@ -2299,8 +2140,7 @@ | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:2747:21:2752 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:2747:21:2752 | self | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [false] ( ... ) | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [true] ( ... ) | +| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | ( ... ) | | UseUseExplosion.rb:21:1261:21:1262 | 41 | UseUseExplosion.rb:21:1253:21:1262 | ... > ... | | UseUseExplosion.rb:21:1265:21:2740 | then ... | UseUseExplosion.rb:21:1249:21:2756 | if ... | | UseUseExplosion.rb:21:1270:21:2740 | if ... | UseUseExplosion.rb:21:1265:21:2740 | then ... | @@ -2309,8 +2149,7 @@ | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:2731:21:2736 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:2731:21:2736 | self | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [false] ( ... ) | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [true] ( ... ) | +| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | ( ... ) | | UseUseExplosion.rb:21:1282:21:1283 | 40 | UseUseExplosion.rb:21:1274:21:1283 | ... > ... | | UseUseExplosion.rb:21:1286:21:2724 | then ... | UseUseExplosion.rb:21:1270:21:2740 | if ... | | UseUseExplosion.rb:21:1291:21:2724 | if ... | UseUseExplosion.rb:21:1286:21:2724 | then ... | @@ -2319,8 +2158,7 @@ | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:2715:21:2720 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:2715:21:2720 | self | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [false] ( ... ) | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [true] ( ... ) | +| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | ( ... ) | | UseUseExplosion.rb:21:1303:21:1304 | 39 | UseUseExplosion.rb:21:1295:21:1304 | ... > ... | | UseUseExplosion.rb:21:1307:21:2708 | then ... | UseUseExplosion.rb:21:1291:21:2724 | if ... | | UseUseExplosion.rb:21:1312:21:2708 | if ... | UseUseExplosion.rb:21:1307:21:2708 | then ... | @@ -2329,8 +2167,7 @@ | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:2699:21:2704 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:2699:21:2704 | self | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [false] ( ... ) | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [true] ( ... ) | +| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | ( ... ) | | UseUseExplosion.rb:21:1324:21:1325 | 38 | UseUseExplosion.rb:21:1316:21:1325 | ... > ... | | UseUseExplosion.rb:21:1328:21:2692 | then ... | UseUseExplosion.rb:21:1312:21:2708 | if ... | | UseUseExplosion.rb:21:1333:21:2692 | if ... | UseUseExplosion.rb:21:1328:21:2692 | then ... | @@ -2339,8 +2176,7 @@ | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:2683:21:2688 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:2683:21:2688 | self | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [false] ( ... ) | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [true] ( ... ) | +| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | ( ... ) | | UseUseExplosion.rb:21:1345:21:1346 | 37 | UseUseExplosion.rb:21:1337:21:1346 | ... > ... | | UseUseExplosion.rb:21:1349:21:2676 | then ... | UseUseExplosion.rb:21:1333:21:2692 | if ... | | UseUseExplosion.rb:21:1354:21:2676 | if ... | UseUseExplosion.rb:21:1349:21:2676 | then ... | @@ -2349,8 +2185,7 @@ | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:2667:21:2672 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:2667:21:2672 | self | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [false] ( ... ) | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [true] ( ... ) | +| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | ( ... ) | | UseUseExplosion.rb:21:1366:21:1367 | 36 | UseUseExplosion.rb:21:1358:21:1367 | ... > ... | | UseUseExplosion.rb:21:1370:21:2660 | then ... | UseUseExplosion.rb:21:1354:21:2676 | if ... | | UseUseExplosion.rb:21:1375:21:2660 | if ... | UseUseExplosion.rb:21:1370:21:2660 | then ... | @@ -2359,8 +2194,7 @@ | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:2651:21:2656 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:2651:21:2656 | self | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [false] ( ... ) | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [true] ( ... ) | +| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | ( ... ) | | UseUseExplosion.rb:21:1387:21:1388 | 35 | UseUseExplosion.rb:21:1379:21:1388 | ... > ... | | UseUseExplosion.rb:21:1391:21:2644 | then ... | UseUseExplosion.rb:21:1375:21:2660 | if ... | | UseUseExplosion.rb:21:1396:21:2644 | if ... | UseUseExplosion.rb:21:1391:21:2644 | then ... | @@ -2369,8 +2203,7 @@ | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:2635:21:2640 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:2635:21:2640 | self | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [false] ( ... ) | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [true] ( ... ) | +| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | ( ... ) | | UseUseExplosion.rb:21:1408:21:1409 | 34 | UseUseExplosion.rb:21:1400:21:1409 | ... > ... | | UseUseExplosion.rb:21:1412:21:2628 | then ... | UseUseExplosion.rb:21:1396:21:2644 | if ... | | UseUseExplosion.rb:21:1417:21:2628 | if ... | UseUseExplosion.rb:21:1412:21:2628 | then ... | @@ -2379,8 +2212,7 @@ | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:2619:21:2624 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:2619:21:2624 | self | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [false] ( ... ) | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [true] ( ... ) | +| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | ( ... ) | | UseUseExplosion.rb:21:1429:21:1430 | 33 | UseUseExplosion.rb:21:1421:21:1430 | ... > ... | | UseUseExplosion.rb:21:1433:21:2612 | then ... | UseUseExplosion.rb:21:1417:21:2628 | if ... | | UseUseExplosion.rb:21:1438:21:2612 | if ... | UseUseExplosion.rb:21:1433:21:2612 | then ... | @@ -2389,8 +2221,7 @@ | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:2603:21:2608 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:2603:21:2608 | self | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [false] ( ... ) | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [true] ( ... ) | +| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | ( ... ) | | UseUseExplosion.rb:21:1450:21:1451 | 32 | UseUseExplosion.rb:21:1442:21:1451 | ... > ... | | UseUseExplosion.rb:21:1454:21:2596 | then ... | UseUseExplosion.rb:21:1438:21:2612 | if ... | | UseUseExplosion.rb:21:1459:21:2596 | if ... | UseUseExplosion.rb:21:1454:21:2596 | then ... | @@ -2399,8 +2230,7 @@ | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:2587:21:2592 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:2587:21:2592 | self | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [false] ( ... ) | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [true] ( ... ) | +| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | ( ... ) | | UseUseExplosion.rb:21:1471:21:1472 | 31 | UseUseExplosion.rb:21:1463:21:1472 | ... > ... | | UseUseExplosion.rb:21:1475:21:2580 | then ... | UseUseExplosion.rb:21:1459:21:2596 | if ... | | UseUseExplosion.rb:21:1480:21:2580 | if ... | UseUseExplosion.rb:21:1475:21:2580 | then ... | @@ -2409,8 +2239,7 @@ | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:2571:21:2576 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:2571:21:2576 | self | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [false] ( ... ) | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [true] ( ... ) | +| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | ( ... ) | | UseUseExplosion.rb:21:1492:21:1493 | 30 | UseUseExplosion.rb:21:1484:21:1493 | ... > ... | | UseUseExplosion.rb:21:1496:21:2564 | then ... | UseUseExplosion.rb:21:1480:21:2580 | if ... | | UseUseExplosion.rb:21:1501:21:2564 | if ... | UseUseExplosion.rb:21:1496:21:2564 | then ... | @@ -2419,8 +2248,7 @@ | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:2555:21:2560 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:2555:21:2560 | self | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [false] ( ... ) | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [true] ( ... ) | +| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | ( ... ) | | UseUseExplosion.rb:21:1513:21:1514 | 29 | UseUseExplosion.rb:21:1505:21:1514 | ... > ... | | UseUseExplosion.rb:21:1517:21:2548 | then ... | UseUseExplosion.rb:21:1501:21:2564 | if ... | | UseUseExplosion.rb:21:1522:21:2548 | if ... | UseUseExplosion.rb:21:1517:21:2548 | then ... | @@ -2429,8 +2257,7 @@ | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:2539:21:2544 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:2539:21:2544 | self | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [false] ( ... ) | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [true] ( ... ) | +| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | ( ... ) | | UseUseExplosion.rb:21:1534:21:1535 | 28 | UseUseExplosion.rb:21:1526:21:1535 | ... > ... | | UseUseExplosion.rb:21:1538:21:2532 | then ... | UseUseExplosion.rb:21:1522:21:2548 | if ... | | UseUseExplosion.rb:21:1543:21:2532 | if ... | UseUseExplosion.rb:21:1538:21:2532 | then ... | @@ -2439,8 +2266,7 @@ | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:2523:21:2528 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:2523:21:2528 | self | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [false] ( ... ) | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [true] ( ... ) | +| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | ( ... ) | | UseUseExplosion.rb:21:1555:21:1556 | 27 | UseUseExplosion.rb:21:1547:21:1556 | ... > ... | | UseUseExplosion.rb:21:1559:21:2516 | then ... | UseUseExplosion.rb:21:1543:21:2532 | if ... | | UseUseExplosion.rb:21:1564:21:2516 | if ... | UseUseExplosion.rb:21:1559:21:2516 | then ... | @@ -2449,8 +2275,7 @@ | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:2507:21:2512 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:2507:21:2512 | self | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [false] ( ... ) | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [true] ( ... ) | +| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | ( ... ) | | UseUseExplosion.rb:21:1576:21:1577 | 26 | UseUseExplosion.rb:21:1568:21:1577 | ... > ... | | UseUseExplosion.rb:21:1580:21:2500 | then ... | UseUseExplosion.rb:21:1564:21:2516 | if ... | | UseUseExplosion.rb:21:1585:21:2500 | if ... | UseUseExplosion.rb:21:1580:21:2500 | then ... | @@ -2459,8 +2284,7 @@ | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:2491:21:2496 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:2491:21:2496 | self | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [false] ( ... ) | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [true] ( ... ) | +| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | ( ... ) | | UseUseExplosion.rb:21:1597:21:1598 | 25 | UseUseExplosion.rb:21:1589:21:1598 | ... > ... | | UseUseExplosion.rb:21:1601:21:2484 | then ... | UseUseExplosion.rb:21:1585:21:2500 | if ... | | UseUseExplosion.rb:21:1606:21:2484 | if ... | UseUseExplosion.rb:21:1601:21:2484 | then ... | @@ -2469,8 +2293,7 @@ | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:2475:21:2480 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:2475:21:2480 | self | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [false] ( ... ) | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [true] ( ... ) | +| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | ( ... ) | | UseUseExplosion.rb:21:1618:21:1619 | 24 | UseUseExplosion.rb:21:1610:21:1619 | ... > ... | | UseUseExplosion.rb:21:1622:21:2468 | then ... | UseUseExplosion.rb:21:1606:21:2484 | if ... | | UseUseExplosion.rb:21:1627:21:2468 | if ... | UseUseExplosion.rb:21:1622:21:2468 | then ... | @@ -2479,8 +2302,7 @@ | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:2459:21:2464 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:2459:21:2464 | self | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [false] ( ... ) | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [true] ( ... ) | +| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | ( ... ) | | UseUseExplosion.rb:21:1639:21:1640 | 23 | UseUseExplosion.rb:21:1631:21:1640 | ... > ... | | UseUseExplosion.rb:21:1643:21:2452 | then ... | UseUseExplosion.rb:21:1627:21:2468 | if ... | | UseUseExplosion.rb:21:1648:21:2452 | if ... | UseUseExplosion.rb:21:1643:21:2452 | then ... | @@ -2489,8 +2311,7 @@ | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:2443:21:2448 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:2443:21:2448 | self | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [false] ( ... ) | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [true] ( ... ) | +| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | ( ... ) | | UseUseExplosion.rb:21:1660:21:1661 | 22 | UseUseExplosion.rb:21:1652:21:1661 | ... > ... | | UseUseExplosion.rb:21:1664:21:2436 | then ... | UseUseExplosion.rb:21:1648:21:2452 | if ... | | UseUseExplosion.rb:21:1669:21:2436 | if ... | UseUseExplosion.rb:21:1664:21:2436 | then ... | @@ -2499,8 +2320,7 @@ | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:2427:21:2432 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:2427:21:2432 | self | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [false] ( ... ) | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [true] ( ... ) | +| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | ( ... ) | | UseUseExplosion.rb:21:1681:21:1682 | 21 | UseUseExplosion.rb:21:1673:21:1682 | ... > ... | | UseUseExplosion.rb:21:1685:21:2420 | then ... | UseUseExplosion.rb:21:1669:21:2436 | if ... | | UseUseExplosion.rb:21:1690:21:2420 | if ... | UseUseExplosion.rb:21:1685:21:2420 | then ... | @@ -2509,8 +2329,7 @@ | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:2411:21:2416 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:2411:21:2416 | self | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [false] ( ... ) | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [true] ( ... ) | +| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | ( ... ) | | UseUseExplosion.rb:21:1702:21:1703 | 20 | UseUseExplosion.rb:21:1694:21:1703 | ... > ... | | UseUseExplosion.rb:21:1706:21:2404 | then ... | UseUseExplosion.rb:21:1690:21:2420 | if ... | | UseUseExplosion.rb:21:1711:21:2404 | if ... | UseUseExplosion.rb:21:1706:21:2404 | then ... | @@ -2519,8 +2338,7 @@ | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:2395:21:2400 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:2395:21:2400 | self | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [false] ( ... ) | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [true] ( ... ) | +| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | ( ... ) | | UseUseExplosion.rb:21:1723:21:1724 | 19 | UseUseExplosion.rb:21:1715:21:1724 | ... > ... | | UseUseExplosion.rb:21:1727:21:2388 | then ... | UseUseExplosion.rb:21:1711:21:2404 | if ... | | UseUseExplosion.rb:21:1732:21:2388 | if ... | UseUseExplosion.rb:21:1727:21:2388 | then ... | @@ -2529,8 +2347,7 @@ | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:2379:21:2384 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:2379:21:2384 | self | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [false] ( ... ) | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [true] ( ... ) | +| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | ( ... ) | | UseUseExplosion.rb:21:1744:21:1745 | 18 | UseUseExplosion.rb:21:1736:21:1745 | ... > ... | | UseUseExplosion.rb:21:1748:21:2372 | then ... | UseUseExplosion.rb:21:1732:21:2388 | if ... | | UseUseExplosion.rb:21:1753:21:2372 | if ... | UseUseExplosion.rb:21:1748:21:2372 | then ... | @@ -2539,8 +2356,7 @@ | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:2363:21:2368 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:2363:21:2368 | self | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [false] ( ... ) | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [true] ( ... ) | +| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | ( ... ) | | UseUseExplosion.rb:21:1765:21:1766 | 17 | UseUseExplosion.rb:21:1757:21:1766 | ... > ... | | UseUseExplosion.rb:21:1769:21:2356 | then ... | UseUseExplosion.rb:21:1753:21:2372 | if ... | | UseUseExplosion.rb:21:1774:21:2356 | if ... | UseUseExplosion.rb:21:1769:21:2356 | then ... | @@ -2549,8 +2365,7 @@ | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:2347:21:2352 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:2347:21:2352 | self | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [false] ( ... ) | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [true] ( ... ) | +| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | ( ... ) | | UseUseExplosion.rb:21:1786:21:1787 | 16 | UseUseExplosion.rb:21:1778:21:1787 | ... > ... | | UseUseExplosion.rb:21:1790:21:2340 | then ... | UseUseExplosion.rb:21:1774:21:2356 | if ... | | UseUseExplosion.rb:21:1795:21:2340 | if ... | UseUseExplosion.rb:21:1790:21:2340 | then ... | @@ -2559,8 +2374,7 @@ | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:2331:21:2336 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:2331:21:2336 | self | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [false] ( ... ) | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [true] ( ... ) | +| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | ( ... ) | | UseUseExplosion.rb:21:1807:21:1808 | 15 | UseUseExplosion.rb:21:1799:21:1808 | ... > ... | | UseUseExplosion.rb:21:1811:21:2324 | then ... | UseUseExplosion.rb:21:1795:21:2340 | if ... | | UseUseExplosion.rb:21:1816:21:2324 | if ... | UseUseExplosion.rb:21:1811:21:2324 | then ... | @@ -2569,8 +2383,7 @@ | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:2315:21:2320 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:2315:21:2320 | self | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [false] ( ... ) | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [true] ( ... ) | +| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | ( ... ) | | UseUseExplosion.rb:21:1828:21:1829 | 14 | UseUseExplosion.rb:21:1820:21:1829 | ... > ... | | UseUseExplosion.rb:21:1832:21:2308 | then ... | UseUseExplosion.rb:21:1816:21:2324 | if ... | | UseUseExplosion.rb:21:1837:21:2308 | if ... | UseUseExplosion.rb:21:1832:21:2308 | then ... | @@ -2579,8 +2392,7 @@ | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:2299:21:2304 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:2299:21:2304 | self | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [false] ( ... ) | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [true] ( ... ) | +| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | ( ... ) | | UseUseExplosion.rb:21:1849:21:1850 | 13 | UseUseExplosion.rb:21:1841:21:1850 | ... > ... | | UseUseExplosion.rb:21:1853:21:2292 | then ... | UseUseExplosion.rb:21:1837:21:2308 | if ... | | UseUseExplosion.rb:21:1858:21:2292 | if ... | UseUseExplosion.rb:21:1853:21:2292 | then ... | @@ -2589,8 +2401,7 @@ | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:2283:21:2288 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:2283:21:2288 | self | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [false] ( ... ) | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [true] ( ... ) | +| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | ( ... ) | | UseUseExplosion.rb:21:1870:21:1871 | 12 | UseUseExplosion.rb:21:1862:21:1871 | ... > ... | | UseUseExplosion.rb:21:1874:21:2276 | then ... | UseUseExplosion.rb:21:1858:21:2292 | if ... | | UseUseExplosion.rb:21:1879:21:2276 | if ... | UseUseExplosion.rb:21:1874:21:2276 | then ... | @@ -2599,8 +2410,7 @@ | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:2267:21:2272 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:2267:21:2272 | self | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [false] ( ... ) | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [true] ( ... ) | +| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | ( ... ) | | UseUseExplosion.rb:21:1891:21:1892 | 11 | UseUseExplosion.rb:21:1883:21:1892 | ... > ... | | UseUseExplosion.rb:21:1895:21:2260 | then ... | UseUseExplosion.rb:21:1879:21:2276 | if ... | | UseUseExplosion.rb:21:1900:21:2260 | if ... | UseUseExplosion.rb:21:1895:21:2260 | then ... | @@ -2609,8 +2419,7 @@ | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:2251:21:2256 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:2251:21:2256 | self | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [false] ( ... ) | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [true] ( ... ) | +| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | ( ... ) | | UseUseExplosion.rb:21:1912:21:1913 | 10 | UseUseExplosion.rb:21:1904:21:1913 | ... > ... | | UseUseExplosion.rb:21:1916:21:2244 | then ... | UseUseExplosion.rb:21:1900:21:2260 | if ... | | UseUseExplosion.rb:21:1921:21:2244 | if ... | UseUseExplosion.rb:21:1916:21:2244 | then ... | @@ -2619,8 +2428,7 @@ | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:2235:21:2240 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:2235:21:2240 | self | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [false] ( ... ) | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [true] ( ... ) | +| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | ( ... ) | | UseUseExplosion.rb:21:1933:21:1933 | 9 | UseUseExplosion.rb:21:1925:21:1933 | ... > ... | | UseUseExplosion.rb:21:1936:21:2228 | then ... | UseUseExplosion.rb:21:1921:21:2244 | if ... | | UseUseExplosion.rb:21:1941:21:2228 | if ... | UseUseExplosion.rb:21:1936:21:2228 | then ... | @@ -2629,8 +2437,7 @@ | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:2219:21:2224 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:2219:21:2224 | self | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [false] ( ... ) | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [true] ( ... ) | +| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | ( ... ) | | UseUseExplosion.rb:21:1953:21:1953 | 8 | UseUseExplosion.rb:21:1945:21:1953 | ... > ... | | UseUseExplosion.rb:21:1956:21:2212 | then ... | UseUseExplosion.rb:21:1941:21:2228 | if ... | | UseUseExplosion.rb:21:1961:21:2212 | if ... | UseUseExplosion.rb:21:1956:21:2212 | then ... | @@ -2639,8 +2446,7 @@ | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:2203:21:2208 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:2203:21:2208 | self | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [false] ( ... ) | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [true] ( ... ) | +| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | ( ... ) | | UseUseExplosion.rb:21:1973:21:1973 | 7 | UseUseExplosion.rb:21:1965:21:1973 | ... > ... | | UseUseExplosion.rb:21:1976:21:2196 | then ... | UseUseExplosion.rb:21:1961:21:2212 | if ... | | UseUseExplosion.rb:21:1981:21:2196 | if ... | UseUseExplosion.rb:21:1976:21:2196 | then ... | @@ -2649,8 +2455,7 @@ | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2187:21:2192 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2187:21:2192 | self | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [false] ( ... ) | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [true] ( ... ) | +| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | ( ... ) | | UseUseExplosion.rb:21:1993:21:1993 | 6 | UseUseExplosion.rb:21:1985:21:1993 | ... > ... | | UseUseExplosion.rb:21:1996:21:2180 | then ... | UseUseExplosion.rb:21:1981:21:2196 | if ... | | UseUseExplosion.rb:21:2001:21:2180 | if ... | UseUseExplosion.rb:21:1996:21:2180 | then ... | @@ -2659,8 +2464,7 @@ | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2171:21:2176 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2171:21:2176 | self | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [false] ( ... ) | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [true] ( ... ) | +| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | ( ... ) | | UseUseExplosion.rb:21:2013:21:2013 | 5 | UseUseExplosion.rb:21:2005:21:2013 | ... > ... | | UseUseExplosion.rb:21:2016:21:2164 | then ... | UseUseExplosion.rb:21:2001:21:2180 | if ... | | UseUseExplosion.rb:21:2021:21:2164 | if ... | UseUseExplosion.rb:21:2016:21:2164 | then ... | @@ -2669,8 +2473,7 @@ | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2155:21:2160 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2155:21:2160 | self | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [false] ( ... ) | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [true] ( ... ) | +| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | ( ... ) | | UseUseExplosion.rb:21:2033:21:2033 | 4 | UseUseExplosion.rb:21:2025:21:2033 | ... > ... | | UseUseExplosion.rb:21:2036:21:2148 | then ... | UseUseExplosion.rb:21:2021:21:2164 | if ... | | UseUseExplosion.rb:21:2041:21:2148 | if ... | UseUseExplosion.rb:21:2036:21:2148 | then ... | @@ -2679,8 +2482,7 @@ | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2139:21:2144 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2139:21:2144 | self | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [false] ( ... ) | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [true] ( ... ) | +| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | ( ... ) | | UseUseExplosion.rb:21:2053:21:2053 | 3 | UseUseExplosion.rb:21:2045:21:2053 | ... > ... | | UseUseExplosion.rb:21:2056:21:2132 | then ... | UseUseExplosion.rb:21:2041:21:2148 | if ... | | UseUseExplosion.rb:21:2061:21:2132 | if ... | UseUseExplosion.rb:21:2056:21:2132 | then ... | @@ -2689,16 +2491,14 @@ | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2123:21:2128 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2123:21:2128 | self | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [false] ( ... ) | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [true] ( ... ) | +| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | ( ... ) | | UseUseExplosion.rb:21:2073:21:2073 | 2 | UseUseExplosion.rb:21:2065:21:2073 | ... > ... | | UseUseExplosion.rb:21:2076:21:2116 | then ... | UseUseExplosion.rb:21:2061:21:2132 | if ... | | UseUseExplosion.rb:21:2081:21:2116 | if ... | UseUseExplosion.rb:21:2076:21:2116 | then ... | | UseUseExplosion.rb:21:2085:21:2089 | @prop | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | | UseUseExplosion.rb:21:2085:21:2089 | [post] self | UseUseExplosion.rb:21:2107:21:2112 | self | | UseUseExplosion.rb:21:2085:21:2089 | self | UseUseExplosion.rb:21:2107:21:2112 | self | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [false] ( ... ) | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [true] ( ... ) | +| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | ( ... ) | | UseUseExplosion.rb:21:2093:21:2093 | 1 | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | | UseUseExplosion.rb:21:2096:21:2099 | then ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2102:21:2112 | else ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | @@ -2994,8 +2794,7 @@ | local_dataflow.rb:10:9:10:9 | ... = ... | local_dataflow.rb:10:9:10:9 | if ... | | local_dataflow.rb:10:9:10:9 | [input] phi | local_dataflow.rb:10:9:10:9 | phi | | local_dataflow.rb:10:9:10:9 | [post] x | local_dataflow.rb:10:9:10:9 | [input] phi | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | +| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | ! ... | | local_dataflow.rb:10:9:10:9 | nil | local_dataflow.rb:10:9:10:9 | ... = ... | | local_dataflow.rb:10:9:10:9 | nil | local_dataflow.rb:10:9:10:9 | x | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | [input] phi | @@ -3016,8 +2815,7 @@ | local_dataflow.rb:15:5:15:5 | ... = ... | local_dataflow.rb:15:5:15:5 | if ... | | local_dataflow.rb:15:5:15:5 | [input] phi | local_dataflow.rb:15:5:15:5 | phi | | local_dataflow.rb:15:5:15:5 | [post] x | local_dataflow.rb:15:5:15:5 | [input] phi | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | +| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | ! ... | | local_dataflow.rb:15:5:15:5 | nil | local_dataflow.rb:15:5:15:5 | ... = ... | | local_dataflow.rb:15:5:15:5 | nil | local_dataflow.rb:15:5:15:5 | x | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | [input] phi | @@ -3035,8 +2833,7 @@ | local_dataflow.rb:19:5:19:5 | ... = ... | local_dataflow.rb:19:5:19:5 | if ... | | local_dataflow.rb:19:5:19:5 | [input] phi | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | [post] x | local_dataflow.rb:19:5:19:5 | [input] phi | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | +| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | ! ... | | local_dataflow.rb:19:5:19:5 | nil | local_dataflow.rb:19:5:19:5 | ... = ... | | local_dataflow.rb:19:5:19:5 | nil | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | [input] phi | @@ -3325,8 +3122,7 @@ | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:18:133:23 | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:18:133:23 | self | | local_dataflow.rb:133:12:133:12 | [post] x | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | @@ -3337,8 +3133,7 @@ | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:136:7:136:12 | self | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:136:7:136:12 | self | | local_dataflow.rb:133:22:133:22 | [post] x | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | @@ -3377,23 +3172,20 @@ | local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | +| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | | local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [true] ! ... | +| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | @@ -3424,8 +3216,7 @@ | local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | +| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | ! ... | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | | local_dataflow.rb:141:35:141:35 | [post] x | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | @@ -3441,8 +3232,7 @@ | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:21:143:26 | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:21:143:26 | self | | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | @@ -3455,8 +3245,7 @@ | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:25:143:25 | [post] x | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(x) | From f374034fb83fef7a6310ff7de599f12e3e313902 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 6 Aug 2026 10:28:51 +0200 Subject: [PATCH 4/4] support or-guards --- .../lib/codeql/ruby/controlflow/internal/Guards.qll | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll index 245f592abf8e..4c7167f5c07f 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll @@ -12,12 +12,12 @@ predicate guardControlsBlock(CfgNodes::AstCfgNode guard, BasicBlock bb, boolean conditionBlock.edgeDominates(bb, s) ) or - exists(BasicBlock whenBlock, ConditionalSuccessor s, ControlFlowNode guardNode, int i | - guardNode.isAfter(guard.(CfgNodes::ExprNodes::WhenClauseCfgNode).getAstNode()) and - whenBlock.getNode(i) = guardNode and - i != 0 and - guardNode = any(ControlFlowNode n).getASuccessor(s) and + exists(ConditionalSuccessor s, ControlFlowNode guardNode | + guardNode.isAfter(guard.getAstNode()) and + forall(ControlFlowNode pred | pred = guardNode.getAPredecessor() | + pred.getASuccessor(s) = guardNode + ) and s.getValue() = branch and - whenBlock.dominates(bb) + guardNode.getBasicBlock().dominates(bb) ) }