From bca83c3bb40fe982aef354a8bd2ecc01b3d34232 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 7 Feb 2021 11:10:19 +0100 Subject: [PATCH] try..catch vs loops --- .../decompiler/flash/abc/AVM2LocalData.java | 3 + .../flash/abc/avm2/graph/AVM2Graph.java | 18 ++ .../decompiler/flash/action/ActionGraph.java | 2 +- .../src/com/jpexs/decompiler/graph/Graph.java | 165 ++++++++++++++---- .../com/jpexs/decompiler/graph/GraphPart.java | 10 -- .../src/com/jpexs/decompiler/graph/Loop.java | 3 +- .../jpexs/decompiler/graph/ThrowState.java | 25 +++ .../GraphPrecontinueDetector.java | 40 ++++- .../bin/as3_cross_compile.air.swf | Bin 4026 -> 3992 bytes .../bin/as3_cross_compile.flex.swf | Bin 5474 -> 5397 bytes .../bin/as3_cross_compile.flex_apache.swf | Bin 5448 -> 5391 bytes .../bin/as3_cross_compile.swftools.swf | Bin 2334 -> 2430 bytes .../obj/as3_cross_compileConfig.old | 2 +- .../obj/as3_cross_compileConfig.xml | 2 +- .../testdata/as3_cross_compile/src/Main.as | 3 +- .../src/tests/TestTryCatchInWhile3.as | 12 +- .../src/tests/TestTryCatchInWhile4.as | 37 ++++ .../src/tests/TestTryCatchLoopBreak.as | 52 +----- .../src/tests/TestTryCatchLoopBreak2.as | 36 ++++ .../src/tests/TestTryCatchLoopBreak3.as | 41 +++++ 20 files changed, 342 insertions(+), 109 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInWhile4.as create mode 100644 libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak2.as create mode 100644 libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak3.as diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java index cebcb41b9..7bc9b5506 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/AVM2LocalData.java @@ -89,6 +89,8 @@ public class AVM2LocalData extends BaseLocalData { */ public Map finallyThrowParts = new HashMap<>(); + public Map finallyTargetParts = new HashMap<>(); + //switchedPart -> index of nextpart public Map defaultWays = new HashMap<>(); @@ -156,6 +158,7 @@ public class AVM2LocalData extends BaseLocalData { finallyThrowParts = localData.finallyThrowParts; inGetLoops = localData.inGetLoops; parsedExceptionIds = localData.parsedExceptionIds; + finallyTargetParts = localData.finallyTargetParts; } public AVM2ConstantPool getConstants() { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index 1a704594c..ae3ec91f4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -160,9 +160,27 @@ public class AVM2Graph extends Graph { } + @Override + protected boolean canBeBreakCandidate(BaseLocalData localData, GraphPart part) { + AVM2LocalData aLocalData = (AVM2LocalData) localData; + if (aLocalData.finallyTargetParts.containsValue(part)) { + return false; + } + return true; + } + + @Override protected void beforeGetLoops(BaseLocalData localData, String path, Set allParts, List throwStates) throws InterruptedException { AVM2LocalData avm2LocalData = ((AVM2LocalData) localData); + + for (int e = 0; e < body.exceptions.length; e++) { + ABCException ex = body.exceptions[e]; + if (ex.isFinally()) { + avm2LocalData.finallyTargetParts.put(e, searchPart(code.adr2pos(ex.target), allParts)); + } + } + avm2LocalData.codeStats = avm2LocalData.code.getStats(avm2LocalData.abc, avm2LocalData.methodBody, avm2LocalData.methodBody.init_scope_depth, false); getIgnoredSwitches((AVM2LocalData) localData, allParts); Set integerSwitchesIps = new HashSet<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index a1f3124db..9c60ca11b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -143,7 +143,7 @@ public class ActionGraph extends Graph { } @Override - protected boolean canBeBreakCandidate(GraphPart part) { + protected boolean canBeBreakCandidate(BaseLocalData localData, GraphPart part) { if (part.refs.size() <= 1) { return true; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index 54112ccf2..647d71475 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -517,7 +517,6 @@ public class Graph { beforeGetLoops(localData, path, allParts, throwStates); List loops = new ArrayList<>(); - getLoops(localData, heads.get(0), loops, throwStates, null); afterGetLoops(localData, path, allParts); @@ -532,7 +531,7 @@ public class Graph { //TODO: Make getPrecontinues faster getBackEdges(localData, loops, throwStates); - new GraphPrecontinueDetector().detectPrecontinues(heads, allParts, loops); + new GraphPrecontinueDetector().detectPrecontinues(heads, allParts, loops, throwStates); /*System.err.println(""); for (Loop el : loops) { @@ -1155,13 +1154,21 @@ public class Graph { } } - private void getLoops(BaseLocalData localData, GraphPart part, List loops, List throwStates, List stopPart) throws InterruptedException { - clearLoops(loops); - getLoops(localData, part, loops, throwStates, stopPart, true, 1, new ArrayList<>()); - clearLoops(loops); + private void clearThrowStates(List throwStates) { + for (ThrowState ts : throwStates) { + ts.state = 0; + } } - protected boolean canBeBreakCandidate(GraphPart part) { + private void getLoops(BaseLocalData localData, GraphPart part, List loops, List throwStates, List stopPart) throws InterruptedException { + clearLoops(loops); + clearThrowStates(throwStates); + getLoopsWalk(localData, part, loops, throwStates, stopPart, true, new ArrayList<>(), 0); + clearLoops(loops); + clearThrowStates(throwStates); + } + + protected boolean canBeBreakCandidate(BaseLocalData localData, GraphPart part) { return true; } @@ -1169,7 +1176,21 @@ public class Graph { } - private void getLoops(BaseLocalData localData, GraphPart part, List loops, List throwStates, List stopPart, boolean first, int level, List visited) throws InterruptedException { + private void findPartsOutsideTry(ThrowState ts, GraphPart part, List ret, Set visited) { + if (visited.contains(part)) { + return; + } + visited.add(part); + if (!ts.throwingParts.contains(part)) { + ret.add(part); + return; + } + for (GraphPart n : part.nextParts) { + findPartsOutsideTry(ts, n, ret, visited); + } + } + + private void getLoopsWalk(BaseLocalData localData, GraphPart part, List loops, List throwStates, List stopPart, boolean first, List visited, int level) throws InterruptedException { if (part == null) { return; @@ -1184,6 +1205,15 @@ public class Graph { } checkGetLoopsPart(part); + List currentThrowStates = new ArrayList<>(); + + for (ThrowState ts : throwStates) { + if (ts.throwingParts.contains(part) && ts.state != 1) { + currentThrowStates.add(ts); + ts.state = 1; + } + } + if (debugGetLoops) { System.err.println("getloops: " + part); } @@ -1200,8 +1230,11 @@ public class Graph { } } - if (lastP1 != null && canBeBreakCandidate(part)) { + if (lastP1 != null && canBeBreakCandidate(localData, part)) { if (lastP1.breakCandidates.contains(part)) { + if (part.start == 54) { + System.err.println("xxx"); + } lastP1.breakCandidates.add(part); lastP1.breakCandidatesLevels.add(level); return; @@ -1259,16 +1292,16 @@ public class Graph { stopPart2.add(next); } if (next != nps.get(0)) { - getLoops(localData, nps.get(0), loops, throwStates, stopPart2, false, level + 1, visited); + getLoopsWalk(localData, nps.get(0), loops, throwStates, stopPart2, false, visited, level + 1); } if (next != nps.get(1)) { - getLoops(localData, nps.get(1), loops, throwStates, stopPart2, false, level + 1, visited); + getLoopsWalk(localData, nps.get(1), loops, throwStates, stopPart2, false, visited, level + 1); } if (next != null) { - getLoops(localData, next, loops, throwStates, stopPart, false, level, visited); + getLoopsWalk(localData, next, loops, throwStates, stopPart, false, visited, level); } } else if (part.nextParts.size() > 2 || partIsSwitch(part)) { - GraphPart next = getNextCommonPart(localData, part, loops, throwStates); + GraphPart next = getMostCommonPart(localData, part.nextParts, loops, throwStates); for (GraphPart p : part.nextParts) { List stopPart2 = stopPart == null ? new ArrayList<>() : new ArrayList<>(stopPart); @@ -1284,45 +1317,107 @@ public class Graph { } } if (next != p) { - getLoops(localData, p, loops, throwStates, stopPart2, false, level + 1, visited); + getLoopsWalk(localData, p, loops, throwStates, stopPart2, false, visited, level + 1); } } if (next != null) { - getLoops(localData, next, loops, throwStates, stopPart, false, level, visited); + getLoopsWalk(localData, next, loops, throwStates, stopPart, false, visited, level); } } else if (part.nextParts.size() == 1) { - getLoops(localData, part.nextParts.get(0), loops, throwStates, stopPart, false, level, visited); + getLoopsWalk(localData, part.nextParts.get(0), loops, throwStates, stopPart, false, visited, level); } List loops2 = new ArrayList<>(loops); - for (Loop l : loops2) { + /*for (Loop l : loops2) { l.breakCandidatesLocked++; - } + }*/ for (ThrowState ts : throwStates) { - //check state? - if (ts.throwingParts.contains(part)) { + if (ts.throwingParts.contains(part) && (currentThrowStates.contains(ts) || ts.state != 1)) { GraphPart t = ts.targetPart; if (!visited.contains(t)) { - getLoops(localData, t, loops, throwStates, stopPart, false, level, visited); + getLoopsWalk(localData, t, loops, throwStates, stopPart, false, visited, level + 1 /*???*/); } } } - for (Loop l : loops2) { + /*for (Loop l : loops2) { l.breakCandidatesLocked--; - } + }*/ if (isLoop && currentLoop != null) { GraphPart found; + + for (int i = 0; i < currentLoop.breakCandidates.size(); i++) { + GraphPart ch = checkPart(null, localData, null, currentLoop.breakCandidates.get(i), null); + if (ch == null) { + currentLoop.breakCandidates.remove(i); + currentLoop.breakCandidatesLevels.remove(i); + i--; + } + } + if (debugGetLoops) { + System.err.println("loop " + currentLoop + " break candidates:"); + for (GraphPart cand : currentLoop.breakCandidates) { + System.err.println("- " + cand); + } + } + + List contThrowStates = new ArrayList<>(); + + for (ThrowState ts : throwStates) { + if (ts.throwingParts.contains(currentLoop.loopContinue)) { + contThrowStates.add(ts.exceptionId); + } + } + Map removed = new HashMap<>(); - do { - found = null; - for (int i = 0; i < currentLoop.breakCandidates.size(); i++) { - GraphPart ch = checkPart(null, localData, null, currentLoop.breakCandidates.get(i), null); - if (ch == null) { - currentLoop.breakCandidates.remove(i); - i--; + + loopcand: + for (int c = 0; c < currentLoop.breakCandidates.size(); c++) { + GraphPart cand = currentLoop.breakCandidates.get(c); + List candThrowStates = new ArrayList<>(); + for (ThrowState ts : throwStates) { + if (ts.throwingParts.contains(cand)) { + if (contThrowStates.equals(candThrowStates)) { + //adding new ts + //this means breakcandidate is in nested try + if (debugGetLoops) { + System.err.println("candidate " + cand + " is in inner try, getting outside parts"); + } + List outsideTry = new ArrayList<>(); + findPartsOutsideTry(ts, cand, outsideTry, new HashSet<>()); + + for (int j = outsideTry.size() - 1; j >= 0; j--) { + if (!canBeBreakCandidate(localData, outsideTry.get(j))) { + outsideTry.remove(j); + } + } + if (debugGetLoops) { + for (GraphPart op : outsideTry) { + System.err.println("- outsidepart " + op); + } + } + int bcLevel = currentLoop.breakCandidatesLevels.get(c); + currentLoop.breakCandidates.remove(c); + + currentLoop.breakCandidates.addAll(c, outsideTry); + currentLoop.breakCandidatesLevels.remove(c); + + removed.put(cand, bcLevel); + for (int j = 0; j < outsideTry.size(); j++) { + currentLoop.breakCandidatesLevels.add(c, bcLevel); + } + + c--; + continue loopcand; + } + candThrowStates.add(ts.exceptionId); } } + } + + do { + found = null; + loopcand: for (GraphPart cand : currentLoop.breakCandidates) { for (GraphPart cand2 : currentLoop.breakCandidates) { @@ -1372,7 +1467,7 @@ public class Graph { removed.put(found, maxlevel); } } while ((found != null) && (currentLoop.breakCandidates.size() > 1)); - + Map count = new HashMap<>(); GraphPart winner = null; int winnerCount = 0; @@ -1431,7 +1526,7 @@ public class Graph { if (removedVisited.contains(r)) { continue; } - getLoops(localData, r, loops, throwStates, stopPart, false, removed.get(r), visited); + getLoopsWalk(localData, r, loops, throwStates, stopPart, false, visited, removed.get(r)); removedVisited.add(r); } start = false; @@ -1444,7 +1539,7 @@ public class Graph { el.phase = 2; } } - getLoops(localData, currentLoop.loopBreak, loops, throwStates, stopPart, false, level, visited); + getLoopsWalk(localData, currentLoop.loopBreak, loops, throwStates, stopPart, false, visited, level); } } @@ -1638,9 +1733,7 @@ public class Graph { boolean vCanHandleVisited = canHandleVisited(localData, part); - /*if (part.start == 31) { - - FIXME + /*if (part.start == 25) { new RuntimeException().printStackTrace(); }*/ if (vCanHandleVisited) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java index 80b4ccec1..9c1ea15b9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphPart.java @@ -175,7 +175,6 @@ public class GraphPart implements Serializable { return true; } } - if (useThrow) for (ThrowState ts : throwStates) { if (ts.state != 1) { if (ts.throwingParts.contains(this)) { @@ -188,15 +187,6 @@ public class GraphPart implements Serializable { } } } - /*if (useThrow) { - for (GraphPart p : throwParts) { - if (p == part) { - return true; - } else if (p.leadsTo(localData, gr, code, this, part, visited, loops, throwStates, useThrow)) { - return true; - } - } - }*/ return false; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java index 106c360ca..cb4b83349 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Loop.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph; import java.io.Serializable; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/ThrowState.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/ThrowState.java index d3786c385..b353b2faf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/ThrowState.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/ThrowState.java @@ -13,4 +13,29 @@ public class ThrowState { public Set throwingParts = new HashSet<>(); public GraphPart targetPart; + + @Override + public int hashCode() { + int hash = 3; + hash = 97 * hash + this.exceptionId; + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ThrowState other = (ThrowState) obj; + if (this.exceptionId != other.exceptionId) { + return false; + } + return true; + } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/precontinues/GraphPrecontinueDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/precontinues/GraphPrecontinueDetector.java index f92b2373b..5a97d706f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/precontinues/GraphPrecontinueDetector.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/precontinues/GraphPrecontinueDetector.java @@ -18,6 +18,7 @@ package com.jpexs.decompiler.graph.precontinues; import com.jpexs.decompiler.graph.GraphPart; import com.jpexs.decompiler.graph.Loop; +import com.jpexs.decompiler.graph.ThrowState; import com.jpexs.helpers.Reference; import java.util.ArrayList; import java.util.HashMap; @@ -40,7 +41,7 @@ import java.util.Set; */ public class GraphPrecontinueDetector { - public void detectPrecontinues(List heads, Set allParts, List loops) { + public void detectPrecontinues(List heads, Set allParts, List loops, List throwStates) { boolean isSomethingTodo = false; for (Loop el : loops) { if (el.backEdges.size() == 1) { @@ -60,6 +61,12 @@ public class GraphPrecontinueDetector { for (GraphPart part : allParts) { Node node = partToNode.get(part); for (GraphPart prev : part.refs) { + /*if (prev.start < 0 && !partToNode.containsKey(prev)) { + Node minusNode = new Node(); + minusNode.graphPart = prev; + partToNode.put(prev, node); + continue; + }*/ if (prev.start < 0) { continue; } @@ -90,6 +97,12 @@ public class GraphPrecontinueDetector { } } + List targetParts = new ArrayList<>(); + + for (ThrowState ts : throwStates) { + targetParts.add(ts.targetPart); + } + for (Loop el : loops) { if (el.backEdges.size() == 1) { //System.err.println("loop " + el.loopContinue); @@ -97,15 +110,26 @@ public class GraphPrecontinueDetector { Node node = partToNode.get(backEdgePart); //System.err.println("backedge:" + backEdgePart); boolean wholeLoop = false; - while (node.parentNode != null) { - node = node.parentNode; - //System.err.println("- parent " + node.graphPart); - if (node.graphPart.equals(el.loopContinue)) { - wholeLoop = true; - break; + boolean inTryTarget = false; + + if (targetParts.contains(node.graphPart)) { + inTryTarget = true; + } + if (!inTryTarget) { + while (node.parentNode != null) { + node = node.parentNode; + //System.err.println("- parent " + node.graphPart); + if (node.graphPart.equals(el.loopContinue)) { + wholeLoop = true; + break; + } + if (targetParts.contains(node.graphPart)) { + inTryTarget = true; + break; + } } } - if (!wholeLoop) { + if (!wholeLoop && !inTryTarget) { el.loopPreContinue = node.graphPart; //System.err.println("found precontinue:" + node.graphPart); } diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.air.swf b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.air.swf index 429b394ed3e67efdd443fe6de431fe5d52de0fe4..3cfaf17dd3142deca945de37f8a11059786d75bd 100644 GIT binary patch literal 3992 zcmV;J4`=X0S5qq*CIA3<0livHY#T{-uIeJ$q{N@*zy2tZ6!l}dC6SbE$+BdREb7lc zlE?ClXLq$LQDjTxSR%PiT9&g(c6XB5{7$lS2!dRK!3M}7i|hco=CHutf*^o3##pCZ z0wma*JEt6SP~NNVCe^YQ3j`PvXw~bgV!iKu@71eUgpP^rKM3*uJt19`vwM~Yf6S1a?$%tSgFzjM1|PA%@uKF%%2VYE`8g}3=+snMv-PENjf@nYh| z)I?R?pUm96d2=$Ioy=y(Va9mW|f3zN!$a;Q`q^~uacCTUE~*IRQd^@)73x~ohSs)v&>FqutfvW6zEtyq}dtEz|j z#_fEqc2F+lQRn3Gc)e6DJbRHpQpWcV^7Yc(WNRXa$-fK>&cedA@`0kpEBQlZKDki9 z1vWYQ_@XhEY>}0nNF!al&&vnJ`Q+5~YuWV8iV*M&IaJhrrAQ<)0WajI)b=o6t`OJ5>QPx)JSf*Z z+?t7Exn4WSzl?5g?^m}Q)$O9PSFV&1`F2S;sIgkL&NA22edc(fQB~iWG=1a7cNb^3 za%#1-BAe#x0n5>lT8Z$k*LZVBQn;^2%G#cF zQsrq0{1dWH;(gi6I;Sq{yk^nypjxek&##9acU2|-tml01(s4oIA^br-zpr?Wq2+QV ze{k?}(E6Gyt4g8qSZO?0D{B>FPQW?`we-H*)tr7|?BVl+M!9yNaP~~N#>(qe-fNm_ z^y=zkRuva8nHE~UvJS3MiWl_jU(|=PU6(ETVYOUzZ0vpvmiv~DU>oNkEYa7B>ek~_ z!QQ$D`ypKQss6P}Ls9dv&yEzmCt?|2tU^X9R}|H;SyRgmg{jXgER&fMrl&ssM#8m$ zfqBa?kn;+$Yi|HVrDIot?4raQ>Ptttf{hcJ0*~kX9++WYQq`(T726ST0Vt;{ZGyN4 z`vhRpJYqxd|Yf6Ef$5Ijw&uEht&%(#A4R z@aA!b$-XWq8A!6(wuQD{0O|hCwjr$>F>TZsT<_HMk7?Ti>(W{ZVbmKcJ3c(| z{a9-=h$#T!hPp$28Hbb$<*%@Dzs(S?0R$T!Ny4t`YHt5F9Fp7_)@uSl3Gz&%6yu6{ zftZbphe{o95$(&7mg@tc@|wiNc}DZMUX2_F$JNbR+cvqegT#msu|?dG!Kgd(j9e8d z6$K`;PLX*;<`tPwWRl4IA`6HtD6){q!Xk@^EGn`tk#&o#M`XPs>l0Z_Wc?x=5LsNL z3DK4mg_I}^iNdfbjEHnpq_RjeqCG3pDUnW#bVj5%MY=B9%cA3B(S9J(Kc!Fc(yf2+ zG7g{QsNR}?hc3Kd9KZNJd}02@_un@E;`qh)-?m=6=U>!!?mcLy4$(;+E@-d7GX~E! zcxK_b1PE$_+-jCQ^Hj2$Xfw&KzOX;iFOxSY$yO$`LzdQ5wzx zwXB!gazvzTfCh8GEE}Yr9C1-LLZdmLn_Z=m9Ozz8v1wjx?3xc7hbCboYJO~-S^yiD7R07Q3t`i#g|TsK5o|nK z6dSMBg^f?^#zxY5u<>iX*aWmbY=T-0n~>IzO;{ViCZff$iE0Tz2NV+L@T;^!cDm9# z-RYg4^iFSjr!Tz|OYaC{>5oWE|CA`qw%HgFZi6XTcLs`@TOMDaS5WfF6Ci0GDMHAr z^tZ{_o3ZrOLyAK|c@ll4kB>iAOg1o{Zk{3&|+dR6mDJ_AI-#!H#VsZ{Gho69P$+)}(Z(r4Woe)(WguG_hn?!rAXoE-w_$sWPovjGa z8BZkF9>PSwX=1=)qR(ogEmo4i#1IpS@ULj%is=y4p~s)B&Tom7{b%*Bn@l_c2q|)kPy;;rPP8C05)1$w*p90O8&Gm;rNrK( zq{pP>RMIK2rv$!Ozx+O|{JP$Y#z9b^adyVp4V%G$Za2PWGMSPew>Sx!ob1|GwPAU4 zl?|;uj3x1M!4^W)1)jnE;0^ z00*rAU9pk}0FGh;{cH5q_uko32-$N!fl54Zni&QX0}ua<=_<_iO@mtL)d;F{=~YiM zG1Cb~x_~3>H8Wy#KsPISZyk~*ZV#xIj1U~Nm^ETGt0Pv5f>|Tg)oPg&J_Vx<76pTT@v1NG`#S_f-9a^q7x4=>AzLHRil1d-dy zh?Hl zvlh71R=D0+$qR7ju&(_KQ_c@~&Gwf5E+qg+^YU6#`X2Zaj%?@%VO7ih8j-nQqrVcq zg7PvH{x!JQ-*m58^Ez!(!tn38E{I!nOH%$l3=LkC`BKI3-{=+Uko@~lp9=$bmq!x= zcfSR$pEr%UZ87GS)fiu_)B(o4hxzk!H0FoqS;y@_jXqv3Lm2KER)mcF8BRHZkCEW6 zl!yXO?v;N;5nn)pTAyDh^aL7nGQ&bp0Tlk+efk7gc30NIWITw zZ;U3A_w!)Tf@#oQi$Qm+21&7!2nOZQJ6KWtnEqyi#?VC}`4fKk2uSeXDjcyvI+|lt zmRgSq>fgX)eexgBRXQ}D0Z>aOsAUVNMJp(OtmFhxt61h70jNK0f%4!13FPtk2+E%# zd;IPZf?S0V!tzhBPs#!}T`LeSQ46s+rBD7NoWd_^{jza~@k#%nhlX)2iQZWRylW=j zdltMaR=j~&$pv^Hmiaz{p4I7WMb7 z>VvV88`M9-toaEB<)3l=<{{3@2>lS3?!E&cB>y=l19^q(4Zt(gr0&qqnxmF%W?U66 zlqLQA{APi^IOK@F+oOrVM_Z66-Z#y7Y%ycQYDOql@`D*qaBqEyX8a|%{oL*Dr-s)r zx!qy057)L}pa=I?IAu4kZ4rKLbU)!cBb%BHV|(_;0livXY#Z5izIQIkp?*jXfAu@!n4%^TkH5S`@ zRxR$%$Vg zWcB{ggSoY}C-)y|M3a8QX2>rizwRXjJVSQ%>W-c#5*daU@|Vy;`*KJes*nPeQ{CKbL*wzR;`*_-`>vaxea((uj{pX zK3mVOXKSMyxoV|W+pu6|)Un*%N@Xv4_EYS*UDdNsJJ0qm9OQH!tzW5ScXYosv{)=> zOQpkJ=c`t%>bd$Oz5c9PUMX91Le4q3OV`_7jp^sc?ma8ji+d%V17)jgt-M;{y|$@V zuerVK+~S;0wuO#QR>2E;{@niNhvrbG{auTGwNlJ`?r(hvmIoI0A!9X&Ky<5KZ8bwu z$KIL``yn#TslkmlBzE zjKOKkK#nVfsk;s;>djj^5Q(nTtB0Oq85=J&IUc&%Z7{>VP_0&~RCnzI7NF&L`GQnj zfs_C>X%@(!Uhq`2<$PtA70Y!<@o|<;jnytlkw)%-HZ2xhC5UtY@GzYfva?*+^6VD# z`I7E}-b|B?VMa82GuS=a=suOMx%7i#-Mesqk>hMf6=DutmYF#G@{P0-1S}gAzT(GJprJM;Dj0w?9uT0A+jA!Mv7jy=b=I(;q(;t2L8gm}7&LU9N zV@5Uu^r~O}=2py^o`v1TExrC+*URA843NzA(uJvj(Ui`N?O)i2rpE-uB* zt*rwOcE?cURG*pBeP`s#wuf^+k54`!eP#m4_Js7AU{0Ceqy#-9=xHG7%!LK9Su2^I z%v`{+U`4N0qwsx4$G=4{EQH=!i=i5|dX*g<9JqBnKUkrtxS>?ZJrxSiz#pS5ZoeXhc73;*qog49N6y{sO4Qx3QDv>-BLYNfLx(` z7Vf`y0Vfj2!CB#hB4M7+dS21(+J8zBcl8=x04|P*9F;$4<+sU4;Z;!Z^wp}1;7pj@ zyRiJSf>(?QF;}cLmS}5@t&l;HQc++cYY~}GWPXtaL?($WD6){q!Xk@^EGn{?$l65K zF0u}hb&9M@WZfc@Mb;y-xJVVzbx9O@MIk8)eWK7W(gBfP6=_Ozr$w3(>2;Bgi*!Qt zEQ|Ds=&p(Gx=4RW*YI9!{@{HXel87|t^GTB?*07u`S<>F^UuHkw)yAB&%gh+^)7n; znf=0U>Jh!v(**5hc&@-R3eO}wQ}En@=RQ2Y3y%)Z4m?G8p271Ro<8D%eZHG}L&xs|#DAcs(vs2B!0hH`{@BOrI8+)hOo$UP`` z)20x}36vGu)CzJx%1PQB19=eT%d{m5@-WIOZS{bhK{-WzL6EPbe2w~jAWxw@K?6-7 z-#~eWN+QU&QNBebFUX51YgB3h`3}m zMEb}TGDOm3j7*YQGDjB33b{uf!Z@WG0f;E0OoJCDQny9~%35f%Mi})3Xg~wpSeS-2 z;-&y)L<2Bc7jC>x+L4FG0WX;dRE)H6ao8sO_0r9qAOC>y6f z4M1npv`HfY8oWtG4KVl2Q?EvX)U!leG;joak4hQ|gS)9;13$1efl@-fFH`@~{BngX z!C$BF{f87gHkskO0*%Y?W8*dg*mw*H8_@`2<26FqG#O!RnvDoHEk+cZRwIUu&uGKO zZ?t0*Fgmc2j81HVMi(|AqZ^yBA!8FUda#Kaacp9S0%`$f#M}QerIXFJ)Mk5Xvm>?H zncD11ZFZ+Ng~8POL^gj46lS|zj0iWthQZCAywR$vbMy*I0d)u@!zaZEd71he8GJpM zy1GkoD69^{kc?tf9hsv`)Zf_?SHR`KKe(m`f$_XdnJ_WXNAR2a!0uEoFqq?IZX(RW zzSrK+F+w&IM(biPseN%|_>#?^8NN_AAx1Dsk6$et0V!Z9k#lh^WTQPPEK_CRDs0_)t}E z!!Sp8ST*-OGJ2Dd=s%cyrqp>{?Vh#TxT@i5W6}&?N*K(Ejisj51zgH2O7OQ-a3VW9 zcuQTh20eguM*7TLenDLVkGi_&v@6zwnxblzmbNbq9|C9D9kk^)@{SL%ioQN~I z&J z^^wt;bpOog3_*w<8Qn?oMUDGWR_`G~Nr);~Qc+jo?ekif7gD2{kXHio(C*41(ebGSTcR+eslcVMHVx z0(F2>9_CyC$*~iX(+ugfAvu;zNZd(*FV>@e0E@kN<2ngy3gk89veB=8eVO&G+>0xHJ5Ry5zo9Dn(XU;2eEXV5=)oKzHQ^vK!dWaRF6Zc zE~iqWTyTL>3iA-*pD<##{{IpC#8f=0=C~!XB>TA$<1TDh^WZ`OqI%Sv)5+a@8sDeR z?6IBsy5UU5<2zyJEqGA?X95|6Z@{0gmcca$QqqjqK5&xIQK><^{(ydp{<&mBk#Il} zcS7Nn3n73a$>0Fo0wlI^O*?0~kIbBHu+dv5AP||!Mz52Uf6!*;WP@uy=Umgl-6RCN z;&CN70Xz-GkQG4v4h4Ii3O31wR#5OV66jx{uL^Ia6sqhyOP~@DoCd=HG4SwD+pfZF zYZ!D&uU1f^neP_GHcLb)_~KjX1NdpvsBhZ zgn!4A_(R()A5;J~Qvg3CNzR1^Ml6nqB1c3+po7r{9N`AbaxUo(@aE#%yxFZj1yf~Q zLmJ@2aLS(2s-l(}!vK=WtLAn|&LUeb2aR};MvkS2CXW5;F5)=P*L9q#gKF7a_t*+{ z*V!|7SgqKjBHvWBm@C66$jMxygSoD$d$^_fnb$f4Ce)9h(_$`25F|V=+cK$sO0B}6 zF%9V<##6A^e>HejKv>IPCD_ zRi__Y( z!cOGyI}_Qeb|H}gq%nK@>yGV5o!k55LJ+o}K)(G5w*S31^c!G}PyPK*@H~7MBZk#K z0DvHJPZ^PNMr>365C)E*>ip)AxkI+ym(fOt~b4Lb13K zN?ikeCvAPF9Quws_4UgIALu)S)%mB$Ie$!f)%J#d8$JV_3_mZKr44YW5yp-PR_ENc zF_pWv?N`F*P$fsAzX1;i8y>c6cdtuISS~)(1#6&Z66z-u!-E%Qfn+}V*JfGTr+x?e zmxN2&a-VWZ`vCkuYa4XKVbHYGpnzOx0)uWLiT)T3`Ysp*7Y?)nO~FkAyzqx$+_nsf zSS%V%dcuzo=JuqB0#5EyzsEHUN!P8=HEC4#GRstI)vZ{zdm|ztI0R9RjSHNA8H-LR z1lvBvi0-}npik+&y9E}_*%sY)Saj2Akt7#Hut-A}VO{Yj|A#??=%tAIr~DcflHea+ z_+8Gz9nG=oOQX|P>R-TV-Rk%0GVL2mgHj8&Qi~3y=AB9f<$@QKTDH^d&-hL89oI>? z*1dI|`~lrmwy(Uvs7IBoGz;K)34bN9viy!?`z7c0A-T{3+uubl`WU_Z=X`(rXyjft zk4EYCTM9(fAE8GfEhNte>G7e_>{yeP{ZS6`$|8GaW%P!euBN>cn`BCf(L$D8?^C zya*V8lhV8hp1oOhpB7-;ykqNZY22Ie=!dff`1=);;DkX?&R?H)cqFeqi7UN(bujm# gZSEt7x%ZvsM&yDY%xwyTiwXa?o?9UN4h;Yrdx}4*+`p3fP}=uK7fEEAQTA%JT5|FcM*933C#kV zMS_QYVYNsIYT*II0_L21tIG9jdm~LpW4B%R)U7Jl_nq^db5G@jlb>+h_z}m=5^f_t z!ExM|5`RfJ?)m0HW$pEi&CJQeTD`Rf-(I+I*lr)Kt*ktL{P^SZ- zg_S~K87!7tr}cK}WVzm2xUfzq*w9+#X7#9DZPYV3VQIf{+tBQ>*S)v?({WQoG@_Ft_1&tyF(-Tza6b-+qp(1&j`t2dAT^9zpw5}!m~DOKy-Hc70Ex&wF zZ5`E0r^+jhM^){mTJLx zU%NJL8o9^wS92kWr1+GSCMkteWS+=ENakf(3d=%77KUUYDhtDK7kKzpMR@TXA0s1b zoQ#YT!Yd;E=?PEB27xgmaD*rk;Yn@_ZVDlhq1X=vec?$?&pz4V^hMapgRSxtPjaw* zNaKn^MaUJ!ikK@(6)9H?RYJL;2k$%H zt=7stc)!;?-K^G2wc6?HTKl+Je-*ZA2L;Xm#f5X!bgh@^=~F=rJ??Wojtgj#n#c8Q z4shE(3^hyjgT_Ot4M5Q3YCY3#o)(1HZ{L${H=B(nuN8)1BY2+jVPQ=((S$>-@a;RB z)M(gd(Wsz3Km&i8La0;$h!uD(Z_Scl(=2=V?6A)>dunV3VK}ADomX$YEYS-j zC81hxpQoRD{m3hDrJ=j+X0`s{h5p7pel-Cm3dA;IKYuMZ)nk8yo0WCq^m7(vdF`2~0_ zlIXA!;&?K23%CG7L?F=(?CeLN1 zk6I6jo-7JW;Z1>D)Wyzpl z$34k?JNGts>C;QOXJNK!m@SI4&4hV8lz?~(5lQHDS71Cr)H;(reyGXGEfKf|BQfARkV ze@K`k3Lu1tQshYvTqMBY7I-%SHVISINrsED;&5d+hi~8p52Ij0r~?FScpczN=oL(l zH$Lj%7aM!$>AN_3Ak(L?tw6N)_B11U||1Q{3W&Mcf1o zMsN@*HwIsZsAX!4Oe|dF1s9g4oLG{JVHR8=!XlPJ7MA`Z5KBAt`-h->Oh~0CytlwK z`MEPfmT^1)SO|k=KF<&~WFV~8XdD?3BPIXnNHhk%nZS#&Ah#TBVuz4%PW=IRwZH(F z@Y&lIkeDu0Qb~lO2q8#9K?Z?{kIFp6B2^a0WIm;g8EBM-;SQpf27wkQqX~G86FIC% zfQV2Rjj}Hqhu%k7<%~Zj9MwJW^ZKZXNfn&CLV*{iz)LK~{}ufFqVgRA)JjWqW zXI04MXawp;7#s#+iNmqQ_^-nx=ePLT^$lK_T`!AnBwunOIb2kjLIjzJNR}-m{|w9- zBnw|TuC=R2HO=89r+j6h)Aa0Qq2suw3%%0Mg~m)5nxW#)AN29Aks%Tzu*J}H%=h|= zH^(ViyzrH7PE!Nnn@o5*#`^Q*T8{C=CEy&hc=$4u8t?Ljxo${c__)j`WHBxC6H40T ziwb-hWqe7Ju@t-}2jhzuRW34@mVPFe2VVnrIphYj~`6DM8W z#d&nsH0%-P8aQQ!b2^Iv`5ss4N=JWU;3t1E~G<;Z)MJ1z9$fmaVsf7z1H*pP;78hDQawf#822eV{ARt;n;2(Mf0ahE> zsT;S|6gHU!zx(Mn{=%7|*L7qI#W#Xb+$|8;B()9NGNkH|u;=-c6XRncTyIpW^`_Ql z-d~2{+i&jNV~&@l^A`sARge-!LVs%zb0@f67uugBtGSt;GjwS}MbvmAMfJQ06ahUC zVjc=xsN`jS93p}&&Ok!1%owBzrGPYPMw&@7H4U#h5>}{=lDnh{`;bPGqQA|%Sfi0F z2kEv=+}q^63ZoL{_HiSlPe4W=))O?Ne}$&kG=J~L2`i3ZoS@1d@1Y!{UTZExF4lRx97q-J71rc;yK3p6Sr`~CFUIayJ;Is#i*8Jw54gd0A)E9>u`M1CFeqM zpe@h`W8D}@jl*klFxpBG>%Nb2&Y6uPaer$Xbfvn`XYXS zKm~vFXYhb#5CWYGK}Z^Z3xd$n7Qc)nTGoDvhyn;ef-7Wp4VZUoz;JP>7^y^Z_=Xx# zu{7Y<{Ynz{o4;ztp^0D)t#W6~p;ePZMmfUHp(w1MHcvB(7kELanhhPPbI(u~n5sl@uFnZY!SPjkYeUsGtM#jDi-WL(h z%4}0!_+!RF^9pp}D3Vw{F~3EgsW$x4e!+!yXz20J*FOnF`|XpmMqBbe*Me3v6Y}Yd zH_p2(PtHjDI1g)rKOdAxn0QZ=X|vZsMl&yPEh9hFT6mR=0@;3-Xkq`kzLs_ZI8V4g z3kpzpz$Nj?;7Pi<1zRAetCF}LX)TaLmQFppFwm+bu95d$m5ki?WaR)#?;80zw|t>% z%)vrO9%7Ydd|0)p5hIGGTg1CotzjD^H7*M0vh>P2s%J4OI9oEpwI39^_%kO}mZdK12pF_aEV&fTqNn6o!w&luJtIRjzf`*UWyC+f{BvKm0nHdDl)p-$%)ap|tcfT( zmSz~R#{rc*lgGS{DCe`uv3~?`26ch};?WNWb%KBx$6+kPu&Sq{j0p+|GRT9mhj4)N zV8T54;ugPf?`>XKxOXZFJWVBKj(6vi&pLUa6r;tV%1{p9FrSQA`DCGoW8bNmJV^TR zV5bh_XT<|N81R6U9KFJ{?}KPQs78B4H7ac%P}5;MK5;{TQ0K2RIysP%UI}c-7(^W?)JGQMq^a^=r?;P8&i#tD2z{=lGNfb0ZI#nZ!k8t(Ha+kCOHVW;> z-A+0^v1RL{8~5g86Q(ajm}0$-dA;c^a_+@#|CoQyjoF~;!$ZHAZ*)Yk1$h&+b557y zv^j&?nd5*KY>fi6cO3`2Amn|m{aDlL@VOu}G#5N@_AKc5KF#3Ny^eE1d>dU4PUY*g zG9d2QI0(i~j9H^EI(Gd%^- zV+tUAng}Y0?kc#1xv9GfK2Q_42+c=-;$|qW{x3;i!3HBQXAb?sSZ{pmchc@aeU6 z|7Fz$cUTLm&HR?16f^F*8PL*6Kh$uwGb4`0k-?vg@dPX1#tKVu`L;5;D9|76d03%B z#}jj6z6)=AEf55jRSWbf1d4u-Ck*tk491>c^dQ?7b-tMh0s2 zrlJmG(rXfXQ=y%D;`R=PQAfHk=f-Hzqc&ST;sA>PZ@`mICR%5DC=hD*=*)22JvkG> z1)t|ty^?Hj31%i2n5xeEv9x;%7S^x#v2%jAJ3)W^7p|s*cJ6Y3B^zprrnw?5-WXmU zD&j_tYX~xNQs$?WNkff=6X2_$0~7Pzagv^Z*EBpYO&d*n7jKXef97R``+?D6@Yd{s zQPp(yR--9&h3g6Et+_`97Um(QXZOuR1Xv2{5h=XArZX^K40oX|YQM{*)f{Z3&y?z! zEq>{ZT~WGp^7G*ELmYv!je|_*-DC=?+5B~1GO>riO*+jv*OiRWz))dWp2513&tXkU z<*z%+I*t`qEZLi6^6mDvKjzJ9__i&1-vr0G2<3BPwlv4N4CQC*#~1dq4nVgX<^q(@ z%x=P&iI10Xf$2}!FZ~&aaL^(;@@wwSZXH%7~Iqtt4Q7_CNFZN%-*pAD)q2Yk6ev literal 5474 zcmV-o6`krsS5qW#L;wJI0li#XY$Mlso^xh~LsFD95-F0RZd{4GYp8X2_8~ygpaF_z(!R7!TlW9YnHkQFml#+XONu<_KWAn*-}m3gCxY@s5E4g%FiV8> zu}MJ?z7YK@A_zAd`{mVp>l^8l!)mR$3g2#BJZQC!R+pC_KYo1q@yg|Ty5)=Ypr;6RIQYXxZU!}QuCl*di!zlk+xK>7Mlk* zmpg*Erd4TGwYA&(^*t@UQPob;&!=y9)-!1?g2MZq6J4`iW)W9kF4Yg0j~ey;;}V=x z8Mb1J?MrZrqvO45rFoz=){bj$*XoaJOsX@AGNp!AY}K6-<`~Xbi?xTx#fRG3ombgv z>pMHgVoO`w(Du?VET;3>e2$+54&GeGAJ_I{8zXT4)`SuDc=FY|ORwF&fB%iU_tu3c zqi~ZQ|E;V4BHk2UqV0D3&9Del0eDG)_uk}E-+%ezlg9vw55un%D>dO8v44jz@K0c0 zRpByF89pDaEq-oLZ6v9Yd|cB+-VW}~!I zF7IolUHG!o(weRPVyn1QY_9B<8uey#7k>1kN>$qd!5cSl@5{wz2>&kQ+c3N3m-j2p zqiXRq^h*6vMSH1QISSm}drK>|M(;cV0IkDpu~mXw65-++jy8vJ99D7BvF%z*YZObZ z$|H@B#2xc5)dAC$n$`&1KWbE3+Vt-3!}@NkzFUGDxx25GE42y&a`!;19*IZwrg(Mb zdcqWP&*!dW12T!zxSS;MkPuQRQN(~k6-5pzVptJ}6fvTR!*CZU{HhYXs6a=^s5(YQ z#|fb!iT(7160%NUj)(#wp|JQQy9qaiknqsR4@G_cNmgHYvMuQ6VU&Vw=qH|JVSGpv z3SwEz7NoM2Ey!g#TL_c`*@9A5vV~wdm@UvUWpAGmX83;x1lGy0%{O8{g44nKj(4lM z`~cn`G)^}vwPLk;dQWQ|H)^lKn6{r63{YG=$3$0qiJm?c#IWPu=y6;?liWD2WwL{`) zqY9N3%BVoY3I!gFD0EzrrW87@&{>716*;5O^Pvm@7y>!MGw?RY3386iFTm>pi42DV z0wqJYfeSE2L=ss?UI1%|C>bmXNOJs}BGTbW_Ki#5$^HPQhxB2M6iAtDP$46~-#jFG ztROB1H$?KRKB18+$w(vT1z|CyC*JueBdA{xgwV4g`0yk1!xq7jzX{SUJ*BP+!jtT` zvu_HQKDv~B4tAS{-6FW#OpxlcYRZ@==6o9FM~(SRTTL7D^wLLJSns z{&Pi1p8wnzNkE?eDtQm?_xyLs_lTsxpLYRC^Y7E&0f@~1GyOjNN&hGPANWIp0to>^ zh$M%fWI;s&3~qyV6Jbc4VoEYt7%2>whqL$wYVaTeB7`YGz=l@=zJyxA)Od+;2fz5- zTTfrbu>+YpEzk8>cuxbrNkd&0;3|!4Gol4eRV6dc6!)GpY7FU7y|O>&GiMN-9kahi z$gOZ?6|pZf6al@uA~QV@MI9i5IRqULR49BHR_LfA#uPdciW!WTBJlfUV-g8t|*KHz1%D9Yj2;5Nc7HwhosBL%V;*dV~~QTU{=Ph%D*EaFCCGK`Z*xe53( z#3bXJWOCtID!Q;V<;0Rw2y){J78bD-u(0%(U9q%Xd*c8+9}`l^N$)K%MSkXtkYyYX z02V-_nags74H*cl*6T+G#7NQKIueb8Z>H% z@kQg%yXaOq?T-mZbrvcFAnL%mwfuDge?(C~| z2cagW*o||A0H#p$=^F{>X<25XD~midaJm`J?JNT1dR(O|95t@JKj`y@ahPyY$5`)n zQ^uH^qA)iF48yP@jsws`;|9cO815N(>1NChaXa`fGILPGj!BTbCIKKGIUT@3vHWSk zx7(ivNE@Mo7qaNYF!NzS7Co5|gKT`0PAyy%gvl2mXmO#{e42 zBfxV5+co31nvP9+!S8;$g@5+U(Ca#~h2rPC*@8}jz~)lhpshft4gq_Po}3sT^TArZ zT&Xp*7T5j?OyBv;_5-eXc{qP@fL{eEVFdKI2N8FI+jXJ+NwSii>A6FPCd`RSMB~h# zmw+PR&x11$i7oWx6`BBxphzr8Y=#{!Ffsv$8`fvvDM=Zs!X-n#U{4B4TY4HqnMu*lF;SU`j_UI$Dmp|n zAgVI!GX`Pnr`zpcZMQ!J8wCF@z|0fzYPArhu;2Po>TPfygbKoO)u|-Zp`)s$|EI616OLt zTKX}@W;T*@A{zv*bj`;(j&E5sUzg4)>Li|Hu0L_}*Idq=W4)WUBk>XD%W>MWFkFPR zoQiok8gsdGfia*h&mUN*)w8*)RJ?fq4S)8zVyy1$yV-|*rcIqn z`k4c~>%!5Q8B#o)Wj%A`t{zS@MANMZn%^z;|o&tZ+ zSNtUWiQ1448EyWJAs=bPlM4yVXmdlTHURl4FXzyz{g{T($)B(DMD>9D(cT9Be3|?b zWElMH*T4)~^J5T;qKrh6Rkcc`9MEyfG@d?-90xQ_)m2U-pN!iW%i*RgHK*Sw| zFf(v=Uvswmm0Cnv?jd7v!g0p^$#i8U=C{zGQ>Qo-N({$`(IUx^QLts>B*?}AuUL*j z29GisN*KPR;>|HkLUokYgn}JkGUW9oAwxX$kvqp=_>v=rY3f)d_1DozVQPV=jd_76 z5QDrUOxVQy}N=jP6-S$FD=S(r>P2B|&}-IGfCn2$v!DxR&0FXVOJy`NfLo&u8m9_6j4~_8Vjj$h`uCr*Mz_*yg~4Q zu3MDECg7Fyb=`=&a*B17BY=ZFaowFHD~u$I$`)|Ktan!vfO%njaewcCqB z`t%lA%3q_RpYoq~0T;R({DYSiT(~Di&F%vFDlbA;&f6w(GtOL^OXv)8Y0e||z%E#X z(_E1jZ?O-19`ptdEBpIZO~PJ=keP|jD||GM!zCf%g_f6A4UC3p||RJq1P-qflrom{H_&3Z3ViP*T8& zY0imRGM9$eg0JQ9fiFykUa1p-p%)&F9`Xy_vmH%FZd6v4y zwU^f zXth{T%IZk?6o^hR(c4@!%tiAT#=Zhay#v#6HodtiJyWSu@hjxF$=3-Le?b0=w2i;N zOZ^So%U=E9Z`eNUYS`|alr+}A_~|C}<(Wz%nf5wGF3FQKaul71HPuDesLRw6(Gu&7 z+fQre1+J!*L#>Hd$x|AcewS#m{6=3%JJp>h+@J6HYh3N5x^L16#CSIWE8$}C*6Jnz z9l#8sI8X@}8w&cCaKmqSQWyYMZ$rU31M-&TV+{owt&+0DNRPxrHNaDagZ344tHwe{ zLJw1C0(i=&=YwSlYG(vnBS*k`@Qeg|zt({e3v_nDZi!lL->^k2<3`@{aX0Y@7DSy% zb<1!#95P(cAC6a6R67uHQOELJ=sH~@e zXg;V$c|e zp$+Uwr@IotmdwyCGMBj|;(_ep?W_|r3PcI4)!Ea?^84K(Q{JvUXq=j;N%^&886s!a zlEse)*x@Z%M$=z_w`7SB(FVZh2W4qmd{@(->B}oG*6UTRSo3Sl;)k%5s9$52A>x1> zAM200e9qaD#n*Kp$D>*!2jnOw+7dvLBLNifO8^a2OvKQ(?y=|^x$p>+`j)0-nU!(q zYV9;=>CsJFdsf17u`Po?X{telDW-wArJvp;=U&|Mk8IDmFx#~(cj#yCjY9i9menvp zJLl9UPMI@E$v6&Z!M1A&4vXu`p4NJ-X*KwqS2&vU9yojI1inr3&P=D{ToB(zG2NNF zaY`8wcMJ}KaWmKHSm*}%czoPedV_Q)w3bA%=td!JlT;*Vfu9LY8(Gf41SqNm*RYc$ zH3hF(-~0`Df|xexbiQNh;6L1@HzQX41Qqk22QR|tc(=8aFzYTxu(Tf5lTcbGDwMxW z!IVh`ecHLw`Glo#bMVcUwA zGEsOaB7_e`bfb*71fGB;VO+wi6pKSKP$oPFi|r<6>6>+?EJmzo$ddxb5} z%VVm1tM!(@<=Y?UVnBbe=fK3GZ$ILMdOv-UoUD11--lcz|uQ zIiSXQEzK9>omzpfS@6TS5qeq;kLZPQ$18;mkIl zufyXrCRk^B_#aH}(V4-vb8?mwcGVGlcIkW{+yOH~3ye|c{Yct51qOm-FsQO?OR28)KVYHhd$w_!k z!$Y{Nd$D)c1{v|^UPic|LL3HV&7VS4O-*lgFG8!a9)*UD2h6>~D8y9kzEOw>b%7p+ z!rQ<&1N)8O64v+hTimglgF*J7qMqKQi?8oU@}-lX1AQM52;^%VWWuM9Z4cHdU6VC` z-Iq-K$zqdEbI$y`VHr3o49PRdzxy24qSO^HrOe(9h{>&J#;2cX+EGg0revzu^c*yAN!*Wf4U7yJxFIOsbZ{S|k+unwg< z=VQO4fNxH?arnesE6kg+2Y{hK2rGjW2u*r`}yIEM$q22qO zcGmO3)*}G;h>GixS}3ax__Q$e4a0*g5F1_Ck`{ONfW)7F2Lhw{Z;=n-Px|l3-(#5M Y!|BDrI30?@dj5Zi_!NBje>qPev~)3=B>(^b diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex_apache.swf b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex_apache.swf index 193a266e484bf8791830a66839e30d756f244953..9aec6df3b8946bc1e5833bad168674c3483d5f66 100644 GIT binary patch literal 5391 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 literal 2334 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 Eoc=U&MF0Q* diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/obj/as3_cross_compileConfig.old b/libsrc/ffdec_lib/testdata/as3_cross_compile/obj/as3_cross_compileConfig.old index e4c2ad11e..05ccd9936 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/obj/as3_cross_compileConfig.old +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/obj/as3_cross_compileConfig.old @@ -16,7 +16,7 @@ CONFIG::timeStamp - '06.02.2021' + '07.02.2021' CONFIG::air diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/obj/as3_cross_compileConfig.xml b/libsrc/ffdec_lib/testdata/as3_cross_compile/obj/as3_cross_compileConfig.xml index e4c2ad11e..05ccd9936 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/obj/as3_cross_compileConfig.xml +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/obj/as3_cross_compileConfig.xml @@ -16,7 +16,7 @@ CONFIG::timeStamp - '06.02.2021' + '07.02.2021' CONFIG::air diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/Main.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/Main.as index d979aa5f6..eece0b7e7 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/Main.as @@ -9,13 +9,14 @@ package * @author JPEXS */ public class Main extends MovieClip - { + { TestTryCatch; TestTryCatchIfInTry; TestTryCatchInIf; TestTryCatchInWhile; TestTryCatchInWhile2; TestTryCatchInWhile3; + TestTryCatchInWhile4; TestTryCatchLoop; TestTryCatchLoopBreak; TestTryCatchExceptionUsage diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInWhile3.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInWhile3.as index e2ee5c3bd..3710d51dc 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInWhile3.as +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInWhile3.as @@ -12,20 +12,20 @@ package tests { var a:int; a = 0; - trace("before loop"); - while (a > 5) + trace("before loop"); //1-17 + while (a > 5) //44-47 { try { - return "intry return"; + return "intry return"; //20-23 } catch(e:Error) { - trace("in catch"); + trace("in catch"); //26-43 } - a++; + a++; //26-43 cont. } - return "OK"; + return "OK";//48-50 } } diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInWhile4.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInWhile4.as new file mode 100644 index 000000000..eb7f0b5d0 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInWhile4.as @@ -0,0 +1,37 @@ +package tests +{ + /** + * ... + * @author JPEXS + */ + public class TestTryCatchInWhile4 + { + + public function run() : void + { + var a:int; + a = 0; + + while (true) { + + try + { + trace("try2"); //12-21 + if (a == 10){ + trace("br"); + break; + } + return; + } + catch(e:Error) + { + trace("in catch2"); + } + trace("a=" + a); + } + trace("after"); //61-66 + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak.as index 51c64b75a..3fc1a330e 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak.as +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak.as @@ -13,59 +13,23 @@ package tests { var a:int; a = 0; - trace("before loop");//1-15 + trace("before loop"); try { - trace("try1a");//16-22 - while (a < 10){ //34-37 loop0 - trace("a=" + a); //23-33 + trace("in try1"); + while (a < 10){ + trace("a=" + a); a++; } - trace("try1b"); //38-44 - //45-45 + trace("in try2"); + } catch(e:Error) { - trace("in catch"); //46-61 + trace("in catch"); } - trace("middle");//62-68 - - - while (a < 20) { //104-107 loop1 - //69-69 - try - { - trace("try2"); //70-77 - return; - } - catch(e:Error) - { - trace("in catch2"); //80-103 - } - trace("a=" + a); //pokračuje 80-103 - } - trace("middle2"); //108-114 - - while (true) { //161-161 loop2 - //115-115 - try - { - trace("try3"); //116-122 - } - catch(e:Error) - { - trace("in catch3"); //124-141 - break; - } - catch(e:EOFError) - { - trace("in catch4"); //141-159 - break; - } - //123-123 - } - trace("exit"); //162-167 + trace("after"); } diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak2.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak2.as new file mode 100644 index 000000000..4d527e002 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak2.as @@ -0,0 +1,36 @@ +package tests +{ + import flash.errors.EOFError; + /** + * ... + * @author JPEXS + */ + public class TestTryCatchLoopBreak2 + { + + + public function run() : void + { + var a:int; + a = 0; + trace("before loop"); + + while (a < 20) { + + try + { + trace("in try"); + return; + } + catch(e:Error) + { + trace("in catch"); + } + trace("a=" + a); + } + trace("after"); + } + + } + +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak3.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak3.as new file mode 100644 index 000000000..804ebc38b --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchLoopBreak3.as @@ -0,0 +1,41 @@ +package tests +{ + import flash.errors.EOFError; + /** + * ... + * @author JPEXS + */ + public class TestTryCatchLoopBreak3 + { + + + public function run() : void + { + var a:int; + a = 0; + trace("before loop"); + while (true) { + + try + { + trace("in try"); + } + catch(e:Error) + { + trace("in catch1"); + break; + } + catch(e:EOFError) + { + trace("in catch2"); + break; + } + + } + trace("after"); + + } + + } + +} \ No newline at end of file